--- mozilla/toolkit/mozapps/extensions/src/nsExtensionManager.js.in.fixextensionsmanager 2004-10-12 08:19:47.000000000 +0200 +++ mozilla/toolkit/mozapps/extensions/src/nsExtensionManager.js.in 2005-01-18 15:45:41.324642191 +0100 @@ -20,6 +20,7 @@ * * Contributor(s): * Ben Goodger <ben@bengoodger.com> + * Mike Hommey <mh@glandium.org> * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -144,6 +145,19 @@ } // Returns the file at the appropriate point in a directory hierarchy under +// the specified key. Does NOT create the file NOR the directories along the +// way. +function getFileNoCreateDir(aKey, aPathToFile) +{ + var subdirs = []; + for (var i = 0; i < aPathToFile.length - 1; ++i) + subdirs.push(aPathToFile[i]); + var file = getDirNoCreate(aKey, subdirs); + file.append(aPathToFile[aPathToFile.length - 1]); + return file; +} + +// Returns the file at the appropriate point in a directory hierarchy under // the specified key, creating directories along the way if necessary. Does // NOT create the file. function getFile(aKey, aPathToFile) @@ -675,9 +689,17 @@ function nsInstallLogReader(aExtensionID, aIsProfile, aListener) { this._isProfile = aIsProfile; - this.uninstallLog = getFile(getDirKey(aIsProfile), + this.uninstallLog = getFileNoCreateDir(getDirKey(aIsProfile), [DIR_EXTENSIONS, aExtensionID, DIR_UNINSTALL, FILE_UNINSTALL_LOG]); + // If the uninstall Log doesn't exist in profile, let's give a try in + // global extension pool. + if (aIsProfile && !this.uninstallLog.exists()) { + this._isProfile = false; + this.uninstallLog = getFileNoCreateDir(getDirKey(false), + [DIR_EXTENSIONS, aExtensionID, + DIR_UNINSTALL, FILE_UNINSTALL_LOG]); + } this._listener = aListener } @@ -829,26 +851,20 @@ { // extension,{GUID} or theme,{GUID} var parts = aLine.split(","); - var manifest = getFile(KEY_APPDIR, + var manifest = getFileNoCreateDir(KEY_APPDIR, [DIR_EXTENSIONS, parts[1], FILE_INSTALL_MANIFEST]); if (parts.length != 2) return; - if (!manifest.exists()) { - defaultManifest = defaultFile = getFile(KEY_DEFAULTS, - [DIR_DEFAULTS_EXTENSIONS, parts[1], FILE_INSTALL_MANIFEST]); - var extensionDir = getDir(KEY_APPDIR, [DIR_EXTENSIONS, parts[1]]); - defaultManifest.copyTo(extensionDir, FILE_INSTALL_MANIFEST); - manifest = getFile(KEY_APPDIR, - [DIR_EXTENSIONS, parts[1], FILE_INSTALL_MANIFEST]); - } - switch (parts[0]) { - case this.TOKEN_EXTENSION: - this._manager.ensurePreConfiguredItem(parts[1], nsIUpdateItem.TYPE_EXTENSION, manifest); - break; - case this.TOKEN_THEME: - this._manager.ensurePreConfiguredItem(parts[1], nsIUpdateItem.TYPE_THEME, manifest); - break; + if (manifest.exists()) { + switch (parts[0]) { + case this.TOKEN_EXTENSION: + this._manager.ensurePreConfiguredItem(parts[1], nsIUpdateItem.TYPE_EXTENSION, manifest); + break; + case this.TOKEN_THEME: + this._manager.ensurePreConfiguredItem(parts[1], nsIUpdateItem.TYPE_THEME, manifest); + break; + } } } }; @@ -929,7 +945,7 @@ this._installExtensionFiles(); // Load the metadata datasource - var metadataFile = getFile(this._extDirKey, + var metadataFile = getFileNoCreateDir(this._extDirKey, [DIR_EXTENSIONS, aExtensionID, FILE_INSTALL_MANIFEST]); this._metadataDS = getInstallManifest(metadataFile); @@ -969,10 +985,12 @@ _installExtensionFiles: function nsExtensionInstaller__installExtensionFiles () { - var sourceXPI = getFile(this._extDirKey, + var sourceXPI = getFileNoCreateDir(this._extDirKey, [DIR_EXTENSIONS, DIR_TEMP, this._extensionID, this._extensionID + ".xpi"]); + if (!sourceXPI.exists()) + return; var zipReader = Components.classes["@mozilla.org/libjar/zip-reader;1"] .createInstance(Components.interfaces.nsIZipReader); zipReader.init(sourceXPI); @@ -1752,6 +1770,9 @@ // Write bin/components.ini var manifest = getFile(KEY_APPDIR, [FILE_COMPONENT_MANIFEST]); this._writeProfileFile(manifest, this._getComponentsDir, false); + + // Update the Defaults Manifest + this._writeDefaults(false); } }, @@ -2002,6 +2023,34 @@ this._ds.insertForthcomingItem(aItemID, aItemType, false); var metadataDS = getInstallManifest(aManifest); this._ds.addItemMetadata(aItemID, aItemType, metadataDS, false); + + // Check whether the extension is installable (firefox_version fitting between + // em:MaxVersion and em:MinVersion) + var extensionID = this.canInstallItem(metadataDS); + // |extensionID| must be a GUID string, not a number - a number means failure. + if (isNaN(parseInt(extensionID))) { + // Do install the extension, meaning we register its chrome and components + if (!this._extInstaller) + this._extInstaller = new nsExtensionInstaller(this._ds); + try { + this._extInstaller.install(aItemID, false); + } + catch (e) { + // If the installation failed, we disable the extension in addition + // to _not_ uninstalling it (which would fail anyway because it + // would be done at launch time... as a user). + this._ds.setItemProperty(aItemID, this._ds._emR("toBeUninstalled"), + null, false, aItemType); + this._ds.setItemProperty(aItemID, this._ds._emR("disabled"), + this._ds._emL("true"), false, aItemType); + } + } else { + // disable extensions that aren't installable + this._ds.setItemProperty(aItemID, this._ds._emR("disabled"), + this._ds._emL("true"), false, aItemType); + } + // Force locking pre-configured items. + this._ds.lockUnlockItem(aItemID, true); }, checkForMismatches: function nsExtensionManager_checkForMismatches () @@ -2028,22 +2077,31 @@ if (items.length > 0) { for (var i = 0; i < items.length; ++i) { // Now disable the extension so it won't hurt anything. + var alreadyDisabled = this._ds.getItemProperty(items[i].id, "disabled"); var itemType = getItemType(this._ds._getResourceForItem(items[i].id).Value); if (itemType != -1 && itemType & nsIUpdateItem.TYPE_EXTENSION) - this.disableExtension(items[i].id); + if (!alreadyDisabled) this.disableExtension(items[i].id); else if (itemType & nsIUpdateItem.TYPE_THEME) { if (gPref.prefHasUserValue(PREF_GENERAL_SKINS_SELECTEDSKIN)) gPref.clearUserPref(PREF_GENERAL_SKINS_SELECTEDSKIN); - this._ds.disableTheme(items[i].id); + if (!alreadyDisabled) this._ds.disableTheme(items[i].id); } } - var updates = Components.classes["@mozilla.org/updates/update-service;1"] - .getService(Components.interfaces.nsIUpdateService); - updates.checkForUpdates(items, items.length, nsIUpdateItem.TYPE_ADDON, - nsIUpdateService.SOURCE_EVENT_MISMATCH, - null); + // We want to eliminate locked extensions + newitems = []; + for (var i = 0; i < items.length; ++i) { + if (!this._ds.getItemProperty(items[i].id, "locked")) + newitems.push(items[i]); + } + if (newitems.length > 0) { + var updates = Components.classes["@mozilla.org/updates/update-service;1"] + .getService(Components.interfaces.nsIUpdateService); + updates.checkForUpdates(newitems, newitems.length, nsIUpdateItem.TYPE_ADDON, + nsIUpdateService.SOURCE_EVENT_MISMATCH, + null); - needsRestart = true; + needsRestart = true; + } } } @@ -2133,6 +2191,11 @@ validExtensions.push({ sourceDir: sourceDir, isProfile: isProfile }); } + // Debian hook to insert defaults/syspref into defaults.ini + if ((aFile.leafName == FILE_DEFAULTS) && aIsProfile == false) { + validExtensions.push({ sourceDir: getDirNoCreate(getDirKey(false), [DIR_DEFAULTS, "syspref"]), isProfile: false }); + } + var lines = ["[Extra Files]\r\n", "Count=" + validExtensions.length + "\r\n"]; for (i = 0; i < lines.length; ++i) @@ -2545,16 +2608,16 @@ this._extEnabler = new nsExtensionEnabler(this._ds); var isProfile = this._ds.isProfileItem(aExtensionID); - this._extEnabler.enable(aExtensionID, isProfile, aDisable); + this._extEnabler.enable(aExtensionID, true, aDisable); // clear temporary flags this._ds.setItemProperty(aExtensionID, this._ds._emR("toBeEnabled"), - null, isProfile, + null, true, nsIUpdateItem.TYPE_EXTENSION); this._ds.setItemProperty(aExtensionID, this._ds._emR("toBeDisabled"), - null, isProfile, + null, true, nsIUpdateItem.TYPE_EXTENSION); }, @@ -3090,8 +3153,10 @@ checkForUpdates: function (aItem, aVersionUpdateOnly) { // A preference setting can disable updating for this item + // We'll also skip locked items. try { - if (!gPref.getBoolPref(PREF_EM_ITEM_UPDATE_ENABLED.replace(/%UUID%/, aItem.id))) { + if (this._updater._emDS.getItemProperty(aItem.id, "locked") || + !gPref.getBoolPref(PREF_EM_ITEM_UPDATE_ENABLED.replace(/%UUID%/, aItem.id))) { gOS.notifyObservers(null, "Update:Extension:Item-Ended", ""); this._updater._checkForDone(); return; @@ -3557,7 +3622,7 @@ isProfileItem: function nsExtensionsDataSource_isProfileItem (aItemID) { - return this.getItemProperty(aItemID, "installLocation") != "global"; + return this.getItemProperty(aItemID, "installLocation") == "profile"; }, _setProperty: function nsExtensionsDataSource__setProperty (aDS, aSource, aProperty, aNewValue) @@ -3845,26 +3910,26 @@ enableExtension: function nsExtensionsDataSource_enableExtension (aExtensionID) { this.setItemProperty(aExtensionID, this._emR("toBeEnabled"), - this._emL("true"), this.isProfileItem(aExtensionID), + this._emL("true"), true, nsIUpdateItem.TYPE_EXTENSION); this.setItemProperty(aExtensionID, this._emR("toBeDisabled"), - null, this.isProfileItem(aExtensionID), + null, true, nsIUpdateItem.TYPE_EXTENSION); this.setItemProperty(aExtensionID, this._emR("disabled"), - null, this.isProfileItem(aExtensionID), + null, true, nsIUpdateItem.TYPE_EXTENSION); }, disableExtension: function nsExtensionsDataSource_disableExtension (aExtensionID) { this.setItemProperty(aExtensionID, this._emR("toBeDisabled"), - this._emL("true"), this.isProfileItem(aExtensionID), + this._emL("true"), true, nsIUpdateItem.TYPE_EXTENSION); this.setItemProperty(aExtensionID, this._emR("toBeEnabled"), - null, this.isProfileItem(aExtensionID), + null, true, nsIUpdateItem.TYPE_EXTENSION); this.setItemProperty(aExtensionID, this._emR("disabled"), - this._emL("true"), this.isProfileItem(aExtensionID), + this._emL("true"), true, nsIUpdateItem.TYPE_EXTENSION); },