Bug 1388737 - Make about:debugging webextension popup test able to run with oop extension mode enabled. draft
authorLuca Greco <lgreco@mozilla.com>
Wed, 09 Aug 2017 13:55:13 +0200
changeset 643266 19b4bc5469edd4e13cd65d61eac8084b4f3f3b92
parent 643173 4c5fbf49376351679dcc49f4cff26c3c2e055ccc
child 725252 60f3cd7b0eb4e169381738fd49add665e13e4007
push id73040
push userluca.greco@alcacoop.it
push dateWed, 09 Aug 2017 14:15:19 +0000
bugs1388737
milestone57.0a1
Bug 1388737 - Make about:debugging webextension popup test able to run with oop extension mode enabled. MozReview-Commit-ID: FsyDdPsQoLC
devtools/client/aboutdebugging/test/addons/test-devtools-webextension/bg.js
devtools/client/aboutdebugging/test/addons/test-devtools-webextension/popup.js
devtools/client/aboutdebugging/test/browser_addons_debug_webextension_popup.js
--- 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});