158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/command_line.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/path_service.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/win/windows_version.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/media/media_browsertest.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/media/test_license_server.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/media/wv_test_license_server_config.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/test/browser_test_utils.h"
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "testing/gtest/include/gtest/gtest-spi.h"
188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_ANDROID)
198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/android/build_info.h"
208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "widevine_cdm_version.h"  //  In SHARED_INTERMEDIATE_DIR.
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS)
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Platform-specific filename relative to the chrome executable.
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kClearKeyCdmAdapterFileName[] =
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_MACOSX)
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "clearkeycdmadapter.plugin";
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#elif defined(OS_WIN)
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "clearkeycdmadapter.dll";
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#elif defined(OS_POSIX)
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "libclearkeycdmadapter.so";
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kClearKeyCdmPluginMimeType[] = "application/x-ppapi-clearkey-cdm";
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // defined(ENABLE_PEPPER_CDMS)
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Available key systems.
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kClearKeyKeySystem[] = "org.w3.clearkey";
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kPrefixedClearKeyKeySystem[] = "webkit-org.w3.clearkey";
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char kExternalClearKeyKeySystem[] = "org.chromium.externalclearkey";
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char kExternalClearKeyDecryptOnlyKeySystem[] =
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    "org.chromium.externalclearkey.decryptonly";
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kExternalClearKeyFileIOTestKeySystem[] =
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "org.chromium.externalclearkey.fileiotest";
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char kExternalClearKeyInitializeFailKeySystem[] =
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    "org.chromium.externalclearkey.initializefail";
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kExternalClearKeyCrashKeySystem[] =
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "org.chromium.externalclearkey.crash";
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Supported media types.
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kWebMAudioOnly[] = "audio/webm; codecs=\"vorbis\"";
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kWebMVideoOnly[] = "video/webm; codecs=\"vp8\"";
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst char kWebMVP9VideoOnly[] = "video/webm; codecs=\"vp9\"";
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kWebMAudioVideo[] = "video/webm; codecs=\"vorbis, vp8\"";
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(USE_PROPRIETARY_CODECS)
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMP4AudioOnly[] = "audio/mp4; codecs=\"mp4a.40.2\"";
5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kMP4VideoOnly[] = "video/mp4; codecs=\"avc1.4D4041\"";
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif  // defined(USE_PROPRIETARY_CODECS)
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Sessions to load.
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kNoSessionToLoad[] = "";
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kLoadableSession[] = "LoadableSession";
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kUnknownSession[] = "UnknownSession";
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// EME-specific test results and errors.
676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char kEmeKeyError[] = "KEY_ERROR";
688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)const char kEmeNotSupportedError[] = "NOTSUPPORTEDERROR";
696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char kFileIOTestSuccess[] = "FILE_IO_TEST_SUCCESS";
706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char kDefaultEmePlayer[] = "eme_player.html";
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// The type of video src used to load media.
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)enum SrcType {
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SRC,
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  MSE
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Whether to use prefixed or unprefixed EME.
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)enum EmeVersion {
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PREFIXED,
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  UNPREFIXED
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// MSE is available on all desktop platforms and on Android 4.1 and later.
868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)static bool IsMSESupported() {
878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_ANDROID)
888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (base::android::BuildInfo::GetInstance()->sdk_int() < 16) {
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    VLOG(0) << "MSE is only supported in Android 4.1 and later.";
908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return false;
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif  // defined(OS_ANDROID)
938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return true;
948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static bool IsParentKeySystemOf(const std::string& parent_key_system,
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                const std::string& key_system) {
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string prefix = parent_key_system + '.';
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return key_system.substr(0, prefix.size()) == prefix;
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Base class for encrypted media tests.
1038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class EncryptedMediaTestBase : public MediaBrowserTest {
1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public:
1058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EncryptedMediaTestBase() : is_pepper_cdm_registered_(false) {}
1068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool IsExternalClearKey(const std::string& key_system) {
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return key_system == kExternalClearKeyKeySystem ||
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           IsParentKeySystemOf(kExternalClearKeyKeySystem, key_system);
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE)
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool IsWidevine(const std::string& key_system) {
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return key_system == kWidevineKeySystem;
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(WIDEVINE_CDM_AVAILABLE)
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RunEncryptedMediaTestPage(
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const std::string& html_page,
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const std::string& key_system,
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const media::QueryParams& query_params,
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const std::string& expected_title) {
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    media::QueryParams new_query_params = query_params;
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    StartLicenseServerIfNeeded(key_system, &new_query_params);
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    RunMediaTestPage(html_page, new_query_params, expected_title, true);
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Tests |html_page| using |media_file| (with |media_type|) and |key_system|.
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // When |session_to_load| is not empty, the test will try to load
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |session_to_load| with stored keys, instead of creating a new session
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // and trying to update it with licenses.
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // When |force_invalid_response| is true, the test will provide invalid
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // responses, which should trigger errors.
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(xhwang): Find an easier way to pass multiple configuration test
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // options.
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void RunEncryptedMediaTest(const std::string& html_page,
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             const std::string& media_file,
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             const std::string& media_type,
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             const std::string& key_system,
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                             SrcType src_type,
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             EmeVersion eme_version,
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             const std::string& session_to_load,
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             bool force_invalid_response,
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             const std::string& expected_title) {
1458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (src_type == MSE && !IsMSESupported()) {
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      VLOG(0) << "Skipping test - MSE not supported.";
1478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      return;
1488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    media::QueryParams query_params;
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    query_params.push_back(std::make_pair("mediaFile", media_file));
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    query_params.push_back(std::make_pair("mediaType", media_type));
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    query_params.push_back(std::make_pair("keySystem", key_system));
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (src_type == MSE)
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      query_params.push_back(std::make_pair("useMSE", "1"));
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (eme_version == PREFIXED)
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      query_params.push_back(std::make_pair("usePrefixedEME", "1"));
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (force_invalid_response)
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      query_params.push_back(std::make_pair("forceInvalidResponse", "1"));
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!session_to_load.empty())
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      query_params.push_back(std::make_pair("sessionToLoad", session_to_load));
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    RunEncryptedMediaTestPage(html_page, key_system, query_params,
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              expected_title);
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void RunSimpleEncryptedMediaTest(const std::string& media_file,
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   const std::string& media_type,
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   const std::string& key_system,
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   SrcType src_type,
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   EmeVersion eme_version) {
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string expected_title = kEnded;
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!IsPlayBackPossible(key_system))
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      expected_title = kEmeKeyError;
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    RunEncryptedMediaTest(kDefaultEmePlayer,
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          media_file,
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          media_type,
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          key_system,
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          src_type,
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          eme_version,
180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          kNoSessionToLoad,
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          false,
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          expected_title);
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Check KeyMessage received for all key systems.
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool receivedKeyMessage = false;
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents(),
1876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "window.domAutomationController.send("
1886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "document.querySelector('video').receivedKeyMessage);",
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        &receivedKeyMessage));
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(receivedKeyMessage);
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Starts a license server if available for the |key_system| and adds a
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // 'licenseServerURL' query parameter to |query_params|.
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void StartLicenseServerIfNeeded(const std::string& key_system,
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  media::QueryParams* query_params) {
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<TestLicenseServerConfig> config = GetServerConfig(key_system);
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!config)
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    license_server_.reset(new TestLicenseServer(config.Pass()));
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(license_server_->Start());
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    query_params->push_back(
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        std::make_pair("licenseServerURL", license_server_->GetServerURL()));
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool IsPlayBackPossible(const std::string& key_system) {
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE)
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (IsWidevine(key_system) && !GetServerConfig(key_system))
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(WIDEVINE_CDM_AVAILABLE)
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<TestLicenseServerConfig> GetServerConfig(
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::string& key_system) {
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE)
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (IsWidevine(key_system)) {
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scoped_ptr<TestLicenseServerConfig> config =
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         scoped_ptr<TestLicenseServerConfig>(new WVTestLicenseServerConfig());
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (config->IsPlatformSupported())
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return config.Pass();
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(WIDEVINE_CDM_AVAILABLE)
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return scoped_ptr<TestLicenseServerConfig>();
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<TestLicenseServer> license_server_;
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
230d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // We want to fail quickly when a test fails because an error is encountered.
231d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void AddWaitForTitles(content::TitleWatcher* title_watcher) OVERRIDE {
232d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    MediaBrowserTest::AddWaitForTitles(title_watcher);
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    title_watcher->AlsoWaitForTitle(base::ASCIIToUTF16(kEmeNotSupportedError));
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    title_watcher->AlsoWaitForTitle(base::ASCIIToUTF16(kEmeKeyError));
235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
236d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_ANDROID)
2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    command_line->AppendSwitch(
2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        switches::kDisableGestureRequirementForMediaPlayback);
2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(OS_ANDROID)
24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetUpCommandLineForKeySystem(const std::string& key_system,
2458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                    CommandLine* command_line) {
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (GetServerConfig(key_system))
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Since the web and license servers listen on different ports, we need to
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // disable web-security to send license requests to the license server.
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // TODO(shadi): Add port forwarding to the test web server configuration.
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      command_line->AppendSwitch(switches::kDisableWebSecurity);
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS)
2538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (IsExternalClearKey(key_system)) {
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      RegisterPepperCdm(command_line, kClearKeyCdmAdapterFileName, key_system);
2558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
2568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT)
2578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    else if (IsWidevine(key_system)) {
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      RegisterPepperCdm(command_line, kWidevineCdmAdapterFileName, key_system);
2598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
2608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif  // defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT)
2618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif  // defined(ENABLE_PEPPER_CDMS)
2628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) private:
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS)
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void RegisterPepperCdm(CommandLine* command_line,
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                         const std::string& adapter_name,
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                         const std::string& key_system) {
2698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    DCHECK(!is_pepper_cdm_registered_)
2708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        << "RegisterPepperCdm() can only be called once.";
2718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    is_pepper_cdm_registered_ = true;
2728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Append the switch to register the Clear Key CDM Adapter.
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::FilePath plugin_dir;
27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(PathService::Get(base::DIR_MODULE, &plugin_dir));
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::FilePath plugin_lib = plugin_dir.AppendASCII(adapter_name);
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_TRUE(base::PathExists(plugin_lib)) << plugin_lib.value();
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::FilePath::StringType pepper_plugin = plugin_lib.value();
27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    pepper_plugin.append(FILE_PATH_LITERAL("#CDM#0.1.0.0;"));
28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN)
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pepper_plugin.append(base::ASCIIToWide(GetPepperType(key_system)));
28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else
28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    pepper_plugin.append(GetPepperType(key_system));
28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    command_line->AppendSwitchNative(switches::kRegisterPepperPlugins,
28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     pepper_plugin);
28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Adapted from key_systems.cc.
29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string GetPepperType(const std::string& key_system) {
291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (IsExternalClearKey(key_system))
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return kClearKeyCdmPluginMimeType;
29358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE)
294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (IsWidevine(key_system))
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return kWidevineCdmPluginMimeType;
29658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // WIDEVINE_CDM_AVAILABLE
29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    NOTREACHED();
29958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return "";
30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // defined(ENABLE_PEPPER_CDMS)
3028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool is_pepper_cdm_registered_;
3048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)};
3058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS)
307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests encrypted media playback using ExternalClearKey key system in
308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// decrypt-and-decode mode.
3098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class ECKEncryptedMediaTest : public EncryptedMediaTestBase {
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We use special |key_system| names to do non-playback related tests, e.g.
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // kExternalClearKeyFileIOTestKeySystem is used to test file IO.
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void TestNonPlaybackCases(const std::string& key_system,
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            const std::string& expected_title) {
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Since we do not test playback, arbitrarily choose a test file and source
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // type.
3176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    RunEncryptedMediaTest(kDefaultEmePlayer,
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          "bear-a_enc-a.webm",
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          kWebMAudioOnly,
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          key_system,
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          SRC,
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          PREFIXED,
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          kNoSessionToLoad,
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          false,
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          expected_title);
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) protected:
3298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
3308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    EncryptedMediaTestBase::SetUpCommandLine(command_line);
3318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    SetUpCommandLineForKeySystem(kExternalClearKeyKeySystem, command_line);
3328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
3338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)};
3348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE)
3368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Tests encrypted media playback using Widevine key system.
3378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class WVEncryptedMediaTest : public EncryptedMediaTestBase {
3388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) protected:
3398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
3408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    EncryptedMediaTestBase::SetUpCommandLine(command_line);
341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    command_line->AppendSwitch(switches::kEnableEncryptedMedia);
3428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    SetUpCommandLineForKeySystem(kWidevineKeySystem, command_line);
3438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
3448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)};
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif  // defined(WIDEVINE_CDM_AVAILABLE)
3478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif  // defined(ENABLE_PEPPER_CDMS)
3488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Tests encrypted media playback with a combination of parameters:
3508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// - char*: Key system name.
3518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// - bool: True to load media using MSE, otherwise use src.
352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// - bool: True to use unprefixed EME, otherwise use prefixed EME.
3538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)//
3548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Note: Only parameterized (*_P) tests can be used. Non-parameterized (*_F)
3558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// tests will crash at GetParam(). To add non-parameterized tests, use
3568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// EncryptedMediaTestBase or one of its subclasses (e.g. WVEncryptedMediaTest).
357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class EncryptedMediaTest
358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public EncryptedMediaTestBase,
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      public testing::WithParamInterface<
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          std::tr1::tuple<const char*, SrcType, EmeVersion> > {
3618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public:
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string CurrentKeySystem() {
3638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return std::tr1::get<0>(GetParam());
3648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
3658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  SrcType CurrentSourceType() {
3678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return std::tr1::get<1>(GetParam());
3688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
3698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EmeVersion CurrentEmeVersion() {
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return std::tr1::get<2>(GetParam());
372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void TestSimplePlayback(const std::string& encrypted_media,
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          const std::string& media_type) {
376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    RunSimpleEncryptedMediaTest(encrypted_media,
377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                media_type,
378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                CurrentKeySystem(),
379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                CurrentSourceType(),
380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                CurrentEmeVersion());
3818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
3828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void RunInvalidResponseTest() {
3846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    RunEncryptedMediaTest(kDefaultEmePlayer,
3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          "bear-320x240-av_enc-av.webm",
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          kWebMAudioVideo,
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          CurrentKeySystem(),
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          CurrentSourceType(),
389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          CurrentEmeVersion(),
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          kNoSessionToLoad,
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          true,
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          kEmeKeyError);
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void TestFrameSizeChange() {
3968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    RunEncryptedMediaTest("encrypted_frame_size_change.html",
3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          "frame_size_change-av_enc-v.webm",
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          kWebMAudioVideo,
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          CurrentKeySystem(),
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          CurrentSourceType(),
401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          CurrentEmeVersion(),
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          kNoSessionToLoad,
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          false,
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          kEnded);
4058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
4068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void TestConfigChange() {
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(IsMSESupported());
4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    media::QueryParams query_params;
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    query_params.push_back(std::make_pair("keySystem", CurrentKeySystem()));
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    query_params.push_back(std::make_pair("runEncrypted", "1"));
412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (CurrentEmeVersion() == PREFIXED)
413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      query_params.push_back(std::make_pair("usePrefixedEME", "1"));
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RunEncryptedMediaTestPage("mse_config_change.html",
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              CurrentKeySystem(),
4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              query_params,
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              kEnded);
4188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
4198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) protected:
4218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
4228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    EncryptedMediaTestBase::SetUpCommandLine(command_line);
4238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    SetUpCommandLineForKeySystem(CurrentKeySystem(), command_line);
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (CurrentEmeVersion() == UNPREFIXED)
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      command_line->AppendSwitch(switches::kEnableEncryptedMedia);
4278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
42958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)using ::testing::Combine;
4318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)using ::testing::Values;
4328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if !defined(OS_ANDROID)
434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(SRC_ClearKey_Prefixed,
435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        EncryptedMediaTest,
436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Combine(Values(kPrefixedClearKeyKeySystem),
437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(SRC),
438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(PREFIXED)));
439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO(jrummell): Enable unprefixed tests before shipping unprefixed EME.
441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Disabled now as they don't provide much additional coverage, but do take a
442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// bit of time to execute.
443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(DISABLED_SRC_ClearKey,
444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        EncryptedMediaTest,
445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Combine(Values(kClearKeyKeySystem),
446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(SRC),
447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(UNPREFIXED)));
4488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif  // !defined(OS_ANDROID)
4498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(MSE_ClearKey_Prefixed,
451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        EncryptedMediaTest,
452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Combine(Values(kPrefixedClearKeyKeySystem),
453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(MSE),
454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(PREFIXED)));
45503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// http://crbug.com/402766
45603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(DISABLED_MSE_ClearKey,
457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        EncryptedMediaTest,
458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Combine(Values(kClearKeyKeySystem),
459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(MSE),
460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(UNPREFIXED)));
46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
46258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// External Clear Key is currently only used on platforms that use Pepper CDMs.
46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS)
464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(SRC_ExternalClearKey_Prefixed,
465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        EncryptedMediaTest,
466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Combine(Values(kExternalClearKeyKeySystem),
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(SRC),
468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(PREFIXED)));
469effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochINSTANTIATE_TEST_CASE_P(SRC_ExternalClearKey,
470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        EncryptedMediaTest,
471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Combine(Values(kExternalClearKeyKeySystem),
472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(SRC),
473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(UNPREFIXED)));
474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(MSE_ExternalClearKey_Prefixed,
475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        EncryptedMediaTest,
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Combine(Values(kExternalClearKeyKeySystem),
477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(MSE),
478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(PREFIXED)));
479effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochINSTANTIATE_TEST_CASE_P(MSE_ExternalClearKey,
480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        EncryptedMediaTest,
481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Combine(Values(kExternalClearKeyKeySystem),
482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(MSE),
483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(UNPREFIXED)));
484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// To reduce test time, only run ExternalClearKeyDecryptOnly with MSE.
485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(MSE_ExternalClearKeyDecryptOnly_Prefixed,
486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        EncryptedMediaTest,
487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Combine(Values(kExternalClearKeyDecryptOnlyKeySystem),
488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(MSE),
489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(PREFIXED)));
490effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochINSTANTIATE_TEST_CASE_P(MSE_ExternalClearKeyDecryptOnly,
491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        EncryptedMediaTest,
492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Combine(Values(kExternalClearKeyDecryptOnlyKeySystem),
493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(MSE),
494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(UNPREFIXED)));
4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif  // defined(ENABLE_PEPPER_CDMS)
49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE)
4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// This test doesn't fully test playback with Widevine. So we only run Widevine
4998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// test with MSE (no SRC) to reduce test time. Also, on Android EME only works
5008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// with MSE and we cannot run this test with SRC.
501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(MSE_Widevine_Prefixed,
502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        EncryptedMediaTest,
503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Combine(Values(kWidevineKeySystem),
504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(MSE),
505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(PREFIXED)));
506effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
507effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Following tests fail if Widevine is loaded as a component, crbug.com/356833.
508effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if !defined(WIDEVINE_CDM_IS_COMPONENT)
509effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochINSTANTIATE_TEST_CASE_P(MSE_Widevine,
510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        EncryptedMediaTest,
511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Combine(Values(kWidevineKeySystem),
512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(MSE),
513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                Values(UNPREFIXED)));
514effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // !defined(WIDEVINE_CDM_IS_COMPONENT)
5154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(WIDEVINE_CDM_AVAILABLE)
51658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
51703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioOnly_WebM) {
5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestSimplePlayback("bear-a_enc-a.webm", kWebMAudioOnly);
51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
52058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioClearVideo_WebM) {
5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestSimplePlayback("bear-320x240-av_enc-a.webm", kWebMAudioVideo);
52358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoAudio_WebM) {
5265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestSimplePlayback("bear-320x240-av_enc-av.webm", kWebMAudioVideo);
52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoOnly_WebM) {
5305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestSimplePlayback("bear-320x240-v_enc-v.webm", kWebMVideoOnly);
53158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
53258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
53303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoClearAudio_WebM) {
5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestSimplePlayback("bear-320x240-av_enc-v.webm", kWebMAudioVideo);
53558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
53658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
53703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VP9Video_WebM) {
5385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TestSimplePlayback("bear-320x240-v-vp9_enc-v.webm", kWebMVP9VideoOnly);
539a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
540a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
54103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, InvalidResponseKeyError) {
5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunInvalidResponseTest();
5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, ConfigChangeVideo) {
5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (CurrentSourceType() != MSE || !IsMSESupported()) {
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    VLOG(0) << "Skipping test - ConfigChange test requires MSE.";
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!IsPlayBackPossible(CurrentKeySystem())) {
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    VLOG(0) << "Skipping test - ConfigChange test requires video playback.";
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TestConfigChange();
5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, FrameSizeChangeVideo) {
55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Times out on Windows XP. http://crbug.com/171937
55958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN)
56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (base::win::GetVersion() < base::win::VERSION_VISTA)
56158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
56258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!IsPlayBackPossible(CurrentKeySystem())) {
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    VLOG(0) << "Skipping test - FrameSizeChange test requires video playback.";
5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TestFrameSizeChange();
56858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
56958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(USE_PROPRIETARY_CODECS)
57158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoOnly_MP4) {
57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // MP4 without MSE is not support yet, http://crbug.com/170793.
5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (CurrentSourceType() != MSE) {
574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    VLOG(0) << "Skipping test; Can only play MP4 encrypted streams by MSE.";
57558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
5774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TestSimplePlayback("bear-640x360-v_frag-cenc.mp4", kMP4VideoOnly);
57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioOnly_MP4) {
58158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // MP4 without MSE is not support yet, http://crbug.com/170793.
5824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (CurrentSourceType() != MSE) {
583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    VLOG(0) << "Skipping test; Can only play MP4 encrypted streams by MSE.";
58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
5864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TestSimplePlayback("bear-640x360-a_frag-cenc.mp4", kMP4AudioOnly);
58758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // defined(USE_PROPRIETARY_CODECS)
58958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE)
59158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// The parent key system cannot be used in generateKeyRequest.
592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WVEncryptedMediaTest, ParentThrowsException_Prefixed) {
5936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RunEncryptedMediaTest(kDefaultEmePlayer,
5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        "bear-a_enc-a.webm",
595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        kWebMAudioOnly,
596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        "com.widevine",
597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        MSE,
598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        PREFIXED,
599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        kNoSessionToLoad,
600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        false,
601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        kEmeNotSupportedError);
602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO(jrummell): http://crbug.com/349181
605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// The parent key system cannot be used when creating MediaKeys.
606e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochIN_PROC_BROWSER_TEST_F(WVEncryptedMediaTest, ParentThrowsException) {
6076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RunEncryptedMediaTest(kDefaultEmePlayer,
6085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        "bear-a_enc-a.webm",
6098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        kWebMAudioOnly,
6108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        "com.widevine",
6118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        MSE,
612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        UNPREFIXED,
6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        kNoSessionToLoad,
6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        false,
6158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                        kEmeNotSupportedError);
61658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
6174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(WIDEVINE_CDM_AVAILABLE)
61858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS)
6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, InitializeCDMFail) {
6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestNonPlaybackCases(kExternalClearKeyInitializeFailKeySystem, kEmeKeyError);
6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// When CDM crashes, we should still get a decode error.
6256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// crbug.com/386657
626f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, DISABLED_CDMCrashDuringDecode) {
627effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  IgnorePluginCrash();
6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestNonPlaybackCases(kExternalClearKeyCrashKeySystem, kError);
6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
631effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Testing that the media browser test does fail on plugin crash.
6326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// crbug.com/386657
633f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, DISABLED_CDMExpectedCrash) {
634effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Plugin crash is not ignored by default, the test is expected to fail.
635effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_NONFATAL_FAILURE(
636effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      TestNonPlaybackCases(kExternalClearKeyCrashKeySystem, kError),
637effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "plugin crash");
638effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
639effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, FileIOTest) {
6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestNonPlaybackCases(kExternalClearKeyFileIOTestKeySystem,
6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       kFileIOTestSuccess);
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, LoadLoadableSession) {
6466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RunEncryptedMediaTest(kDefaultEmePlayer,
6475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        "bear-320x240-v_enc-v.webm",
6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        kWebMVideoOnly,
6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        kExternalClearKeyKeySystem,
6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        SRC,
651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        PREFIXED,
6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        kLoadableSession,
6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        false,
6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        kEnded);
6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, LoadUnknownSession) {
6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(xhwang): Add a specific error for this failure, e.g. kSessionNotFound.
6596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RunEncryptedMediaTest(kDefaultEmePlayer,
6605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        "bear-320x240-v_enc-v.webm",
6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        kWebMVideoOnly,
6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        kExternalClearKeyKeySystem,
6634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        SRC,
664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        PREFIXED,
6655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        kUnknownSession,
6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        false,
6674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        kEmeKeyError);
66858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
6694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // defined(ENABLE_PEPPER_CDMS)
670