author | Georg Fritzsche <georg.fritzsche@googlemail.com> |
Thu, 17 Apr 2014 15:47:37 +0200 | |
changeset 179062 | 36bc9e63aba710eb6b0c4ac72553d04259c073c6 |
parent 179061 | 57bc0a61010365d8b53c82e3e12daafc7e59e438 |
child 179063 | 5a9d701731a1143118ad6258517545ab17615029 |
push id | 26606 |
push user | ryanvm@gmail.com |
push date | Fri, 18 Apr 2014 02:20:00 +0000 |
treeherder | mozilla-central@ec728bfdbb79 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | bsmedberg |
bugs | 989137 |
milestone | 31.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
browser/experiments/Experiments.jsm | file | annotate | diff | comparison | revisions | |
toolkit/mozapps/extensions/test/browser/browser_experiments.js | file | annotate | diff | comparison | revisions |
--- a/browser/experiments/Experiments.jsm +++ b/browser/experiments/Experiments.jsm @@ -322,16 +322,24 @@ Experiments.Policy.prototype = { }); }, telemetryPayload: function () { return TelemetryPing.getPayload(); }, }; +function AlreadyShutdownError(message="already shut down") { + this.name = "AlreadyShutdownError"; + this.message = message; +} + +AlreadyShutdownError.prototype = new Error(); +AlreadyShutdownError.prototype.constructor = AlreadyShutdownError; + /** * Manages the experiments and provides an interface to control them. */ Experiments.Experiments = function (policy=new Experiments.Policy()) { this._log = Log.repository.getLoggerWithMessagePrefix( "Browser.Experiments.Experiments", "Experiments #" + gExperimentsCounter++ + "::"); @@ -429,17 +437,21 @@ Experiments.Experiments.prototype = { if (this._timer) { this._timer.clear(); } } this._shutdown = true; if (this._mainTask) { - yield this._mainTask; + try { + yield this._mainTask; + } catch (e if e instanceof AlreadyShutdownError) { + // We error out of tasks after shutdown via that exception. + } } this._log.info("Completed uninitialization."); }), _registerWithAddonManager: function () { this._log.trace("Registering instance with Addon Manager."); @@ -452,17 +464,17 @@ Experiments.Experiments.prototype = { AddonManager.removeAddonListener(this); }, /** * Throws an exception if we've already shut down. */ _checkForShutdown: function() { if (this._shutdown) { - throw Error("uninit() already called"); + throw new AlreadyShutdownError("uninit() already called"); } }, /** * Whether the experiments feature is enabled. */ get enabled() { return gExperimentsEnabled;
--- a/toolkit/mozapps/extensions/test/browser/browser_experiments.js +++ b/toolkit/mozapps/extensions/test/browser/browser_experiments.js @@ -34,16 +34,17 @@ add_task(function* initializeState() { // not the superset Experiments Manager has imposed. if ("@mozilla.org/browser/experiments-service;1" in Components.classes) { let tmp = {}; Components.utils.import("resource:///modules/experiments/Experiments.jsm", tmp); // There is a race condition between XPCOM service initialization and // this test running. We have to initialize the instance first, then // uninitialize it to prevent this. gExperiments = tmp.Experiments.instance(); + yield gExperiments._mainTask; yield gExperiments.uninit(); } }); // On an empty profile with no experiments, the experiment category // should be hidden. add_task(function* testInitialState() { Assert.ok(gCategoryUtilities.get("experiment", false), "Experiment tab is defined.");