tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>