Bug 1388737 - Make about:debugging webextension popup test able to run with oop extension mode enabled.
MozReview-Commit-ID: FsyDdPsQoLC
--- a/devtools/client/aboutdebugging/test/addons/test-devtools-webextension/bg.js
+++ b/devtools/client/aboutdebugging/test/addons/test-devtools-webextension/bg.js
@@ -3,18 +3,21 @@
/* eslint-env browser */
/* global browser */
"use strict";
document.body.innerText = "Background Page Body Test Content";
-// This function are called from the webconsole test:
-// browser_addons_debug_webextension.js
+// These functions are called from the following about:debugging tests:
+// - browser_addons_debug_webextension.js
+// - browser_addons_debug_webextension_popup.js
-function myWebExtensionAddonFunction() { // eslint-disable-line no-unused-vars
+// eslint-disable-next-line no-unused-vars
+function myWebExtensionAddonFunction() {
console.log("Background page function called", browser.runtime.getManifest());
}
-function myWebExtensionShowPopup() { // eslint-disable-line no-unused-vars
- console.log("readyForOpenPopup");
+// eslint-disable-next-line no-unused-vars
+function myWebExtensionShowPopup() {
+ browser.test.sendMessage("readyForOpenPopup");
}
--- a/devtools/client/aboutdebugging/test/addons/test-devtools-webextension/popup.js
+++ b/devtools/client/aboutdebugging/test/addons/test-devtools-webextension/popup.js
@@ -1,13 +1,15 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/* eslint-env browser */
/* global browser */
"use strict";
-// This function is called from the webconsole test:
+// This function is called from the following about:debugging test:
// browser_addons_debug_webextension.js
-function myWebExtensionPopupAddonFunction() { // eslint-disable-line no-unused-vars
- console.log("Popup page function called", browser.runtime.getManifest());
+//
+// eslint-disable-next-line no-unused-vars
+function myWebExtensionPopupAddonFunction() {
+ browser.test.sendMessage("popupPageFunctionCalled", browser.runtime.getManifest());
}
--- a/devtools/client/aboutdebugging/test/browser_addons_debug_webextension_popup.js
+++ b/devtools/client/aboutdebugging/test/browser_addons_debug_webextension_popup.js
@@ -32,86 +32,99 @@ const {
* Returns the widget id for an extension with the passed id.
*/
function makeWidgetId(id) {
id = id.toLowerCase();
return id.replace(/[^a-z0-9_-]/g, "_");
}
add_task(function* testWebExtensionsToolboxSwitchToPopup() {
+ let onReadyForOpenPopup;
+ let onPopupCustomMessage;
+
+ Management.on("startup", function listener(event, extension) {
+ if (extension.name != ADDON_NAME) {
+ return;
+ }
+
+ Management.off("startup", listener);
+
+ function waitForExtensionTestMessage(expectedMessage) {
+ return new Promise(done => {
+ extension.on("test-message", function testLogListener(evt, ...args) {
+ const [message, ] = args;
+
+ if (message !== expectedMessage) {
+ return;
+ }
+
+ extension.off("test-message", testLogListener);
+ done(args);
+ });
+ });
+ }
+
+ // Wait for the test script running in the browser toolbox process
+ // to be ready for selecting the popup page in the frame list selector.
+ onReadyForOpenPopup = waitForExtensionTestMessage("readyForOpenPopup");
+
+ // Wait for a notification sent by a script evaluated the test addon via
+ // the web console.
+ onPopupCustomMessage = waitForExtensionTestMessage("popupPageFunctionCalled");
+ });
+
let {
tab, document, debugBtn,
} = yield setupTestAboutDebuggingWebExtension(ADDON_NAME, ADDON_MANIFEST_PATH);
- let onReadyForOpenPopup = new Promise(done => {
- Services.obs.addObserver(function listener(message, topic) {
- let apiMessage = message.wrappedJSObject;
- if (apiMessage.addonId != ADDON_ID) {
- return;
- }
-
- if (apiMessage.arguments[0] == "readyForOpenPopup") {
- Services.obs.removeObserver(listener, "console-api-log-event");
- done();
- }
- }, "console-api-log-event");
- });
-
// Be careful, this JS function is going to be executed in the addon toolbox,
// which lives in another process. So do not try to use any scope variable!
- let env = Cc["@mozilla.org/process/environment;1"]
- .getService(Ci.nsIEnvironment);
+ let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
+
let testScript = function () {
/* eslint-disable no-undef */
let jsterm;
let popupFramePromise;
toolbox.selectTool("webconsole")
- .then(console => {
+ .then(async (console) => {
dump(`Clicking the noautohide button\n`);
toolbox.doc.getElementById("command-button-noautohide").click();
dump(`Clicked the noautohide button\n`);
popupFramePromise = new Promise(resolve => {
let listener = (event, data) => {
if (data.frames.some(({url}) => url && url.endsWith("popup.html"))) {
toolbox.target.off("frame-update", listener);
resolve();
}
};
toolbox.target.on("frame-update", listener);
});
- let waitForFrameListUpdate = new Promise((done) => {
- toolbox.target.once("frame-update", () => {
- done(console);
- });
- });
+ let waitForFrameListUpdate = toolbox.target.once("frame-update");
jsterm = console.hud.jsterm;
jsterm.execute("myWebExtensionShowPopup()");
- // Wait the initial frame update (which list the background page).
- return waitForFrameListUpdate;
- })
- .then((console) => {
- // Wait the new frame update (once the extension popup has been opened).
- return popupFramePromise;
- })
- .then(() => {
+ await Promise.all([
+ // Wait the initial frame update (which list the background page).
+ waitForFrameListUpdate,
+ // Wait the new frame update (once the extension popup has been opened).
+ popupFramePromise,
+ ]);
+
dump(`Clicking the frame list button\n`);
let btn = toolbox.doc.getElementById("command-button-frames");
- let menu = toolbox.showFramesMenu({target: btn});
+ let frameMenu = toolbox.showFramesMenu({target: btn});
dump(`Clicked the frame list button\n`);
- return menu.once("open").then(() => {
- return menu;
- });
- })
- .then(frameMenu => {
+
+ await frameMenu.once("open");
+
let frames = frameMenu.items;
if (frames.length != 2) {
throw Error(`Number of frames found is wrong: ${frames.length} != 2`);
}
let popupFrameBtn = frames.filter((frame) => {
return frame.label.endsWith("popup.html");
@@ -120,66 +133,50 @@ add_task(function* testWebExtensionsTool
if (!popupFrameBtn) {
throw Error("Extension Popup frame not found in the listed frames");
}
let waitForNavigated = toolbox.target.once("navigate");
popupFrameBtn.click();
- return waitForNavigated;
+ await waitForNavigated;
+
+ await jsterm.execute("myWebExtensionPopupAddonFunction()");
+
+ await toolbox.destroy();
})
- .then(() => {
- return jsterm.execute("myWebExtensionPopupAddonFunction()");
- })
- .then(() => toolbox.destroy())
.catch((error) => {
dump("Error while running code in the browser toolbox process:\n");
dump(error + "\n");
dump("stack:\n" + error.stack + "\n");
});
/* eslint-enable no-undef */
};
env.set("MOZ_TOOLBOX_TEST_SCRIPT", "new " + testScript);
registerCleanupFunction(() => {
env.set("MOZ_TOOLBOX_TEST_SCRIPT", "");
});
- // Wait for a notification sent by a script evaluated the test addon via
- // the web console.
- let onPopupCustomMessage = new Promise(done => {
- Services.obs.addObserver(function listener(message, topic) {
- let apiMessage = message.wrappedJSObject;
- if (apiMessage.addonId != ADDON_ID) {
- return;
- }
-
- if (apiMessage.arguments[0] == "Popup page function called") {
- Services.obs.removeObserver(listener, "console-api-log-event");
- done(apiMessage.arguments);
- }
- }, "console-api-log-event");
- });
-
let onToolboxClose = BrowserToolboxProcess.once("close");
debugBtn.click();
yield onReadyForOpenPopup;
let browserActionId = makeWidgetId(ADDON_ID) + "-browser-action";
let browserActionEl = window.document.getElementById(browserActionId);
ok(browserActionEl, "Got the browserAction button from the browser UI");
browserActionEl.click();
info("Clicked on the browserAction button");
let args = yield onPopupCustomMessage;
ok(true, "Received console message from the popup page function as expected");
- is(args[0], "Popup page function called", "Got the expected console message");
+ is(args[0], "popupPageFunctionCalled", "Got the expected console message");
is(args[1] && args[1].name, ADDON_NAME,
"Got the expected manifest from WebExtension API");
yield onToolboxClose;
ok(true, "Addon toolbox closed");
yield uninstallAddon({document, id: ADDON_ID, name: ADDON_NAME});