Bug 1286908 Part 1: refactor existing webextensions browser tests r?kmag draft
authorAndrew Swan <aswan@mozilla.com>
Tue, 02 Aug 2016 15:57:48 -0700
changeset 395847 f3515807c727f45b82744918e74423ae4f961b54
parent 394995 ffac2798999c5b84f1b4605a1280994bb665a406
child 395848 151d8d2f0fa54aba946bb27a78a059d449189231
push id24862
push useraswan@mozilla.com
push dateTue, 02 Aug 2016 23:16:50 +0000
reviewerskmag
bugs1286908
milestone51.0a1
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
browser/components/extensions/test/browser/browser_ext_browserAction_context.js
browser/components/extensions/test/browser/browser_ext_browserAction_pageAction_icon.js
browser/components/extensions/test/browser/browser_ext_browserAction_popup.js
browser/components/extensions/test/browser/browser_ext_incognito_popup.js
browser/components/extensions/test/browser/browser_ext_pageAction_context.js
browser/components/extensions/test/browser/browser_ext_pageAction_popup.js
--- 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);