Bug 1253148: [webext] Cleanup running extensions on test failure. r=billm

MozReview-Commit-ID: HTFZk6y6ZEp

--HG--
extra : rebase_source : 476d51fba97989b8bcbcdb6720d53f1820db8fc9
This commit is contained in:
Kris Maglione 2016-03-02 20:58:28 -08:00
Родитель f92f7a7fae
Коммит fbcae3eafe
3 изменённых файлов: 32 добавлений и 2 удалений

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

@ -145,7 +145,11 @@ function Tester(aTests, structuredLogger, aCallback) {
this._scriptLoader.loadSubScript("chrome://mochikit/content/chrome-harness.js", simpleTestScope);
this.SimpleTest = simpleTestScope.SimpleTest;
var extensionUtilsScope = {};
var extensionUtilsScope = {
registerCleanupFunction: (fn) => {
this.currentTest.scope.registerCleanupFunction(fn);
},
};
extensionUtilsScope.SimpleTest = this.SimpleTest;
this._scriptLoader.loadSubScript("chrome://mochikit/content/tests/SimpleTest/ExtensionTestUtils.js", extensionUtilsScope);
this.ExtensionTestUtils = extensionUtilsScope.ExtensionTestUtils;

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

@ -2,6 +2,15 @@ var ExtensionTestUtils = {};
ExtensionTestUtils.loadExtension = function(ext, id = null)
{
// Cleanup functions need to be registered differently depending on
// whether we're in browser chrome or plain mochitests.
var registerCleanup;
if (typeof registerCleanupFunction != "undefined") {
registerCleanup = registerCleanupFunction;
} else {
registerCleanup = SimpleTest.registerCleanupFunction.bind(SimpleTest);
}
var testResolve;
var testDone = new Promise(resolve => { testResolve = resolve; });
@ -10,7 +19,7 @@ ExtensionTestUtils.loadExtension = function(ext, id = null)
var messageQueue = new Set();
SimpleTest.registerCleanupFunction(() => {
registerCleanup(() => {
if (messageQueue.size) {
SimpleTest.is(messageQueue.size, 0, "message queue is empty");
}
@ -74,6 +83,15 @@ ExtensionTestUtils.loadExtension = function(ext, id = null)
var extension = SpecialPowers.loadExtension(id, ext, handler);
registerCleanup(() => {
if (extension.state == "pending" || extension.state == "running") {
SimpleTest.ok(false, "Extension left running at test shutdown")
return extension.unload();
} else if (extension.state == "unloading") {
SimpleTest.ok(false, "Extension not fully unloaded at test shutdown")
}
});
extension.awaitMessage = (msg) => {
return new Promise(resolve => {
checkDuplicateListeners(msg);

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

@ -1881,15 +1881,20 @@ SpecialPowersAPI.prototype = {
ext = Cu.waiveXrays(ext);
let sp = this;
let state = "uninitialized";
let extension = {
id,
get state() { return state; },
startup() {
state = "pending";
sp._sendAsyncMessage("SPStartupExtension", {id});
return startupPromise;
},
unload() {
state = "unloading";
sp._sendAsyncMessage("SPUnloadExtension", {id});
return unloadPromise;
},
@ -1904,11 +1909,14 @@ SpecialPowersAPI.prototype = {
let listener = (msg) => {
if (msg.data.id == id) {
if (msg.data.type == "extensionStarted") {
state = "running";
resolveStartup();
} else if (msg.data.type == "extensionFailed") {
state = "failed";
rejectStartup("startup failed");
} else if (msg.data.type == "extensionUnloaded") {
this._removeMessageListener("SPExtensionMessage", listener);
state = "unloaded";
resolveUnload();
} else if (msg.data.type in handler) {
handler[msg.data.type](...msg.data.args);