From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../test/browser/browser_ext_menus_accesskey.js | 209 +++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 browser/components/extensions/test/browser/browser_ext_menus_accesskey.js (limited to 'browser/components/extensions/test/browser/browser_ext_menus_accesskey.js') diff --git a/browser/components/extensions/test/browser/browser_ext_menus_accesskey.js b/browser/components/extensions/test/browser/browser_ext_menus_accesskey.js new file mode 100644 index 0000000000..88c89902ac --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_menus_accesskey.js @@ -0,0 +1,209 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +"use strict"; + +const PAGE = + "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context.html"; + +add_task(async function accesskeys() { + let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, PAGE); + gBrowser.selectedTab = tab; + + async function background() { + // description is informative. + // title is passed to menus.create. + // label and key are compared with the actual values. + const TESTCASES = [ + { + description: "Amp at start", + title: "&accesskey", + label: "accesskey", + key: "a", + }, + { + description: "amp in between", + title: "A& b", + label: "A b", + key: " ", + }, + { + description: "lonely amp", + title: "&", + label: "", + key: "", + }, + { + description: "amp at end", + title: "End &", + label: "End ", + key: "", + }, + { + description: "escaped amp", + title: "A && B", + label: "A & B", + key: "", + }, + { + description: "amp before escaped amp", + title: "A &T&& before", + label: "A T& before", + key: "T", + }, + { + description: "amp after escaped amp", + title: "A &&&T after", + label: "A &T after", + key: "T", + }, + { + // Only the first amp should be used as the access key. + description: "amp, escaped amp, amp to ignore", + title: "First &1 comes && first &2 serves", + label: "First 1 comes & first 2 serves", + key: "1", + }, + { + description: "created with amp, updated without amp", + title: "temp with &X", // will be updated below. + label: "remove amp", + key: "", + }, + { + description: "created without amp, update with amp", + title: "temp without access key", // will be updated below. + label: "add ampY", + key: "Y", + }, + ]; + + let menuIds = TESTCASES.map(({ title }) => browser.menus.create({ title })); + + // Should clear the access key: + await browser.menus.update(menuIds[menuIds.length - 2], { + title: "remove amp", + }); + + // Should add an access key: + await browser.menus.update(menuIds[menuIds.length - 1], { + title: "add amp&Y", + }); + // Should not clear the access key because title is not set: + await browser.menus.update(menuIds[menuIds.length - 1], { enabled: true }); + + browser.test.sendMessage("testCases", TESTCASES); + } + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + permissions: ["menus"], + }, + background, + }); + + await extension.startup(); + + const TESTCASES = await extension.awaitMessage("testCases"); + let menu = await openExtensionContextMenu(); + let items = menu.getElementsByTagName("menuitem"); + is(items.length, TESTCASES.length, "Expected menu items for page"); + TESTCASES.forEach(({ description, label, key }, i) => { + is(items[i].label, label, `Label for item ${i} (${description})`); + is(items[i].accessKey, key, `Accesskey for item ${i} (${description})`); + }); + + await closeExtensionContextMenu(); + await extension.unload(); + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function accesskeys_selection() { + const PAGE_WITH_AMPS = "data:text/plain;charset=utf-8,PageSelection&Amp"; + let tab = await BrowserTestUtils.openNewForegroundTab( + gBrowser, + PAGE_WITH_AMPS + ); + gBrowser.selectedTab = tab; + + async function background() { + const TESTCASES = [ + { + description: "Selection without amp", + title: "percent-s: %s.", + label: "percent-s: PageSelection&Amp.", + key: "", + }, + { + description: "Selection with amp after %s", + title: "percent-s: %s &A.", + label: "percent-s: PageSelection&Amp A.", + key: "A", + }, + { + description: "Selection with amp before %s", + title: "percent-s: &B %s.", + label: "percent-s: B PageSelection&Amp.", + key: "B", + }, + { + description: "Amp-percent", + title: "Amp-percent: &%.", + label: "Amp-percent: %.", + key: "%", + }, + { + // "&%s" should be treated as "%s", and "ignore this" with amps should be ignored. + description: "Selection with amp-percent-s", + title: "Amp-percent-s: &%s.&i&g&n&o&r&e& &t&h&i&s", + label: "Amp-percent-s: PageSelection&Amp.ignore this", + // Chrome uses the first character of the selection as access key. + // Let's not copy that behavior... + key: "", + }, + { + description: "Selection with amp before amp-percent-s", + title: "Amp-percent-s: &_ &%s.", + label: "Amp-percent-s: _ PageSelection&Amp.", + key: "_", + }, + ]; + + let lastMenuId; + for (let { title } of TESTCASES) { + lastMenuId = browser.menus.create({ contexts: ["selection"], title }); + } + // Round-trip to ensure that the menus have been registered. + await browser.menus.update(lastMenuId, {}); + browser.test.sendMessage("testCases", TESTCASES); + } + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + permissions: ["menus"], + }, + background, + }); + + await extension.startup(); + + // Select all + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function (arg) { + let doc = content.document; + let range = doc.createRange(); + let selection = content.getSelection(); + selection.removeAllRanges(); + range.selectNodeContents(doc.body); + selection.addRange(range); + }); + + const TESTCASES = await extension.awaitMessage("testCases"); + let menu = await openExtensionContextMenu(); + let items = menu.getElementsByTagName("menuitem"); + is(items.length, TESTCASES.length, "Expected menu items for page"); + TESTCASES.forEach(({ description, label, key }, i) => { + is(items[i].label, label, `Label for item ${i} (${description})`); + is(items[i].accessKey, key, `Accesskey for item ${i} (${description})`); + }); + + await closeExtensionContextMenu(); + await extension.unload(); + BrowserTestUtils.removeTab(tab); +}); -- cgit v1.2.3