tor-browser

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

test_eme_pssh_in_moof.html (4915B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 
      4  <head>
      5    <title>Test Encrypted Media Extensions</title>
      6    <script src="/tests/SimpleTest/SimpleTest.js"></script>
      7    <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
      8    <script type="text/javascript" src="manifest.js"></script>
      9    <script type="text/javascript" src="eme.js"></script>
     10  </head>
     11 
     12  <body>
     13    <script class="testbody" type="text/javascript">
     14    let manager = new MediaTestManager;
     15 
     16    let psshTests = [
     17      { name: "bear-640x360-cenc-key-rotation",
     18        tracks : [
     19          {
     20            name: "video",
     21            type: "video/mp4; codecs=\"avc1.64000d\"",
     22            fragments: ["bear-640x360-v_frag-cenc-key_rotation.mp4"],
     23            initDatas: 6
     24          },
     25          {
     26            name: "audio",
     27            type: "audio/mp4; codecs=\"mp4a.40.2\"",
     28            fragments: ["bear-640x360-a_frag-cenc-key_rotation.mp4"],
     29            initDatas: 7
     30          }
     31        ],
     32        keys : {
     33          "30313233343536373839303132333435" :
     34            "ebdd62f16814d27b68ef122afce4ae3c"
     35        }
     36      },
     37      { name: "bipbop-clearkey-keyrotation-clear-lead",
     38        tracks : [
     39          {
     40            name: "video",
     41            type: "video/mp4; codecs=\"avc1.4d4015\"",
     42            fragments: ["bipbop-clearkey-keyrotation-clear-lead-video.mp4"],
     43            initDatas: 3
     44          },
     45          {
     46            name: "audio",
     47            type: "audio/mp4; codecs=\"mp4a.40.2\"",
     48            fragments: ["bipbop-clearkey-keyrotation-clear-lead-audio.mp4"],
     49            initDatas: 3
     50          }
     51        ],
     52        keys : {
     53          "00112233445566778899aabbccddeeff" :
     54            "00112233445566778899aabbccddeeff",
     55          "112233445566778899aabbccddeeff00" :
     56            "112233445566778899aabbccddeeff00"
     57        }
     58      }
     59    ];
     60 
     61    // Specialized create media keys function, since the one in eme.js relies
     62    // on listening for encrypted events, and we want to manage those
     63    // ourselves within this test.
     64    async function createAndSetMediaKeys(video, test) {
     65      function streamType(type) {
     66        var x = test.tracks.find(o => o.name == type);
     67        return x ? x.type : undefined;
     68      }
     69 
     70      var configuration = { initDataTypes: ["cenc"] };
     71      if (streamType("video")) {
     72        configuration.videoCapabilities = [{contentType: streamType("video")}];
     73      }
     74      if (streamType("audio")) {
     75        configuration.audioCapabilities = [{contentType: streamType("audio")}];
     76      }
     77      let keySystemAccess = await navigator.requestMediaKeySystemAccess(
     78        "org.w3.clearkey", [configuration]);
     79      let mediaKeys = await keySystemAccess.createMediaKeys();
     80      return video.setMediaKeys(mediaKeys);
     81    }
     82 
     83    function startTest(test, token) {
     84      manager.started(token);
     85      let video = document.createElement("video");
     86      document.body.appendChild(video);
     87 
     88      let encryptedEventCount = 0;
     89 
     90      let initDatas = new Map();
     91 
     92      function handleEncrypted(event) {
     93        // We get one 'encrypted' event for every run of contiguous PSSH boxes
     94        // in each stream. Note that some of the PSSH boxes contained in the
     95        // "bear" streams aren't in the Common Open PSSH box format, so our
     96        // ClearKey CDM will reject those license requests. Some of the init
     97        // data is also repeated.
     98        encryptedEventCount++;
     99 
    100        let hexStr = StringToHex(new TextDecoder().decode(event.initData));
    101        if (initDatas.has(hexStr)) {
    102          // Already have a session for this.
    103          return;
    104        }
    105 
    106        let initData = new Uint8Array(event.initData);
    107        is(event.initDataType, "cenc", "'encrypted' event should have 'cenc' " +
    108           "initDataType");
    109        Log(token, "encrypted event => len=" + initData.length + " " + hexStr);
    110        let session = event.target.mediaKeys.createSession();
    111        initDatas.set(hexStr, session);
    112        session.addEventListener("message", e => {
    113          e.target.update(
    114            GenerateClearKeyLicense(e.message, test.keys));
    115        });
    116 
    117        session.generateRequest(event.initDataType, event.initData);
    118      }
    119 
    120      video.addEventListener("encrypted", handleEncrypted);
    121 
    122      video.addEventListener("ended", () => {
    123        let expectedEncryptedEvents =
    124          test.tracks.reduce((sum, track) => sum += track.initDatas, 0);
    125        is(encryptedEventCount, expectedEncryptedEvents,
    126           "Should get one 'encrypted' event per run of contiguous PSSH " +
    127           "boxes in media.");
    128        manager.finished(token);
    129      });
    130 
    131      video.autoplay = true;
    132 
    133      createAndSetMediaKeys(video, test, token)
    134        .then(() => LoadTest(test, video, token))
    135    }
    136 
    137    manager.runTests(psshTests, startTest);
    138 
    139    </script>
    140  </body>
    141 </html>