browser_fullscreen-document-mutation.js (3296B)
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 async function startTests(testFun, name) { 24 TEST_URLS.forEach(url => { 25 add_task(async () => { 26 info(`Test ${name}, url: ${url}`); 27 await BrowserTestUtils.withNewTab( 28 { 29 gBrowser, 30 url, 31 }, 32 async function (browser) { 33 let promiseFsState = waitForFullscreenState(document, true); 34 // Trigger click event in inner most iframe 35 SpecialPowers.spawn( 36 browser.browsingContext.children[0].children[0], 37 [], 38 function () { 39 content.setTimeout(() => { 40 content.document.getElementById("div").click(); 41 }, 0); 42 } 43 ); 44 await promiseFsState; 45 46 // This should exit fullscreen 47 promiseFsState = waitForFullscreenState(document, false); 48 await testFun(browser); 49 await promiseFsState; 50 51 // Ensure the browser exits fullscreen state. 52 ok( 53 !window.fullScreen, 54 "The chrome window should not be in fullscreen" 55 ); 56 ok( 57 !document.documentElement.hasAttribute("inDOMFullscreen"), 58 "The chrome document should not be in fullscreen" 59 ); 60 } 61 ); 62 }); 63 }); 64 } 65 66 function RemoveElementFromRemoteDocument(aBrowsingContext, aElementId) { 67 return SpecialPowers.spawn( 68 aBrowsingContext, 69 [aElementId], 70 async function (id) { 71 content.document.getElementById(id).remove(); 72 } 73 ); 74 } 75 76 startTests(async browser => { 77 let promiseRemoteFsState = waitRemoteFullscreenExitEvents([ 78 // browsingContext, name 79 [browser.browsingContext, "toplevel"], 80 ]); 81 // toplevel 82 await RemoveElementFromRemoteDocument(browser.browsingContext, "div"); 83 await promiseRemoteFsState; 84 }, "document_mutation_toplevel"); 85 86 startTests(async browser => { 87 let promiseRemoteFsState = waitRemoteFullscreenExitEvents([ 88 // browsingContext, name 89 [browser.browsingContext, "toplevel"], 90 [browser.browsingContext.children[0], "middle"], 91 ]); 92 // middle iframe 93 await RemoveElementFromRemoteDocument( 94 browser.browsingContext.children[0], 95 "div" 96 ); 97 await promiseRemoteFsState; 98 }, "document_mutation_middle_frame"); 99 100 startTests(async browser => { 101 let promiseRemoteFsState = waitRemoteFullscreenExitEvents([ 102 // browsingContext, name 103 [browser.browsingContext, "toplevel"], 104 [browser.browsingContext.children[0], "middle"], 105 [browser.browsingContext.children[0].children[0], "inner"], 106 ]); 107 // innermost iframe 108 await RemoveElementFromRemoteDocument( 109 browser.browsingContext.children[0].children[0], 110 "div" 111 ); 112 await promiseRemoteFsState; 113 }, "document_mutation_inner_frame");