Bug 1385548 - Part 2: Add new test for tab modals created from a WebExtensions options_ui page.
MozReview-Commit-ID: BUExkEQLkuR
--- a/browser/components/extensions/test/browser/browser-common.ini
+++ b/browser/components/extensions/test/browser/browser-common.ini
@@ -88,16 +88,17 @@ skip-if = (os == 'win' && !debug) # bug
[browser_ext_incognito_views.js]
[browser_ext_incognito_popup.js]
[browser_ext_lastError.js]
[browser_ext_menus.js]
[browser_ext_omnibox.js]
skip-if = debug || asan # Bug 1354681
[browser_ext_openPanel.js]
[browser_ext_optionsPage_browser_style.js]
+[browser_ext_optionsPage_modals.js]
[browser_ext_optionsPage_privileges.js]
[browser_ext_pageAction_context.js]
[browser_ext_pageAction_contextMenu.js]
[browser_ext_pageAction_popup.js]
[browser_ext_pageAction_popup_resize.js]
[browser_ext_pageAction_simple.js]
[browser_ext_pageAction_telemetry.js]
[browser_ext_pageAction_title.js]
new file mode 100644
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_optionsPage_modals.js
@@ -0,0 +1,94 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+add_task(async function test_tab_options_modals() {
+ function backgroundScript() {
+ browser.runtime.openOptionsPage();
+ }
+
+ function optionsScript() {
+ try {
+ alert("WebExtensions OptionsUI Page Modal");
+
+ browser.test.notifyPass("options-ui-modals");
+ } catch (error) {
+ browser.test.log(`Error: ${error} :: ${error.stack}`);
+ browser.test.notifyFail("options-ui-modals");
+ }
+ }
+
+ let extension = ExtensionTestUtils.loadExtension({
+ useAddonManager: "temporary",
+
+ manifest: {
+ "permissions": ["tabs"],
+ "options_ui": {
+ "page": "options.html",
+ },
+ },
+ files: {
+ "options.html": `<!DOCTYPE html>
+ <html>
+ <head>
+ <meta charset="utf-8">
+ <script src="options.js" type="text/javascript"></script>
+ </head>
+ </html>`,
+ "options.js": optionsScript,
+ },
+ background: backgroundScript,
+ });
+
+ await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:addons");
+
+ await extension.startup();
+
+ const onceModalOpened = new Promise(resolve => {
+ const aboutAddonsBrowser = gBrowser.selectedBrowser;
+
+ aboutAddonsBrowser.addEventListener("DOMWillOpenModalDialog", function onModalDialog(event) {
+ if (Cu.isCrossProcessWrapper(event.target)) {
+ // This event fires in both the content and chrome processes. We
+ // want to ignore the one in the content process.
+ return;
+ }
+
+ aboutAddonsBrowser.removeEventListener("DOMWillOpenModalDialog", onModalDialog, true);
+ resolve();
+ }, true);
+ });
+
+ info("Wait the options_ui modal to be opened");
+ await onceModalOpened;
+
+ const optionsBrowser = gBrowser.selectedBrowser.contentDocument
+ .getElementById("addon-options");
+
+ let stack;
+
+ // For remote extensions, the stack that contains the tabmodalprompt elements
+ // is the parent of the extensions options_ui browser element, otherwise it would
+ // be the parent of the currently selected tabbrowser's browser.
+ if (optionsBrowser.isRemoteBrowser) {
+ stack = optionsBrowser.parentNode;
+ } else {
+ stack = gBrowser.selectedBrowser.parentNode;
+ }
+
+ let dialogs = stack.querySelectorAll("tabmodalprompt");
+
+ Assert.equal(dialogs.length, 1, "Expect a tab modal opened for the about addons tab");
+
+ info("Close the tab modal prompt");
+ dialogs[0].onButtonClick(0);
+
+ await extension.awaitFinish("options-ui-modals");
+
+ Assert.equal(stack.querySelectorAll("tabmodalprompt").length, 0,
+ "Expect the tab modal to be closed");
+
+ await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+
+ await extension.unload();
+});