browser_contextmenu_badiframe.js (5024B)
1 /* Tests for proper behaviour of "Show this frame" context menu options with a valid frame and 2 a frame with an invalid url. 3 */ 4 5 // Two frames, one with text content, the other an error page 6 var invalidPage = "http://127.0.0.1:55555/"; 7 // eslint-disable-next-line @microsoft/sdl/no-insecure-url 8 var validPage = "http://example.com/"; 9 var testPage = 10 'data:text/html,<frameset cols="400,400"><frame src="' + 11 validPage + 12 '"><frame src="' + 13 invalidPage + 14 '"></frameset>'; 15 16 async function openTestPage() { 17 let tab = await BrowserTestUtils.openNewForegroundTab( 18 gBrowser, 19 "about:blank", 20 true, 21 true 22 ); 23 let browser = tab.linkedBrowser; 24 25 // The test page has a top-level document and two subframes. One of 26 // those subframes is an error page, which doesn't fire a load event. 27 // We'll use BrowserTestUtils.browserLoaded and have it wait for all 28 // 3 loads before resolving. 29 let expectedLoads = 3; 30 let pageAndIframesLoaded = BrowserTestUtils.browserLoaded( 31 browser, 32 true /* includeSubFrames */, 33 () => { 34 expectedLoads--; 35 return !expectedLoads; 36 }, 37 true /* maybeErrorPage */ 38 ); 39 BrowserTestUtils.startLoadingURIString(browser, testPage); 40 await pageAndIframesLoaded; 41 42 // Make sure both the top-level document and the iframe documents have 43 // had a chance to present. We need this so that the context menu event 44 // gets dispatched properly. 45 for (let bc of [ 46 ...browser.browsingContext.children, 47 browser.browsingContext, 48 ]) { 49 await SpecialPowers.spawn(bc, [], async function () { 50 await new Promise(resolve => { 51 content.requestAnimationFrame(resolve); 52 }); 53 }); 54 } 55 } 56 57 async function selectFromFrameMenu(frameNumber, menuId) { 58 const contextMenu = document.getElementById("contentAreaContextMenu"); 59 60 let popupShownPromise = BrowserTestUtils.waitForEvent( 61 contextMenu, 62 "popupshown" 63 ); 64 65 await BrowserTestUtils.synthesizeMouseAtPoint( 66 40, 67 40, 68 { 69 type: "contextmenu", 70 button: 2, 71 }, 72 gBrowser.selectedBrowser.browsingContext.children[frameNumber] 73 ); 74 75 await popupShownPromise; 76 77 let frameItem = document.getElementById("frame"); 78 let framePopup = frameItem.menupopup; 79 let subPopupShownPromise = BrowserTestUtils.waitForEvent( 80 framePopup, 81 "popupshown" 82 ); 83 84 frameItem.openMenu(true); 85 await subPopupShownPromise; 86 87 let subPopupHiddenPromise = BrowserTestUtils.waitForEvent( 88 framePopup, 89 "popuphidden" 90 ); 91 let contextMenuHiddenPromise = BrowserTestUtils.waitForEvent( 92 contextMenu, 93 "popuphidden" 94 ); 95 contextMenu.activateItem(document.getElementById(menuId)); 96 await subPopupHiddenPromise; 97 await contextMenuHiddenPromise; 98 } 99 100 add_task(async function testOpenFrame() { 101 for (let frameNumber = 0; frameNumber < 2; frameNumber++) { 102 await openTestPage(); 103 104 let expectedResultURI = [validPage, invalidPage][frameNumber]; 105 106 info("show only this frame for " + expectedResultURI); 107 108 let browserLoadedPromise = BrowserTestUtils.browserLoaded( 109 gBrowser.selectedBrowser, 110 false, 111 expectedResultURI, 112 frameNumber == 1 113 ); 114 115 await selectFromFrameMenu(frameNumber, "context-showonlythisframe"); 116 await browserLoadedPromise; 117 118 is( 119 gBrowser.selectedBrowser.currentURI.spec, 120 expectedResultURI, 121 "Should navigate to page url, not about:neterror" 122 ); 123 124 gBrowser.removeCurrentTab(); 125 } 126 }); 127 128 add_task(async function testOpenFrameInTab() { 129 for (let frameNumber = 0; frameNumber < 2; frameNumber++) { 130 await openTestPage(); 131 132 let expectedResultURI = [validPage, invalidPage][frameNumber]; 133 134 info("open frame in tab for " + expectedResultURI); 135 136 let newTabPromise = BrowserTestUtils.waitForNewTab( 137 gBrowser, 138 expectedResultURI, 139 false 140 ); 141 await selectFromFrameMenu(frameNumber, "context-openframeintab"); 142 let newTab = await newTabPromise; 143 144 await BrowserTestUtils.switchTab(gBrowser, newTab); 145 146 // We should now have the error page in a new, active tab. 147 is( 148 gBrowser.selectedBrowser.currentURI.spec, 149 expectedResultURI, 150 "New tab should have page url, not about:neterror" 151 ); 152 153 gBrowser.removeCurrentTab(); 154 gBrowser.removeCurrentTab(); 155 } 156 }); 157 158 add_task(async function testOpenFrameInWindow() { 159 for (let frameNumber = 0; frameNumber < 2; frameNumber++) { 160 await openTestPage(); 161 162 let expectedResultURI = [validPage, invalidPage][frameNumber]; 163 164 info("open frame in window for " + expectedResultURI); 165 166 let newWindowPromise = BrowserTestUtils.waitForNewWindow({ 167 url: frameNumber == 1 ? invalidPage : validPage, 168 maybeErrorPage: frameNumber == 1, 169 }); 170 await selectFromFrameMenu(frameNumber, "context-openframe"); 171 let newWindow = await newWindowPromise; 172 173 is( 174 newWindow.gBrowser.selectedBrowser.currentURI.spec, 175 expectedResultURI, 176 "New window should have page url, not about:neterror" 177 ); 178 179 newWindow.close(); 180 gBrowser.removeCurrentTab(); 181 } 182 });