file_iframe_media.html (2924B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 </head> 5 <body> 6 <video id="video" src="gizmo.mp4" loop></video> 7 <script type="text/javascript"> 8 9 const video = document.getElementById("video"); 10 const w = window.opener || window.parent; 11 12 window.onmessage = async event => { 13 if (event.data == "fullscreen") { 14 video.requestFullscreen(); 15 video.onfullscreenchange = () => { 16 video.onfullscreenchange = null; 17 video.onfullscreenerror = null; 18 w.postMessage("entered-fullscreen", "*"); 19 } 20 video.onfullscreenerror = () => { 21 // Retry until the element successfully enters fullscreen. 22 video.requestFullscreen(); 23 } 24 } else if (event.data == "check-playing") { 25 if (!video.paused) { 26 w.postMessage("checked-playing", "*"); 27 } else { 28 video.onplaying = () => { 29 video.onplaying = null; 30 w.postMessage("checked-playing", "*"); 31 } 32 } 33 } else if (event.data == "check-pause") { 34 if (video.paused) { 35 w.postMessage("checked-pause", "*"); 36 } else { 37 video.onpause = () => { 38 video.onpause = null; 39 w.postMessage("checked-pause", "*"); 40 } 41 } 42 } else if (event.data == "play") { 43 await video.play(); 44 w.postMessage("played", "*"); 45 } else if (event.data == "pause") { 46 video.pause(); 47 w.postMessage("paused", "*"); 48 } else if (event.data == "setMetadata") { 49 const metadata = { 50 title: document.title, 51 artist: document.title, 52 album: document.title, 53 artwork: [{ src: document.title, sizes: "128x128", type: "image/jpeg" }], 54 }; 55 navigator.mediaSession.metadata = new window.MediaMetadata(metadata); 56 w.postMessage(metadata, "*"); 57 } else if (event.data == "setPositionState") { 58 navigator.mediaSession.setPositionState({ 59 duration: 60, // The value doesn't matter 60 }); 61 } else if (event.data.cmd == "setActionHandler") { 62 if (window.triggeredActionHandler === undefined) { 63 window.triggeredActionHandler = {}; 64 } 65 const action = event.data.action; 66 window.triggeredActionHandler[action] = new Promise(r => { 67 navigator.mediaSession.setActionHandler(action, async () => { 68 if (action == "stop" || action == "pause") { 69 video.pause(); 70 } else if (action == "play") { 71 await video.play(); 72 } 73 r(); 74 }); 75 }); 76 w.postMessage("setActionHandler-done", "*"); 77 } else if (event.data.cmd == "checkActionHandler") { 78 const action = event.data.action; 79 if (!window.triggeredActionHandler[action]) { 80 w.postMessage("checkActionHandler-fail", "*"); 81 } else { 82 await window.triggeredActionHandler[action]; 83 w.postMessage("checkActionHandler-done", "*"); 84 } 85 } else if (event.data == "create-media-session") { 86 // simply calling a media session would create an instance. 87 navigator.mediaSession; 88 w.postMessage("created-media-session", "*"); 89 } 90 } 91 92 </script> 93 </body> 94 </html>