Backed out changeset 4834a3833639 and c580afddd1cb (bug 985084 and bug 97500)

--HG--
extra : histedit_source : c580afddd1cb90bd3cccbc7abc8082132ffe2a3c%2C4371c5775a71d493e82f193b1cf15efd44566645
This commit is contained in:
Gregory Szorc 2014-03-28 21:45:10 -07:00
Родитель c427405c3c
Коммит f1b0e7f95e
9 изменённых файлов: 31 добавлений и 244 удалений

Просмотреть файл

@ -611,8 +611,6 @@ Experiments.Experiments.prototype = {
return this._run();
},
// START OF ADD-ON LISTENERS
onDisabled: function (addon) {
gLogger.trace("Experiments::onDisabled() - addon id: " + addon.id);
if (addon.id == this._pendingUninstall) {
@ -638,8 +636,6 @@ Experiments.Experiments.prototype = {
this.disableExperiment();
},
// END OF ADD-ON LISTENERS.
_getExperimentByAddonId: function (addonId) {
for (let [, entry] of this._experiments) {
if (entry._addonId === addonId) {
@ -1380,9 +1376,8 @@ Experiments.ExperimentEntry.prototype = {
deferred.reject(new Error(message));
};
let entry = this;
let listener = {
onDownloadEnded: function (install) {
onDownloadEnded: install => {
gLogger.trace("ExperimentEntry::_installAddon() - onDownloadEnded for " + this.id);
if (install.existingAddon) {
@ -1393,9 +1388,9 @@ Experiments.ExperimentEntry.prototype = {
gLogger.error("ExperimentEntry::_installAddon() - onDownloadEnded, wrong addon type");
install.cancel();
}
}.bind(entry),
},
onInstallStarted: function (install) {
onInstallStarted: install => {
gLogger.trace("ExperimentEntry::_installAddon() - onInstallStarted for " + this.id);
if (install.existingAddon) {
@ -1406,12 +1401,9 @@ Experiments.ExperimentEntry.prototype = {
gLogger.error("ExperimentEntry::_installAddon() - onInstallStarted, wrong addon type");
return false;
}
},
// Experiment add-ons default to userDisabled = true.
install.addon.userDisabled = false;
}.bind(entry),
onInstallEnded: function (install) {
onInstallEnded: install => {
gLogger.trace("ExperimentEntry::_installAddon() - install ended for " + this.id);
this._lastChangedDate = this._policy.now();
this._startDate = this._policy.now();
@ -1427,14 +1419,14 @@ Experiments.ExperimentEntry.prototype = {
this._homepageURL = addon.homepageURL || "";
deferred.resolve();
}.bind(entry),
onDownloadCancelled: failureHandler.bind(entry),
onDownloadFailed: failureHandler.bind(entry),
onInstallCancelled: failureHandler.bind(entry),
onInstallFailed: failureHandler.bind(entry),
},
};
["onDownloadCancelled", "onDownloadFailed", "onInstallCancelled", "onInstallFailed"]
.forEach(what => {
listener[what] = install => failureHandler(install, what)
});
install.addListener(listener);
install.install();

Просмотреть файл

@ -2317,25 +2317,7 @@ this.AddonManagerPrivate = {
return {
done: () => this.recordSimpleMeasure(aName, Date.now() - startTime)
};
},
/**
* Helper to call update listeners when no update is available.
*
* This can be used as an implementation for Addon.findUpdates() when
* no update mechanism is available.
*/
callNoUpdateListeners: function (addon, listener, reason, appVersion, platformVersion) {
if ("onNoCompatibilityUpdateAvailable" in listener) {
safeCall(listener.onNoCompatibilityUpdateAvailable, addon);
}
if ("onNoUpdateAvailable" in listener) {
safeCall(listener.onNoUpdateAvailable, addon);
}
if ("onUpdateFinished" in listener) {
safeCall(listener.onUpdateFinished, addon);
}
},
};
/**

Просмотреть файл

@ -508,7 +508,12 @@ function AddonWrapper(aTheme) {
};
this.findUpdates = function AddonWrapper_findUpdates(listener, reason, appVersion, platformVersion) {
AddonManagerPrivate.callNoUpdateListeners(this, listener, reason, appVersion, platformVersion);
if ("onNoCompatibilityUpdateAvailable" in listener)
listener.onNoCompatibilityUpdateAvailable(this);
if ("onNoUpdateAvailable" in listener)
listener.onNoUpdateAvailable(this);
if ("onUpdateFinished" in listener)
listener.onUpdateFinished(this);
};
}

Просмотреть файл

@ -908,11 +908,6 @@ function loadManifestFromRDF(aUri, aStream) {
addon.userDisabled = !!LightweightThemeManager.currentTheme ||
addon.internalName != XPIProvider.selectedSkin;
}
// Experiments are disabled by default. It is up to the Experiments Manager
// to enable them (it drives installation).
else if (addon.type == "experiment") {
addon.userDisabled = true;
}
else {
addon.userDisabled = false;
addon.softDisabled = addon.blocklistState == Ci.nsIBlocklistService.STATE_SOFTBLOCKED;
@ -920,17 +915,6 @@ function loadManifestFromRDF(aUri, aStream) {
addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DEFAULT;
// Experiments are managed and updated through an external "experiments
// manager." So disable some built-in mechanisms.
if (addon.type == "experiment") {
addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE;
addon.updateURL = null;
addon.updateKey = null;
addon.targetApplications = [];
addon.targetPlatforms = [];
}
// Load the storage service before NSS (nsIRandomGenerator),
// to avoid a SQLite initialization error (bug 717904).
let storage = Services.storage;
@ -2087,19 +2071,8 @@ var XPIProvider = {
* Persists changes to XPIProvider.bootstrappedAddons to its store (a pref).
*/
persistBootstrappedAddons: function XPI_persistBootstrappedAddons() {
// Experiments are disabled upon app load, so don't persist references.
let filtered = {};
for (let id in this.bootstrappedAddons) {
let entry = this.bootstrappedAddons[id];
if (entry.type == "experiment") {
continue;
}
filtered[id] = entry;
}
Services.prefs.setCharPref(PREF_BOOTSTRAP_ADDONS,
JSON.stringify(filtered));
JSON.stringify(this.bootstrappedAddons));
},
/**
@ -4254,16 +4227,12 @@ var XPIProvider = {
// no onDisabling/onEnabling is sent - so send a onPropertyChanged.
let appDisabledChanged = aAddon.appDisabled != appDisabled;
// Update the properties in the database.
// We never persist this for experiments because the disabled flags
// are controlled by the Experiments Manager.
if (aAddon.type != "experiment") {
// Update the properties in the database
XPIDatabase.setAddonProperties(aAddon, {
userDisabled: aUserDisabled,
appDisabled: appDisabled,
softDisabled: aSoftDisabled
});
}
if (appDisabledChanged) {
AddonManagerPrivate.callAddonListeners("onPropertyChanged",
@ -6045,17 +6014,6 @@ AddonInternal.prototype = {
},
isCompatibleWith: function AddonInternal_isCompatibleWith(aAppVersion, aPlatformVersion) {
// Experiments are installed through an external mechanism that
// limits target audience to compatible clients. We trust it knows what
// it's doing and skip compatibility checks.
//
// This decision does forfeit defense in depth. If the experiments system
// is ever wrong about targeting an add-on to a specific application
// or platform, the client will likely see errors.
if (this.type == "experiment") {
return true;
}
let app = this.matchingTargetApplication;
if (!app)
return false;
@ -6440,11 +6398,6 @@ function AddonWrapper(aAddon) {
return aAddon.applyBackgroundUpdates;
});
this.__defineSetter__("applyBackgroundUpdates", function AddonWrapper_applyBackgroundUpdatesSetter(val) {
if (this.type == "experiment") {
logger.warn("Setting applyBackgroundUpdates on an experiment is not supported.");
return;
}
if (val != AddonManager.AUTOUPDATE_DEFAULT &&
val != AddonManager.AUTOUPDATE_DISABLE &&
val != AddonManager.AUTOUPDATE_ENABLE) {
@ -6545,33 +6498,22 @@ function AddonWrapper(aAddon) {
if (!(aAddon.inDatabase))
return permissions;
// Experiments can only be uninstalled. An uninstall reflects the user
// intent of "disable this experiment." This is partially managed by the
// experiments manager.
if (aAddon.type == "experiment") {
return AddonManager.PERM_CAN_UNINSTALL;
}
if (!aAddon.appDisabled) {
if (this.userDisabled) {
if (this.userDisabled)
permissions |= AddonManager.PERM_CAN_ENABLE;
}
else if (aAddon.type != "theme") {
else if (aAddon.type != "theme")
permissions |= AddonManager.PERM_CAN_DISABLE;
}
}
// Add-ons that are in locked install locations, or are pending uninstall
// cannot be upgraded or uninstalled
if (!aAddon._installLocation.locked && !aAddon.pendingUninstall) {
// Add-ons that are installed by a file link cannot be upgraded
if (!aAddon._installLocation.isLinkedAddon(aAddon.id)) {
if (!aAddon._installLocation.isLinkedAddon(aAddon.id))
permissions |= AddonManager.PERM_CAN_UPGRADE;
}
permissions |= AddonManager.PERM_CAN_UNINSTALL;
}
return permissions;
});
@ -6653,14 +6595,6 @@ function AddonWrapper(aAddon) {
};
this.findUpdates = function AddonWrapper_findUpdates(aListener, aReason, aAppVersion, aPlatformVersion) {
// Short-circuit updates for experiments because updates are handled
// through the Experiments Manager.
if (this.type == "experiment") {
AddonManagerPrivate.callNoUpdateListeners(this, aListener, aReason,
aAppVersion, aPlatformVersion);
return;
}
new UpdateChecker(aAddon, aListener, aReason, aAppVersion, aPlatformVersion);
};

Просмотреть файл

@ -1,17 +0,0 @@
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>experiment1@tests.mozilla.org</em:id>
<em:version>1.0</em:version>
<em:type>128</em:type>
<em:bootstrap>true</em:bootstrap>
<!-- Front End MetaData -->
<em:name>Test Experiment 1</em:name>
<em:description>Test Description</em:description>
</Description>
</RDF>

Просмотреть файл

@ -50,7 +50,8 @@ add_test(function testActiveExperiment() {
install_addon("addons/browser_experiment1.xpi", (addon) => {
gInstalledAddons.push(addon);
Assert.ok(addon.userDisabled, "Add-on is disabled upon initial install.");
// This may change if we remove compatibility checking from experiments.
// Putting this check here so a test fails if preconditions change.
Assert.equal(addon.isActive, false, "Add-on is not active.");
Assert.ok(gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab visible.");
@ -132,22 +133,3 @@ add_test(function testOpenPreferences() {
EventUtils.synthesizeMouseAtCenter(btn, {}, gManagerWindow);
});
});
add_test(function testButtonPresence() {
gCategoryUtilities.openType("experiment", (win) => {
let item = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org");
Assert.ok(item, "Got add-on element.");
let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn");
// Corresponds to the uninstall permission.
is_element_visible(el, "Remove button is visible.");
// Corresponds to lack of disable permission.
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "disable-btn");
is_element_hidden(el, "Disable button not visible.");
// Corresponds to lack of enable permission.
el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "enable-btn");
is_element_hidden(el, "Enable button not visible.");
run_next_test();
});
});

Просмотреть файл

@ -1,89 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
let scope = Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm");
const XPIProvider = scope.XPIProvider;
function run_test() {
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
startupManager();
run_next_test();
}
add_test(function test_experiment() {
AddonManager.getInstallForFile(do_get_addon("test_experiment1"), (install) => {
completeAllInstalls([install], () => {
AddonManager.getAddonByID("experiment1@tests.mozilla.org", (addon) => {
Assert.ok(addon, "Addon is found.");
Assert.ok(addon.userDisabled, "Experiments are userDisabled by default.");
Assert.equal(addon.isActive, false, "Add-on is not active.");
Assert.equal(addon.updateURL, null, "No updateURL for experiments.");
Assert.equal(addon.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DISABLE,
"Background updates are disabled.");
Assert.equal(addon.permissions, AddonManager.PERM_CAN_UNINSTALL,
"Permissions are minimal.");
// Setting applyBackgroundUpdates should not work.
addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_ENABLE;
Assert.equal(addon.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DISABLE,
"Setting applyBackgroundUpdates shouldn't do anything.");
let noCompatibleCalled = false;
let noUpdateCalled = false;
let finishedCalled = false;
let listener = {
onNoCompatibilityUpdateAvailable: () => { noCompatibleCalled = true; },
onNoUpdateAvailable: () => { noUpdateCalled = true; },
onUpdateFinished: () => { finishedCalled = true; },
};
addon.findUpdates(listener, "testing", null, null);
Assert.ok(noCompatibleCalled, "Listener called.");
Assert.ok(noUpdateCalled, "Listener called.");
Assert.ok(finishedCalled, "Listener called.");
run_next_test();
});
});
});
});
// Changes to userDisabled should not be persisted to the database.
add_test(function test_userDisabledNotPersisted() {
AddonManager.getAddonByID("experiment1@tests.mozilla.org", (addon) => {
Assert.ok(addon, "Addon is found.");
let listener = {
onEnabled: (addon2) => {
Assert.equal(addon2.id, addon.id, "Changed add-on matches expected.");
Assert.ok(addon2.isActive, "Add-on is no longer disabled.");
Assert.ok("experiment1@tests.mozilla.org" in XPIProvider.bootstrappedAddons,
"Experiment add-on listed in XPIProvider bootstrapped list.");
AddonManager.getAddonByID("experiment1@tests.mozilla.org", (addon) => {
Assert.ok(addon, "Add-on retrieved.");
Assert.ok(addon.userDisabled, "Add-on is disabled according to database.");
restartManager();
let persisted = JSON.parse(Services.prefs.getCharPref("extensions.bootstrappedAddons"));
Assert.ok(!("experiment1@tests.mozilla.org" in persisted),
"Experiment add-on not persisted to bootstrappedAddons.");
AddonManager.getAddonByID("experiment1@tests.mozilla.org", (addon) => {
Assert.ok(addon, "Add-on retrieved.");
Assert.ok(addon.userDisabled, "Add-on is disabled after restart.");
run_next_test();
});
});
},
};
AddonManager.addAddonListener(listener);
addon.userDisabled = false;
});
});

Просмотреть файл

@ -17,8 +17,7 @@ const IGNORE_PRIVATE = ["AddonAuthor", "AddonCompatibilityOverride",
"addStartupChange", "removeStartupChange",
"recordTimestamp", "recordSimpleMeasure",
"recordException", "getSimpleMeasures", "simpleTimer",
"setTelemetryDetails", "getTelemetryDetails",
"callNoUpdateListeners"];
"setTelemetryDetails", "getTelemetryDetails"];
function test_functions() {
for (let prop in AddonManager) {

Просмотреть файл

@ -163,7 +163,6 @@ fail-if = os == "android"
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"
[test_error.js]
[test_experiment.js]
[test_filepointer.js]
# Bug 676992: test consistently hangs on Android
skip-if = os == "android"