Index: third_party/WebKit/LayoutTests/imported/wpt/encrypted-media/scripts/keystatuses.js |
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/encrypted-media/scripts/keystatuses.js b/third_party/WebKit/LayoutTests/imported/wpt/encrypted-media/scripts/keystatuses.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8d33dd42100676b8bd27ec6c47dc4d906a74960a |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/imported/wpt/encrypted-media/scripts/keystatuses.js |
@@ -0,0 +1,165 @@ |
+function runTest(config,qualifier) |
+{ |
+ var testname = testnamePrefix(qualifier, config.keysystem) + ', temporary, keystatuses'; |
+ |
+ var configuration = getSimpleConfigurationForContent(config.content); |
+ |
+ if (config.initDataType && config.initData) { |
+ configuration.initDataTypes = [config.initDataType]; |
+ } |
+ |
+ async_test(function(test) |
+ { |
+ var mediaKeySession; |
+ var initDataType; |
+ var initData; |
+ var closed = false; |
+ |
+ // Even though key ids are uint8, using printable values so that |
+ // they can be verified easily. |
+ var key1 = new Uint8Array(config.content.keys[0].kid), |
+ key2 = new Uint8Array(config.content.keys[1].kid), |
+ key1String = arrayBufferAsString(key1), |
+ key2String = arrayBufferAsString(key2); |
+ |
+ function onFailure(error) { |
+ forceTestFailureFromPromise(test, error); |
+ } |
+ |
+ function processMessage(event) |
+ { |
+ // No keys added yet. |
+ assert_equals(mediaKeySession.keyStatuses.size, 0); |
+ |
+ waitForEventAndRunStep('keystatuseschange', mediaKeySession, processKeyStatusesChange, test); |
+ |
+ // Add keys to session |
+ config.messagehandler(event.messageType, event.message).then(function(response) { |
+ return event.target.update(response); |
+ }).catch(onFailure); |
+ } |
+ |
+ function checkKeyStatusFor2Keys() |
+ { |
+ // Two keys added, so both should show up in |keyStatuses|. |
+ assert_equals(mediaKeySession.keyStatuses.size, 2); |
+ |
+ // Check |keyStatuses| for 2 entries. |
+ var result = []; |
+ for (let item of mediaKeySession.keyStatuses) { |
+ result.push({ key: arrayBufferAsString(item[0]), value: item[1] }); |
+ } |
+ function lexicographical( a, b ) { return a < b ? -1 : a === b ? 0 : +1; } |
+ function lexicographicalkey( a, b ) { return lexicographical( a.key, b.key ); } |
+ var expected1 = [{ key: key1String, value: 'usable'}, { key: key2String, value: 'usable'}].sort( lexicographicalkey ); |
+ var expected2 = [{ key: key1String, value: 'status-pending'}, { key: key2String, value: 'status-pending'}].sort( lexicographicalkey ); |
+ assert_in_array( JSON.stringify(result), |
+ [ JSON.stringify(expected1),JSON.stringify(expected2) ], |
+ "keystatuses should have the two expected keys with keystatus 'usable' or 'status-pending'"); |
+ |
+ // |keyStatuses| must contain both keys. |
+ result = []; |
+ for (var key of mediaKeySession.keyStatuses.keys()) { |
+ result.push(arrayBufferAsString(key)); |
+ } |
+ assert_array_equals(result, |
+ [key1String, key2String].sort( lexicographical ), |
+ "keyStatuses.keys() should return an iterable over the two expected keys"); |
+ |
+ // Both values in |mediaKeySession| should be 'usable' or 'status-pending'. |
+ result = []; |
+ for (var value of mediaKeySession.keyStatuses.values()) { |
+ result.push(value); |
+ } |
+ |
+ assert_equals( result.length, 2, "keyStatuses.values() should have two elements" ); |
+ assert_equals( result[0], result[1], "the values in keyStatuses.values() should be equal" ); |
+ assert_in_array( result[0], [ 'usable', 'status-pending' ] ); |
+ |
+ // Check |keyStatuses.entries()|. |
+ result = []; |
+ for (var entry of mediaKeySession.keyStatuses.entries()) { |
+ result.push({ key: arrayBufferAsString(entry[0]), value: entry[1] }); |
+ } |
+ assert_in_array(JSON.stringify(result), |
+ [ JSON.stringify(expected1), JSON.stringify(expected2) ], |
+ "keyStatuses.entries() should return an iterable over the two expected keys, with keystatus 'usable' or 'status-pending'"); |
+ |
+ // forEach() should return both entries. |
+ result = []; |
+ mediaKeySession.keyStatuses.forEach(function(status, keyId) { |
+ result.push({ key: arrayBufferAsString(keyId), value: status }); |
+ }); |
+ assert_in_array(JSON.stringify(result), |
+ [ JSON.stringify(expected1), JSON.stringify(expected2) ], |
+ "keyStatuses.forEach() should iterate over the two expected keys, with keystatus 'usable' or 'status-pending'"); |
+ |
+ // has() and get() should return the expected values. |
+ assert_true(mediaKeySession.keyStatuses.has(key1), "keyStatuses should have key1"); |
+ assert_true(mediaKeySession.keyStatuses.has(key2), "keyStatuses should have key2"); |
+ assert_in_array(mediaKeySession.keyStatuses.get(key1), [ 'usable', 'status-pending' ], "key1 should have status 'usable' or 'status-pending'"); |
+ assert_in_array(mediaKeySession.keyStatuses.get(key2), [ 'usable', 'status-pending' ], "key2 should have status 'usable' or 'status-pending'"); |
+ |
+ // Try some invalid keyIds. |
+ var invalid1 = key1.subarray(0, key1.length - 1); |
+ assert_false(mediaKeySession.keyStatuses.has(invalid1), "keystatuses should not have invalid key (1)"); |
+ assert_equals(mediaKeySession.keyStatuses.get(invalid1), undefined, "keystatus value for invalid key should be undefined (1)"); |
+ |
+ var invalid2 = key1.subarray(1); |
+ assert_false(mediaKeySession.keyStatuses.has(invalid2), "keystatuses should not have invalid key (2)"); |
+ assert_equals(mediaKeySession.keyStatuses.get(invalid2), undefined, "keystatus value for invalid key should be undefined (2)"); |
+ |
+ var invalid3 = new Uint8Array(key1); |
+ invalid3[0] += 1; |
+ assert_false(mediaKeySession.keyStatuses.has(invalid3), "keystatuses should not have invalid key (3)"); |
+ assert_equals(mediaKeySession.keyStatuses.get(invalid3), undefined, "keystatus value for invalid key should be undefined (3)"); |
+ |
+ var invalid4 = new Uint8Array(key1); |
+ invalid4[invalid4.length - 1] -= 1; |
+ assert_false(mediaKeySession.keyStatuses.has(invalid4), "keystatuses should not have invalid key (4)"); |
+ assert_equals(mediaKeySession.keyStatuses.get(invalid4), undefined, "keystatus value for invalid key should be undefined (4)"); |
+ |
+ var invalid5 = new Uint8Array(key1.length + 1); |
+ invalid5.set(key1, 1); // First element will be 0. |
+ assert_false(mediaKeySession.keyStatuses.has(invalid5), "keystatuses should not have invalid key (5)"); |
+ assert_equals(mediaKeySession.keyStatuses.get(invalid5), undefined, "keystatus value for invalid key should be undefined (5)"); |
+ |
+ var invalid6 = new Uint8Array(key1.length + 1); |
+ invalid6.set(key1, 0); // Last element will be 0. |
+ assert_false(mediaKeySession.keyStatuses.has(invalid6), "keystatuses should not have invalid key (6)"); |
+ assert_equals(mediaKeySession.keyStatuses.get(invalid6), undefined, "keystatus value for invalid key should be undefined (6)"); |
+ } |
+ |
+ function processKeyStatusesChange(event) |
+ { |
+ if (!closed) |
+ { |
+ // The first keystatuseschange (caused by update()) |
+ // should include both keys. |
+ checkKeyStatusFor2Keys(); |
+ |
+ mediaKeySession.close().catch(onFailure); |
+ closed = true; |
+ } |
+ else |
+ { |
+ // The second keystatuseschange (caused by close()) |
+ // should not have any keys. |
+ assert_equals(mediaKeySession.keyStatuses.size, 0); |
+ test.done(); |
+ } |
+ } |
+ |
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) { |
+ return access.createMediaKeys(); |
+ }).then(test.step_func(function(mediaKeys) { |
+ mediaKeySession = mediaKeys.createSession(); |
+ |
+ // There should be no keys defined yet. |
+ //verifyKeyStatuses(mediaKeySession.keyStatuses, { expected: [], unexpected: [key1, key2] }); |
+ |
+ waitForEventAndRunStep('message', mediaKeySession, processMessage, test); |
+ return mediaKeySession.generateRequest(config.initDataType, config.initData); |
+ })).catch(onFailure); |
+ }, testname ); |
+} |