FullscreenFrame.sys.mjs (2943B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 /** 5 * test helper JSWindowActors used by the browser_fullscreen_api_fission.js test. 6 */ 7 8 export class FullscreenFrameChild extends JSWindowActorChild { 9 actorCreated() { 10 this.fullscreen_events = []; 11 } 12 13 changed() { 14 return new Promise(resolve => { 15 this.contentWindow.document.addEventListener( 16 "fullscreenchange", 17 () => resolve(), 18 { 19 once: true, 20 } 21 ); 22 }); 23 } 24 25 requestFullscreen() { 26 let doc = this.contentWindow.document; 27 let button = doc.createElement("button"); 28 doc.body.appendChild(button); 29 30 return new Promise(resolve => { 31 button.onclick = () => { 32 doc.body.requestFullscreen().then(resolve); 33 doc.body.removeChild(button); 34 }; 35 button.click(); 36 }); 37 } 38 39 receiveMessage(msg) { 40 switch (msg.name) { 41 case "WaitForChange": 42 return this.changed(); 43 case "ExitFullscreen": 44 return this.contentWindow.document.exitFullscreen(); 45 case "RequestFullscreen": 46 return Promise.all([this.changed(), this.requestFullscreen()]); 47 case "CreateChild": { 48 let child = msg.data; 49 let iframe = this.contentWindow.document.createElement("iframe"); 50 iframe.allow = child.allow_fullscreen ? "fullscreen" : ""; 51 iframe.name = child.name; 52 53 let loaded = new Promise(resolve => { 54 iframe.addEventListener( 55 "load", 56 () => resolve(iframe.browsingContext), 57 { once: true } 58 ); 59 }); 60 iframe.src = child.url; 61 this.contentWindow.document.body.appendChild(iframe); 62 return loaded; 63 } 64 case "GetEvents": 65 return Promise.resolve(this.fullscreen_events); 66 case "ClearEvents": 67 this.fullscreen_events = []; 68 return Promise.resolve(); 69 case "GetFullscreenElement": { 70 let document = this.contentWindow.document; 71 let child_iframe = this.contentWindow.document.getElementsByTagName( 72 "iframe" 73 ) 74 ? this.contentWindow.document.getElementsByTagName("iframe")[0] 75 : null; 76 switch (document.fullscreenElement) { 77 case null: 78 return Promise.resolve("null"); 79 case document: 80 return Promise.resolve("document"); 81 case document.body: 82 return Promise.resolve("body"); 83 case child_iframe: 84 return Promise.resolve("child_iframe"); 85 default: 86 return Promise.resolve("other"); 87 } 88 } 89 } 90 91 return Promise.reject("Unexpected Message"); 92 } 93 94 async handleEvent(event) { 95 switch (event.type) { 96 case "fullscreenchange": 97 this.fullscreen_events.push(true); 98 break; 99 case "fullscreenerror": 100 this.fullscreen_events.push(false); 101 break; 102 } 103 } 104 }