summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_menus_targetElement_shadow.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/extensions/test/browser/browser_ext_menus_targetElement_shadow.js')
-rw-r--r--browser/components/extensions/test/browser/browser_ext_menus_targetElement_shadow.js108
1 files changed, 108 insertions, 0 deletions
diff --git a/browser/components/extensions/test/browser/browser_ext_menus_targetElement_shadow.js b/browser/components/extensions/test/browser/browser_ext_menus_targetElement_shadow.js
new file mode 100644
index 0000000000..115f4fe96a
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_menus_targetElement_shadow.js
@@ -0,0 +1,108 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+const PAGE =
+ "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context.html";
+
+add_task(async function menuInShadowDOM() {
+ Services.prefs.setBoolPref("security.allow_eval_with_system_principal", true);
+ registerCleanupFunction(() => {
+ Services.prefs.clearUserPref("security.allow_eval_with_system_principal");
+ });
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, PAGE);
+ gBrowser.selectedTab = tab;
+
+ async function background() {
+ browser.menus.onShown.addListener(async (info, tab) => {
+ browser.test.assertTrue(
+ Number.isInteger(info.targetElementId),
+ `${info.targetElementId} should be an integer`
+ );
+ browser.test.assertEq(
+ "all,link",
+ info.contexts.sort().join(","),
+ "Expected context"
+ );
+ browser.test.assertEq(
+ "http://example.com/?shadowlink",
+ info.linkUrl,
+ "Menu target should be a link in the shadow DOM"
+ );
+
+ let code = `{
+ try {
+ let elem = browser.menus.getTargetElement(${info.targetElementId});
+ browser.test.assertTrue(elem, "Shadow element must be found");
+ browser.test.assertEq("http://example.com/?shadowlink", elem.href, "Element is a link in shadow DOM " - elem.outerHTML);
+ } catch (e) {
+ browser.test.fail("Unexpected error in getTargetElement: " + e);
+ }
+ }`;
+ await browser.tabs.executeScript(tab.id, { code });
+ browser.test.sendMessage(
+ "onShownMenuAndCheckedInfo",
+ info.targetElementId
+ );
+ });
+
+ // Ensure that onShown is registered (workaround for bug 1300234):
+ await browser.menus.removeAll();
+ browser.test.sendMessage("ready");
+ }
+
+ let extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ permissions: ["menus", "http://mochi.test/*"],
+ },
+ background,
+ });
+
+ await extension.startup();
+ await extension.awaitMessage("ready");
+
+ async function testShadowMenu(setupMenuTarget) {
+ await openContextMenu(setupMenuTarget);
+ await extension.awaitMessage("onShownMenuAndCheckedInfo");
+ await closeContextMenu();
+ }
+
+ info("Clicking in open shadow root");
+ await testShadowMenu(() => {
+ let doc = this.document;
+ doc.body.innerHTML = `<div></div>`;
+ let host = doc.body.firstElementChild.attachShadow({ mode: "open" });
+ host.innerHTML = `<a href="http://example.com/?shadowlink">Test open</a>`;
+ this.document.testTarget = host.firstElementChild;
+ return this.document.testTarget;
+ });
+
+ info("Clicking in closed shadow root");
+ await testShadowMenu(() => {
+ let doc = this.document;
+ doc.body.innerHTML = `<div></div>`;
+ let host = doc.body.firstElementChild.attachShadow({ mode: "closed" });
+ host.innerHTML = `<a href="http://example.com/?shadowlink">Test closed</a>`;
+ this.document.testTarget = host.firstElementChild;
+ return this.document.testTarget;
+ });
+
+ info("Clicking in nested shadow DOM");
+ await testShadowMenu(() => {
+ let doc = this.document;
+ let host;
+ for (let container = doc.body, i = 0; i < 10; ++i) {
+ container.innerHTML = `<div id="level"></div>`;
+ host = container.firstElementChild.attachShadow({ mode: "open" });
+ container = host;
+ }
+ host.innerHTML = `<a href="http://example.com/?shadowlink">Test nested</a>`;
+ this.document.testTarget = host.firstElementChild;
+ return this.document.testTarget;
+ });
+
+ await extension.unload();
+ BrowserTestUtils.removeTab(tab);
+});