diff options
author | shadi@chromium.org <shadi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-18 04:02:14 +0000 |
---|---|---|
committer | shadi@chromium.org <shadi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-18 04:02:14 +0000 |
commit | 6aad7dc0fd39b04af7a5dd3ab0007955bbf3d238 (patch) | |
tree | 68071626128160c8d682004622ffbe459ca98cb3 /content | |
parent | 1feea225f788e3fb3dd0a179fb62d041bf50af0b (diff) | |
download | chromium_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.cc | 38 | ||||
-rw-r--r-- | content/test/data/media/encrypted_frame_size_change.html | 48 | ||||
-rw-r--r-- | content/test/data/media/encrypted_media_player.html | 102 | ||||
-rwxr-xr-x | content/test/data/media/encrypted_media_utils.js | 107 |
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'); +} |