| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src=../video-test.js></script> |
| <script type="text/javascript"> |
| var mock; |
| var promise; |
| var mediaKeySystemAccess; |
| var mediaKeys; |
| var mediaKeySession; |
| var capabilities = {}; |
| var kids; |
| var iteratorArray; |
| var encoder = new TextEncoder(); |
| |
| function doTest() |
| { |
| if (!window.internals) { |
| failTest("Internals is required for this test.") |
| return; |
| } |
| |
| run('internals.initializeMockMediaSource()'); |
| run('mock = internals.registerMockCDM()'); |
| run('mock.supportedDataTypes = ["keyids"]'); |
| run('capabilities.initDataTypes = ["keyids"]'); |
| run(`capabilities.videoCapabilities = [{ contentType: 'video/mock; codecs="mock"' }] `); |
| run('promise = navigator.requestMediaKeySystemAccess("org.webkit.mock", [capabilities])'); |
| shouldResolve(promise).then(gotMediaKeySystemAccess, failTest); |
| } |
| |
| function next() { |
| if (!tests.length) { |
| mock.unregister(); |
| endTest() |
| return; |
| } |
| |
| var nextTest = tests.shift(); |
| consoleWrite(''); |
| nextTest(); |
| } |
| |
| function gotMediaKeySystemAccess(result) { |
| mediaKeySystemAccess = result; |
| next(); |
| } |
| |
| function gotMediaKeys(result) { |
| mediaKeys = result; |
| next(); |
| } |
| |
| tests = [ |
| function() { |
| run('promise = mediaKeySystemAccess.createMediaKeys()'); |
| shouldResolve(promise).then(gotMediaKeys, failTest); |
| }, |
| |
| function() { |
| consoleWrite('Using a non-callable MediaKeySession should reject.'); |
| run('mediaKeySession = mediaKeys.createSession("temporary")'); |
| testExpected('typeof mediaKeySession', 'object'); |
| run('promise = mediaKeySession.update(encoder.encode("invalid-state"))'); |
| shouldReject(promise).then(next, next); |
| }, |
| |
| function() { |
| consoleWrite('Using a zero-length response should reject.'); |
| run('kids = JSON.stringify({ kids: [ "MTIzNDU=" ] })'); |
| run('mediaKeySession = mediaKeys.createSession("temporary")'); |
| run('promise = mediaKeySession.generateRequest("keyids", encoder.encode(kids))'); |
| shouldResolve(promise).then(function() { |
| run('promise = mediaKeySession.update(new Uint8Array(0))'); |
| shouldReject(promise).then(next, next); |
| }, next); |
| }, |
| |
| function() { |
| consoleWrite('Using a non-sanitizable response should reject.'); |
| run('kids = JSON.stringify({ kids: [ "MTIzNDU=" ] })'); |
| run('mediaKeySession = mediaKeys.createSession("temporary")'); |
| run('promise = mediaKeySession.generateRequest("keyids", encoder.encode(kids))'); |
| shouldResolve(promise).then(function() { |
| run('promise = mediaKeySession.update(encoder.encode("invalid-response"))'); |
| shouldReject(promise).then(next, next); |
| }, next); |
| }, |
| |
| function() { |
| consoleWrite('Using a sanitizable response should resolve.'); |
| run('kids = JSON.stringify({ kids: [ "MTIzNDU=" ] })'); |
| run('mediaKeySession = mediaKeys.createSession("temporary")'); |
| run('promise = mediaKeySession.generateRequest("keyids", encoder.encode(kids))'); |
| shouldResolve(promise).then(function() { |
| run('promise = mediaKeySession.update(encoder.encode("valid-response"))'); |
| shouldResolve(promise).then(next, next); |
| }, next); |
| }, |
| |
| function() { |
| consoleWrite('Using a sanitizable response with invalid format should resolve.'); |
| run('kids = JSON.stringify({ kids: [ "MTIzNDU=" ] })'); |
| run('mediaKeySession = mediaKeys.createSession("temporary")'); |
| run('promise = mediaKeySession.generateRequest("keyids", encoder.encode(kids))'); |
| shouldResolve(promise).then(function() { |
| run('promise = mediaKeySession.update(encoder.encode("valid-response invalid-format"))'); |
| shouldReject(promise).then(next, next); |
| }, next); |
| }, |
| |
| function() { |
| consoleWrite('A valid MediaKeySession properly dispatches keystatuseschange event.'); |
| run('kids = JSON.stringify({ kids: [ "MTIzNDU=", "Njc4OTA=" ] })'); |
| run('mediaKeySession = mediaKeys.createSession("temporary")'); |
| run('promise = mediaKeySession.generateRequest("keyids", encoder.encode(kids))'); |
| shouldResolve(promise).then(function() { |
| run('promise = mediaKeySession.update(encoder.encode("valid-response keys-changed"))'); |
| mediaKeySession.addEventListener('keystatuseschange', function(event) { |
| testExpected('mediaKeySession.keyStatuses.size', 2); |
| testExpected('mediaKeySession.keyStatuses.has(encoder.encode("12345"))', true); |
| testExpected('mediaKeySession.keyStatuses.get(encoder.encode("12345"))', 'usable'); |
| testExpected('mediaKeySession.keyStatuses.has(encoder.encode("67890"))', true); |
| testExpected('mediaKeySession.keyStatuses.get(encoder.encode("67890"))', 'usable'); |
| testExpected('mediaKeySession.keyStatuses.has(encoder.encode("invalid"))', false); |
| testExpected('mediaKeySession.keyStatuses.get(encoder.encode("invalid"))', undefined); |
| |
| iteratorArray = []; |
| for (var pair of mediaKeySession.keyStatuses) |
| iteratorArray.push([ new Uint8Array(pair[0]), pair[1] ]); |
| testExpected('iteratorArray.length', 2); |
| testArraysEqual('iteratorArray[0][0]', encoder.encode('12345')); |
| testExpected('iteratorArray[0][1]', 'usable'); |
| testArraysEqual('iteratorArray[1][0]', encoder.encode('67890')); |
| testExpected('iteratorArray[1][1]', 'usable'); |
| |
| iteratorArray = []; |
| for (var key of mediaKeySession.keyStatuses.keys()) |
| iteratorArray.push(new Uint8Array(key)); |
| testExpected('iteratorArray.length', 2); |
| testArraysEqual('iteratorArray[0]', encoder.encode('12345')); |
| testArraysEqual('iteratorArray[1]', encoder.encode('67890')); |
| |
| iteratorArray = []; |
| for (var value of mediaKeySession.keyStatuses.values()) |
| iteratorArray.push(value); |
| testArraysEqual('iteratorArray', [ 'usable', 'usable' ]); |
| |
| iteratorArray = []; |
| for (var entry of mediaKeySession.keyStatuses.entries()) |
| iteratorArray.push({ key: new Uint8Array(entry[0]), value: entry[1] }); |
| testExpected('iteratorArray.length', 2); |
| testArraysEqual('iteratorArray[0].key', encoder.encode('12345')); |
| testExpected('iteratorArray[0].value', 'usable'); |
| testArraysEqual('iteratorArray[1].key', encoder.encode('67890')); |
| testExpected('iteratorArray[1].value', 'usable'); |
| |
| iteratorArray = []; |
| mediaKeySession.keyStatuses.forEach(function(value, key) { |
| iteratorArray.push({ key: new Uint8Array(key), value: value }); |
| }); |
| testExpected('iteratorArray.length', 2); |
| testArraysEqual('iteratorArray[0].key', encoder.encode('12345')); |
| testExpected('iteratorArray[0].value', 'usable'); |
| testArraysEqual('iteratorArray[1].key', encoder.encode('67890')); |
| testExpected('iteratorArray[1].value', 'usable'); |
| |
| shouldResolve(promise).then(next, next); |
| }, false); |
| }, next); |
| }, |
| ]; |
| </script> |
| </head> |
| <body onload="doTest()"> |
| </body> |
| </html> |