зеркало из https://github.com/mozilla/pjs.git
Bug 267906 Disabled extensions with a externally raised maxVersion claim to be incompatible
patch by moz_bugzilla@exchangecode.com r=bsmedberg a=asa
This commit is contained in:
Родитель
ae47b0d06f
Коммит
0a4b0c5f9c
|
@ -2895,6 +2895,7 @@ ExtensionManager.prototype = {
|
||||||
// Stuff has changed, load the Extensions datasource in all its RDFey
|
// Stuff has changed, load the Extensions datasource in all its RDFey
|
||||||
// glory.
|
// glory.
|
||||||
var ds = this.datasource;
|
var ds = this.datasource;
|
||||||
|
var updatedTargetAppInfos = [];
|
||||||
|
|
||||||
var needsRestart = false;
|
var needsRestart = false;
|
||||||
do {
|
do {
|
||||||
|
@ -2931,8 +2932,13 @@ ExtensionManager.prototype = {
|
||||||
id = items[i].id;
|
id = items[i].id;
|
||||||
var oldLocation = this.getInstallLocation(id);
|
var oldLocation = this.getInstallLocation(id);
|
||||||
var newLocation = InstallLocations.get(items[i].locationKey);
|
var newLocation = InstallLocations.get(items[i].locationKey);
|
||||||
if (newLocation.priority <= oldLocation.priority)
|
if (newLocation.priority <= oldLocation.priority) {
|
||||||
|
// check if there is updated app compatibility info
|
||||||
|
var newTargetAppInfo = ds.getUpdatedTargetAppInfo(id);
|
||||||
|
if (newTargetAppInfo)
|
||||||
|
updatedTargetAppInfos.push(newTargetAppInfo);
|
||||||
this._finalizeUpgrade(id);
|
this._finalizeUpgrade(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
PendingOperations.clearItems(OP_NEEDS_UPGRADE);
|
PendingOperations.clearItems(OP_NEEDS_UPGRADE);
|
||||||
|
|
||||||
|
@ -2940,7 +2946,12 @@ ExtensionManager.prototype = {
|
||||||
items = PendingOperations.getOperations(OP_NEEDS_INSTALL);
|
items = PendingOperations.getOperations(OP_NEEDS_INSTALL);
|
||||||
for (i = items.length - 1; i >= 0; --i) {
|
for (i = items.length - 1; i >= 0; --i) {
|
||||||
needsRestart = true;
|
needsRestart = true;
|
||||||
this._finalizeInstall(items[i].id, null);
|
var id = items[i].id;
|
||||||
|
// check if there is updated app compatibility info
|
||||||
|
newTargetAppInfo = ds.getUpdatedTargetAppInfo(id);
|
||||||
|
if (newTargetAppInfo)
|
||||||
|
updatedTargetAppInfos.push(newTargetAppInfo);
|
||||||
|
this._finalizeInstall(id, null);
|
||||||
}
|
}
|
||||||
PendingOperations.clearItems(OP_NEEDS_INSTALL);
|
PendingOperations.clearItems(OP_NEEDS_INSTALL);
|
||||||
|
|
||||||
|
@ -2970,6 +2981,13 @@ ExtensionManager.prototype = {
|
||||||
// no new components that need registering so we can inform the app
|
// no new components that need registering so we can inform the app
|
||||||
// not to do any extra startup checking next time round.
|
// not to do any extra startup checking next time round.
|
||||||
this._updateManifests(needsRestart);
|
this._updateManifests(needsRestart);
|
||||||
|
|
||||||
|
// If there is updated app compatibility info update the data sources.
|
||||||
|
for (i = 0; i < updatedTargetAppInfos.length; ++i) {
|
||||||
|
ds.updateTargetAppInfo(updatedTargetAppInfos[i].id,
|
||||||
|
updatedTargetAppInfos[i].minVersion,
|
||||||
|
updatedTargetAppInfos[i].maxVersion);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
LOG("ExtensionManager:_finishOperations - failure, catching exception... " + e);
|
LOG("ExtensionManager:_finishOperations - failure, catching exception... " + e);
|
||||||
|
@ -3518,7 +3536,20 @@ ExtensionManager.prototype = {
|
||||||
// Try and install again, but use the updated compatibility DB
|
// Try and install again, but use the updated compatibility DB
|
||||||
em.installItemFromFileInternal(this._xpi, aInstallLocationKey,
|
em.installItemFromFileInternal(this._xpi, aInstallLocationKey,
|
||||||
this._installManifest);
|
this._installManifest);
|
||||||
} else {
|
|
||||||
|
// Add the updated compatibility info to the datasource if done
|
||||||
|
if (StartupCache.entries[aInstallLocationKey][item.id].op == OP_NONE) {
|
||||||
|
em.datasource.updateTargetAppInfo(item.id, item.minAppVersion,
|
||||||
|
item.maxAppVersion);
|
||||||
|
}
|
||||||
|
else { // needs a restart
|
||||||
|
// Add updatedMinVersion and updatedMaxVersion so it can be used
|
||||||
|
// to update the data sources during the installation or upgrade.
|
||||||
|
em.datasource.setUpdatedTargetAppInfo(item.id, item.minAppVersion,
|
||||||
|
item.maxAppVersion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
showIncompatibleError(installData);
|
showIncompatibleError(installData);
|
||||||
// We are responsible for cleaning up this file!
|
// We are responsible for cleaning up this file!
|
||||||
InstallLocations.get(aInstallLocationKey).removeFile(this._xpi);
|
InstallLocations.get(aInstallLocationKey).removeFile(this._xpi);
|
||||||
|
@ -4575,11 +4606,11 @@ ExtensionItemUpdater.prototype = {
|
||||||
var targetAppInfo = this._emDS.getTargetApplicationInfo(aLocalItem.id, this._emDS);
|
var targetAppInfo = this._emDS.getTargetApplicationInfo(aLocalItem.id, this._emDS);
|
||||||
if (gVersionChecker.compare(targetAppInfo.maxVersion, aRemoteItem.maxAppVersion) < 0) {
|
if (gVersionChecker.compare(targetAppInfo.maxVersion, aRemoteItem.maxAppVersion) < 0) {
|
||||||
// Remotely specified maxVersion is newer than the maxVersion
|
// Remotely specified maxVersion is newer than the maxVersion
|
||||||
// for the installed Extension. Apply that change to the datasource.
|
// for the installed Extension. Apply that change to the datasources.
|
||||||
this._emDS.setTargetApplicationInfo(aLocalItem.id,
|
this._emDS.datasource.updateTargetAppInfo(aLocalItem.id,
|
||||||
aRemoteItem.minAppVersion,
|
item.minAppVersion,
|
||||||
aRemoteItem.maxAppVersion, null);
|
item.maxAppVersion);
|
||||||
|
|
||||||
// If we got here through |checkForMismatches|, this extension has
|
// If we got here through |checkForMismatches|, this extension has
|
||||||
// already been disabled, re-enable it.
|
// already been disabled, re-enable it.
|
||||||
if (this._emDS.getItemProperty(aLocalItem.id, "disabled") == "true")
|
if (this._emDS.getItemProperty(aLocalItem.id, "disabled") == "true")
|
||||||
|
@ -5165,6 +5196,132 @@ ExtensionsDataSource.prototype = {
|
||||||
datasource.Assert(source, property, newValue, true);
|
datasource.Assert(source, property, newValue, true);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the target application info for an item in the Extensions
|
||||||
|
* datasource and in the item's install manifest if it is installed in a
|
||||||
|
* profile's extensions directory, it exists, and we have write access.
|
||||||
|
* @param id
|
||||||
|
* The ID of the item to update target application info for
|
||||||
|
* @param minVersion
|
||||||
|
* The minimum version of the target application that this item can
|
||||||
|
* run in
|
||||||
|
* @param maxVersion
|
||||||
|
* The maximum version of the target application that this item can
|
||||||
|
* run in
|
||||||
|
*/
|
||||||
|
updateTargetAppInfo: function(id, minVersion, maxVersion)
|
||||||
|
{
|
||||||
|
// Update the Extensions datasource
|
||||||
|
this.setTargetApplicationInfo(id, minVersion, maxVersion, null);
|
||||||
|
|
||||||
|
var installLocation = InstallLocations.get(this.getInstallLocationKey(id));
|
||||||
|
if (installLocation.name != KEY_APP_PROFILE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var installManifestFile = installLocation.getItemFile(id, FILE_INSTALL_MANIFEST);
|
||||||
|
// Only update if the item exists and we can write to the location
|
||||||
|
if (installManifestFile.exists() && installLocation.canAccess)
|
||||||
|
this.setTargetApplicationInfo(id, minVersion, maxVersion,
|
||||||
|
getInstallManifest(installManifestFile));
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the updated target application info if it exists for an item from
|
||||||
|
* the Extensions datasource during an installation or upgrade.
|
||||||
|
* @param id
|
||||||
|
* The ID of the item to discover updated target application info for
|
||||||
|
* @returns A JS Object with the following properties:
|
||||||
|
* "id" The id of the item
|
||||||
|
* "minVersion" The updated minimum version of the target
|
||||||
|
* application that this item can run in
|
||||||
|
* "maxVersion" The updated maximum version of the target
|
||||||
|
* application that this item can run in
|
||||||
|
*/
|
||||||
|
getUpdatedTargetAppInfo: function(id) {
|
||||||
|
// The default theme is always compatible so there is never update info.
|
||||||
|
if (getResourceForID(id).EqualsNode(this._defaultTheme))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var appID = gApp.ID;
|
||||||
|
var r = getResourceForID(id);
|
||||||
|
var targetApps = this._inner.GetTargets(r, EM_R("targetApplication"), true);
|
||||||
|
if (!targetApps.hasMoreElements())
|
||||||
|
targetApps = this._inner.GetTargets(gInstallManifestRoot, EM_R("targetApplication"), true);
|
||||||
|
while (targetApps.hasMoreElements()) {
|
||||||
|
var targetApp = targetApps.getNext();
|
||||||
|
if (targetApp instanceof Components.interfaces.nsIRDFResource) {
|
||||||
|
try {
|
||||||
|
var foundAppID = stringData(this._inner.GetTarget(targetApp, EM_R("id"), true));
|
||||||
|
if (foundAppID != appID) // Different target application
|
||||||
|
continue;
|
||||||
|
var updatedMinVersion = this._inner.GetTarget(targetApp, EM_R("updatedMinVersion"), true);
|
||||||
|
var updatedMaxVersion = this._inner.GetTarget(targetApp, EM_R("updatedMaxVersion"), true);
|
||||||
|
if (updatedMinVersion && updatedMaxVersion)
|
||||||
|
return { id : id,
|
||||||
|
minVersion: stringData(updatedMinVersion),
|
||||||
|
maxVersion: stringData(updatedMaxVersion) };
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the updated target application info for an item in the Extensions
|
||||||
|
* datasource during an installation or upgrade.
|
||||||
|
* @param id
|
||||||
|
* The ID of the item to set updated target application info for
|
||||||
|
* @param updatedMinVersion
|
||||||
|
* The updated minimum version of the target application that this
|
||||||
|
* item can run in
|
||||||
|
* @param updatedMaxVersion
|
||||||
|
* The updated maximum version of the target application that this
|
||||||
|
* item can run in
|
||||||
|
*/
|
||||||
|
setUpdatedTargetAppInfo: function(id, updatedMinVersion, updatedMaxVersion) {
|
||||||
|
// The default theme is always compatible so it is never updated.
|
||||||
|
if (getResourceForID(id).EqualsNode(this._defaultTheme))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Version/Dependency Info
|
||||||
|
var updatedMinVersionRes = EM_R("updatedMinVersion");
|
||||||
|
var updatedMaxVersionRes = EM_R("updatedMaxVersion");
|
||||||
|
|
||||||
|
var appID = gApp.ID;
|
||||||
|
var r = getResourceForID(id);
|
||||||
|
var targetApps = this._inner.GetTargets(r, EM_R("targetApplication"), true);
|
||||||
|
// add updatedMinVersion and updatedMaxVersion for an install else an upgrade
|
||||||
|
if (!targetApps.hasMoreElements()) {
|
||||||
|
var idRes = EM_R("id");
|
||||||
|
var targetRes = getResourceForID(id);
|
||||||
|
var property = EM_R("targetApplication");
|
||||||
|
var anon = gRDF.GetAnonymousResource();
|
||||||
|
this._inner.Assert(anon, idRes, EM_L(appID), true);
|
||||||
|
this._inner.Assert(anon, updatedMinVersionRes, EM_L(updatedMinVersion), true);
|
||||||
|
this._inner.Assert(anon, updatedMaxVersionRes, EM_L(updatedMaxVersion), true);
|
||||||
|
this._inner.Assert(targetRes, property, anon, true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
while (targetApps.hasMoreElements()) {
|
||||||
|
var targetApp = targetApps.getNext();
|
||||||
|
if (targetApp instanceof Components.interfaces.nsIRDFResource) {
|
||||||
|
var foundAppID = stringData(this._inner.GetTarget(targetApp, EM_R("id"), true));
|
||||||
|
if (foundAppID != appID) // Different target application
|
||||||
|
continue;
|
||||||
|
this._inner.Assert(targetApp, updatedMinVersionRes, EM_L(updatedMinVersion), true);
|
||||||
|
this._inner.Assert(targetApp, updatedMaxVersionRes, EM_L(updatedMaxVersion), true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this._inner.Flush();
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the target application info for an item from a datasource.
|
* Gets the target application info for an item from a datasource.
|
||||||
* @param id
|
* @param id
|
||||||
|
@ -5193,8 +5350,8 @@ ExtensionsDataSource.prototype = {
|
||||||
var targetApp = targetApps.getNext();
|
var targetApp = targetApps.getNext();
|
||||||
if (targetApp instanceof Components.interfaces.nsIRDFResource) {
|
if (targetApp instanceof Components.interfaces.nsIRDFResource) {
|
||||||
try {
|
try {
|
||||||
var id = stringData(datasource.GetTarget(targetApp, EM_R("id"), true));
|
var foundAppID = stringData(datasource.GetTarget(targetApp, EM_R("id"), true));
|
||||||
if (id != appID) // Different target application
|
if (foundAppID != appID) // Different target application
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
return { minVersion: stringData(datasource.GetTarget(targetApp, EM_R("minVersion"), true)),
|
return { minVersion: stringData(datasource.GetTarget(targetApp, EM_R("minVersion"), true)),
|
||||||
|
@ -5234,8 +5391,8 @@ ExtensionsDataSource.prototype = {
|
||||||
while (targetApps.hasMoreElements()) {
|
while (targetApps.hasMoreElements()) {
|
||||||
var targetApp = targetApps.getNext();
|
var targetApp = targetApps.getNext();
|
||||||
if (targetApp instanceof Components.interfaces.nsIRDFResource) {
|
if (targetApp instanceof Components.interfaces.nsIRDFResource) {
|
||||||
var id = stringData(targetDataSource.GetTarget(targetApp, EM_R("id"), true));
|
var foundAppID = stringData(targetDataSource.GetTarget(targetApp, EM_R("id"), true));
|
||||||
if (id != appID) // Different target application
|
if (foundAppID != appID) // Different target application
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
this._setProperty(targetDataSource, targetApp, EM_R("minVersion"), EM_L(minVersion));
|
this._setProperty(targetDataSource, targetApp, EM_R("minVersion"), EM_L(minVersion));
|
||||||
|
|
Загрузка…
Ссылка в новой задаче