tor-browser

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

keystatuses-multiple-sessions.js (4420B)


      1 function runTest(config,qualifier)
      2 {
      3    var testname = testnamePrefix(qualifier, config.keysystem) + ', temporary, keystatuses, multiple sessions';
      4 
      5    var configuration = getSimpleConfigurationForContent(config.content);
      6 
      7    if (config.initDataType && config.initData) configuration.initDataTypes = [config.initDataType];
      8 
      9    async_test(function(test)
     10    {
     11        var mediaKeySession1;
     12        var mediaKeySession2;
     13 
     14        // Even though key ids are uint8, using printable values so that
     15        // they can be verified easily.
     16        var key1 = new Uint8Array(config.content.keys[0].kid),
     17            key2 = new Uint8Array(config.content.keys[1].kid),
     18            variant1 = config.content.keys[0].variantId,
     19            variant2 = config.content.keys[1].variantId;
     20 
     21        function onFailure(error) {
     22            forceTestFailureFromPromise(test,error);
     23        }
     24 
     25        function processMessage1(event)
     26        {
     27            // This should only be called for session1.
     28            assert_equals(event.target, mediaKeySession1);
     29 
     30            // No keys added yet.
     31            verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [], unexpected: [key1, key2]});
     32 
     33            // Add key1 to session1.
     34            config.messagehandler(event.messageType, event.message, {variantId:variant1}).then(function(response) {
     35                return event.target.update(response);
     36            }).catch(onFailure);
     37 
     38        }
     39 
     40        function processKeyStatusesChange1(event)
     41        {
     42            // This should only be called for session1.
     43            assert_equals(event.target, mediaKeySession1);
     44 
     45            // Check that keyStatuses contains the expected key1 only.
     46            verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [key1], unexpected: [key2]});
     47 
     48            // Now trigger a message event on session2.
     49            mediaKeySession2.generateRequest(config.initDataType, config.initData[1]).catch(onFailure);
     50        }
     51 
     52        function processMessage2(event)
     53        {
     54            // This should only be called for session2.
     55            assert_equals(event.target, mediaKeySession2);
     56 
     57            // session2 has no keys added yet.
     58            verifyKeyStatuses(mediaKeySession2.keyStatuses, {expected: [], unexpected: [key1, key2]});
     59 
     60            // session1 should still have 1 key.
     61            verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [key1], unexpected: [key2]});
     62 
     63            // Add key2 to session2.
     64            config.messagehandler(event.messageType, event.message, {variantId:variant2}).then(function(response) {
     65                return event.target.update(response);
     66            }).catch(onFailure);
     67        }
     68 
     69        function processKeyStatusesChange2(event)
     70        {
     71            // This should only be called for session2.
     72            assert_equals(event.target, mediaKeySession2);
     73 
     74            // Check that keyStatuses contains the expected key2 only.
     75            verifyKeyStatuses(mediaKeySession2.keyStatuses, {expected: [key2], unexpected: [key1]});
     76 
     77            // session1 should still have 1 key.
     78            verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [key1], unexpected: [key2]});
     79 
     80            test.done();
     81        }
     82 
     83        navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
     84            return access.createMediaKeys();
     85        }).then(function(mediaKeys) {
     86            mediaKeySession1 = mediaKeys.createSession();
     87            mediaKeySession2 = mediaKeys.createSession();
     88 
     89            // There should be no keys defined on either session.
     90            verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [], unexpected: [key1, key2]});
     91            verifyKeyStatuses(mediaKeySession2.keyStatuses, {expected: [], unexpected: [key1, key2]});
     92 
     93            // Bind all the event handlers now.
     94            waitForEventAndRunStep('message', mediaKeySession1, processMessage1, test);
     95            waitForEventAndRunStep('message', mediaKeySession2, processMessage2, test);
     96            waitForEventAndRunStep('keystatuseschange', mediaKeySession1, processKeyStatusesChange1, test);
     97            waitForEventAndRunStep('keystatuseschange', mediaKeySession2, processKeyStatusesChange2, test);
     98 
     99            // Generate a request on session1.
    100            return mediaKeySession1.generateRequest(config.initDataType, config.initData[0]);
    101        }).catch(onFailure);
    102    },  testname );
    103 }