Bug 1286908 Part 1: refactor existing webextensions browser tests r?kmag
These tests all assume that an extension id will be allocated as part
of loadExtension(). To pave the way for removing the code that allocates
ids from special powers, adapt these tests so that they don't reference
the extension's id until after the extension has been started.
MozReview-Commit-ID: 4HxFFomlfZS
--- a/browser/components/extensions/test/browser/browser_ext_browserAction_context.js
+++ b/browser/components/extensions/test/browser/browser_ext_browserAction_context.js
@@ -54,17 +54,17 @@ function* runTests(options) {
// run the next test.
new Promise(resolve => {
return browser.tabs.query({active: true, currentWindow: true}, resolve);
}).then(tabs => {
return checkDetails(expecting, tabs[0].id);
}).then(() => {
// Check that the actual icon has the expected values, then
// run the next test.
- browser.test.sendMessage("nextTest", expecting, tests.length);
+ browser.test.sendMessage("nextTest", {expecting, remaining: tests.length});
});
});
}
browser.test.onMessage.addListener((msg) => {
if (msg != "runNextTest") {
browser.test.fail("Expecting 'runNextTest' message");
}
@@ -81,19 +81,19 @@ function* runTests(options) {
let extension = ExtensionTestUtils.loadExtension({
manifest: options.manifest,
files: options.files || {},
background: `(${background})(${options.getTests})`,
});
-
+ yield extension.startup();
- let browserActionId = makeWidgetId(extension.id) + "-browser-action";
+ let browserActionId = `${makeWidgetId(extension.id)}-browser-action`;
function checkDetails(details) {
let button = document.getElementById(browserActionId);
ok(button, "button exists");
let title = details.title || options.manifest.name;
@@ -113,31 +113,25 @@ function* runTests(options) {
is(badgeColor, expectedColor, "badge color is correct");
}
// TODO: Popup URL.
}
- let awaitFinish = new Promise(resolve => {
- extension.onMessage("nextTest", (expecting, testsRemaining) => {
- checkDetails(expecting);
-
- if (testsRemaining) {
- extension.sendMessage("runNextTest");
- } else {
- resolve();
- }
- });
- });
-
- yield extension.startup();
-
- yield awaitFinish;
+ while (true) {
+ let results = yield extension.awaitMessage("nextTest");
+ checkDetails(results.expecting);
+ if (results.remaining > 0) {
+ extension.sendMessage("runNextTest");
+ } else {
+ break;
+ }
+ }
yield extension.unload();
}
add_task(function* testTabSwitchContext() {
yield runTests({
manifest: {
"browser_action": {
--- a/browser/components/extensions/test/browser/browser_ext_browserAction_pageAction_icon.js
+++ b/browser/components/extensions/test/browser/browser_ext_browserAction_pageAction_icon.js
@@ -249,25 +249,25 @@ add_task(function* testDetailsObjects()
"a.png": imageBuffer,
"data/2.png": imageBuffer,
"data/100.png": imageBuffer,
"data/a.png": imageBuffer,
"data/a-x2.png": imageBuffer,
},
});
+ yield extension.startup();
+ let tests = yield extension.awaitMessage("ready");
+
const RESOLUTION_PREF = "layout.css.devPixelsPerPx";
- let pageActionId = makeWidgetId(extension.id) + "-page-action";
+ let pageActionId = `${makeWidgetId(extension.id)}-page-action`;
let browserActionWidget = getBrowserActionWidget(extension);
- yield extension.startup();
- let tests = yield extension.awaitMessage("ready");
-
for (let test of tests) {
extension.sendMessage("setIcon", test);
yield extension.awaitMessage("iconSet");
let browserActionButton = browserActionWidget.forWindow(window).node;
let pageActionImage = document.getElementById(pageActionId);
--- a/browser/components/extensions/test/browser/browser_ext_browserAction_popup.js
+++ b/browser/components/extensions/test/browser/browser_ext_browserAction_popup.js
@@ -115,52 +115,58 @@ function* testInArea(area) {
if (msg != "next-test") {
browser.test.fail("Expecting 'next-test' message");
}
if (tests.length) {
let test = tests.shift();
test();
} else {
+ browser.test.sendMessage("next-test", {finished: true});
browser.test.notifyPass("browseraction-tests-done");
}
});
browser.test.sendMessage("next-test");
},
},
});
extension.onMessage("send-click", () => {
clickBrowserAction(extension);
});
- let widget;
- extension.onMessage("next-test", Task.async(function* (expecting = {}) {
- if (!widget) {
- widget = getBrowserActionWidget(extension);
- CustomizableUI.addWidgetToArea(widget.id, area);
+ yield extension.startup();
+
+ let widget = getBrowserActionWidget(extension);
+ CustomizableUI.addWidgetToArea(widget.id, area);
+
+ while (true) {
+ let expecting = yield extension.awaitMessage("next-test");
+ expecting = expecting || {};
+ if (expecting.finished) {
+ break;
}
if (expecting.expectClosed) {
let panel = getBrowserActionPopup(extension);
ok(panel, "Expect panel to exist");
yield promisePopupShown(panel);
extension.sendMessage("close-popup");
yield promisePopupHidden(panel);
ok(true, "Panel is closed");
} else {
yield closeBrowserAction(extension);
}
extension.sendMessage("next-test");
- }));
+ }
- yield Promise.all([extension.startup(), extension.awaitFinish("browseraction-tests-done")]);
+ yield extension.awaitFinish("browseraction-tests-done");
yield extension.unload();
let view = document.getElementById(widget.viewId);
is(view, null, "browserAction view removed from document");
}
add_task(function* testBrowserActionInToolbar() {
--- a/browser/components/extensions/test/browser/browser_ext_incognito_popup.js
+++ b/browser/components/extensions/test/browser/browser_ext_incognito_popup.js
@@ -44,42 +44,45 @@ add_task(function* testIncognitoPopup()
browser.test.sendMessage("click-browserAction");
return awaitPopup(window.id);
}).then(msg => {
browser.test.assertEq(window.incognito, msg.incognito, "Correct incognito status in browserAction popup");
});
};
- const URL = "http://example.com/incognito";
- let windowReady = new Promise(resolve => {
- browser.tabs.onUpdated.addListener(function listener(tabId, changed, tab) {
- if (changed.status == "complete" && tab.url == URL) {
- browser.tabs.onUpdated.removeListener(listener);
- resolve();
- }
+ browser.test.onMessage.addListener(msg => {
+ const URL = "http://example.com/incognito";
+ let windowReady = new Promise(resolve => {
+ browser.tabs.onUpdated.addListener(function listener(tabId, changed, tab) {
+ if (changed.status == "complete" && tab.url == URL) {
+ browser.tabs.onUpdated.removeListener(listener);
+ resolve();
+ }
+ });
+ });
+
+ browser.windows.getCurrent().then(window => {
+ return testWindow(window);
+ }).then(() => {
+ return browser.windows.create({incognito: true, url: URL});
+ }).then(window => {
+ return windowReady.then(() => {
+ return testWindow(window);
+ }).then(() => {
+ return browser.windows.remove(window.id);
+ });
+ }).then(() => {
+ browser.test.notifyPass("incognito");
+ }).catch(error => {
+ browser.test.fail(`Error: ${error} :: ${error.stack}`);
+ browser.test.notifyFail("incognito");
});
});
-
- browser.windows.getCurrent().then(window => {
- return testWindow(window);
- }).then(() => {
- return browser.windows.create({incognito: true, url: URL});
- }).then(window => {
- return windowReady.then(() => {
- return testWindow(window);
- }).then(() => {
- return browser.windows.remove(window.id);
- });
- }).then(() => {
- browser.test.notifyPass("incognito");
- }).catch(error => {
- browser.test.fail(`Error: ${error} :: ${error.stack}`);
- browser.test.notifyFail("incognito");
- });
+ browser.test.sendMessage("ready");
},
files: {
"popup.html": '<html><head><meta charset="utf-8"><script src="popup.js"></script></head></html>',
"popup.js": function() {
browser.windows.getCurrent().then(win => {
browser.runtime.sendMessage({
@@ -88,20 +91,24 @@ add_task(function* testIncognitoPopup()
incognito: browser.extension.inIncognitoContext,
});
window.close();
});
},
},
});
+ yield extension.startup();
+
extension.onMessage("click-browserAction", () => {
clickBrowserAction(extension, Services.wm.getMostRecentWindow("navigator:browser"));
});
extension.onMessage("click-pageAction", () => {
clickPageAction(extension, Services.wm.getMostRecentWindow("navigator:browser"));
});
- yield extension.startup();
+ yield extension.awaitMessage("ready");
+ extension.sendMessage("go");
+
yield extension.awaitFinish("incognito");
yield extension.unload();
});
--- a/browser/components/extensions/test/browser/browser_ext_pageAction_context.js
+++ b/browser/components/extensions/test/browser/browser_ext_pageAction_context.js
@@ -29,17 +29,17 @@ function* runTests(options) {
// and passes control back to the outer test scope.
function nextTest() {
let test = tests.shift();
test(expecting => {
function finish() {
// Check that the actual icon has the expected values, then
// run the next test.
- browser.test.sendMessage("nextTest", expecting, tests.length);
+ browser.test.sendMessage("nextTest", {expecting, remaining: tests.length});
}
if (expecting) {
// Check that the API returns the expected values, and then
// run the next test.
getDetails().then(details => {
browser.test.assertEq(expecting.title, details.title,
"expected value from getTitle");
@@ -70,29 +70,29 @@ function* runTests(options) {
if (msg == "runTests") {
runTests();
} else if (msg == "runNextTest") {
nextTest();
} else {
browser.test.fail(`Unexpected message: ${msg}`);
}
});
-
- runTests();
}
let extension = ExtensionTestUtils.loadExtension({
manifest: options.manifest,
files: options.files || {},
background: `(${background})(${options.getTests})`,
});
- let pageActionId = makeWidgetId(extension.id) + "-page-action";
+ yield extension.startup();
+
+ let pageActionId = `${makeWidgetId(extension.id)}-page-action`;
let currentWindow = window;
let windows = [];
function checkDetails(details) {
let image = currentWindow.document.getElementById(pageActionId);
if (details == null) {
ok(image == null || image.hidden, "image is hidden");
} else {
@@ -104,41 +104,38 @@ function* runTests(options) {
is(image.getAttribute("tooltiptext"), title, "image title is correct");
is(image.getAttribute("aria-label"), title, "image aria-label is correct");
// TODO: Popup URL.
}
}
let testNewWindows = 1;
- let awaitFinish = new Promise(resolve => {
- extension.onMessage("nextTest", (expecting, testsRemaining) => {
- checkDetails(expecting);
+ extension.sendMessage("runTests");
+ while (true) {
+ let result = yield extension.awaitMessage("nextTest");
- if (testsRemaining) {
- extension.sendMessage("runNextTest");
- } else if (testNewWindows) {
- testNewWindows--;
+ checkDetails(result.expecting);
+
+ if (result.remaining > 0) {
+ extension.sendMessage("runNextTest");
+ } else if (testNewWindows) {
+ testNewWindows--;
- BrowserTestUtils.openNewBrowserWindow().then(window => {
- windows.push(window);
- currentWindow = window;
- return focusWindow(window);
- }).then(() => {
- extension.sendMessage("runTests");
- });
- } else {
- resolve();
- }
- });
- });
-
- yield extension.startup();
-
- yield awaitFinish;
+ BrowserTestUtils.openNewBrowserWindow().then(window => {
+ windows.push(window);
+ currentWindow = window;
+ return focusWindow(window);
+ }).then(() => {
+ extension.sendMessage("runTests");
+ });
+ } else if (testNewWindows == 0) {
+ break;
+ }
+ }
yield extension.unload();
let node = document.getElementById(pageActionId);
is(node, null, "pageAction image removed from document");
currentWindow = null;
for (let win of windows.splice(0)) {
--- a/browser/components/extensions/test/browser/browser_ext_pageAction_popup.js
+++ b/browser/components/extensions/test/browser/browser_ext_pageAction_popup.js
@@ -131,24 +131,28 @@ add_task(function* testPageActionPopup()
browser.pageAction.show(tabId).then(() => {
browser.test.sendMessage("next-test");
});
});
},
},
});
- let pageActionId = makeWidgetId(extension.id) + "-page-action";
- let panelId = makeWidgetId(extension.id) + "-panel";
+ yield extension.startup();
+
+ let pageActionId = `${makeWidgetId(extension.id)}-page-action`;
+ let panelId = `${makeWidgetId(extension.id)}-panel`;
extension.onMessage("send-click", () => {
clickPageAction(extension);
});
- extension.onMessage("next-test", Task.async(function* (expecting = {}) {
+ while (true) {
+ let expecting = yield extension.awaitMessage("next-test");
+ expecting = expecting || {};
let panel = document.getElementById(panelId);
if (expecting.expectClosed) {
ok(panel, "Expect panel to exist");
yield promisePopupShown(panel);
extension.sendMessage("close-popup");
yield promisePopupHidden(panel);
@@ -159,20 +163,22 @@ add_task(function* testPageActionPopup()
}
if (panel) {
panel = document.getElementById(panelId);
is(panel, null, "panel successfully removed from document after hiding");
}
extension.sendMessage("next-test");
- }));
+ if (expecting.expectClosed) {
+ break;
+ }
+ }
- yield extension.startup();
yield extension.awaitFinish("pageaction-tests-done");
yield extension.unload();
let node = document.getElementById(pageActionId);
is(node, null, "pageAction image removed from document");
let panel = document.getElementById(panelId);