fune/toolkit/components/viewsource/test/browser/browser_contextmenu.js
Emilio Cobos Álvarez a14c746228 Bug 1805415 - Use activateItem() rather than click() to activate menuitems. r=Gijs,extension-reviewers,pip-reviewers,search-reviewers
Bug 1805414 will move menu event handling to the DOM.

With that change the current synthetic click behavior of XUL menuitems
breaks. On current central, we rely on nsMenuFrame::HandleEvent not
getting called at all for synthetic clicks, and instead we just fire a
command event synchronously here:

  https://searchfox.org/mozilla-central/rev/a0d4f8f112c5c792ae272bf6ce50763ddd23ffa2/dom/xul/nsXULElement.cpp#1071

After my patch the command event is fired properly (potentially
asynchronously too) by the regular menu activation machinery, which is
preferable.

 * They fire a command event synchronously (even though on some
   platforms like macOS activating a context menu item is async).

 * They use a totally different codepath from what a user does.

 * They don't deal with native menus, etc.

We have a proper API for this (activateItem) which takes a much more
closer codepath to what users do, requires that the menu is shown, etc.
Use that API instead for testing.

As a benefit, tests now do not need to close the context menu manually
when clicking on a menu item (because we trigger the same code path as
users clicking the menu).

Differential Revision: https://phabricator.services.mozilla.com/D164567
2022-12-15 03:11:55 +00:00

115 lines
3.2 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
var source =
"data:text/html,text<link%20href='http://example.com/'%20/>more%20text<a%20href='mailto:abc@def.ghi'>email</a>";
var gViewSourceWindow, gContextMenu, gCopyLinkMenuItem, gCopyEmailMenuItem;
var expectedData = [];
add_task(async function() {
// Full source in view source tab
let newTab = await openDocument(source);
await onViewSourceWindowOpen(window);
let contextMenu = document.getElementById("contentAreaContextMenu");
for (let test of expectedData) {
await checkMenuItems(contextMenu, test[0], test[1], test[2], test[3]);
}
gBrowser.removeTab(newTab);
// Selection source in view source tab
expectedData = [];
newTab = await openDocumentSelect(source, "body");
await onViewSourceWindowOpen(window);
contextMenu = document.getElementById("contentAreaContextMenu");
for (let test of expectedData) {
await checkMenuItems(contextMenu, test[0], test[1], test[2], test[3]);
}
gBrowser.removeTab(newTab);
});
async function onViewSourceWindowOpen(aWindow) {
gViewSourceWindow = aWindow;
gCopyLinkMenuItem = aWindow.document.getElementById("context-copylink");
gCopyEmailMenuItem = aWindow.document.getElementById("context-copyemail");
let browser = gBrowser.selectedBrowser;
await SpecialPowers.spawn(browser, [], async function(arg) {
let tags = content.document.querySelectorAll("a[href]");
Assert.equal(
tags[0].href,
"view-source:http://example.com/",
"Link has correct href"
);
Assert.equal(tags[1].href, "mailto:abc@def.ghi", "Link has correct href");
});
expectedData.push(["a[href]", true, false, "http://example.com/"]);
expectedData.push(["a[href^=mailto]", false, true, "abc@def.ghi"]);
expectedData.push(["span", false, false, null]);
}
async function checkMenuItems(
contextMenu,
selector,
copyLinkExpected,
copyEmailExpected,
expectedClipboardContent
) {
let browser = gBrowser.selectedBrowser;
await SpecialPowers.spawn(browser, [{ selector }], async function(arg) {
content.document.querySelector(arg.selector).scrollIntoView();
});
let popupShownPromise = BrowserTestUtils.waitForEvent(
contextMenu,
"popupshown"
);
await BrowserTestUtils.synthesizeMouseAtCenter(
selector,
{ type: "contextmenu", button: 2 },
browser
);
await popupShownPromise;
is(
gCopyLinkMenuItem.hidden,
!copyLinkExpected,
"Copy link menuitem is " + (copyLinkExpected ? "not hidden" : "hidden")
);
is(
gCopyEmailMenuItem.hidden,
!copyEmailExpected,
"Copy email menuitem is " + (copyEmailExpected ? "not hidden" : "hidden")
);
if (copyLinkExpected || copyEmailExpected) {
await new Promise((resolve, reject) => {
waitForClipboard(
expectedClipboardContent,
function() {
contextMenu.activateItem(
copyLinkExpected ? gCopyLinkMenuItem : gCopyEmailMenuItem
);
},
resolve,
reject
);
});
} else {
let popupHiddenPromise = BrowserTestUtils.waitForEvent(
contextMenu,
"popuphidden"
);
contextMenu.hidePopup();
await popupHiddenPromise;
}
}