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