Bug 1217129: Part 6 - [webext] Test browserAction popups in both the toolbar and in the menu panel. r?gijs r?billm draft
authorKris Maglione <maglione.k@gmail.com>
Sun, 10 Jan 2016 19:58:09 -0800
changeset 320570 33c48e2b9f772e892305ac841642316b658790c4
parent 320569 b65d62cf3d7a519084ccb04e4902450ff0350a84
child 512771 994fd65c5d06090cc25810dfa527f7e962949886
push id9233
push usermaglione.k@gmail.com
push dateMon, 11 Jan 2016 20:43:12 +0000
reviewersgijs, billm
bugs1217129
milestone46.0a1
Bug 1217129: Part 6 - [webext] Test browserAction popups in both the toolbar and in the menu panel. r?gijs r?billm r? Bill for the test refactoring, Gijs for the PanelUI interaction.
browser/components/extensions/test/browser/.eslintrc
browser/components/extensions/test/browser/browser_ext_browserAction_popup.js
browser/components/extensions/test/browser/browser_ext_pageAction_popup.js
browser/components/extensions/test/browser/head.js
--- a/browser/components/extensions/test/browser/.eslintrc
+++ b/browser/components/extensions/test/browser/.eslintrc
@@ -5,16 +5,19 @@
     "webextensions": true,
   },
 
   "globals": {
     "NetUtil": true,
     "XPCOMUtils": true,
     "Task": true,
 
+    // Browser window globals.
+    "PanelUI": false,
+
     // Test harness globals
     "ExtensionTestUtils": false,
 
     "clickBrowserAction": true,
     "clickPageAction": true,
     "CustomizableUI": true,
     "focusWindow": true,
     "makeWidgetId": true,
--- a/browser/components/extensions/test/browser/browser_ext_browserAction_popup.js
+++ b/browser/components/extensions/test/browser/browser_ext_browserAction_popup.js
@@ -1,27 +1,13 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
-function promisePopupShown(popup) {
-  return new Promise(resolve => {
-    if (popup.state == "open") {
-      resolve();
-    } else {
-      let onPopupShown = event => {
-        popup.removeEventListener("popupshown", onPopupShown);
-        resolve();
-      };
-      popup.addEventListener("popupshown", onPopupShown);
-    }
-  });
-}
-
-add_task(function* testPageActionPopup() {
+function* testInArea(area) {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "background": {
         "page": "data/background.html",
       },
       "browser_action": {
         "default_popup": "popup-a.html",
       },
@@ -111,35 +97,39 @@ add_task(function* testPageActionPopup()
           }
         });
 
         browser.test.sendMessage("next-test");
       },
     },
   });
 
-  let viewId = `PanelUI-webext-${makeWidgetId(extension.id)}-browser-action-view`;
-
   extension.onMessage("send-click", () => {
     clickBrowserAction(extension);
   });
 
+  let widget;
   extension.onMessage("next-test", Task.async(function* () {
-    let panel = getBrowserActionPopup(extension);
-    if (panel) {
-      yield promisePopupShown(panel);
-      panel.hidePopup();
+    if (!widget) {
+      widget = getBrowserActionWidget(extension);
+      CustomizableUI.addWidgetToArea(widget.id, area);
+    }
 
-      panel = getBrowserActionPopup(extension);
-      is(panel, null, "panel successfully removed from document after hiding");
-    }
+    yield closeBrowserAction(extension);
 
     extension.sendMessage("next-test");
   }));
 
-
   yield Promise.all([extension.startup(), extension.awaitFinish("browseraction-tests-done")]);
 
   yield extension.unload();
 
-  let view = document.getElementById(viewId);
+  let view = document.getElementById(widget.viewId);
   is(view, null, "browserAction view removed from document");
+}
+
+add_task(function* testBrowserActionInToolbar() {
+  yield testInArea(CustomizableUI.AREA_NAVBAR);
 });
+
+add_task(function* testBrowserActionInPanel() {
+  yield testInArea(CustomizableUI.AREA_PANEL);
+});
--- a/browser/components/extensions/test/browser/browser_ext_pageAction_popup.js
+++ b/browser/components/extensions/test/browser/browser_ext_pageAction_popup.js
@@ -1,26 +1,12 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
-function promisePopupShown(popup) {
-  return new Promise(resolve => {
-    if (popup.popupOpen) {
-      resolve();
-    } else {
-      let onPopupShown = event => {
-        popup.removeEventListener("popupshown", onPopupShown);
-        resolve();
-      };
-      popup.addEventListener("popupshown", onPopupShown);
-    }
-  });
-}
-
 add_task(function* testPageActionPopup() {
   let scriptPage = url => `<html><head><meta charset="utf-8"><script src="${url}"></script></head></html>`;
 
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "background": {
         "page": "data/background.html",
       },
--- a/browser/components/extensions/test/browser/head.js
+++ b/browser/components/extensions/test/browser/head.js
@@ -1,16 +1,18 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
 /* exported CustomizableUI makeWidgetId focusWindow
+ *          getBrowserActionWidget
  *          clickBrowserAction clickPageAction
  *          getBrowserActionPopup getPageActionPopup
  *          closeBrowserAction closePageAction
+ *          promisePopupShown
  */
 
 var {CustomizableUI} = Cu.import("resource:///modules/CustomizableUI.jsm");
 
 function makeWidgetId(id) {
   id = id.toLowerCase();
   return id.replace(/[^a-z0-9_-]/g, "_");
 }
@@ -27,33 +29,61 @@ var focusWindow = Task.async(function* f
       resolve();
     }, true);
   });
 
   win.focus();
   yield promise;
 });
 
-function getBrowserActionPopup(extension, win = window) {
-  return win.document.getElementById("customizationui-widget-panel");
+function promisePopupShown(popup) {
+  return new Promise(resolve => {
+    if (popup.state == "open") {
+      resolve();
+    } else {
+      let onPopupShown = event => {
+        popup.removeEventListener("popupshown", onPopupShown);
+        resolve();
+      };
+      popup.addEventListener("popupshown", onPopupShown);
+    }
+  });
+}
+
+function getBrowserActionWidget(extension) {
+  return CustomizableUI.getWidget(makeWidgetId(extension.id) + "-browser-action");
 }
 
-function clickBrowserAction(extension, win = window) {
-  let browserActionId = makeWidgetId(extension.id) + "-browser-action";
-  let elem = win.document.getElementById(browserActionId);
+function getBrowserActionPopup(extension, win = window) {
+  let group = getBrowserActionWidget(extension);
 
-  EventUtils.synthesizeMouseAtCenter(elem, {}, win);
-  return new Promise(SimpleTest.executeSoon);
+  if (group.areaType == CustomizableUI.TYPE_TOOLBAR) {
+    return win.document.getElementById("customizationui-widget-panel");
+  }
+  return null;
 }
 
+var clickBrowserAction = Task.async(function* (extension, win = window) {
+  let group = getBrowserActionWidget(extension);
+  let widget = group.forWindow(win);
+
+  if (group.areaType == CustomizableUI.TYPE_TOOLBAR) {
+    ok(!widget.overflowed, "Expect widget not to be overflowed");
+  } else if (group.areaType == CustomizableUI.TYPE_MENU_PANEL) {
+    yield PanelUI.show();
+  }
+
+  EventUtils.synthesizeMouseAtCenter(widget.node, {}, win);
+});
+
 function closeBrowserAction(extension, win = window) {
-  let node = getBrowserActionPopup(extension, win);
-  if (node) {
-    node.hidePopup();
-  }
+  let group = getBrowserActionWidget(extension);
+
+  let node = document.getElementById(group.viewId);
+  CustomizableUI.hidePanelForNode(node);
 
   return Promise.resolve();
 }
 
 function getPageActionPopup(extension, win = window) {
   let panelId = makeWidgetId(extension.id) + "-panel";
   return win.document.getElementById(panelId);
 }