summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_contextMenus_checkboxes.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/extensions/test/browser/browser_ext_contextMenus_checkboxes.js')
-rw-r--r--browser/components/extensions/test/browser/browser_ext_contextMenus_checkboxes.js157
1 files changed, 157 insertions, 0 deletions
diff --git a/browser/components/extensions/test/browser/browser_ext_contextMenus_checkboxes.js b/browser/components/extensions/test/browser/browser_ext_contextMenus_checkboxes.js
new file mode 100644
index 0000000000..a471ae7e58
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_contextMenus_checkboxes.js
@@ -0,0 +1,157 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+add_task(async function () {
+ let tab1 = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context.html"
+ );
+
+ gBrowser.selectedTab = tab1;
+
+ let extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ permissions: ["contextMenus"],
+ },
+
+ background: function () {
+ // Report onClickData info back.
+ browser.contextMenus.onClicked.addListener(info => {
+ browser.test.sendMessage("contextmenus-click", info);
+ });
+
+ browser.contextMenus.create({
+ title: "Checkbox",
+ type: "checkbox",
+ });
+
+ browser.test.sendMessage("single-contextmenu-item-added");
+
+ browser.test.onMessage.addListener(msg => {
+ if (msg !== "add-additional-menu-items") {
+ return;
+ }
+
+ browser.contextMenus.create({
+ type: "separator",
+ });
+
+ browser.contextMenus.create({
+ title: "Checkbox",
+ type: "checkbox",
+ checked: true,
+ });
+
+ browser.contextMenus.create({
+ title: "Checkbox",
+ type: "checkbox",
+ });
+
+ browser.test.notifyPass("contextmenus-checkboxes");
+ });
+ },
+ });
+
+ await extension.startup();
+
+ await extension.awaitMessage("single-contextmenu-item-added");
+
+ async function testSingleCheckboxItem() {
+ let extensionMenuRoot = await openExtensionContextMenu();
+
+ // On Linux, the single menu item should be contained in a submenu.
+ if (AppConstants.platform === "linux") {
+ let items = extensionMenuRoot.getElementsByAttribute("type", "checkbox");
+ is(items.length, 1, "single checkbox should be in the submenu on Linux");
+ await closeContextMenu();
+ } else {
+ is(
+ extensionMenuRoot,
+ null,
+ "there should be no submenu for a single checkbox item"
+ );
+ await closeContextMenu();
+ }
+ }
+
+ await testSingleCheckboxItem();
+
+ extension.sendMessage("add-additional-menu-items");
+ await extension.awaitFinish("contextmenus-checkboxes");
+
+ function confirmCheckboxStates(extensionMenuRoot, expectedStates) {
+ let checkboxItems = extensionMenuRoot.getElementsByAttribute(
+ "type",
+ "checkbox"
+ );
+
+ is(
+ checkboxItems.length,
+ 3,
+ "there should be 3 checkbox items in the context menu"
+ );
+
+ is(
+ checkboxItems[0].hasAttribute("checked"),
+ expectedStates[0],
+ `checkbox item 1 has state (checked=${expectedStates[0]})`
+ );
+ is(
+ checkboxItems[1].hasAttribute("checked"),
+ expectedStates[1],
+ `checkbox item 2 has state (checked=${expectedStates[1]})`
+ );
+ is(
+ checkboxItems[2].hasAttribute("checked"),
+ expectedStates[2],
+ `checkbox item 3 has state (checked=${expectedStates[2]})`
+ );
+
+ return extensionMenuRoot.getElementsByAttribute("type", "checkbox");
+ }
+
+ function confirmOnClickData(onClickData, id, was, checked) {
+ is(
+ onClickData.wasChecked,
+ was,
+ `checkbox item ${id} was ${was ? "" : "not "}checked before the click`
+ );
+ is(
+ onClickData.checked,
+ checked,
+ `checkbox item ${id} is ${checked ? "" : "not "}checked after the click`
+ );
+ }
+
+ let extensionMenuRoot = await openExtensionContextMenu();
+ let items = confirmCheckboxStates(extensionMenuRoot, [false, true, false]);
+ await closeExtensionContextMenu(items[0]);
+
+ let result = await extension.awaitMessage("contextmenus-click");
+ confirmOnClickData(result, 1, false, true);
+
+ extensionMenuRoot = await openExtensionContextMenu();
+ items = confirmCheckboxStates(extensionMenuRoot, [true, true, false]);
+ await closeExtensionContextMenu(items[2]);
+
+ result = await extension.awaitMessage("contextmenus-click");
+ confirmOnClickData(result, 3, false, true);
+
+ extensionMenuRoot = await openExtensionContextMenu();
+ items = confirmCheckboxStates(extensionMenuRoot, [true, true, true]);
+ await closeExtensionContextMenu(items[0]);
+
+ result = await extension.awaitMessage("contextmenus-click");
+ confirmOnClickData(result, 1, true, false);
+
+ extensionMenuRoot = await openExtensionContextMenu();
+ items = confirmCheckboxStates(extensionMenuRoot, [false, true, true]);
+ await closeExtensionContextMenu(items[2]);
+
+ result = await extension.awaitMessage("contextmenus-click");
+ confirmOnClickData(result, 3, true, false);
+
+ await extension.unload();
+ BrowserTestUtils.removeTab(tab1);
+});