diff options
-rw-r--r-- | chrome/browser/media/encrypted_media_browsertest.cc | 59 | ||||
-rw-r--r-- | chrome/browser/media/encrypted_media_istypesupported_browsertest.cc | 8 | ||||
-rw-r--r-- | chrome/browser/media/media_browsertest.cc | 47 | ||||
-rw-r--r-- | chrome/browser/media/media_browsertest.h | 15 | ||||
-rw-r--r-- | chrome/test/data/media/eme_player_js/test_config.js | 31 | ||||
-rw-r--r-- | chrome/test/data/media/frame_size_change-av-enc-v.webm | bin | 1187773 -> 0 bytes | |||
-rw-r--r-- | content/browser/media/encrypted_media_browsertest.cc | 71 | ||||
-rw-r--r-- | content/browser/media/media_browsertest.cc | 89 | ||||
-rw-r--r-- | content/browser/media/media_browsertest.h | 19 | ||||
-rw-r--r-- | content/browser/media/media_source_browsertest.cc | 18 | ||||
-rw-r--r-- | content/test/data/media/encrypted_frame_size_change.html | 50 | ||||
-rw-r--r-- | content/test/data/media/encrypted_media_player.html | 37 | ||||
-rw-r--r-- | content/test/data/media/encrypted_media_utils.js | 142 | ||||
-rw-r--r-- | content/test/data/media/media_source_utils.js | 67 | ||||
-rw-r--r-- | content/test/data/media/media_utils.js | 50 | ||||
-rw-r--r-- | content/test/data/media/mse_config_change.html | 132 | ||||
-rw-r--r-- | media/DEPS | 1 | ||||
-rw-r--r-- | media/base/test_data_util.cc | 32 | ||||
-rw-r--r-- | media/base/test_data_util.h | 15 | ||||
-rw-r--r-- | media/media.gyp | 1 | ||||
-rw-r--r-- | media/test/data/blackwhite.html (renamed from content/test/data/media/blackwhite.html) | 0 | ||||
-rw-r--r-- | media/test/data/eme_player.html (renamed from chrome/test/data/media/eme_player.html) | 0 | ||||
-rw-r--r-- | media/test/data/eme_player_js/app_loader.js (renamed from chrome/test/data/media/eme_player_js/app_loader.js) | 0 | ||||
-rw-r--r-- | media/test/data/eme_player_js/clearkey_player.js (renamed from chrome/test/data/media/eme_player_js/clearkey_player.js) | 0 | ||||
-rw-r--r-- | media/test/data/eme_player_js/eme_app.js (renamed from chrome/test/data/media/eme_player_js/eme_app.js) | 0 | ||||
-rw-r--r-- | media/test/data/eme_player_js/file_io_test_player.js (renamed from chrome/test/data/media/eme_player_js/file_io_test_player.js) | 0 | ||||
-rw-r--r-- | media/test/data/eme_player_js/fps_observer.js (renamed from chrome/test/data/media/eme_player_js/fps_observer.js) | 0 | ||||
-rw-r--r-- | media/test/data/eme_player_js/globals.js (renamed from chrome/test/data/media/eme_player_js/globals.js) | 0 | ||||
-rw-r--r-- | media/test/data/eme_player_js/media_source_utils.js (renamed from chrome/test/data/media/eme_player_js/media_source_utils.js) | 2 | ||||
-rw-r--r-- | media/test/data/eme_player_js/player_utils.js (renamed from chrome/test/data/media/eme_player_js/player_utils.js) | 0 | ||||
-rw-r--r-- | media/test/data/eme_player_js/prefixed_clearkey_player.js (renamed from chrome/test/data/media/eme_player_js/prefixed_clearkey_player.js) | 0 | ||||
-rw-r--r-- | media/test/data/eme_player_js/prefixed_widevine_player.js (renamed from chrome/test/data/media/eme_player_js/prefixed_widevine_player.js) | 0 | ||||
-rw-r--r-- | media/test/data/eme_player_js/test_config.js | 65 | ||||
-rw-r--r-- | media/test/data/eme_player_js/utils.js (renamed from chrome/test/data/media/eme_player_js/utils.js) | 0 | ||||
-rw-r--r-- | media/test/data/eme_player_js/widevine_player.js (renamed from chrome/test/data/media/eme_player_js/widevine_player.js) | 0 | ||||
-rw-r--r-- | media/test/data/encrypted_frame_size_change.html (renamed from chrome/test/data/media/encrypted_frame_size_change.html) | 0 | ||||
-rw-r--r-- | media/test/data/media_source_player.html (renamed from content/test/data/media/media_source_player.html) | 15 | ||||
-rw-r--r-- | media/test/data/mse_config_change.html (renamed from chrome/test/data/media/mse_config_change.html) | 5 | ||||
-rw-r--r-- | media/test/data/player.html (renamed from content/test/data/media/player.html) | 0 | ||||
-rw-r--r-- | media/test/data/test_key_system_instantiation.html (renamed from chrome/test/data/media/test_key_system_instantiation.html) | 2 |
40 files changed, 286 insertions, 687 deletions
diff --git a/chrome/browser/media/encrypted_media_browsertest.cc b/chrome/browser/media/encrypted_media_browsertest.cc index 40a73b4..65a7280 100644 --- a/chrome/browser/media/encrypted_media_browsertest.cc +++ b/chrome/browser/media/encrypted_media_browsertest.cc @@ -115,12 +115,14 @@ class EncryptedMediaTestBase : public MediaBrowserTest { } #endif // defined(WIDEVINE_CDM_AVAILABLE) - void RunEncryptedMediaTestPage(const std::string& html_page, - const std::string& key_system, - std::vector<StringPair>* query_params, - const std::string& expected_title) { - StartLicenseServerIfNeeded(key_system, query_params); - RunMediaTestPage(html_page, query_params, expected_title, true); + void RunEncryptedMediaTestPage( + const std::string& html_page, + const std::string& key_system, + const media::QueryParams& query_params, + const std::string& expected_title) { + media::QueryParams new_query_params = query_params; + StartLicenseServerIfNeeded(key_system, &new_query_params); + RunMediaTestPage(html_page, new_query_params, expected_title, true); } // Tests |html_page| using |media_file| (with |media_type|) and |key_system|. @@ -144,7 +146,7 @@ class EncryptedMediaTestBase : public MediaBrowserTest { VLOG(0) << "Skipping test - MSE not supported."; return; } - std::vector<StringPair> query_params; + media::QueryParams query_params; query_params.push_back(std::make_pair("mediaFile", media_file)); query_params.push_back(std::make_pair("mediaType", media_type)); query_params.push_back(std::make_pair("keySystem", key_system)); @@ -156,7 +158,7 @@ class EncryptedMediaTestBase : public MediaBrowserTest { query_params.push_back(std::make_pair("forceInvalidResponse", "1")); if (!session_to_load.empty()) query_params.push_back(std::make_pair("sessionToLoad", session_to_load)); - RunEncryptedMediaTestPage(html_page, key_system, &query_params, + RunEncryptedMediaTestPage(html_page, key_system, query_params, expected_title); } @@ -188,16 +190,17 @@ class EncryptedMediaTestBase : public MediaBrowserTest { EXPECT_TRUE(receivedKeyMessage); } - + // Starts a license server if available for the |key_system| and adds a + // 'licenseServerURL' query parameter to |query_params|. void StartLicenseServerIfNeeded(const std::string& key_system, - std::vector<StringPair>* query_params) { + media::QueryParams* query_params) { scoped_ptr<TestLicenseServerConfig> config = GetServerConfig(key_system); if (!config) return; license_server_.reset(new TestLicenseServer(config.Pass())); EXPECT_TRUE(license_server_->Start()); - query_params->push_back(std::make_pair("licenseServerURL", - license_server_->GetServerURL())); + query_params->push_back( + std::make_pair("licenseServerURL", license_server_->GetServerURL())); } bool IsPlayBackPossible(const std::string& key_system) { @@ -312,7 +315,7 @@ class ECKEncryptedMediaTest : public EncryptedMediaTestBase { // Since we do not test playback, arbitrarily choose a test file and source // type. RunEncryptedMediaTest(kDefaultEmePlayer, - "bear-a-enc_a.webm", + "bear-a_enc-a.webm", kWebMAudioOnly, key_system, SRC, @@ -379,7 +382,7 @@ class EncryptedMediaTest void RunInvalidResponseTest() { RunEncryptedMediaTest(kDefaultEmePlayer, - "bear-320x240-av-enc_av.webm", + "bear-320x240-av_enc-av.webm", kWebMAudioVideo, CurrentKeySystem(), CurrentSourceType(), @@ -391,7 +394,7 @@ class EncryptedMediaTest void TestFrameSizeChange() { RunEncryptedMediaTest("encrypted_frame_size_change.html", - "frame_size_change-av-enc-v.webm", + "frame_size_change-av_enc-v.webm", kWebMAudioVideo, CurrentKeySystem(), CurrentSourceType(), @@ -403,14 +406,14 @@ class EncryptedMediaTest void TestConfigChange() { DCHECK(IsMSESupported()); - std::vector<StringPair> query_params; + media::QueryParams query_params; query_params.push_back(std::make_pair("keySystem", CurrentKeySystem())); query_params.push_back(std::make_pair("runEncrypted", "1")); if (CurrentEmeVersion() == PREFIXED) query_params.push_back(std::make_pair("usePrefixedEME", "1")); RunEncryptedMediaTestPage("mse_config_change.html", CurrentKeySystem(), - &query_params, + query_params, kEnded); } @@ -488,7 +491,7 @@ INSTANTIATE_TEST_CASE_P(MSE_ExternalClearKeyDecryptOnly, Combine(Values(kExternalClearKeyDecryptOnlyKeySystem), Values(MSE), Values(UNPREFIXED))); -#endif // defined(ENABLE_PEPPER_CDMS) +#endif // defined(ENABLE_PEPPER_CDMS) #if defined(WIDEVINE_CDM_AVAILABLE) // This test doesn't fully test playback with Widevine. So we only run Widevine @@ -511,27 +514,27 @@ INSTANTIATE_TEST_CASE_P(MSE_Widevine, #endif // defined(WIDEVINE_CDM_AVAILABLE) IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioOnly_WebM) { - TestSimplePlayback("bear-a-enc_a.webm", kWebMAudioOnly); + TestSimplePlayback("bear-a_enc-a.webm", kWebMAudioOnly); } IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioClearVideo_WebM) { - TestSimplePlayback("bear-320x240-av-enc_a.webm", kWebMAudioVideo); + TestSimplePlayback("bear-320x240-av_enc-a.webm", kWebMAudioVideo); } IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoAudio_WebM) { - TestSimplePlayback("bear-320x240-av-enc_av.webm", kWebMAudioVideo); + TestSimplePlayback("bear-320x240-av_enc-av.webm", kWebMAudioVideo); } IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoOnly_WebM) { - TestSimplePlayback("bear-320x240-v-enc_v.webm", kWebMVideoOnly); + TestSimplePlayback("bear-320x240-v_enc-v.webm", kWebMVideoOnly); } IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoClearAudio_WebM) { - TestSimplePlayback("bear-320x240-av-enc_v.webm", kWebMAudioVideo); + TestSimplePlayback("bear-320x240-av_enc-v.webm", kWebMAudioVideo); } IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VP9Video_WebM) { - TestSimplePlayback("bear-320x240-v-vp9-enc_v.webm", kWebMVP9VideoOnly); + TestSimplePlayback("bear-320x240-v-vp9_enc-v.webm", kWebMVP9VideoOnly); } IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, InvalidResponseKeyError) { @@ -587,7 +590,7 @@ IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioOnly_MP4) { // The parent key system cannot be used in generateKeyRequest. IN_PROC_BROWSER_TEST_F(WVEncryptedMediaTest, ParentThrowsException_Prefixed) { RunEncryptedMediaTest(kDefaultEmePlayer, - "bear-a-enc_a.webm", + "bear-a_enc-a.webm", kWebMAudioOnly, "com.widevine", MSE, @@ -601,7 +604,7 @@ IN_PROC_BROWSER_TEST_F(WVEncryptedMediaTest, ParentThrowsException_Prefixed) { // The parent key system cannot be used when creating MediaKeys. IN_PROC_BROWSER_TEST_F(WVEncryptedMediaTest, ParentThrowsException) { RunEncryptedMediaTest(kDefaultEmePlayer, - "bear-a-enc_a.webm", + "bear-a_enc-a.webm", kWebMAudioOnly, "com.widevine", MSE, @@ -640,7 +643,7 @@ IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, FileIOTest) { IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, LoadLoadableSession) { RunEncryptedMediaTest(kDefaultEmePlayer, - "bear-320x240-v-enc_v.webm", + "bear-320x240-v_enc-v.webm", kWebMVideoOnly, kExternalClearKeyKeySystem, SRC, @@ -653,7 +656,7 @@ IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, LoadLoadableSession) { IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, LoadUnknownSession) { // TODO(xhwang): Add a specific error for this failure, e.g. kSessionNotFound. RunEncryptedMediaTest(kDefaultEmePlayer, - "bear-320x240-v-enc_v.webm", + "bear-320x240-v_enc-v.webm", kWebMVideoOnly, kExternalClearKeyKeySystem, SRC, diff --git a/chrome/browser/media/encrypted_media_istypesupported_browsertest.cc b/chrome/browser/media/encrypted_media_istypesupported_browsertest.cc index 4ffde6f..3e7dc6c 100644 --- a/chrome/browser/media/encrypted_media_istypesupported_browsertest.cc +++ b/chrome/browser/media/encrypted_media_istypesupported_browsertest.cc @@ -17,6 +17,7 @@ #include "chrome/test/base/ui_test_utils.h" #include "content/public/common/content_switches.h" #include "content/public/test/browser_test_utils.h" +#include "media/base/test_data_util.h" #include "url/gurl.h" #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. @@ -224,9 +225,10 @@ class EncryptedMediaIsTypeSupportedTest : public InProcessBrowserTest { // Load the test page needed. IsConcreteSupportedKeySystem() needs some // JavaScript and a video loaded in order to work. if (!is_test_page_loaded_) { - ASSERT_TRUE(test_server()->Start()); - GURL gurl = test_server()->GetURL( - "files/media/test_key_system_instantiation.html"); + scoped_ptr<net::SpawnedTestServer> http_test_server = + media::StartMediaHttpTestServer(); + GURL gurl = http_test_server->GetURL( + "files/test_key_system_instantiation.html"); ui_test_utils::NavigateToURL(browser(), gurl); is_test_page_loaded_ = true; } diff --git a/chrome/browser/media/media_browsertest.cc b/chrome/browser/media/media_browsertest.cc index cf0195e..aca81db 100644 --- a/chrome/browser/media/media_browsertest.cc +++ b/chrome/browser/media/media_browsertest.cc @@ -4,12 +4,9 @@ #include "chrome/browser/media/media_browsertest.h" -#include "base/path_service.h" -#include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/common/chrome_paths.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" @@ -28,37 +25,27 @@ MediaBrowserTest::MediaBrowserTest() : ignore_plugin_crash_(false) { MediaBrowserTest::~MediaBrowserTest() { } -void MediaBrowserTest::RunMediaTestPage( - const std::string& html_page, std::vector<StringPair>* query_params, - const std::string& expected_title, bool http) { +void MediaBrowserTest::RunMediaTestPage(const std::string& html_page, + const media::QueryParams& query_params, + const std::string& expected_title, + bool http) { GURL gurl; - std::string query = ""; - if (query_params != NULL && !query_params->empty()) { - std::vector<StringPair>::const_iterator itr = query_params->begin(); - query = itr->first + "=" + itr->second; - ++itr; - for (; itr != query_params->end(); ++itr) { - query.append("&" + itr->first + "=" + itr->second); - } - } + std::string query = media::GetURLQueryString(query_params); + scoped_ptr<net::SpawnedTestServer> http_test_server; if (http) { - ASSERT_TRUE(test_server()->Start()); - gurl = test_server()->GetURL("files/media/" + html_page + "?" + query); + http_test_server = media::StartMediaHttpTestServer(); + gurl = http_test_server->GetURL("files/" + html_page + "?" + query); } else { - base::FilePath test_file_path; - PathService::Get(chrome::DIR_TEST_DATA, &test_file_path); - test_file_path = test_file_path.AppendASCII("media") - .AppendASCII(html_page); - gurl = content::GetFileUrlWithQuery(test_file_path, query); + gurl = content::GetFileUrlWithQuery(media::GetTestDataFilePath(html_page), + query); } - - base::string16 final_title = RunTest(gurl, expected_title); - EXPECT_EQ(base::ASCIIToUTF16(expected_title), final_title); + std::string final_title = RunTest(gurl, expected_title); + EXPECT_EQ(expected_title, final_title); } -base::string16 MediaBrowserTest::RunTest(const GURL& gurl, - const std::string& expected_title) { - VLOG(0) << "Running test URL: " << gurl; +std::string MediaBrowserTest::RunTest(const GURL& gurl, + const std::string& expected_title) { + DVLOG(0) << "Running test URL: " << gurl; // Observe the web contents for plugin crashes. Observe(browser()->tab_strip_model()->GetActiveWebContents()); content::TitleWatcher title_watcher( @@ -66,8 +53,8 @@ base::string16 MediaBrowserTest::RunTest(const GURL& gurl, base::ASCIIToUTF16(expected_title)); AddWaitForTitles(&title_watcher); ui_test_utils::NavigateToURL(browser(), gurl); - - return title_watcher.WaitAndGetTitle(); + base::string16 result = title_watcher.WaitAndGetTitle(); + return base::UTF16ToASCII(result); } void MediaBrowserTest::AddWaitForTitles(content::TitleWatcher* title_watcher) { diff --git a/chrome/browser/media/media_browsertest.h b/chrome/browser/media/media_browsertest.h index be62f7a..893fab1 100644 --- a/chrome/browser/media/media_browsertest.h +++ b/chrome/browser/media/media_browsertest.h @@ -5,11 +5,11 @@ #ifndef CHROME_BROWSER_MEDIA_MEDIA_BROWSERTEST_H_ #define CHROME_BROWSER_MEDIA_MEDIA_BROWSERTEST_H_ -#include <utility> -#include <vector> +#include <string> #include "chrome/test/base/in_process_browser_test.h" #include "content/public/browser/web_contents_observer.h" +#include "media/base/test_data_util.h" namespace content { class TitleWatcher; @@ -21,8 +21,6 @@ class TitleWatcher; class MediaBrowserTest : public InProcessBrowserTest, public content::WebContentsObserver { protected: - typedef std::pair<std::string, std::string> StringPair; - // Common test results. static const char kEnded[]; // TODO(xhwang): Report detailed errors, e.g. "ERROR-3". @@ -38,12 +36,13 @@ class MediaBrowserTest : public InProcessBrowserTest, // page, otherwise a local file URL is loaded inside the content shell. // It uses RunTest() to check for expected test output. void RunMediaTestPage(const std::string& html_page, - std::vector<StringPair>* query_params, - const std::string& expected, bool http); + const media::QueryParams& query_params, + const std::string& expected, + bool http); // Opens a URL and waits for the document title to match either one of the - // default strings or the expected string. - base::string16 RunTest(const GURL& gurl, const std::string& expected); + // default strings or the expected string. Returns the matching title value. + std::string RunTest(const GURL& gurl, const std::string& expected); virtual void AddWaitForTitles(content::TitleWatcher* title_watcher); diff --git a/chrome/test/data/media/eme_player_js/test_config.js b/chrome/test/data/media/eme_player_js/test_config.js deleted file mode 100644 index e654a1c..0000000 --- a/chrome/test/data/media/eme_player_js/test_config.js +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 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. - -// Test configuration used by test page to configure the player app and other -// test specific configurations. -function TestConfig() { - this.mediaFile = null; - this.keySystem = null; - this.mediaType = null; - this.licenseServerURL = null; - this.useMSE = false; - this.usePrefixedEME = false; - this.runFPS = false; -} - -TestConfig.prototype.loadQueryParams = function() { - // Load query parameters and set default values. - var r = /([^&=]+)=?([^&]*)/g; - // Lambda function for decoding extracted match values. Replaces '+' with - // space so decodeURIComponent functions properly. - var decodeURI = function decodeURI(s) { - return decodeURIComponent(s.replace(/\+/g, ' ')); - }; - var match; - while (match = r.exec(window.location.search.substring(1))) - this[decodeURI(match[1])] = decodeURI(match[2]); - this.useMSE = this.useMSE == '1' || this.useMSE == 'true'; - this.usePrefixedEME = - this.usePrefixedEME == '1' || this.usePrefixedEME == 'true'; -}; diff --git a/chrome/test/data/media/frame_size_change-av-enc-v.webm b/chrome/test/data/media/frame_size_change-av-enc-v.webm Binary files differdeleted file mode 100644 index 200be55..0000000 --- a/chrome/test/data/media/frame_size_change-av-enc-v.webm +++ /dev/null diff --git a/content/browser/media/encrypted_media_browsertest.cc b/content/browser/media/encrypted_media_browsertest.cc index 9c0dbac..9f5e137 100644 --- a/content/browser/media/encrypted_media_browsertest.cc +++ b/content/browser/media/encrypted_media_browsertest.cc @@ -3,7 +3,6 @@ // found in the LICENSE file. #include "base/command_line.h" -#include "base/path_service.h" #include "base/strings/utf_string_conversions.h" #include "base/win/windows_version.h" #include "content/browser/media/media_browsertest.h" @@ -26,6 +25,8 @@ const char kWebMAudioVideo[] = "video/webm; codecs=\"vorbis, vp8\""; const char kEmeKeyError[] = "KEYERROR"; const char kEmeNotSupportedError[] = "NOTSUPPORTEDERROR"; +const char kDefaultEmePlayer[] = "eme_player.html"; + // The type of video src used to load media. enum SrcType { SRC, @@ -52,7 +53,7 @@ class EncryptedMediaTest : public content::MediaBrowserTest, public testing::WithParamInterface<std::tr1::tuple<const char*, SrcType> > { public: // Can only be used in parameterized (*_P) tests. - const char* CurrentKeySystem() { + const std::string CurrentKeySystem() { return std::tr1::get<0>(GetParam()); } @@ -61,14 +62,15 @@ class EncryptedMediaTest : public content::MediaBrowserTest, return std::tr1::get<1>(GetParam()); } - void TestSimplePlayback(const char* encrypted_media, const char* media_type) { + void TestSimplePlayback(const std::string& encrypted_media, + const std::string& media_type) { RunSimpleEncryptedMediaTest( encrypted_media, media_type, CurrentKeySystem(), CurrentSourceType()); } void TestFrameSizeChange() { RunEncryptedMediaTest("encrypted_frame_size_change.html", - "frame_size_change-av-enc-v.webm", kWebMAudioVideo, + "frame_size_change-av_enc-v.webm", kWebMAudioVideo, CurrentKeySystem(), CurrentSourceType(), kEnded); } @@ -78,38 +80,42 @@ class EncryptedMediaTest : public content::MediaBrowserTest, return; } - std::vector<StringPair> query_params; - query_params.push_back(std::make_pair("keysystem", CurrentKeySystem())); - query_params.push_back(std::make_pair("runencrypted", "1")); - RunMediaTestPage("mse_config_change.html", &query_params, kEnded, true); + media::QueryParams query_params; + query_params.push_back(std::make_pair("keySystem", CurrentKeySystem())); + query_params.push_back(std::make_pair("runEncrypted", "1")); + RunMediaTestPage("mse_config_change.html", query_params, kEnded, true); } - void RunEncryptedMediaTest(const char* html_page, - const char* media_file, - const char* media_type, - const char* key_system, + void RunEncryptedMediaTest(const std::string& html_page, + const std::string& media_file, + const std::string& media_type, + const std::string& key_system, SrcType src_type, - const char* expectation) { + const std::string& expectation) { if (src_type == MSE && !IsMSESupported()) { VLOG(0) << "Skipping test - MSE not supported."; return; } - std::vector<StringPair> query_params; - query_params.push_back(std::make_pair("mediafile", media_file)); - query_params.push_back(std::make_pair("mediatype", media_type)); - query_params.push_back(std::make_pair("keysystem", key_system)); + media::QueryParams query_params; + query_params.push_back(std::make_pair("mediaFile", media_file)); + query_params.push_back(std::make_pair("mediaType", media_type)); + query_params.push_back(std::make_pair("keySystem", key_system)); if (src_type == MSE) - query_params.push_back(std::make_pair("usemse", "1")); - RunMediaTestPage(html_page, &query_params, expectation, true); + query_params.push_back(std::make_pair("useMSE", "1")); + RunMediaTestPage(html_page, query_params, expectation, true); } - void RunSimpleEncryptedMediaTest(const char* media_file, - const char* media_type, - const char* key_system, + void RunSimpleEncryptedMediaTest(const std::string& media_file, + const std::string& media_type, + const std::string& key_system, SrcType src_type) { - RunEncryptedMediaTest("encrypted_media_player.html", media_file, - media_type, key_system, src_type, kEnded); + RunEncryptedMediaTest(kDefaultEmePlayer, + media_file, + media_type, + key_system, + src_type, + kEnded); } protected: @@ -141,23 +147,23 @@ INSTANTIATE_TEST_CASE_P(MSE_ClearKey, EncryptedMediaTest, Combine(Values(kClearKeyKeySystem), Values(MSE))); IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioOnly_WebM) { - TestSimplePlayback("bear-a-enc_a.webm", kWebMAudioOnly); + TestSimplePlayback("bear-a_enc-a.webm", kWebMAudioOnly); } IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioClearVideo_WebM) { - TestSimplePlayback("bear-320x240-av-enc_a.webm", kWebMAudioVideo); + TestSimplePlayback("bear-320x240-av_enc-a.webm", kWebMAudioVideo); } IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoAudio_WebM) { - TestSimplePlayback("bear-320x240-av-enc_av.webm", kWebMAudioVideo); + TestSimplePlayback("bear-320x240-av_enc-av.webm", kWebMAudioVideo); } IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoOnly_WebM) { - TestSimplePlayback("bear-320x240-v-enc_v.webm", kWebMVideoOnly); + TestSimplePlayback("bear-320x240-v_enc-v.webm", kWebMVideoOnly); } IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoClearAudio_WebM) { - TestSimplePlayback("bear-320x240-av-enc_v.webm", kWebMAudioVideo); + TestSimplePlayback("bear-320x240-av_enc-v.webm", kWebMAudioVideo); } IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, ConfigChangeVideo) { @@ -174,8 +180,11 @@ IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, FrameSizeChangeVideo) { } IN_PROC_BROWSER_TEST_F(EncryptedMediaTest, UnknownKeySystemThrowsException) { - RunEncryptedMediaTest("encrypted_media_player.html", "bear-a-enc_a.webm", - kWebMAudioOnly, "com.example.foo", MSE, + RunEncryptedMediaTest(kDefaultEmePlayer, + "bear-a_enc-a.webm", + kWebMAudioOnly, + "com.example.foo", + MSE, kEmeNotSupportedError); } diff --git a/content/browser/media/media_browsertest.cc b/content/browser/media/media_browsertest.cc index a0658c2..4535880 100644 --- a/content/browser/media/media_browsertest.cc +++ b/content/browser/media/media_browsertest.cc @@ -4,10 +4,8 @@ #include "content/browser/media/media_browsertest.h" -#include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "content/public/browser/web_contents.h" -#include "content/public/common/url_constants.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/content_browser_test_utils.h" #include "content/shell/browser/shell.h" @@ -26,39 +24,33 @@ const char MediaBrowserTest::kEnded[] = "ENDED"; const char MediaBrowserTest::kError[] = "ERROR"; const char MediaBrowserTest::kFailed[] = "FAILED"; -void MediaBrowserTest::RunMediaTestPage( - const char* html_page, std::vector<StringPair>* query_params, - const char* expected, bool http) { +void MediaBrowserTest::RunMediaTestPage(const std::string& html_page, + const media::QueryParams& query_params, + const std::string& expected_title, + bool http) { GURL gurl; - std::string query = ""; - if (query_params != NULL && !query_params->empty()) { - std::vector<StringPair>::const_iterator itr = query_params->begin(); - query = base::StringPrintf("%s=%s", itr->first, itr->second); - ++itr; - for (; itr != query_params->end(); ++itr) { - query.append(base::StringPrintf("&%s=%s", itr->first, itr->second)); - } - } + std::string query = media::GetURLQueryString(query_params); + scoped_ptr<net::SpawnedTestServer> http_test_server; if (http) { - ASSERT_TRUE(test_server()->Start()); - gurl = test_server()->GetURL( - base::StringPrintf("files/media/%s?%s", html_page, query.c_str())); + http_test_server = media::StartMediaHttpTestServer(); + gurl = http_test_server->GetURL("files/" + html_page + "?" + query); } else { - base::FilePath test_file_path = GetTestFilePath("media", html_page); - gurl = GetFileUrlWithQuery(test_file_path, query); + gurl = content::GetFileUrlWithQuery(media::GetTestDataFilePath(html_page), + query); } - RunTest(gurl, expected); + std::string final_title = RunTest(gurl, expected_title); + EXPECT_EQ(expected_title, final_title); } -void MediaBrowserTest::RunTest(const GURL& gurl, const char* expected) { - const base::string16 expected_title = base::ASCIIToUTF16(expected); - DVLOG(1) << "Running test URL: " << gurl; - TitleWatcher title_watcher(shell()->web_contents(), expected_title); +std::string MediaBrowserTest::RunTest(const GURL& gurl, + const std::string& expected_title) { + VLOG(0) << "Running test URL: " << gurl; + TitleWatcher title_watcher(shell()->web_contents(), + base::ASCIIToUTF16(expected_title)); AddWaitForTitles(&title_watcher); NavigateToURL(shell(), gurl); - - base::string16 final_title = title_watcher.WaitAndGetTitle(); - EXPECT_EQ(expected_title, final_title); + base::string16 result = title_watcher.WaitAndGetTitle(); + return base::UTF16ToASCII(result); } void MediaBrowserTest::AddWaitForTitles(content::TitleWatcher* title_watcher) { @@ -75,25 +67,29 @@ class MediaTest : public testing::WithParamInterface<bool>, public MediaBrowserTest { public: // Play specified audio over http:// or file:// depending on |http| setting. - void PlayAudio(const char* media_file, bool http) { + void PlayAudio(const std::string& media_file, bool http) { PlayMedia("audio", media_file, http); } // Play specified video over http:// or file:// depending on |http| setting. - void PlayVideo(const char* media_file, bool http) { + void PlayVideo(const std::string& media_file, bool http) { PlayMedia("video", media_file, http); } // Run specified color format test with the expected result. - void RunColorFormatTest(const char* media_file, const char* expected) { - base::FilePath test_file_path = GetTestFilePath("media", "blackwhite.html"); + void RunColorFormatTest(const std::string& media_file, + const std::string& expected) { + base::FilePath test_file_path = + media::GetTestDataFilePath("blackwhite.html"); RunTest(GetFileUrlWithQuery(test_file_path, media_file), expected); } - void PlayMedia(const char* tag, const char* media_file, bool http) { - std::vector<StringPair> query_params; + void PlayMedia(const std::string& tag, + const std::string& media_file, + bool http) { + media::QueryParams query_params; query_params.push_back(std::make_pair(tag, media_file)); - RunMediaTestPage("player.html", &query_params, kEnded, http); + RunMediaTestPage("player.html", query_params, kEnded, http); } }; @@ -140,7 +136,7 @@ IN_PROC_BROWSER_TEST_P(MediaTest, VideoBearMovPcmS16be) { IN_PROC_BROWSER_TEST_P(MediaTest, VideoBearMovPcmS24be) { PlayVideo("bear_pcm_s24be.mov", GetParam()); } -#endif +#endif // defined(USE_PROPRIETARY_CODECS) #if defined(OS_CHROMEOS) #if defined(USE_PROPRIETARY_CODECS) @@ -171,8 +167,9 @@ IN_PROC_BROWSER_TEST_P(MediaTest, VideoBearWavGsmms) { IN_PROC_BROWSER_TEST_P(MediaTest, VideoBearFlac) { PlayAudio("bear.flac", GetParam()); } -#endif -#endif +#endif // defined(USE_PROPRIETARY_CODECS) +#endif // defined(OS_CHROMEOS) + IN_PROC_BROWSER_TEST_P(MediaTest, VideoBearWavAlaw) { PlayAudio("bear_alaw.wav", GetParam()); @@ -209,19 +206,19 @@ INSTANTIATE_TEST_CASE_P(File, MediaTest, ::testing::Values(false)); INSTANTIATE_TEST_CASE_P(Http, MediaTest, ::testing::Values(true)); IN_PROC_BROWSER_TEST_F(MediaTest, MAYBE(Yuv420pTheora)) { - RunColorFormatTest("yuv420p.ogv", "ENDED"); + RunColorFormatTest("yuv420p.ogv", kEnded); } IN_PROC_BROWSER_TEST_F(MediaTest, MAYBE(Yuv422pTheora)) { - RunColorFormatTest("yuv422p.ogv", "ENDED"); + RunColorFormatTest("yuv422p.ogv", kEnded); } IN_PROC_BROWSER_TEST_F(MediaTest, MAYBE(Yuv444pTheora)) { - RunColorFormatTest("yuv444p.ogv", "ENDED"); + RunColorFormatTest("yuv444p.ogv", kEnded); } IN_PROC_BROWSER_TEST_F(MediaTest, MAYBE(Yuv420pVp8)) { - RunColorFormatTest("yuv420p.webm", "ENDED"); + RunColorFormatTest("yuv420p.webm", kEnded); } // TODO(johannkoenig): Reenable after landing libvpx roll @@ -232,24 +229,24 @@ IN_PROC_BROWSER_TEST_F(MediaTest, DISABLED_Yuv444pVp9) { #if defined(USE_PROPRIETARY_CODECS) IN_PROC_BROWSER_TEST_F(MediaTest, MAYBE(Yuv420pH264)) { - RunColorFormatTest("yuv420p.mp4", "ENDED"); + RunColorFormatTest("yuv420p.mp4", kEnded); } IN_PROC_BROWSER_TEST_F(MediaTest, MAYBE(Yuvj420pH264)) { - RunColorFormatTest("yuvj420p.mp4", "ENDED"); + RunColorFormatTest("yuvj420p.mp4", kEnded); } IN_PROC_BROWSER_TEST_F(MediaTest, MAYBE(Yuv422pH264)) { - RunColorFormatTest("yuv422p.mp4", "ENDED"); + RunColorFormatTest("yuv422p.mp4", kEnded); } IN_PROC_BROWSER_TEST_F(MediaTest, MAYBE(Yuv444pH264)) { - RunColorFormatTest("yuv444p.mp4", "ENDED"); + RunColorFormatTest("yuv444p.mp4", kEnded); } #if defined(OS_CHROMEOS) IN_PROC_BROWSER_TEST_F(MediaTest, Yuv420pMpeg4) { - RunColorFormatTest("yuv420p.avi", "ENDED"); + RunColorFormatTest("yuv420p.avi", kEnded); } #endif // defined(OS_CHROMEOS) #endif // defined(USE_PROPRIETARY_CODECS) diff --git a/content/browser/media/media_browsertest.h b/content/browser/media/media_browsertest.h index b242db3..4be3197 100644 --- a/content/browser/media/media_browsertest.h +++ b/content/browser/media/media_browsertest.h @@ -5,10 +5,10 @@ #ifndef CONTENT_BROWSER_MEDIA_MEDIA_BROWSERTEST_H_ #define CONTENT_BROWSER_MEDIA_MEDIA_BROWSERTEST_H_ -#include <utility> -#include <vector> +#include <string> #include "content/public/test/content_browser_test.h" +#include "media/base/test_data_util.h" namespace content { @@ -19,8 +19,6 @@ class TitleWatcher; // the test http server. class MediaBrowserTest : public ContentBrowserTest { public: - typedef std::pair<const char*, const char*> StringPair; - // Common test results. static const char kEnded[]; static const char kError[]; @@ -30,17 +28,18 @@ class MediaBrowserTest : public ContentBrowserTest { // If http is true, the test starts a local http test server to load the test // page, otherwise a local file URL is loaded inside the content shell. // It uses RunTest() to check for expected test output. - void RunMediaTestPage(const char* html_page, - std::vector<StringPair>* query_params, - const char* expected, bool http); + void RunMediaTestPage(const std::string& html_page, + const media::QueryParams& query_params, + const std::string& expected, + bool http); // Opens a URL and waits for the document title to match either one of the - // default strings or the expected string. - void RunTest(const GURL& gurl, const char* expected); + // default strings or the expected string. Returns the matching title value. + std::string RunTest(const GURL& gurl, const std::string& expected); virtual void AddWaitForTitles(content::TitleWatcher* title_watcher); }; -} // namespace content +} // namespace content #endif // CONTENT_BROWSER_MEDIA_MEDIA_BROWSERTEST_H_ diff --git a/content/browser/media/media_source_browsertest.cc b/content/browser/media/media_source_browsertest.cc index d5d8615..90d0c84 100644 --- a/content/browser/media/media_source_browsertest.cc +++ b/content/browser/media/media_source_browsertest.cc @@ -32,17 +32,18 @@ static bool IsMSESupported() { class MediaSourceTest : public content::MediaBrowserTest { public: - void TestSimplePlayback(const char* media_file, const char* media_type, - const char* expectation) { + void TestSimplePlayback(const std::string& media_file, + const std::string& media_type, + const std::string& expectation) { if (!IsMSESupported()) { VLOG(0) << "Skipping test - MSE not supported."; return; } - std::vector<StringPair> query_params; - query_params.push_back(std::make_pair("mediafile", media_file)); - query_params.push_back(std::make_pair("mediatype", media_type)); - RunMediaTestPage("media_source_player.html", &query_params, expectation, + media::QueryParams query_params; + query_params.push_back(std::make_pair("mediaFile", media_file)); + query_params.push_back(std::make_pair("mediaType", media_type)); + RunMediaTestPage("media_source_player.html", query_params, expectation, true); } @@ -84,7 +85,10 @@ IN_PROC_BROWSER_TEST_F(MediaSourceTest, ConfigChangeVideo) { VLOG(0) << "Skipping test - MSE not supported."; return; } - RunMediaTestPage("mse_config_change.html", NULL, kEnded, true); + RunMediaTestPage("mse_config_change.html", + media::QueryParams(), + kEnded, + true); } } // namespace content diff --git a/content/test/data/media/encrypted_frame_size_change.html b/content/test/data/media/encrypted_frame_size_change.html deleted file mode 100644 index 719d8be..0000000 --- a/content/test/data/media/encrypted_frame_size_change.html +++ /dev/null @@ -1,50 +0,0 @@ -<!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="media_utils.js" type="text/javascript"></script> - <script src="media_source_utils.js" type="text/javascript"></script> - <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) { - var mediaSource = 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) { - console.log('One video seeked.'); - firstVideoSeek = true; - return; - } - setResultInTitle('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 deleted file mode 100644 index 2b16d51..0000000 --- a/content/test/data/media/encrypted_media_player.html +++ /dev/null @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>Encrypted Media Player</title> - </head> - <body onload="runTest();"> - <video controls></video> - <script src="media_utils.js" type="text/javascript"></script> - <script src="media_source_utils.js" type="text/javascript"></script> - <script src="encrypted_media_utils.js" type="text/javascript"></script> - <script type="text/javascript"> - var video = document.querySelector('video'); - - function onTimeUpdate() { - if (video.currentTime < 1) - return; - // keyadded may be fired around the start of playback; check for it - // after a delay to avoid timing issues. - if (!video.receivedKeyAdded) - failTest('Key added event not received.'); - if (video.isHeartbeatExpected && !video.receivedHeartbeat) - failTest('Heartbeat keymessage event not received.'); - video.removeEventListener('ended', failTest); - installTitleEventHandler(video, 'ended'); - video.removeEventListener('timeupdate', onTimeUpdate); - } - - // 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() { - loadEncryptedMediaFromURL(video); - video.addEventListener('timeupdate', onTimeUpdate); - video.play(); - } - </script> - </body> -</html> diff --git a/content/test/data/media/encrypted_media_utils.js b/content/test/data/media/encrypted_media_utils.js deleted file mode 100644 index 8fb3f97..0000000 --- a/content/test/data/media/encrypted_media_utils.js +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright (c) 2013 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 keySystem = QueryString.keysystem; -var mediaFile = QueryString.mediafile; -var mediaType = QueryString.mediatype || 'video/webm; codecs="vorbis, vp8"'; -var useMSE = QueryString.usemse == 1; - -// 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]); -// KEY_ID constant used as init data while encrypting test media files. -var KEY_ID = getInitDataFromKeyId("0123456789012345"); -// Heart beat message header. -var HEART_BEAT_HEADER = 'HEARTBEAT'; -var EXTERNAL_CLEAR_KEY_KEY_SYSTEM = "org.chromium.externalclearkey"; -// Note that his URL has been normalized from the one in clear_key_cdm.cc. -var EXTERNAL_CLEAR_KEY_HEARTBEAT_URL = - 'http://test.externalclearkey.chromium.org/'; - -function isHeartbeatMessage(msg) { - if (msg.length < HEART_BEAT_HEADER.length) - return false; - for (var i = 0; i < HEART_BEAT_HEADER.length; ++i) { - if (String.fromCharCode(msg[i]) != HEART_BEAT_HEADER[i]) - return false; - } - return true; -} - -function loadEncryptedMediaFromURL(video) { - return loadEncryptedMedia(video, mediaFile, keySystem, KEY, useMSE); -} - -function loadEncryptedMedia(video, mediaFile, keySystem, key, useMSE, - appendSourceCallbackFn) { - var keyRequested = false; - var sourceOpened = false; - // Add properties to enable verification that events occurred. - video.receivedKeyAdded = false; - video.receivedHeartbeat = false; - video.isHeartbeatExpected = keySystem === EXTERNAL_CLEAR_KEY_KEY_SYSTEM; - video.receivedKeyMessage = false; - - if (!(video && mediaFile && keySystem && key)) { - failTest('Missing parameters in loadEncryptedMedia().'); - return; - } - - function onNeedKey(e) { - if (keyRequested) - return; - keyRequested = true; - console.log('onNeedKey', e); - try { - video.webkitGenerateKeyRequest(keySystem, e.initData); - } - catch(error) { - setResultInTitle(error.name); - } - } - - function onKeyAdded(e) { - e.target.receivedKeyAdded = true; - } - - function onKeyMessage(e) { - video.receivedKeyMessage = true; - if (!e.keySystem || e.keySystem != keySystem) { - failTest('keymessage with unexpected keySystem: ' + e.keySystem); - return; - } - - if (!e.sessionId) { - failTest('keymessage without a sessionId: ' + e.sessionId); - return; - } - - if (!e.message) { - failTest('keymessage without a message: ' + e.message); - return; - } - - if (isHeartbeatMessage(e.message)) { - console.log('onKeyMessage - heartbeat', e); - e.target.receivedHeartbeat = true; - verifyHeartbeatMessage(e); - return; - } - - // No tested key system returns defaultURL in for key request messages. - if (e.defaultURL) { - failTest('keymessage unexpectedly has defaultURL: ' + e.defaultURL); - return; - } - - // keymessage in response to generateKeyRequest. Reply with key. - console.log('onKeyMessage - key request', e); - var initData = e.message; - if (mediaType.indexOf('mp4') != -1) - initData = KEY_ID; // Temporary hack for Clear Key in v0.1. - video.webkitAddKey(keySystem, key, initData); - } - - function verifyHeartbeatMessage(e) { - // Only External Clear Key sends a HEARTBEAT message. - if (e.keySystem != EXTERNAL_CLEAR_KEY_KEY_SYSTEM) { - failTest('Unexpected heartbeat from ' + e.keySystem); - return; - } - - if (e.defaultURL != EXTERNAL_CLEAR_KEY_HEARTBEAT_URL) { - failTest('Heartbeat message with unexpected defaultURL: ' + e.defaultURL); - return; - } - } - - video.addEventListener('webkitneedkey', onNeedKey); - video.addEventListener('webkitkeymessage', onKeyMessage); - video.addEventListener('webkitkeyerror', function() { - setResultInTitle("KeyError"); - }); - video.addEventListener('webkitkeyadded', onKeyAdded); - installTitleEventHandler(video, 'error'); - - if (useMSE) { - var mediaSource = loadMediaSource(mediaFile, mediaType, - appendSourceCallbackFn); - video.src = window.URL.createObjectURL(mediaSource); - } else { - video.src = mediaFile; - } -} - -function getInitDataFromKeyId(keyID) { - var init_key_id = new Uint8Array(keyID.length); - for(var i = 0; i < keyID.length; i++) { - init_key_id[i] = keyID.charCodeAt(i); - } - return init_key_id; -} diff --git a/content/test/data/media/media_source_utils.js b/content/test/data/media/media_source_utils.js deleted file mode 100644 index 7f179b5..0000000 --- a/content/test/data/media/media_source_utils.js +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2013 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. - -function loadMediaFromURL(video) { - installTitleEventHandler(video, 'error'); - video.addEventListener('playing', function(event) { - console.log('Video Playing.'); - }); - var source = loadMediaSource(QueryString.mediafile, QueryString.mediatype); - video.src = window.URL.createObjectURL(source); -} - -function loadMediaSource(mediaFiles, mediaTypes, appendSourceCallbackFn) { - mediaFiles = convertToArray(mediaFiles); - mediaTypes = convertToArray(mediaTypes); - - if (!mediaFiles || !mediaTypes) - failTest('Missing parameters in loadMediaSource().'); - - var totalAppended = 0; - function onSourceOpen(e) { - console.log('onSourceOpen', e); - // We can load multiple media files using the same media type. However, if - // more than one media type is used, we expect to have a media type entry - // for each corresponding media file. - var srcBuffer = null; - for (var i = 0; i < mediaFiles.length; i++) { - if (i == 0 || mediaFiles.length == mediaTypes.length) { - console.log('Creating a source buffer for type ' + mediaTypes[i]); - try { - srcBuffer = mediaSource.addSourceBuffer(mediaTypes[i]); - } catch (e) { - failTest('Exception adding source buffer: ' + e.message); - return; - } - } - doAppend(mediaFiles[i], srcBuffer); - } - } - - function doAppend(mediaFile, srcBuffer) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', mediaFile); - xhr.responseType = 'arraybuffer'; - xhr.addEventListener('load', function(e) { - var onUpdateEnd = function(e) { - console.log('End of appending buffer from ' + mediaFile); - srcBuffer.removeEventListener('updateend', onUpdateEnd); - totalAppended++; - if (totalAppended == mediaFiles.length) { - if (appendSourceCallbackFn) - appendSourceCallbackFn(mediaSource); - else - mediaSource.endOfStream(); - } - }; - srcBuffer.addEventListener('updateend', onUpdateEnd); - srcBuffer.appendBuffer(new Uint8Array(e.target.response)); - }); - xhr.send(); - } - - var mediaSource = new MediaSource(); - mediaSource.addEventListener('sourceopen', onSourceOpen); - return mediaSource; -} diff --git a/content/test/data/media/media_utils.js b/content/test/data/media/media_utils.js deleted file mode 100644 index 8c5c1d6..0000000 --- a/content/test/data/media/media_utils.js +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2013 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; -}(); - -function failTest(msg) { - var failMessage = msg; - if (msg instanceof Event) - failMessage = msg.target + '.' + msg.type; - console.log("FAILED TEST: " + msg); - setResultInTitle('FAILED'); -} - -var titleChanged = false; -function setResultInTitle(title) { - // If document title is 'ENDED', then update it with new title to possibly - // mark a test as failure. Otherwise, keep the first title change in place. - if (!titleChanged || document.title.toUpperCase() == 'ENDED') - document.title = title.toUpperCase(); - console.log('Set document title to: ' + title + ', updated title: ' + - document.title); - titleChanged = true; -} - -function installTitleEventHandler(element, event) { - element.addEventListener(event, function(e) { - setResultInTitle(event.toString()); - }, false); -} - -function convertToArray(input) { - if (Array.isArray(input)) - return input; - return [input]; -} diff --git a/content/test/data/media/mse_config_change.html b/content/test/data/media/mse_config_change.html deleted file mode 100644 index 13f4174..0000000 --- a/content/test/data/media/mse_config_change.html +++ /dev/null @@ -1,132 +0,0 @@ -<html> - <head> - <title>Test media source config changes.</title> - </head> - <body onload="runTest();"> - <video controls></video> - <script src="media_utils.js" type="text/javascript"></script> - <script src="media_source_utils.js" type="text/javascript"></script> - <script src="encrypted_media_utils.js" type="text/javascript"></script> - <script type="text/javascript"> - var runEncrypted = QueryString.runencrypted == 1; - var video = document.querySelector('video'); - var mediaType = 'video/webm; codecs="vorbis, vp8"'; - - var MEDIA_1 = 'bear-320x240.webm'; - var MEDIA_2 = 'bear-640x360.webm'; - if (runEncrypted) { - MEDIA_1 = 'bear-320x240-av-enc_av.webm'; - MEDIA_2 = 'bear-640x360-av-enc_av.webm'; - } - - var MEDIA_1_WIDTH = 320; - var MEDIA_1_HEIGHT = 240; - - var MEDIA_2_WIDTH = 640; - var MEDIA_2_HEIGHT = 360; - var MEDIA_2_LENGTH = 2.75; - - // The time in secs to append the second media source. - var APPEND_TIME = 1; - // DELTA is the time after APPEND_TIME where the second video dimensions - // are guaranteed to take effect. - var DELTA = 0.1; - // Append MEDIA_2 source at APPEND_TIME, so expected total duration is: - var TOTAL_DURATION = APPEND_TIME + MEDIA_2_LENGTH; - - function appendNextSource(mediaSource) { - console.log('Appending next media source at ' + APPEND_TIME + 'sec.'); - var xhr = new XMLHttpRequest(); - xhr.open("GET", MEDIA_2); - xhr.responseType = 'arraybuffer'; - xhr.addEventListener('load', function(e) { - var onUpdateEnd = function(e) { - console.log('Second buffer append ended.'); - srcBuffer.removeEventListener('updateend', onUpdateEnd); - mediaSource.endOfStream(); - if (!mediaSource.duration || - Math.abs(mediaSource.duration - TOTAL_DURATION) > DELTA) { - failTest('Unexpected mediaSource.duration = ' + - mediaSource.duration + ', expected duration = ' + - TOTAL_DURATION); - return; - } - video.play(); - }; - console.log('Appending next media source at ' + APPEND_TIME + 'sec.'); - var srcBuffer = mediaSource.sourceBuffers[0]; - srcBuffer.addEventListener('updateend', onUpdateEnd); - srcBuffer.timestampOffset = APPEND_TIME; - srcBuffer.appendBuffer(new Uint8Array(e.target.response)); - }); - xhr.send(); - } - - function onTimeUpdate() { - // crbug.com/246308 - //checkVideoProperties(); - - // Seek to APPEND_TIME because after a seek a timeUpdate event is fired - // before video width and height properties get updated. - if (video.currentTime < APPEND_TIME - DELTA) { - // Seek to save test execution time (about 1 secs) and to test seek - // on the first buffer. - video.currentTime = APPEND_TIME - DELTA; - } else if (video.currentTime > APPEND_TIME + DELTA) { - // Check video duration here to guarantee that second segment has been - // appended and video total duration is updated. - // Video duration is a float value so we check it within a range. - if (!video.duration || - Math.abs(video.duration - TOTAL_DURATION) > DELTA) { - failTest('Unexpected video.duration = ' + video.duration + - ', expected duration = ' + TOTAL_DURATION); - return; - } - - video.removeEventListener('timeupdate', onTimeUpdate); - video.removeEventListener('ended', failTest); - installTitleEventHandler(video, 'ended'); - // Seek to save test execution time and to test seek on second buffer. - video.currentTime = APPEND_TIME + MEDIA_2_LENGTH * 0.9; - } - } - - function checkVideoProperties() { - if (video.currentTime <= APPEND_TIME) { - if (video.videoWidth != MEDIA_1_WIDTH || - video.videoHeight != MEDIA_1_HEIGHT) { - logVideoDimensions(); - failTest('Unexpected dimensions for first video segment.'); - return; - } - } else if (video.currentTime >= APPEND_TIME + DELTA) { - if (video.videoWidth != MEDIA_2_WIDTH || - video.videoHeight != MEDIA_2_HEIGHT) { - logVideoDimensions(); - failTest('Unexpected dimensions for second video segment.'); - return; - } - } - } - - function logVideoDimensions() { - console.log('video.currentTime = ' + video.currentTime + - ', video dimensions = ' + video.videoWidth + 'x' + - video.videoHeight + '.'); - } - - function runTest() { - video.addEventListener('timeupdate', onTimeUpdate); - video.addEventListener('ended', failTest); - if (runEncrypted) { - loadEncryptedMedia(video, MEDIA_1, keySystem, KEY, true, - appendNextSource); - } else { - var mediaSource = loadMediaSource(MEDIA_1, mediaType, - appendNextSource); - video.src = window.URL.createObjectURL(mediaSource); - } - } - </script> - </body> -</html> @@ -1,6 +1,7 @@ include_rules = [ "+gpu", "+jni", + "+net/test", "+third_party/ffmpeg", "+third_party/libvpx", "+third_party/libyuv", diff --git a/media/base/test_data_util.cc b/media/base/test_data_util.cc index a83fa84..9cd886f 100644 --- a/media/base/test_data_util.cc +++ b/media/base/test_data_util.cc @@ -12,14 +12,38 @@ namespace media { +const base::FilePath::CharType kTestDataPath[] = + FILE_PATH_LITERAL("media/test/data"); + base::FilePath GetTestDataFilePath(const std::string& name) { base::FilePath file_path; CHECK(PathService::Get(base::DIR_SOURCE_ROOT, &file_path)); + return file_path.Append(GetTestDataPath()).AppendASCII(name); +} + +base::FilePath GetTestDataPath() { + return base::FilePath(kTestDataPath); +} + +std::string GetURLQueryString(const QueryParams& query_params) { + std::string query = ""; + QueryParams::const_iterator itr = query_params.begin(); + for (; itr != query_params.end(); ++itr) { + if (itr != query_params.begin()) + query.append("&"); + query.append(itr->first + "=" + itr->second); + } + return query; +} - return file_path.AppendASCII("media") - .AppendASCII("test") - .AppendASCII("data") - .AppendASCII(name); +scoped_ptr<net::SpawnedTestServer> StartMediaHttpTestServer() { + scoped_ptr<net::SpawnedTestServer> http_test_server; + http_test_server.reset(new net::SpawnedTestServer( + net::SpawnedTestServer::TYPE_HTTP, + net::SpawnedTestServer::kLocalhost, + GetTestDataPath())); + CHECK(http_test_server->Start()); + return http_test_server.Pass(); } scoped_refptr<DecoderBuffer> ReadTestDataFile(const std::string& name) { diff --git a/media/base/test_data_util.h b/media/base/test_data_util.h index 8d51e96..955d615 100644 --- a/media/base/test_data_util.h +++ b/media/base/test_data_util.h @@ -6,19 +6,34 @@ #define MEDIA_BASE_TEST_DATA_UTIL_H_ #include <string> +#include <utility> +#include <vector> #include "base/basictypes.h" #include "base/files/file_path.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" +#include "net/test/spawned_test_server/spawned_test_server.h" namespace media { class DecoderBuffer; +typedef std::vector<std::pair<std::string, std::string> > QueryParams; + // Returns a file path for a file in the media/test/data directory. base::FilePath GetTestDataFilePath(const std::string& name); +// Returns relative path for test data folder: media/test/data. +base::FilePath GetTestDataPath(); + +// Starts an HTTP server serving files from media data path. +scoped_ptr<net::SpawnedTestServer> StartMediaHttpTestServer(); + +// Returns a string containing key value query params in the form of: +// "key_1=value_1&key_2=value2" +std::string GetURLQueryString(const QueryParams& query_params); + // Reads a test file from media/test/data directory and stores it in // a DecoderBuffer. Use DecoderBuffer vs DataBuffer to ensure no matter // what a test does, it's safe to use FFmpeg methods. diff --git a/media/media.gyp b/media/media.gyp index fdccc42..00ad811 100644 --- a/media/media.gyp +++ b/media/media.gyp @@ -1349,6 +1349,7 @@ 'media', 'shared_memory_support', '../base/base.gyp:base', + '../net/net.gyp:net_test_support', '../skia/skia.gyp:skia', '../testing/gmock.gyp:gmock', '../testing/gtest.gyp:gtest', diff --git a/content/test/data/media/blackwhite.html b/media/test/data/blackwhite.html index 6b9d049..6b9d049 100644 --- a/content/test/data/media/blackwhite.html +++ b/media/test/data/blackwhite.html diff --git a/chrome/test/data/media/eme_player.html b/media/test/data/eme_player.html index 65c120f..65c120f 100644 --- a/chrome/test/data/media/eme_player.html +++ b/media/test/data/eme_player.html diff --git a/chrome/test/data/media/eme_player_js/app_loader.js b/media/test/data/eme_player_js/app_loader.js index f4a3e74..f4a3e74 100644 --- a/chrome/test/data/media/eme_player_js/app_loader.js +++ b/media/test/data/eme_player_js/app_loader.js diff --git a/chrome/test/data/media/eme_player_js/clearkey_player.js b/media/test/data/eme_player_js/clearkey_player.js index 6de8408..6de8408 100644 --- a/chrome/test/data/media/eme_player_js/clearkey_player.js +++ b/media/test/data/eme_player_js/clearkey_player.js diff --git a/chrome/test/data/media/eme_player_js/eme_app.js b/media/test/data/eme_player_js/eme_app.js index 4c2ec0d..4c2ec0d 100644 --- a/chrome/test/data/media/eme_player_js/eme_app.js +++ b/media/test/data/eme_player_js/eme_app.js diff --git a/chrome/test/data/media/eme_player_js/file_io_test_player.js b/media/test/data/eme_player_js/file_io_test_player.js index d259801..d259801 100644 --- a/chrome/test/data/media/eme_player_js/file_io_test_player.js +++ b/media/test/data/eme_player_js/file_io_test_player.js diff --git a/chrome/test/data/media/eme_player_js/fps_observer.js b/media/test/data/eme_player_js/fps_observer.js index 8226df8..8226df8 100644 --- a/chrome/test/data/media/eme_player_js/fps_observer.js +++ b/media/test/data/eme_player_js/fps_observer.js diff --git a/chrome/test/data/media/eme_player_js/globals.js b/media/test/data/eme_player_js/globals.js index c608dfe..c608dfe 100644 --- a/chrome/test/data/media/eme_player_js/globals.js +++ b/media/test/data/eme_player_js/globals.js diff --git a/chrome/test/data/media/eme_player_js/media_source_utils.js b/media/test/data/eme_player_js/media_source_utils.js index d75f31c..8888582 100644 --- a/chrome/test/data/media/eme_player_js/media_source_utils.js +++ b/media/test/data/eme_player_js/media_source_utils.js @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. diff --git a/chrome/test/data/media/eme_player_js/player_utils.js b/media/test/data/eme_player_js/player_utils.js index ac7b6dd..ac7b6dd 100644 --- a/chrome/test/data/media/eme_player_js/player_utils.js +++ b/media/test/data/eme_player_js/player_utils.js diff --git a/chrome/test/data/media/eme_player_js/prefixed_clearkey_player.js b/media/test/data/eme_player_js/prefixed_clearkey_player.js index cbca7d3..cbca7d3 100644 --- a/chrome/test/data/media/eme_player_js/prefixed_clearkey_player.js +++ b/media/test/data/eme_player_js/prefixed_clearkey_player.js diff --git a/chrome/test/data/media/eme_player_js/prefixed_widevine_player.js b/media/test/data/eme_player_js/prefixed_widevine_player.js index adfd570..adfd570 100644 --- a/chrome/test/data/media/eme_player_js/prefixed_widevine_player.js +++ b/media/test/data/eme_player_js/prefixed_widevine_player.js diff --git a/media/test/data/eme_player_js/test_config.js b/media/test/data/eme_player_js/test_config.js new file mode 100644 index 0000000..8be8a9a --- /dev/null +++ b/media/test/data/eme_player_js/test_config.js @@ -0,0 +1,65 @@ +// Copyright 2014 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. + +// Test configuration used by test page to configure the player app and other +// test specific configurations. +function TestConfig() { + this.mediaFile = null; + this.keySystem = null; + this.mediaType = null; + this.licenseServerURL = null; + this.useMSE = false; + this.usePrefixedEME = false; + this.runFPS = false; +} + +TestConfig.prototype.loadQueryParams = function() { + // Load query parameters and set default values. + var r = /([^&=]+)=?([^&]*)/g; + // Lambda function for decoding extracted match values. Replaces '+' with + // space so decodeURIComponent functions properly. + var decodeURI = function decodeURI(s) { + return decodeURIComponent(s.replace(/\+/g, ' ')); + }; + var match; + while (match = r.exec(window.location.search.substring(1))) + this[decodeURI(match[1])] = decodeURI(match[2]); + this.useMSE = this.useMSE == '1' || this.useMSE == 'true'; + this.usePrefixedEME = + this.usePrefixedEME == '1' || this.usePrefixedEME == 'true'; +}; + +TestConfig.updateDocument = function() { + this.loadQueryParams(); + Utils.addOptions(KEYSYSTEM_ELEMENT_ID, KEY_SYSTEMS); + Utils.addOptions(MEDIA_TYPE_ELEMENT_ID, MEDIA_TYPES); + Utils.addOptions(USE_PREFIXED_EME_ID, EME_VERSIONS_OPTIONS, + EME_DISABLED_OPTIONS); + + document.getElementById(MEDIA_FILE_ELEMENT_ID).value = + this.mediaFile || DEFAULT_MEDIA_FILE; + + document.getElementById(LICENSE_SERVER_ELEMENT_ID).value = + this.licenseServerURL || DEFAULT_LICENSE_SERVER; + + if (this.keySystem) + Utils.ensureOptionInList(KEYSYSTEM_ELEMENT_ID, this.keySystem); + if (this.mediaType) + Utils.ensureOptionInList(MEDIA_TYPE_ELEMENT_ID, this.mediaType); + document.getElementById(USE_MSE_ELEMENT_ID).value = this.useMSE; + if (this.usePrefixedEME) + document.getElementById(USE_PREFIXED_EME_ID).value = EME_PREFIXED_VERSION; +}; + +TestConfig.init = function() { + // Reload test configuration from document. + this.mediaFile = document.getElementById(MEDIA_FILE_ELEMENT_ID).value; + this.keySystem = document.getElementById(KEYSYSTEM_ELEMENT_ID).value; + this.mediaType = document.getElementById(MEDIA_TYPE_ELEMENT_ID).value; + this.useMSE = document.getElementById(USE_MSE_ELEMENT_ID).value == 'true'; + this.usePrefixedEME = document.getElementById(USE_PREFIXED_EME_ID).value == + EME_PREFIXED_VERSION; + this.licenseServerURL = + document.getElementById(LICENSE_SERVER_ELEMENT_ID).value; +}; diff --git a/chrome/test/data/media/eme_player_js/utils.js b/media/test/data/eme_player_js/utils.js index e664593..e664593 100644 --- a/chrome/test/data/media/eme_player_js/utils.js +++ b/media/test/data/eme_player_js/utils.js diff --git a/chrome/test/data/media/eme_player_js/widevine_player.js b/media/test/data/eme_player_js/widevine_player.js index 11e8ec86..11e8ec86 100644 --- a/chrome/test/data/media/eme_player_js/widevine_player.js +++ b/media/test/data/eme_player_js/widevine_player.js diff --git a/chrome/test/data/media/encrypted_frame_size_change.html b/media/test/data/encrypted_frame_size_change.html index 5a90990..5a90990 100644 --- a/chrome/test/data/media/encrypted_frame_size_change.html +++ b/media/test/data/encrypted_frame_size_change.html diff --git a/content/test/data/media/media_source_player.html b/media/test/data/media_source_player.html index 97f3b64..7a2ecbe 100644 --- a/content/test/data/media/media_source_player.html +++ b/media/test/data/media_source_player.html @@ -5,8 +5,7 @@ </head> <body onload="runTest();"> <video controls></video> - <script src="media_utils.js" type="text/javascript"></script> - <script src="media_source_utils.js" type="text/javascript"></script> + <script src='eme_player_js/app_loader.js' type='text/javascript'></script> <script type="text/javascript"> var video = document.querySelector('video'); @@ -16,18 +15,22 @@ } function onSeeked() { - video.removeEventListener('ended', failTest); - installTitleEventHandler(video, 'ended'); + video.removeEventListener('ended', Utils.failTest); + Utils.installTitleEventHandler(video, 'ended'); } // The test completes after media starts playing, seeks to 0.9 of // duration and fires the ended event. // The test stops when an error or ended event fire unexpectedly. function runTest() { - loadMediaFromURL(video); - video.addEventListener('ended', failTest); + var testConfig = new TestConfig(); + testConfig.loadQueryParams(); + Utils.installTitleEventHandler(video, 'error'); + video.addEventListener('ended', Utils.failTest); video.addEventListener('seeked', onSeeked); video.addEventListener('timeupdate', onTimeUpdate); + var source = MediaSourceUtils.loadMediaSourceFromTestConfig(testConfig); + video.src = window.URL.createObjectURL(source); video.play(); } </script> diff --git a/chrome/test/data/media/mse_config_change.html b/media/test/data/mse_config_change.html index 8765235..f536ece 100644 --- a/chrome/test/data/media/mse_config_change.html +++ b/media/test/data/mse_config_change.html @@ -8,7 +8,6 @@ <script type="text/javascript"> var testConfig = new TestConfig(); testConfig.loadQueryParams(); - testConfig.useMSE = '1'; var runEncrypted = testConfig.runEncrypted == 1; var video = document.querySelector('video'); @@ -17,8 +16,8 @@ var MEDIA_1 = 'bear-320x240.webm'; var MEDIA_2 = 'bear-640x360.webm'; if (runEncrypted) { - MEDIA_1 = 'bear-320x240-av-enc_av.webm'; - MEDIA_2 = 'bear-640x360-av-enc_av.webm'; + MEDIA_1 = 'bear-320x240-av_enc-av.webm'; + MEDIA_2 = 'bear-640x360-av_enc-av.webm'; } var MEDIA_1_WIDTH = 320; diff --git a/content/test/data/media/player.html b/media/test/data/player.html index e954cf8..e954cf8 100644 --- a/content/test/data/media/player.html +++ b/media/test/data/player.html diff --git a/chrome/test/data/media/test_key_system_instantiation.html b/media/test/data/test_key_system_instantiation.html index d3fb0e3..0199920 100644 --- a/chrome/test/data/media/test_key_system_instantiation.html +++ b/media/test/data/test_key_system_instantiation.html @@ -3,7 +3,7 @@ <video controls="" name="video"> <!-- This test doesn't play the video, so any file will do as long as it can be loaded. --> - <source src="bear-320x240-av-enc_a.webm" type="video/webm"> + <source src="bear-320x240-av_enc-a.webm" type="video/webm"> </video> <script type="text/javascript"> function testKeySystemInstantiation(keySystem) { |