Bug 1379508: Part 3 - Support <select> popups in OOP popup browsers. r?zombie
MozReview-Commit-ID: BuAjyqg1aja
--- 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();
+});