From c3a3eed1ba516fde1ed7f619b4223571d8422d29 Mon Sep 17 00:00:00 2001 From: Neil Deakin Date: Fri, 9 Jul 2021 11:51:13 +0000 Subject: [PATCH] Bug 1717680, modify the test browser_bug423833.js to not set popupNode and instead open a context menu for testing 'Show Only This Frame' command, r=Gijs Differential Revision: https://phabricator.services.mozilla.com/D118519 --- .../base/content/test/contextMenu/browser.ini | 1 + .../browser_contextmenu_badiframe.js | 157 ++++++++++++++++ browser/base/content/test/general/browser.ini | 3 - .../content/test/general/browser_bug423833.js | 168 ------------------ 4 files changed, 158 insertions(+), 171 deletions(-) create mode 100644 browser/base/content/test/contextMenu/browser_contextmenu_badiframe.js delete mode 100644 browser/base/content/test/general/browser_bug423833.js diff --git a/browser/base/content/test/contextMenu/browser.ini b/browser/base/content/test/contextMenu/browser.ini index ab3986dd16c7..1d9d0ae48c9a 100644 --- a/browser/base/content/test/contextMenu/browser.ini +++ b/browser/base/content/test/contextMenu/browser.ini @@ -15,6 +15,7 @@ support-files = ../../../../../toolkit/components/pdfjs/test/file_pdfjs_test.pdf contextmenu_common.js +[browser_contextmenu_badiframe.js] [browser_contextmenu_inspect.js] [browser_contextmenu_keyword.js] skip-if = toolkit == "gtk" || (os == "win" && processor == "aarch64") # disabled on Linux due to bug 513558, aarch64 due to 1533161 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 000000000000..b6adbad31389 --- /dev/null +++ b/browser/base/content/test/contextMenu/browser_contextmenu_badiframe.js @@ -0,0 +1,157 @@ +/* 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/"; +var validPage = "http://example.com/"; +var testPage = + 'data:text/html,'; + +async function openTestPage() { + // Waiting for the error page to load in the subframe + await BrowserTestUtils.openNewForegroundTab(gBrowser, testPage, true, true); + await BrowserTestUtils.waitForCondition(() => { + return ( + gBrowser.selectedBrowser.browsingContext.children[1].currentWindowGlobal + .documentURI.spec != "about:blank" + ); + }); + + await SpecialPowers.spawn( + gBrowser.selectedBrowser.browsingContext.children[1], + [], + () => { + if (!content.document.body.classList.length) { + return new Promise(resolve => { + content.addEventListener( + "AboutNetErrorLoad", + () => { + resolve(); + }, + { once: true } + ); + }); + } + + return undefined; + } + ); +} + +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; + + contextMenu.activateItem(document.getElementById(menuId)); +} + +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, null, 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(); + } +}); diff --git a/browser/base/content/test/general/browser.ini b/browser/base/content/test/general/browser.ini index b31b7af668be..f7c2a76190fd 100644 --- a/browser/base/content/test/general/browser.ini +++ b/browser/base/content/test/general/browser.ini @@ -68,9 +68,6 @@ skip-if = (verify && !debug && (os == 'win')) [browser_bug417483.js] skip-if = (verify && debug && (os == 'mac')) || (os == 'mac') || (os == 'linux') #Bug 1444703 # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD. -[browser_bug423833.js] -skip-if = true # bug 428712 -# DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD. [browser_bug424101.js] # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD. [browser_bug427559.js] diff --git a/browser/base/content/test/general/browser_bug423833.js b/browser/base/content/test/general/browser_bug423833.js deleted file mode 100644 index 397473ed1384..000000000000 --- a/browser/base/content/test/general/browser_bug423833.js +++ /dev/null @@ -1,168 +0,0 @@ -/* Tests for proper behaviour of "Show this frame" context menu options */ - -// Two frames, one with text content, the other an error page -var invalidPage = "http://127.0.0.1:55555/"; -var validPage = "http://example.com/"; -var testPage = - 'data:text/html,'; - -// Store the tab and window created in tests 2 and 3 respectively -var test2tab; -var test3window; - -// We use setInterval instead of setTimeout to avoid race conditions on error doc loads -var intervalID; - -function test() { - waitForExplicitFinish(); - - gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser); - gBrowser.selectedBrowser.addEventListener("load", test1Setup, true); - content.location = testPage; -} - -function test1Setup() { - if (content.frames.length < 2 || content.frames[1].location != invalidPage) { - // The error frame hasn't loaded yet - return; - } - - gBrowser.selectedBrowser.removeEventListener("load", test1Setup, true); - - var badFrame = content.frames[1]; - document.popupNode = badFrame.document.firstElementChild; - - var contentAreaContextMenu = document.getElementById( - "contentAreaContextMenu" - ); - var contextMenu = new nsContextMenu(contentAreaContextMenu); - - // We'd like to use another load listener here, but error pages don't fire load events - contextMenu.showOnlyThisFrame(); - intervalID = setInterval(testShowOnlyThisFrame, 3000); -} - -function testShowOnlyThisFrame() { - if (content.location.href == testPage) { - // This is a stale event from the original page loading - return; - } - - // We should now have loaded the error page frame content directly - // in the tab, make sure the URL is right. - clearInterval(intervalID); - - is( - content.location.href, - invalidPage, - "Should navigate to page url, not about:neterror" - ); - - // Go back to the frames page - gBrowser.addEventListener("load", test2Setup, true); - content.location = testPage; -} - -function test2Setup() { - if (content.frames.length < 2 || content.frames[1].location != invalidPage) { - // The error frame hasn't loaded yet - return; - } - - gBrowser.removeEventListener("load", test2Setup, true); - - // Now let's do the whole thing again, but this time for "Open frame in new tab" - var badFrame = content.frames[1]; - - document.popupNode = badFrame.document.firstElementChild; - - var contentAreaContextMenu = document.getElementById( - "contentAreaContextMenu" - ); - var contextMenu = new nsContextMenu(contentAreaContextMenu); - - gBrowser.tabContainer.addEventListener("TabOpen", function listener(event) { - test2tab = event.target; - gBrowser.tabContainer.removeEventListener("TabOpen", listener); - }); - contextMenu.openFrameInTab(); - ok(test2tab, "openFrameInTab() opened a tab"); - - gBrowser.selectedTab = test2tab; - - intervalID = setInterval(testOpenFrameInTab, 3000); -} - -function testOpenFrameInTab() { - if (gBrowser.contentDocument.location.href == "about:blank") { - // Wait another cycle - return; - } - - clearInterval(intervalID); - - // We should now have the error page in a new, active tab. - is( - gBrowser.contentDocument.location.href, - invalidPage, - "New tab should have page url, not about:neterror" - ); - - // Clear up the new tab, and punt to test 3 - gBrowser.removeCurrentTab(); - - test3Setup(); -} - -function test3Setup() { - // One more time, for "Open frame in new window" - var badFrame = content.frames[1]; - document.popupNode = badFrame.document.firstElementChild; - - var contentAreaContextMenu = document.getElementById( - "contentAreaContextMenu" - ); - var contextMenu = new nsContextMenu(contentAreaContextMenu); - - Services.ww.registerNotification(function notification( - aSubject, - aTopic, - aData - ) { - if (aTopic == "domwindowopened") { - test3window = aSubject; - } - Services.ww.unregisterNotification(notification); - }); - - contextMenu.openFrame(); - - intervalID = setInterval(testOpenFrame, 3000); -} - -function testOpenFrame() { - if (!test3window || test3window.content.location.href == "about:blank") { - info("testOpenFrame: Wait another cycle"); - return; - } - - clearInterval(intervalID); - - is( - test3window.content.location.href, - invalidPage, - "New window should have page url, not about:neterror" - ); - - test3window.close(); - cleanup(); -} - -function cleanup() { - gBrowser.removeCurrentTab(); - finish(); -}