From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../contextMenu/browser_contextmenu_badiframe.js | 182 +++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 browser/base/content/test/contextMenu/browser_contextmenu_badiframe.js (limited to 'browser/base/content/test/contextMenu/browser_contextmenu_badiframe.js') diff --git a/browser/base/content/test/contextMenu/browser_contextmenu_badiframe.js b/browser/base/content/test/contextMenu/browser_contextmenu_badiframe.js new file mode 100644 index 0000000000..89e7fe15e0 --- /dev/null +++ b/browser/base/content/test/contextMenu/browser_contextmenu_badiframe.js @@ -0,0 +1,182 @@ +/* Tests for proper behaviour of "Show this frame" context menu options with a valid frame and + a frame with an invalid url. + */ + +// Two frames, one with text content, the other an error page +var invalidPage = "http://127.0.0.1:55555/"; +// eslint-disable-next-line @microsoft/sdl/no-insecure-url +var validPage = "http://example.com/"; +var testPage = + 'data:text/html,'; + +async function openTestPage() { + let tab = await BrowserTestUtils.openNewForegroundTab( + gBrowser, + "about:blank", + true, + true + ); + let browser = tab.linkedBrowser; + + // The test page has a top-level document and two subframes. One of + // those subframes is an error page, which doesn't fire a load event. + // We'll use BrowserTestUtils.browserLoaded and have it wait for all + // 3 loads before resolving. + let expectedLoads = 3; + let pageAndIframesLoaded = BrowserTestUtils.browserLoaded( + browser, + true /* includeSubFrames */, + url => { + expectedLoads--; + return !expectedLoads; + }, + true /* maybeErrorPage */ + ); + BrowserTestUtils.loadURIString(browser, testPage); + await pageAndIframesLoaded; + + // Make sure both the top-level document and the iframe documents have + // had a chance to present. We need this so that the context menu event + // gets dispatched properly. + for (let bc of [ + ...browser.browsingContext.children, + browser.browsingContext, + ]) { + await SpecialPowers.spawn(bc, [], async function () { + await new Promise(resolve => { + content.requestAnimationFrame(resolve); + }); + }); + } +} + +async function selectFromFrameMenu(frameNumber, menuId) { + const contextMenu = document.getElementById("contentAreaContextMenu"); + + let popupShownPromise = BrowserTestUtils.waitForEvent( + contextMenu, + "popupshown" + ); + + await BrowserTestUtils.synthesizeMouseAtPoint( + 40, + 40, + { + type: "contextmenu", + button: 2, + }, + gBrowser.selectedBrowser.browsingContext.children[frameNumber] + ); + + await popupShownPromise; + + let frameItem = document.getElementById("frame"); + let framePopup = frameItem.menupopup; + let subPopupShownPromise = BrowserTestUtils.waitForEvent( + framePopup, + "popupshown" + ); + + frameItem.openMenu(true); + await subPopupShownPromise; + + let subPopupHiddenPromise = BrowserTestUtils.waitForEvent( + framePopup, + "popuphidden" + ); + let contextMenuHiddenPromise = BrowserTestUtils.waitForEvent( + contextMenu, + "popuphidden" + ); + contextMenu.activateItem(document.getElementById(menuId)); + await subPopupHiddenPromise; + await contextMenuHiddenPromise; +} + +add_task(async function testOpenFrame() { + for (let frameNumber = 0; frameNumber < 2; frameNumber++) { + await openTestPage(); + + let expectedResultURI = [validPage, invalidPage][frameNumber]; + + info("show only this frame for " + expectedResultURI); + + let browserLoadedPromise = BrowserTestUtils.browserLoaded( + gBrowser.selectedBrowser, + false, + expectedResultURI, + frameNumber == 1 + ); + + await selectFromFrameMenu(frameNumber, "context-showonlythisframe"); + await browserLoadedPromise; + + is( + gBrowser.selectedBrowser.currentURI.spec, + expectedResultURI, + "Should navigate to page url, not about:neterror" + ); + + gBrowser.removeCurrentTab(); + } +}); + +add_task(async function testOpenFrameInTab() { + for (let frameNumber = 0; frameNumber < 2; frameNumber++) { + await openTestPage(); + + let expectedResultURI = [validPage, invalidPage][frameNumber]; + + info("open frame in tab for " + expectedResultURI); + + let newTabPromise = BrowserTestUtils.waitForNewTab( + gBrowser, + expectedResultURI, + false + ); + await selectFromFrameMenu(frameNumber, "context-openframeintab"); + let newTab = await newTabPromise; + + await BrowserTestUtils.switchTab(gBrowser, newTab); + + // We should now have the error page in a new, active tab. + is( + gBrowser.selectedBrowser.currentURI.spec, + expectedResultURI, + "New tab should have page url, not about:neterror" + ); + + gBrowser.removeCurrentTab(); + gBrowser.removeCurrentTab(); + } +}); + +add_task(async function testOpenFrameInWindow() { + for (let frameNumber = 0; frameNumber < 2; frameNumber++) { + await openTestPage(); + + let expectedResultURI = [validPage, invalidPage][frameNumber]; + + info("open frame in window for " + expectedResultURI); + + let newWindowPromise = BrowserTestUtils.waitForNewWindow({ + url: frameNumber == 1 ? invalidPage : validPage, + maybeErrorPage: frameNumber == 1, + }); + await selectFromFrameMenu(frameNumber, "context-openframe"); + let newWindow = await newWindowPromise; + + is( + newWindow.gBrowser.selectedBrowser.currentURI.spec, + expectedResultURI, + "New window should have page url, not about:neterror" + ); + + newWindow.close(); + gBrowser.removeCurrentTab(); + } +}); -- cgit v1.2.3