tor-browser

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

test_eme_detach_reattach_same_mediakeys_during_playback.html (3761B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <title>Test Encrypted Media Extensions</title>
      5  <script src="/tests/SimpleTest/SimpleTest.js"></script>
      6  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
      7  <script type="text/javascript" src="manifest.js"></script>
      8  <script type="text/javascript" src="https://example.com:443/tests/dom/media/test/eme.js"></script>
      9 </head>
     10 <body>
     11 <pre id="test">
     12 <video id="v" controls></video>
     13 <script class="testbody" type="text/javascript">
     14 /* import-globals-from eme.js */
     15 var manager = new MediaTestManager;
     16 
     17 var EMEmanifest = [
     18  {
     19    name:"bipbop 10s",
     20    tracks: [
     21      {
     22          name:"video",
     23          type:"video/mp4; codecs=\"avc1.4d4015\"",
     24          fragments:[ "bipbop-cenc-video-10s.mp4",
     25                    ]
     26      }
     27    ],
     28    keys: {
     29      "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311",
     30    },
     31    sessionType:"temporary",
     32    sessionCount:1,
     33    duration:10.01
     34  },
     35 ];
     36 
     37 function sleep(time) {
     38  return new Promise((resolve) => setTimeout(resolve, time));
     39 }
     40 
     41 // To check if playback can be blocked and resumed correctly after
     42 // detaching original mediakeys and reattach it back.
     43 function startTest(test, token)
     44 {
     45  manager.started(token);
     46 
     47  var mk_ori;
     48  let finish = new EMEPromise;
     49 
     50  let v = document.getElementById("v");
     51  let sessions = [];
     52  function onSessionCreated(session) {
     53    sessions.push(session);
     54  }
     55 
     56  function closeSessions() {
     57    let p = new EMEPromise;
     58    Promise.all(sessions.map(s => s.close()))
     59    .then(p.resolve, p.reject);
     60    return p.promise;
     61  }
     62 
     63  function setMediaKeysToElement(mk, solve, reject) {
     64    v.setMediaKeys(mk).then(solve, reject);
     65  }
     66 
     67  function ReattachOriMediaKeys() {
     68    function onOriMediaKeysSetOK() {
     69      ok(true, TimeStamp(token) + " (ENCRYPTED) Set original MediaKeys back OK!");
     70    }
     71    function onOriMediaKeysSetFailed() {
     72      ok(false, " Failed to set original mediakeys back.");
     73    }
     74 
     75    function onCanPlayAgain() {
     76      Promise.all([closeSessions()])
     77      .then(() => {
     78        ok(true, " (ENCRYPTED) Playback can be resumed.");
     79        manager.finished(token);
     80      }, () => {
     81        ok(false, TimeStamp(token) + " Sessions are closed incorrectly.");
     82        manager.finished(token);
     83      });
     84    }
     85 
     86    once(v, "canplay", onCanPlayAgain);
     87    setMediaKeysToElement(mk_ori, onOriMediaKeysSetOK, onOriMediaKeysSetFailed)
     88  }
     89 
     90  function triggerSeek() {
     91    v.currentTime = v.duration / 2;
     92  }
     93 
     94  function onCanPlay() {
     95    function onSetMediaKeysToNullOK() {
     96      ok(true, TimeStamp(token) + " Set MediaKeys to null. OK!");
     97 
     98      triggerSeek();
     99 
    100      SimpleTest.requestFlakyTimeout("To reattach mediakeys back again in 5s.");
    101      sleep(5000).then(ReattachOriMediaKeys);
    102    }
    103    function onSetMediaKeysToNullFailed() {
    104      ok(false, TimeStamp(token) + " Set MediaKeys to null. FAILED!");
    105    }
    106 
    107    SimpleTest.requestFlakyTimeout("To detach mediakeys after receiving 'canplay' event in 2s");
    108    sleep(2000).then(() => {
    109      setMediaKeysToElement(null, onSetMediaKeysToNullOK, onSetMediaKeysToNullFailed);
    110    });
    111  }
    112 
    113  once(v, "canplay", onCanPlay);
    114 
    115  var p1 = LoadInitData(v, test, token);
    116  var p2 = CreateAndSetMediaKeys(v, test, token);
    117  var p3 = LoadTest(test, v, token);
    118  Promise.all([p1, p2, p3])
    119  .then(values => {
    120    let initData = values[0];
    121    // stash the mediakeys
    122    mk_ori = v.mediaKeys;
    123    initData.map(ev => {
    124      let session = v.mediaKeys.createSession();
    125      onSessionCreated(session);
    126      MakeRequest(test, token, ev, session);
    127    });
    128  })
    129  .then(() => {
    130    return finish.promise;
    131  })
    132  .catch(reason => ok(false, reason))
    133 }
    134 
    135 SimpleTest.waitForExplicitFinish();
    136 manager.runTests(EMEmanifest, startTest);
    137 
    138 </script>
    139 </pre>
    140 </body>
    141 </html>