fune/docshell/test/browser/browser_history_triggeringprincipal_viewsource.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

88 lines
2.6 KiB
JavaScript

"use strict";
const TEST_PATH = getRootDirectory(gTestPath).replace(
"chrome://mochitests/content",
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
"http://example.com"
);
const HTML_URI = TEST_PATH + "dummy_page.html";
const VIEW_SRC_URI = "view-source:" + HTML_URI;
add_task(async function() {
await SpecialPowers.pushPrefEnv({
set: [["browser.navigation.requireUserInteraction", false]],
});
info("load baseline html in new tab");
await BrowserTestUtils.withNewTab(HTML_URI, async function(aBrowser) {
is(
gBrowser.selectedBrowser.currentURI.spec,
HTML_URI,
"sanity check to make sure html loaded"
);
info("right-click -> view-source of html");
let vSrcCtxtMenu = document.getElementById("contentAreaContextMenu");
let popupPromise = BrowserTestUtils.waitForEvent(
vSrcCtxtMenu,
"popupshown"
);
BrowserTestUtils.synthesizeMouseAtCenter(
"body",
{ type: "contextmenu", button: 2 },
aBrowser
);
await popupPromise;
let tabPromise = BrowserTestUtils.waitForNewTab(gBrowser, VIEW_SRC_URI);
let vSrcItem = vSrcCtxtMenu.querySelector("#context-viewsource");
vSrcCtxtMenu.activateItem(vSrcItem);
let tab = await tabPromise;
is(
gBrowser.selectedBrowser.currentURI.spec,
VIEW_SRC_URI,
"loading view-source of html succeeded"
);
info("load html file again before going .back()");
let loadPromise = BrowserTestUtils.browserLoaded(
tab.linkedBrowser,
false,
HTML_URI
);
await SpecialPowers.spawn(tab.linkedBrowser, [HTML_URI], HTML_URI => {
content.document.location = HTML_URI;
});
await loadPromise;
is(
gBrowser.selectedBrowser.currentURI.spec,
HTML_URI,
"loading html another time succeeded"
);
info(
"click .back() to view-source of html again and make sure the history entry has a triggeringPrincipal"
);
let backCtxtMenu = document.getElementById("contentAreaContextMenu");
popupPromise = BrowserTestUtils.waitForEvent(backCtxtMenu, "popupshown");
BrowserTestUtils.synthesizeMouseAtCenter(
"body",
{ type: "contextmenu", button: 2 },
aBrowser
);
await popupPromise;
loadPromise = BrowserTestUtils.waitForContentEvent(
tab.linkedBrowser,
"pageshow"
);
let backItem = backCtxtMenu.querySelector("#context-back");
backCtxtMenu.activateItem(backItem);
await loadPromise;
is(
gBrowser.selectedBrowser.currentURI.spec,
VIEW_SRC_URI,
"clicking .back() to view-source of html succeeded"
);
BrowserTestUtils.removeTab(tab);
});
});