Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* -*- 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,
);
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);
});