Bug 1246044 - Part 1 - Split out the testing for radio groups and checkboxes into separate files. r=kmag

MozReview-Commit-ID: KIwj3tZzyuz

--HG--
extra : rebase_source : 3993c18e6b5e41004dd6dc5c04f93f4d38698811
This commit is contained in:
Matthew Wein 2016-07-05 17:02:24 -07:00
parent c3a173f13e
commit 45b87155ca
6 changed files with 250 additions and 205 deletions

View File

@ -19,8 +19,12 @@
"clickBrowserAction": true,
"clickPageAction": true,
"CustomizableUI": true,
"closeContextMenu": true,
"closeExtensionContextMenu": true,
"focusWindow": true,
"makeWidgetId": true,
"openContextMenu": true,
"openExtensionContextMenu": true,
"CustomizableUI": true,
}
}

View File

@ -28,6 +28,8 @@ support-files =
[browser_ext_commands_onCommand.js]
[browser_ext_contentscript_connect.js]
[browser_ext_contextMenus.js]
[browser_ext_contextMenus_checkboxes.js]
[browser_ext_contextMenus_radioGroups.js]
[browser_ext_currentWindow.js]
[browser_ext_getViews.js]
[browser_ext_history.js]

View File

@ -27,36 +27,15 @@ add_task(function* () {
yield extension.startup();
yield extension.awaitFinish();
let contentAreaContextMenu = document.getElementById("contentAreaContextMenu");
let popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown");
yield BrowserTestUtils.synthesizeMouseAtCenter("#img1", {
type: "contextmenu",
button: 2,
}, gBrowser.selectedBrowser);
yield popupShownPromise;
let contentAreaContextMenu = yield openContextMenu("#img1");
let item = contentAreaContextMenu.getElementsByAttribute("label", "Click me!");
is(item.length, 1, "contextMenu item for image was found");
yield closeContextMenu();
let popupHiddenPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popuphidden");
EventUtils.synthesizeMouseAtCenter(item[0], {});
yield popupHiddenPromise;
contentAreaContextMenu = document.getElementById("contentAreaContextMenu");
popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown");
yield BrowserTestUtils.synthesizeMouseAtCenter("body", {
type: "contextmenu",
button: 2,
}, gBrowser.selectedBrowser);
yield popupShownPromise;
contentAreaContextMenu = yield openContextMenu("body");
item = contentAreaContextMenu.getElementsByAttribute("label", "Click me!");
is(item.length, 0, "no contextMenu item for image was found");
// click something to close the context menu
popupHiddenPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popuphidden");
EventUtils.synthesizeMouseAtCenter(document.getElementById("context-selectall"), {});
yield popupHiddenPromise;
yield closeContextMenu();
yield extension.unload();
@ -141,48 +120,6 @@ add_task(function* () {
});
browser.contextMenus.remove(parentToDel);
browser.contextMenus.create({
title: "radio-group-1",
type: "radio",
checked: true,
onclick: genericOnClick,
});
browser.contextMenus.create({
title: "Checkbox",
type: "checkbox",
onclick: genericOnClick,
});
browser.contextMenus.create({
title: "radio-group-2",
type: "radio",
onclick: genericOnClick,
});
browser.contextMenus.create({
title: "radio-group-2",
type: "radio",
onclick: genericOnClick,
});
browser.contextMenus.create({
type: "separator",
});
browser.contextMenus.create({
title: "Checkbox",
type: "checkbox",
checked: true,
onclick: genericOnClick,
});
browser.contextMenus.create({
title: "Checkbox",
type: "checkbox",
onclick: genericOnClick,
});
browser.contextMenus.create({
title: "Without onclick property",
id: "ext-without-onclick",
@ -190,159 +127,58 @@ add_task(function* () {
browser.contextMenus.update(parent, {parentId: child2}).then(
() => {
browser.test.notifyFail();
browser.test.notifyFail("contextmenus");
},
() => {
browser.test.notifyPass();
browser.test.notifyPass("contextmenus");
}
);
},
});
yield extension.startup();
yield extension.awaitFinish();
yield extension.awaitFinish("contextmenus");
let contentAreaContextMenu;
let expectedClickInfo = {
menuItemId: "ext-image",
mediaType: "image",
srcUrl: "http://mochi.test:8888/browser/browser/components/extensions/test/browser/ctxmenu-image.png",
pageUrl: "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context.html",
};
function getTop() {
contentAreaContextMenu = document.getElementById("contentAreaContextMenu");
let items = contentAreaContextMenu.getElementsByAttribute("ext-type", "top-level-menu");
is(items.length, 1, "top level item was found (context=selection)");
let topItem = items[0];
return topItem.childNodes[0];
}
function* openExtensionMenu() {
contentAreaContextMenu = document.getElementById("contentAreaContextMenu");
let popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown");
yield BrowserTestUtils.synthesizeMouseAtCenter("#img1", {
type: "contextmenu",
button: 2,
}, gBrowser.selectedBrowser);
yield popupShownPromise;
popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown");
EventUtils.synthesizeMouseAtCenter(getTop(), {});
yield popupShownPromise;
}
function* closeContextMenu(itemToSelect, expectedClickInfo, hasOnclickProperty = true) {
function checkClickInfo(info, tab) {
for (let i of Object.keys(expectedClickInfo)) {
is(info[i], expectedClickInfo[i],
"click info " + i + " expected to be: " + expectedClickInfo[i] + " but was: " + info[i]);
}
is(expectedClickInfo.pageSrc, tab.url);
function checkClickInfo(result) {
for (let i of Object.keys(expectedClickInfo)) {
is(result.info[i], expectedClickInfo[i],
"click info " + i + " expected to be: " + expectedClickInfo[i] + " but was: " + info[i]);
}
let popupHiddenPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popuphidden");
EventUtils.synthesizeMouseAtCenter(itemToSelect, {});
if (hasOnclickProperty) {
let {info, tab} = yield extension.awaitMessage("onclick");
if (expectedClickInfo) {
checkClickInfo(info, tab);
}
}
let {info, tab} = yield extension.awaitMessage("browser.contextMenus.onClicked");
if (expectedClickInfo) {
checkClickInfo(info, tab);
}
yield popupHiddenPromise;
is(expectedClickInfo.pageSrc, result.tab.url);
}
function confirmRadioGroupStates(expectedStates) {
let top = getTop();
let radioItems = top.getElementsByAttribute("type", "radio");
let radioGroup1 = top.getElementsByAttribute("label", "radio-group-1");
let radioGroup2 = top.getElementsByAttribute("label", "radio-group-2");
is(radioItems.length, 3, "there should be 3 radio items in the context menu");
is(radioGroup1.length, 1, "the first radio group should only have 1 radio item");
is(radioGroup2.length, 2, "the second radio group should only have 2 radio items");
is(radioGroup1[0].hasAttribute("checked"), expectedStates[0], `radio item 1 has state (checked=${expectedStates[0]})`);
is(radioGroup2[0].hasAttribute("checked"), expectedStates[1], `radio item 2 has state (checked=${expectedStates[1]})`);
is(radioGroup2[1].hasAttribute("checked"), expectedStates[2], `radio item 3 has state (checked=${expectedStates[2]})`);
}
function confirmCheckboxStates(expectedStates) {
let checkboxItems = getTop().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]})`);
}
yield openExtensionMenu();
let extensionMenuRoot = yield openExtensionContextMenu();
// Check some menu items
let top = getTop();
let items = top.getElementsByAttribute("label", "image");
let items = extensionMenuRoot.getElementsByAttribute("label", "image");
is(items.length, 1, "contextMenu item for image was found (context=image)");
let image = items[0];
items = top.getElementsByAttribute("label", "selection-edited");
items = extensionMenuRoot.getElementsByAttribute("label", "selection-edited");
is(items.length, 0, "contextMenu item for selection was not found (context=image)");
items = top.getElementsByAttribute("label", "parentToDel");
items = extensionMenuRoot.getElementsByAttribute("label", "parentToDel");
is(items.length, 0, "contextMenu item for removed parent was not found (context=image)");
items = top.getElementsByAttribute("label", "parent");
items = extensionMenuRoot.getElementsByAttribute("label", "parent");
is(items.length, 1, "contextMenu item for parent was found (context=image)");
is(items[0].childNodes[0].childNodes.length, 2, "child items for parent were found (context=image)");
// Click on ext-image item and check the click results
yield closeContextMenu(image, {
menuItemId: "ext-image",
mediaType: "image",
srcUrl: "http://mochi.test:8888/browser/browser/components/extensions/test/browser/ctxmenu-image.png",
pageUrl: "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context.html",
});
yield closeExtensionContextMenu(image);
// Test radio groups
yield openExtensionMenu();
confirmRadioGroupStates([true, false, false]);
items = getTop().getElementsByAttribute("type", "radio");
yield closeContextMenu(items[1]);
yield openExtensionMenu();
confirmRadioGroupStates([true, true, false]);
items = getTop().getElementsByAttribute("type", "radio");
yield closeContextMenu(items[2]);
yield openExtensionMenu();
confirmRadioGroupStates([true, false, true]);
items = getTop().getElementsByAttribute("type", "radio");
yield closeContextMenu(items[0]);
yield openExtensionMenu();
confirmRadioGroupStates([true, false, true]);
// Test checkboxes
items = getTop().getElementsByAttribute("type", "checkbox");
confirmCheckboxStates([false, true, false]);
yield closeContextMenu(items[0]);
yield openExtensionMenu();
confirmCheckboxStates([true, true, false]);
items = getTop().getElementsByAttribute("type", "checkbox");
yield closeContextMenu(items[2]);
yield openExtensionMenu();
confirmCheckboxStates([true, true, true]);
items = getTop().getElementsByAttribute("type", "checkbox");
yield closeContextMenu(items[0]);
yield openExtensionMenu();
confirmCheckboxStates([false, true, true]);
items = getTop().getElementsByAttribute("type", "checkbox");
yield closeContextMenu(items[2]);
let result = yield extension.awaitMessage("onclick");
checkClickInfo(result);
result = yield extension.awaitMessage("browser.contextMenus.onClicked");
checkClickInfo(result);
// Select some text
yield ContentTask.spawn(gBrowser.selectedBrowser, { }, function* (arg) {
@ -357,40 +193,51 @@ add_task(function* () {
});
// Bring up context menu again
yield openExtensionMenu();
extensionMenuRoot = yield openExtensionContextMenu();
// Check some menu items
top = getTop();
items = top.getElementsByAttribute("label", "Without onclick property");
items = extensionMenuRoot.getElementsByAttribute("label", "Without onclick property");
is(items.length, 1, "contextMenu item was found (context=page)");
yield closeContextMenu(items[0], {
yield closeExtensionContextMenu(items[0]);
expectedClickInfo = {
menuItemId: "ext-without-onclick",
pageUrl: "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context.html",
}, false /* hasOnclickProperty */);
};
result = yield extension.awaitMessage("browser.contextMenus.onClicked");
checkClickInfo(result);
// Bring up context menu again
yield openExtensionMenu();
extensionMenuRoot = yield openExtensionContextMenu();
// Check some menu items
top = getTop();
items = top.getElementsByAttribute("label", "selection is: 'just some text 123456789012345678901234567890...'");
items = extensionMenuRoot.getElementsByAttribute("label", "selection is: 'just some text 123456789012345678901234567890...'");
is(items.length, 1, "contextMenu item for selection was found (context=selection)");
let selectionItem = items[0];
items = top.getElementsByAttribute("label", "selection");
items = extensionMenuRoot.getElementsByAttribute("label", "selection");
is(items.length, 0, "contextMenu item label update worked (context=selection)");
yield closeContextMenu(selectionItem, {
yield closeExtensionContextMenu(selectionItem);
expectedClickInfo = {
menuItemId: "ext-selection",
pageUrl: "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context.html",
selectionText: "just some text 1234567890123456789012345678901234567890123456789012345678901234567890123456789012",
});
};
result = yield extension.awaitMessage("onclick");
checkClickInfo(result);
result = yield extension.awaitMessage("browser.contextMenus.onClicked");
checkClickInfo(result);
let contentAreaContextMenu = yield openContextMenu("#img1");
items = contentAreaContextMenu.getElementsByAttribute("ext-type", "top-level-menu");
is(items.length, 0, "top level item was not found (after removeAll()");
yield closeContextMenu();
yield extension.unload();
yield BrowserTestUtils.removeTab(tab1);
});

View File

@ -0,0 +1,74 @@
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
add_task(function* () {
let tab1 = yield 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() {
browser.contextMenus.create({
title: "Checkbox",
type: "checkbox",
});
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");
},
});
yield extension.startup();
yield 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");
}
let extensionMenuRoot = yield openExtensionContextMenu();
let items = confirmCheckboxStates(extensionMenuRoot, [false, true, false]);
yield closeExtensionContextMenu(items[0]);
extensionMenuRoot = yield openExtensionContextMenu();
items = confirmCheckboxStates(extensionMenuRoot, [true, true, false]);
yield closeExtensionContextMenu(items[2]);
extensionMenuRoot = yield openExtensionContextMenu();
items = confirmCheckboxStates(extensionMenuRoot, [true, true, true]);
yield closeExtensionContextMenu(items[0]);
extensionMenuRoot = yield openExtensionContextMenu();
items = confirmCheckboxStates(extensionMenuRoot, [false, true, true]);
yield closeExtensionContextMenu(items[2]);
yield extension.unload();
yield BrowserTestUtils.removeTab(tab1);
});

View File

@ -0,0 +1,78 @@
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
add_task(function* () {
let tab1 = yield 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() {
browser.contextMenus.create({
title: "radio-group-1",
type: "radio",
checked: true,
});
browser.contextMenus.create({
type: "separator",
});
browser.contextMenus.create({
title: "radio-group-2",
type: "radio",
});
browser.contextMenus.create({
title: "radio-group-2",
type: "radio",
});
browser.test.notifyPass("contextmenus-radio-groups");
},
});
yield extension.startup();
yield extension.awaitFinish("contextmenus-radio-groups");
function confirmRadioGroupStates(extensionMenuRoot, expectedStates) {
let radioItems = extensionMenuRoot.getElementsByAttribute("type", "radio");
let radioGroup1 = extensionMenuRoot.getElementsByAttribute("label", "radio-group-1");
let radioGroup2 = extensionMenuRoot.getElementsByAttribute("label", "radio-group-2");
is(radioItems.length, 3, "there should be 3 radio items in the context menu");
is(radioGroup1.length, 1, "the first radio group should only have 1 radio item");
is(radioGroup2.length, 2, "the second radio group should only have 2 radio items");
is(radioGroup1[0].hasAttribute("checked"), expectedStates[0], `radio item 1 has state (checked=${expectedStates[0]})`);
is(radioGroup2[0].hasAttribute("checked"), expectedStates[1], `radio item 2 has state (checked=${expectedStates[1]})`);
is(radioGroup2[1].hasAttribute("checked"), expectedStates[2], `radio item 3 has state (checked=${expectedStates[2]})`);
return extensionMenuRoot.getElementsByAttribute("type", "radio");
}
let extensionMenuRoot = yield openExtensionContextMenu();
let items = confirmRadioGroupStates(extensionMenuRoot, [true, false, false]);
yield closeExtensionContextMenu(items[1]);
extensionMenuRoot = yield openExtensionContextMenu();
items = confirmRadioGroupStates(extensionMenuRoot, [true, true, false]);
yield closeExtensionContextMenu(items[2]);
extensionMenuRoot = yield openExtensionContextMenu();
items = confirmRadioGroupStates(extensionMenuRoot, [true, false, true]);
yield closeExtensionContextMenu(items[0]);
extensionMenuRoot = yield openExtensionContextMenu();
items = confirmRadioGroupStates(extensionMenuRoot, [true, false, true]);
yield closeExtensionContextMenu(items[0]);
yield extension.unload();
yield BrowserTestUtils.removeTab(tab1);
});

View File

@ -8,6 +8,8 @@
* getBrowserActionPopup getPageActionPopup
* closeBrowserAction closePageAction
* promisePopupShown promisePopupHidden
* openContextMenu closeContextMenu
* openExtensionContextMenu closeExtensionContextMenu
*/
var {AppConstants} = Cu.import("resource://gre/modules/AppConstants.jsm");
@ -104,6 +106,44 @@ function closeBrowserAction(extension, win = window) {
return Promise.resolve();
}
function* openContextMenu(id) {
let contentAreaContextMenu = document.getElementById("contentAreaContextMenu");
let popupShownPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popupshown");
yield BrowserTestUtils.synthesizeMouseAtCenter(id, {type: "contextmenu", button: 2}, gBrowser.selectedBrowser);
yield popupShownPromise;
return contentAreaContextMenu;
}
function* closeContextMenu() {
let contentAreaContextMenu = document.getElementById("contentAreaContextMenu");
let popupHiddenPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popuphidden");
contentAreaContextMenu.hidePopup();
yield popupHiddenPromise;
}
function* openExtensionContextMenu() {
let contextMenu = yield openContextMenu("#img1");
let topLevelMenu = contextMenu.getElementsByAttribute("ext-type", "top-level-menu");
// Return null if the extension only has one item and therefore no extension menu.
if (topLevelMenu.length == 0) {
return null;
}
let extensionMenu = topLevelMenu[0].childNodes[0];
let popupShownPromise = BrowserTestUtils.waitForEvent(contextMenu, "popupshown");
EventUtils.synthesizeMouseAtCenter(extensionMenu, {});
yield popupShownPromise;
return extensionMenu;
}
function* closeExtensionContextMenu(itemToSelect) {
let contentAreaContextMenu = document.getElementById("contentAreaContextMenu");
let popupHiddenPromise = BrowserTestUtils.waitForEvent(contentAreaContextMenu, "popuphidden");
EventUtils.synthesizeMouseAtCenter(itemToSelect, {});
yield popupHiddenPromise;
}
function getPageActionPopup(extension, win = window) {
let panelId = makeWidgetId(extension.id) + "-panel";
return win.document.getElementById(panelId);