forked from mirrors/gecko-dev
		
	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
		
			
				
	
	
		
			88 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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);
 | 
						|
  });
 | 
						|
});
 |