browser_fullscreen-navigation.js (4034B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 requestLongerTimeout(2); 7 8 // Import helpers 9 Services.scriptloader.loadSubScript( 10 "chrome://mochitests/content/browser/dom/base/test/fullscreen/fullscreen_helpers.js", 11 this 12 ); 13 14 add_setup(async function () { 15 await pushPrefs( 16 ["test.wait300msAfterTabSwitch", true], 17 ["full-screen-api.transition-duration.enter", "0 0"], 18 ["full-screen-api.transition-duration.leave", "0 0"], 19 ["full-screen-api.allow-trusted-requests-only", false] 20 ); 21 }); 22 23 add_task(async function navigation() { 24 await BrowserTestUtils.withNewTab( 25 { 26 gBrowser, 27 url: `data:text/html, 28 <button id="button">Click here</button> 29 <script> 30 let button = document.getElementById("button"); 31 button.addEventListener("click", function() { 32 button.requestFullscreen(); 33 }); 34 </script>`, 35 }, 36 async function (browser) { 37 let promiseFsState = waitForFullscreenState(document, true); 38 // Trigger click event 39 BrowserTestUtils.synthesizeMouseAtCenter("#button", {}, browser); 40 await promiseFsState; 41 42 promiseFsState = waitForFullscreenState(document, false); 43 await SpecialPowers.spawn(browser, [], async function () { 44 content.location.href = "about:blank"; 45 }); 46 await promiseFsState; 47 48 // Ensure the browser exits fullscreen state. 49 ok(!window.fullScreen, "The chrome window should not be in fullscreen"); 50 ok( 51 !document.documentElement.hasAttribute("inDOMFullscreen"), 52 "The chrome document should not be in fullscreen" 53 ); 54 } 55 ); 56 }); 57 58 async function startTests(testFun, name) { 59 TEST_URLS.forEach(url => { 60 add_task(async () => { 61 info(`Test ${name}, url: ${url}`); 62 await BrowserTestUtils.withNewTab( 63 { 64 gBrowser, 65 url, 66 }, 67 async function (browser) { 68 let promiseFsState = waitForFullscreenState(document, true); 69 // Trigger click event in inner most iframe 70 SpecialPowers.spawn( 71 browser.browsingContext.children[0].children[0], 72 [], 73 function () { 74 content.setTimeout(() => { 75 content.document.getElementById("div").click(); 76 }, 0); 77 } 78 ); 79 await promiseFsState; 80 81 // This should exit fullscreen 82 promiseFsState = waitForFullscreenState(document, false); 83 await testFun(browser); 84 await promiseFsState; 85 86 // Ensure the browser exits fullscreen state. 87 ok( 88 !window.fullScreen, 89 "The chrome window should not be in fullscreen" 90 ); 91 ok( 92 !document.documentElement.hasAttribute("inDOMFullscreen"), 93 "The chrome document should not be in fullscreen" 94 ); 95 } 96 ); 97 }); 98 }); 99 } 100 101 function NavigateRemoteDocument(aBrowsingContext, aURL) { 102 return SpecialPowers.spawn(aBrowsingContext, [aURL], async function (url) { 103 content.location.href = url; 104 }); 105 } 106 107 startTests(async browser => { 108 // toplevel 109 await NavigateRemoteDocument(browser.browsingContext, "about:blank"); 110 }, "navigation_toplevel"); 111 112 startTests(async browser => { 113 let promiseRemoteFsState = waitRemoteFullscreenExitEvents([ 114 // browsingContext, name 115 [browser.browsingContext, "toplevel"], 116 ]); 117 // middle iframe 118 await NavigateRemoteDocument( 119 browser.browsingContext.children[0], 120 "about:blank" 121 ); 122 await promiseRemoteFsState; 123 }, "navigation_middle_frame"); 124 125 startTests(async browser => { 126 let promiseRemoteFsState = waitRemoteFullscreenExitEvents([ 127 // browsingContext, name 128 [browser.browsingContext, "toplevel"], 129 [browser.browsingContext.children[0], "middle"], 130 ]); 131 // innermost iframe 132 await NavigateRemoteDocument( 133 browser.browsingContext.children[0].children[0], 134 "about:blank" 135 ); 136 await promiseRemoteFsState; 137 }, "navigation_inner_frame");