summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorshadi@chromium.org <shadi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-18 04:02:14 +0000
committershadi@chromium.org <shadi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-18 04:02:14 +0000
commit6aad7dc0fd39b04af7a5dd3ab0007955bbf3d238 (patch)
tree68071626128160c8d682004622ffbe459ca98cb3 /content
parent1feea225f788e3fb3dd0a179fb62d041bf50af0b (diff)
downloadchromium_src-6aad7dc0fd39b04af7a5dd3ab0007955bbf3d238.zip
chromium_src-6aad7dc0fd39b04af7a5dd3ab0007955bbf3d238.tar.gz
chromium_src-6aad7dc0fd39b04af7a5dd3ab0007955bbf3d238.tar.bz2
A browser test to test encrypted media playback of videos with frame size change.
BUG=156261 Review URL: https://chromiumcodereview.appspot.com/11121002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@162643 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r--content/browser/encrypted_media_browsertest.cc38
-rw-r--r--content/test/data/media/encrypted_frame_size_change.html48
-rw-r--r--content/test/data/media/encrypted_media_player.html102
-rwxr-xr-xcontent/test/data/media/encrypted_media_utils.js107
4 files changed, 192 insertions, 103 deletions
diff --git a/content/browser/encrypted_media_browsertest.cc b/content/browser/encrypted_media_browsertest.cc
index a00e5db..2e0ed3b 100644
--- a/content/browser/encrypted_media_browsertest.cc
+++ b/content/browser/encrypted_media_browsertest.cc
@@ -37,14 +37,28 @@ class EncryptedMediaTest
: public testing::WithParamInterface<const char*>,
public content::ContentBrowserTest {
public:
- void PlayMedia(const char* key_system, const string16 expectation) {
+ void TestSimplePlayback(const char* encrypted_video, const char* key_system,
+ const string16 expectation) {
+ PlayEncryptedMedia("encrypted_media_player.html", encrypted_video,
+ key_system, expectation);
+ }
+
+ void TestFrameSizeChange(const char* key_system, const string16 expectation) {
+ PlayEncryptedMedia("encrypted_frame_size_change.html",
+ "frame_size_change-av-enc-v.webm", key_system,
+ expectation);
+ }
+
+ void PlayEncryptedMedia(const char* html_page, const char* media_file,
+ const char* key_system, const string16 expectation) {
// TODO(shadi): Add non-HTTP tests once src is supported for EME.
ASSERT_TRUE(test_server()->Start());
const string16 kError = ASCIIToUTF16("ERROR");
const string16 kFailed = ASCIIToUTF16("FAILED");
GURL player_gurl = test_server()->GetURL(base::StringPrintf(
- "files/media/encrypted_media_player.html?keysystem=%s", key_system));
+ "files/media/%s?keysystem=%s&mediafile=%s", html_page, key_system,
+ media_file));
content::TitleWatcher title_watcher(shell()->web_contents(), expectation);
title_watcher.AlsoWaitForTitle(kError);
title_watcher.AlsoWaitForTitle(kFailed);
@@ -91,22 +105,36 @@ class EncryptedMediaTest
};
// Fails on Linux/ChromeOS with ASan. http://crbug.com/153231
+// IN_PROC_BROWSER_TEST_P doesn't accept #define MAYBE_test DISABLED_test.
#if (defined(OS_LINUX) || defined(OS_CHROMEOS)) && defined(ADDRESS_SANITIZER)
IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, DISABLED_BasicPlayback) {
const string16 kExpected = ASCIIToUTF16("ENDED");
- ASSERT_NO_FATAL_FAILURE(PlayMedia(GetParam(), kExpected));
+ ASSERT_NO_FATAL_FAILURE(TestSimplePlayback("bear-320x240-encrypted.webm",
+ GetParam(), kExpected));
+}
+
+IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, DISABLED_FrameChangeVideo) {
+ const string16 kExpected = ASCIIToUTF16("ENDED");
+ ASSERT_NO_FATAL_FAILURE(TestFrameSizeChange(GetParam(), kExpected));
}
#else
IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, BasicPlayback) {
const string16 kExpected = ASCIIToUTF16("ENDED");
- ASSERT_NO_FATAL_FAILURE(PlayMedia(GetParam(), kExpected));
+ ASSERT_NO_FATAL_FAILURE(TestSimplePlayback("bear-320x240-encrypted.webm",
+ GetParam(), kExpected));
+}
+
+IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, FrameChangeVideo) {
+ const string16 kExpected = ASCIIToUTF16("ENDED");
+ ASSERT_NO_FATAL_FAILURE(TestFrameSizeChange(GetParam(), kExpected));
}
#endif
IN_PROC_BROWSER_TEST_F(EncryptedMediaTest, InvalidKeySystem) {
const string16 kExpected = ASCIIToUTF16(
StringToUpperASCII(std::string("GenerateKeyRequestException")));
- ASSERT_NO_FATAL_FAILURE(PlayMedia("com.example.invalid", kExpected));
+ ASSERT_NO_FATAL_FAILURE(TestSimplePlayback("bear-320x240-encrypted.webm",
+ "com.example.invalid", kExpected));
}
INSTANTIATE_TEST_CASE_P(ClearKey, EncryptedMediaTest,
diff --git a/content/test/data/media/encrypted_frame_size_change.html b/content/test/data/media/encrypted_frame_size_change.html
new file mode 100644
index 0000000..aa627aa
--- /dev/null
+++ b/content/test/data/media/encrypted_frame_size_change.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+ <body onload="load()">
+ <p>Tests decoding and rendering encrypted video element that has a changing
+ resolution.</p>
+ <video width=320 controls></video>
+ <video controls></video>
+ <script src="encrypted_media_utils.js" type="text/javascript"></script>
+ <script>
+ var firstVideoSeek = false;
+ var video_fixed_size = document.getElementsByTagName("video")[0];
+ var video = document.getElementsByTagName("video")[1];
+
+ function load() {
+ loadVideo(video_fixed_size);
+ loadVideo(video);
+ }
+
+ function loadVideo(video) {
+ loadEncryptedMediaFromURL(video);
+
+ video.addEventListener('playing', function() {
+ // Make sure the video plays for a bit.
+ video.addEventListener('timeupdate', function() {
+ if (video.currentTime > 1.0) {
+ video.pause();
+ }
+ });
+ });
+
+ video.addEventListener('pause', function() {
+ video.addEventListener('seeked', function() {
+ if (!firstVideoSeek) {
+ setDocTitle('One video seeked.');
+ firstVideoSeek = true;
+ return;
+ }
+ setDocTitle('ENDED');
+ });
+ video.currentTime = 0.5;
+ });
+
+ video.addEventListener('canplay', oncanplay);
+ video.play();
+ }
+ </script>
+ </body>
+</html>
diff --git a/content/test/data/media/encrypted_media_player.html b/content/test/data/media/encrypted_media_player.html
index 05bb29f..777a7e4 100644
--- a/content/test/data/media/encrypted_media_player.html
+++ b/content/test/data/media/encrypted_media_player.html
@@ -5,64 +5,13 @@
</head>
<body onload="runTest();">
<video controls></video>
+ <script src="encrypted_media_utils.js" type="text/javascript"></script>
<script type="text/javascript">
- var FILE_NAME = 'bear-320x240-encrypted.webm';
- var KEY = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
- 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
- // Global reference to the video element.
var video = document.querySelector('video');
- var mediaSource = null;
- var keyRequested = false;
- var keyAdded = false;
- // The key system to use passed as a URL flag 'keysystem'.
- var keySystem = null;
- var failMessage = '';
-
- function onSourceOpen(e) {
- console.log('onSourceOpen', e);
- var srcBuffer =
- mediaSource.addSourceBuffer('video/webm; codecs="vorbis, vp8"');
- var xhr = new XMLHttpRequest();
- xhr.open('GET', FILE_NAME);
- xhr.responseType = 'arraybuffer';
- xhr.addEventListener('load', function(e) {
- srcBuffer.append(new Uint8Array(e.target.response));
- mediaSource.endOfStream();
- });
- xhr.send();
- }
-
- function onWebkitNeedKey(e) {
- if (keyRequested)
- return;
- keyRequested = true;
- console.log('onWebkitNeedKey', e);
- try {
- video.webkitGenerateKeyRequest(keySystem, e.initData);
- }
- catch(error) {
- setDocTitle("GenerateKeyRequestException");
- }
- }
-
- function onWebkitKeyMessage(e) {
- console.log('webkitkeymessage', e);
- video.webkitAddKey(keySystem, KEY, e.message);
- }
-
- function onWebkitKeyAdded() {
- keyAdded = true;
- }
-
- function installTitleEventHandler(element, event) {
- element.addEventListener(event, function(e) {
- setDocTitle(event.toString());
- }, false);
- }
function onTimeUpdate() {
// webkitkeyadded should have been fired before playback.
- if (!keyAdded)
+ if (!video.hasKeyAdded)
failTest('Key not added.');
if (video.currentTime < 1)
return;
@@ -71,53 +20,10 @@
video.removeEventListener('timeupdate', onTimeUpdate);
}
- function failTest(msg) {
- if (msg instanceof Event)
- failMessage = msg.target + '.' + msg.type;
- else
- failMessage = msg;
- setDocTitle('FAILED');
- }
-
- function setDocTitle(title) {
- document.title = title.toUpperCase();
- }
-
- function selectKeySystem() {
- var url_parts = window.location.href.split('?');
- if (url_parts.length != 2)
- return null;
-
- var query_parts = url_parts[1].split('=');
- if (query_parts.length != 2)
- return null;
-
- var tag = query_parts[0];
- if (tag != 'keysystem')
- failTest('Unsupported query parameter.');
- else
- keySystem = query_parts[1];
- }
-
- // Uses the URL query parameter to decide what type of key system to use
- // in the form of "encrypted_media_player.html?keysystem=[system]". The
- // test completes after playing the encrypted media for X seconds and
+ // The test completes after playing the encrypted media for 1 second and
// getting the ended event or when an error occurs at any time.
function runTest() {
- selectKeySystem();
- if (keySystem == null)
- return;
- mediaSource = new WebKitMediaSource();
- video.src = window.URL.createObjectURL(mediaSource);
- mediaSource.addEventListener('sourceopen', onSourceOpen);
- mediaSource.addEventListener('webkitsourceopen', onSourceOpen);
- video.addEventListener('webkitneedkey', onWebkitNeedKey);
- video.addEventListener('webkitkeymessage', onWebkitKeyMessage);
- video.addEventListener('webkitkeyerror', failTest);
- video.addEventListener('webkitkeyadded', onWebkitKeyAdded);
- installTitleEventHandler(video, 'error');
- // The video should not end before timeupdate events playing for X secs.
- video.addEventListener('ended', failTest);
+ loadEncryptedMediaFromURL(video);
video.addEventListener('timeupdate', onTimeUpdate);
video.play();
}
diff --git a/content/test/data/media/encrypted_media_utils.js b/content/test/data/media/encrypted_media_utils.js
new file mode 100755
index 0000000..c90292e
--- /dev/null
+++ b/content/test/data/media/encrypted_media_utils.js
@@ -0,0 +1,107 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+var QueryString = function() {
+ // Allows access to query parameters on the URL; e.g., given a URL like:
+ // http://<server>/my.html?test=123&bob=123
+ // Parameters can then be accessed via QueryString.test or QueryString.bob.
+ var params = {};
+ // RegEx to split out values by &.
+ var r = /([^&=]+)=?([^&]*)/g;
+ // Lambda function for decoding extracted match values. Replaces '+' with
+ // space so decodeURIComponent functions properly.
+ function d(s) { return decodeURIComponent(s.replace(/\+/g, ' ')); }
+ var match;
+ while (match = r.exec(window.location.search.substring(1)))
+ params[d(match[1])] = d(match[2]);
+ return params;
+}();
+
+var keySystem = QueryString.keysystem;
+var mediaFile = QueryString.mediafile;
+// Default key used to encrypt many media files used in browser tests.
+var KEY = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
+ 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
+// Stores a failure message that is read by the browser test when it fails.
+var failMessage = '';
+
+function failTest(msg) {
+ if (msg instanceof Event)
+ failMessage = msg.target + '.' + msg.type;
+ else
+ failMessage = msg;
+ setDocTitle('FAILED');
+}
+
+function setDocTitle(title) {
+ document.title = title.toUpperCase();
+}
+
+function installTitleEventHandler(element, event) {
+ element.addEventListener(event, function(e) {
+ setDocTitle(event.toString());
+ }, false);
+}
+
+function loadEncryptedMediaFromURL(video) {
+ loadEncryptedMedia(video, mediaFile, keySystem, KEY);
+}
+
+function loadEncryptedMedia(video, mediaFile, keySystem, key) {
+ var keyRequested = false;
+ var sourceOpened = false;
+ // Add a property to video to check key was added.
+ video.hasKeyAdded = false;
+
+ if (!(video && mediaFile && keySystem && key))
+ failTest('Missing parameters in loadEncryptedMedia().');
+
+ function onSourceOpen(e) {
+ if (sourceOpened)
+ return;
+ sourceOpened = true;
+ console.log('onSourceOpen', e);
+ var srcBuffer =
+ mediaSource.addSourceBuffer('video/webm; codecs="vorbis, vp8"');
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', mediaFile);
+ xhr.responseType = 'arraybuffer';
+ xhr.addEventListener('load', function(e) {
+ srcBuffer.append(new Uint8Array(e.target.response));
+ mediaSource.endOfStream();
+ });
+ xhr.send();
+ }
+
+ function onNeedKey(e) {
+ if (keyRequested)
+ return;
+ keyRequested = true;
+ console.log('onNeedKey', e);
+ try {
+ video.webkitGenerateKeyRequest(keySystem, e.initData);
+ }
+ catch(error) {
+ setDocTitle("GenerateKeyRequestException");
+ }
+ }
+
+ function onKeyAdded() {
+ video.hasKeyAdded = true;
+ }
+
+ function onKeyMessage(e) {
+ console.log('onKeyMessage', e);
+ video.webkitAddKey(keySystem, key, e.message);
+ }
+
+ var mediaSource = new WebKitMediaSource();
+ video.src = window.URL.createObjectURL(mediaSource);
+ mediaSource.addEventListener('webkitsourceopen', onSourceOpen);
+ video.addEventListener('webkitneedkey', onNeedKey);
+ video.addEventListener('webkitkeymessage', onKeyMessage);
+ video.addEventListener('webkitkeyerror', failTest);
+ video.addEventListener('webkitkeyadded', onKeyAdded);
+ installTitleEventHandler(video, 'error');
+}