mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-06 11:18:19 +02:00
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
115 lines
3.2 KiB
JavaScript
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;
|
|
}
|
|
}
|