Bug 1379508: Part 3 - Support <select> popups in OOP popup browsers. r?zombie draft
authorKris Maglione <maglione.k@gmail.com>
Thu, 13 Jul 2017 15:47:52 -0700
changeset 608642 a69c4c52512f72a18b6c1771ecd1594f4b7fb012
parent 608641 65b8fa0eb658dea04d1d8d3e509c61ebd06fad9d
child 637376 600a75e24b4bad74b7ece04ae0882ddf7a93da59
push id68357
push usermaglione.k@gmail.com
push dateThu, 13 Jul 2017 23:08:44 +0000
reviewerszombie
bugs1379508
milestone56.0a1
Bug 1379508: Part 3 - Support <select> popups in OOP popup browsers. r?zombie MozReview-Commit-ID: BuAjyqg1aja
browser/components/extensions/ExtensionPopups.jsm
browser/components/extensions/test/browser/browser-remote.ini
browser/components/extensions/test/browser/browser_ext_popup_select.js
--- a/browser/components/extensions/ExtensionPopups.jsm
+++ b/browser/components/extensions/ExtensionPopups.jsm
@@ -223,16 +223,17 @@ class BasePopup {
     browser.setAttribute("type", "content");
     browser.setAttribute("disableglobalhistory", "true");
     browser.setAttribute("transparent", "true");
     browser.setAttribute("class", "webextension-popup-browser");
     browser.setAttribute("webextension-view-type", "popup");
     browser.setAttribute("tooltip", "aHTMLTooltip");
     browser.setAttribute("contextmenu", "contentAreaContextMenu");
     browser.setAttribute("autocompletepopup", "PopupAutoComplete");
+    browser.setAttribute("selectmenulist", "ContentSelectDropdown");
     browser.sameProcessAsFrameLoader = this.extension.groupFrameLoader;
 
     if (this.extension.remote) {
       browser.setAttribute("remote", "true");
       browser.setAttribute("remoteType", E10SUtils.EXTENSION_REMOTE_TYPE);
     }
 
     // We only need flex sizing for the sake of the slide-in sub-views of the
--- a/browser/components/extensions/test/browser/browser-remote.ini
+++ b/browser/components/extensions/test/browser/browser-remote.ini
@@ -4,9 +4,11 @@
 # manifests, and include a manifest with a common set of tests from each. In
 # order to detect which manifest we're running from, we install the tests listed
 # in this manifest to the sub-directory "test-oop-extensions", and then check
 # whether we're running from that directory from head.js
 install-to-subdir = test-oop-extensions
 tags = webextensions remote-webextensions
 skip-if = !e10s
 
+[browser_ext_popup_select.js]
+
 [include:browser-common.ini]
new file mode 100644
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_popup_select.js
@@ -0,0 +1,89 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+add_task(async function testPopupSelectPopup() {
+  let extension = ExtensionTestUtils.loadExtension({
+    background() {
+      browser.tabs.query({active: true, currentWindow: true}, tabs => {
+        browser.pageAction.show(tabs[0].id);
+      });
+    },
+
+    manifest: {
+      "browser_action": {
+        "default_popup": "popup.html",
+        "browser_style": false,
+      },
+
+      "page_action": {
+        "default_popup": "popup.html",
+        "browser_style": false,
+      },
+    },
+
+    files: {
+      "popup.html": `<!DOCTYPE html>
+        <html>
+          <head><meta charset="utf-8"></head>
+          <body style="width: 300px; height: 300px;">
+            <div style="text-align: center">
+              <select id="select">
+                <option>Foo</option>
+                <option>Bar</option>
+                <option>Baz</option>
+              </select>
+            </div>
+          </body>
+        </html>`,
+    },
+  });
+
+  await extension.startup();
+
+  let selectPopup = document.getElementById("ContentSelectDropdown").firstChild;
+
+  async function testPanel(browser) {
+    let popupPromise = promisePopupShown(selectPopup);
+
+    BrowserTestUtils.synthesizeMouseAtCenter("#select", {}, browser);
+
+    await popupPromise;
+
+    let elemRect = await ContentTask.spawn(browser, null, async function() {
+      let elem = content.document.getElementById("select");
+      let r = elem.getBoundingClientRect();
+
+      return {left: r.left, bottom: r.bottom};
+    });
+
+    let {boxObject} = browser;
+    let popupRect = selectPopup.getOuterScreenRect();
+
+    is(Math.floor(boxObject.screenX + elemRect.left), popupRect.left,
+       "Select popup has the correct x origin");
+
+    is(Math.floor(boxObject.screenY + elemRect.bottom), popupRect.top,
+       "Select popup has the correct y origin");
+  }
+
+  {
+    info("Test browserAction popup");
+
+    clickBrowserAction(extension);
+    let browser = await awaitExtensionPanel(extension);
+    await testPanel(browser);
+    await closeBrowserAction(extension);
+  }
+
+  {
+    info("Test pageAction popup");
+
+    clickPageAction(extension);
+    let browser = await awaitExtensionPanel(extension);
+    await testPanel(browser);
+    await closePageAction(extension);
+  }
+
+  await extension.unload();
+});