Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: chrome/test/data/media/encrypted_media_utils.js

Issue 93243003: Add CDM FileIO tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: comments addressed Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 var keySystem = QueryString.keysystem; 5 var keySystem = QueryString.keysystem;
6 var mediaFile = QueryString.mediafile; 6 var mediaFile = QueryString.mediafile;
7 var mediaType = QueryString.mediatype || 'video/webm; codecs="vorbis, vp8"'; 7 var mediaType = QueryString.mediatype || 'video/webm; codecs="vorbis, vp8"';
8 var useMSE = QueryString.usemse == 1; 8 var useMSE = QueryString.usemse == 1;
9 9
10 // Default key used to encrypt many media files used in browser tests. 10 // Default key used to encrypt many media files used in browser tests.
11 var KEY = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b, 11 var KEY = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
12 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]); 12 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
13 // KEY_ID constant used as init data while encrypting test media files. 13 // KEY_ID constant used as init data while encrypting test media files.
14 var KEY_ID = getInitDataFromKeyId("0123456789012345"); 14 var KEY_ID = getInitDataFromKeyId("0123456789012345");
15 // Heart beat message header. 15 // Heart beat message header.
16 var HEART_BEAT_HEADER = 'HEARTBEAT'; 16 var HEART_BEAT_HEADER = 'HEARTBEAT';
17 var FILE_IO_TEST_RESULT_HEADER = 'FILEIOTESTRESULT';
17 var EXTERNAL_CLEAR_KEY_KEY_SYSTEM = "org.chromium.externalclearkey"; 18 var EXTERNAL_CLEAR_KEY_KEY_SYSTEM = "org.chromium.externalclearkey";
18 // Note that his URL has been normalized from the one in clear_key_cdm.cc. 19 // Note that his URL has been normalized from the one in clear_key_cdm.cc.
19 var EXTERNAL_CLEAR_KEY_HEARTBEAT_URL = 20 var EXTERNAL_CLEAR_KEY_HEARTBEAT_URL =
20 'http://test.externalclearkey.chromium.org/'; 21 'http://test.externalclearkey.chromium.org/';
21 22
22 function isHeartbeatMessage(msg) { 23 function hasPrefix(msg, prefix) {
23 if (msg.length < HEART_BEAT_HEADER.length) 24 if (msg.length < prefix.length)
24 return false; 25 return false;
25 for (var i = 0; i < HEART_BEAT_HEADER.length; ++i) { 26 for (var i = 0; i < prefix.length; ++i) {
26 if (String.fromCharCode(msg[i]) != HEART_BEAT_HEADER[i]) 27 if (String.fromCharCode(msg[i]) != prefix[i])
27 return false; 28 return false;
28 } 29 }
29 return true; 30 return true;
30 } 31 }
31 32
33 function isHeartbeatMessage(msg) {
34 return hasPrefix(msg, HEART_BEAT_HEADER);
35 }
36
37 function isFileIOTestMessage(msg) {
38 return hasPrefix(msg, FILE_IO_TEST_RESULT_HEADER);
39 }
40
32 function loadEncryptedMediaFromURL(video) { 41 function loadEncryptedMediaFromURL(video) {
33 return loadEncryptedMedia(video, mediaFile, keySystem, KEY, useMSE); 42 return loadEncryptedMedia(video, mediaFile, keySystem, KEY, useMSE);
34 } 43 }
35 44
36 function loadEncryptedMedia(video, mediaFile, keySystem, key, useMSE, 45 function loadEncryptedMedia(video, mediaFile, keySystem, key, useMSE,
37 appendSourceCallbackFn) { 46 appendSourceCallbackFn) {
38 var keyRequested = false; 47 var keyRequested = false;
39 var sourceOpened = false; 48 var sourceOpened = false;
40 // Add properties to enable verification that events occurred. 49 // Add properties to enable verification that events occurred.
41 video.receivedKeyAdded = false; 50 video.receivedKeyAdded = false;
42 video.receivedHeartbeat = false; 51 video.receivedHeartbeat = false;
52 video.fileIOTestPassed = false;
43 video.isHeartbeatExpected = keySystem === EXTERNAL_CLEAR_KEY_KEY_SYSTEM; 53 video.isHeartbeatExpected = keySystem === EXTERNAL_CLEAR_KEY_KEY_SYSTEM;
54 video.isFileIOTestExpected = keySystem === EXTERNAL_CLEAR_KEY_KEY_SYSTEM;
44 video.receivedKeyMessage = false; 55 video.receivedKeyMessage = false;
45 56
46 if (!(video && mediaFile && keySystem && key)) { 57 if (!(video && mediaFile && keySystem && key)) {
47 failTest('Missing parameters in loadEncryptedMedia().'); 58 failTest('Missing parameters in loadEncryptedMedia().');
48 return; 59 return;
49 } 60 }
50 61
51 function onNeedKey(e) { 62 function onNeedKey(e) {
52 if (keyRequested) 63 if (keyRequested)
53 return; 64 return;
(...skipping 28 matching lines...) Expand all
82 return; 93 return;
83 } 94 }
84 95
85 if (isHeartbeatMessage(e.message)) { 96 if (isHeartbeatMessage(e.message)) {
86 console.log('onKeyMessage - heartbeat', e); 97 console.log('onKeyMessage - heartbeat', e);
87 e.target.receivedHeartbeat = true; 98 e.target.receivedHeartbeat = true;
88 verifyHeartbeatMessage(e); 99 verifyHeartbeatMessage(e);
89 return; 100 return;
90 } 101 }
91 102
103 if (isFileIOTestMessage(e.message)) {
104 var success = getFileIOTestResult(e);
105 console.log('onKeyMessage - CDM file IO test: ' +
106 (success ? 'Success' : 'Fail'));
107 e.target.fileIOTestPassed = success;
108 return;
109 }
110
92 // No tested key system returns defaultURL in for key request messages. 111 // No tested key system returns defaultURL in for key request messages.
93 if (e.defaultURL) { 112 if (e.defaultURL) {
94 failTest('keymessage unexpectedly has defaultURL: ' + e.defaultURL); 113 failTest('keymessage unexpectedly has defaultURL: ' + e.defaultURL);
95 return; 114 return;
96 } 115 }
97 116
98 // keymessage in response to generateKeyRequest. Reply with key. 117 // keymessage in response to generateKeyRequest. Reply with key.
99 console.log('onKeyMessage - key request', e); 118 console.log('onKeyMessage - key request', e);
100 var initData = e.message; 119 var initData = e.message;
101 if (mediaType.indexOf('mp4') != -1) 120 if (mediaType.indexOf('mp4') != -1)
(...skipping 16 matching lines...) Expand all
118 failTest('Unexpected heartbeat from ' + e.keySystem); 137 failTest('Unexpected heartbeat from ' + e.keySystem);
119 return; 138 return;
120 } 139 }
121 140
122 if (e.defaultURL != EXTERNAL_CLEAR_KEY_HEARTBEAT_URL) { 141 if (e.defaultURL != EXTERNAL_CLEAR_KEY_HEARTBEAT_URL) {
123 failTest('Heartbeat message with unexpected defaultURL: ' + e.defaultURL); 142 failTest('Heartbeat message with unexpected defaultURL: ' + e.defaultURL);
124 return; 143 return;
125 } 144 }
126 } 145 }
127 146
147 function getFileIOTestResult(e) {
148 // Only External Clear Key sends a FILEIOTESTRESULT message.
149 if (e.keySystem != EXTERNAL_CLEAR_KEY_KEY_SYSTEM) {
150 failTest('Unexpected CDM file IO test result from ' + e.keySystem);
151 return false;
152 }
153
154 // The test result is either '0' or '1' appended to the header.
155 if (e.message.length != FILE_IO_TEST_RESULT_HEADER.length + 1)
156 return false;
157
158 var result_index = FILE_IO_TEST_RESULT_HEADER.length;
159 return String.fromCharCode(e.message[result_index]) == 1;
160 }
161
128 video.addEventListener('webkitneedkey', onNeedKey); 162 video.addEventListener('webkitneedkey', onNeedKey);
129 video.addEventListener('webkitkeymessage', onKeyMessage); 163 video.addEventListener('webkitkeymessage', onKeyMessage);
130 video.addEventListener('webkitkeyerror', function() { 164 video.addEventListener('webkitkeyerror', function() {
131 setResultInTitle("KeyError"); 165 setResultInTitle("KeyError");
132 }); 166 });
133 video.addEventListener('webkitkeyadded', onKeyAdded); 167 video.addEventListener('webkitkeyadded', onKeyAdded);
134 installTitleEventHandler(video, 'error'); 168 installTitleEventHandler(video, 'error');
135 169
136 if (useMSE) { 170 if (useMSE) {
137 var mediaSource = loadMediaSource(mediaFile, mediaType, 171 var mediaSource = loadMediaSource(mediaFile, mediaType,
138 appendSourceCallbackFn); 172 appendSourceCallbackFn);
139 video.src = window.URL.createObjectURL(mediaSource); 173 video.src = window.URL.createObjectURL(mediaSource);
140 } else { 174 } else {
141 video.src = mediaFile; 175 video.src = mediaFile;
142 } 176 }
143 } 177 }
144 178
145 function getInitDataFromKeyId(keyID) { 179 function getInitDataFromKeyId(keyID) {
146 var init_key_id = new Uint8Array(keyID.length); 180 var init_key_id = new Uint8Array(keyID.length);
147 for(var i = 0; i < keyID.length; i++) { 181 for(var i = 0; i < keyID.length; i++) {
148 init_key_id[i] = keyID.charCodeAt(i); 182 init_key_id[i] = keyID.charCodeAt(i);
149 } 183 }
150 return init_key_id; 184 return init_key_id;
151 } 185 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698