| OLD | NEW | 
|    1 // Copyright 2013 The Chromium Authors. All rights reserved. |    1 // Copyright 2013 The Chromium Authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include <memory> |    5 #include <memory> | 
|    6 #include <utility> |    6 #include <utility> | 
|    7  |    7  | 
|    8 #include "base/command_line.h" |    8 #include "base/command_line.h" | 
|    9 #include "base/path_service.h" |    9 #include "base/path_service.h" | 
|   10 #include "base/strings/utf_string_conversions.h" |   10 #include "base/strings/utf_string_conversions.h" | 
|   11 #include "base/win/windows_version.h" |   11 #include "base/win/windows_version.h" | 
|   12 #include "build/build_config.h" |   12 #include "build/build_config.h" | 
|   13 #include "chrome/browser/media/media_browsertest.h" |   13 #include "chrome/browser/media/media_browsertest.h" | 
|   14 #include "chrome/browser/media/test_license_server.h" |   14 #include "chrome/browser/media/test_license_server.h" | 
|   15 #include "chrome/browser/media/wv_test_license_server_config.h" |   15 #include "chrome/browser/media/wv_test_license_server_config.h" | 
|   16 #include "chrome/browser/ui/browser.h" |   16 #include "chrome/browser/ui/browser.h" | 
|   17 #include "chrome/browser/ui/tabs/tab_strip_model.h" |   17 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 
|   18 #include "chrome/common/chrome_switches.h" |   18 #include "chrome/common/chrome_switches.h" | 
|   19 #include "content/public/common/content_switches.h" |   19 #include "content/public/common/content_switches.h" | 
|   20 #include "content/public/test/browser_test_utils.h" |   20 #include "content/public/test/browser_test_utils.h" | 
|   21 #include "testing/gtest/include/gtest/gtest-spi.h" |   21 #include "testing/gtest/include/gtest/gtest-spi.h" | 
|   22 #if defined(OS_ANDROID) |   22 #if defined(OS_ANDROID) | 
|   23 #include "base/android/build_info.h" |   23 #include "base/android/build_info.h" | 
|   24 #endif |   24 #endif | 
|   25  |   25  | 
 |   26 #if defined(ENABLE_PEPPER_CDMS) | 
 |   27 #include "chrome/browser/media/pepper_cdm_test_helper.h" | 
 |   28 #endif | 
 |   29  | 
|   26 #include "widevine_cdm_version.h"  //  In SHARED_INTERMEDIATE_DIR. |   30 #include "widevine_cdm_version.h"  //  In SHARED_INTERMEDIATE_DIR. | 
|   27  |   31  | 
|   28 #if defined(ENABLE_PEPPER_CDMS) |  | 
|   29 // Platform-specific filename relative to the chrome executable. |  | 
|   30 const char kClearKeyCdmAdapterFileName[] = |  | 
|   31 #if defined(OS_MACOSX) |  | 
|   32     "clearkeycdmadapter.plugin"; |  | 
|   33 #elif defined(OS_WIN) |  | 
|   34     "clearkeycdmadapter.dll"; |  | 
|   35 #elif defined(OS_POSIX) |  | 
|   36     "libclearkeycdmadapter.so"; |  | 
|   37 #endif |  | 
|   38  |  | 
|   39 const char kClearKeyCdmPluginMimeType[] = "application/x-ppapi-clearkey-cdm"; |  | 
|   40 #endif  // defined(ENABLE_PEPPER_CDMS) |  | 
|   41  |  | 
|   42 // Available key systems. |   32 // Available key systems. | 
|   43 const char kClearKeyKeySystem[] = "org.w3.clearkey"; |   33 const char kClearKeyKeySystem[] = "org.w3.clearkey"; | 
|   44 const char kExternalClearKeyKeySystem[] = "org.chromium.externalclearkey"; |   34 const char kExternalClearKeyKeySystem[] = "org.chromium.externalclearkey"; | 
|   45 const char kExternalClearKeyFileIOTestKeySystem[] = |   35 const char kExternalClearKeyFileIOTestKeySystem[] = | 
|   46     "org.chromium.externalclearkey.fileiotest"; |   36     "org.chromium.externalclearkey.fileiotest"; | 
|   47 const char kExternalClearKeyInitializeFailKeySystem[] = |   37 const char kExternalClearKeyInitializeFailKeySystem[] = | 
|   48     "org.chromium.externalclearkey.initializefail"; |   38     "org.chromium.externalclearkey.initializefail"; | 
|   49 const char kExternalClearKeyCrashKeySystem[] = |   39 const char kExternalClearKeyCrashKeySystem[] = | 
|   50     "org.chromium.externalclearkey.crash"; |   40     "org.chromium.externalclearkey.crash"; | 
|   51  |   41  | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  101     DVLOG(0) << "MSE is only supported in Android 4.1 and later."; |   91     DVLOG(0) << "MSE is only supported in Android 4.1 and later."; | 
|  102     return false; |   92     return false; | 
|  103   } |   93   } | 
|  104 #endif  // defined(OS_ANDROID) |   94 #endif  // defined(OS_ANDROID) | 
|  105   return true; |   95   return true; | 
|  106 } |   96 } | 
|  107  |   97  | 
|  108 // Base class for encrypted media tests. |   98 // Base class for encrypted media tests. | 
|  109 class EncryptedMediaTestBase : public MediaBrowserTest { |   99 class EncryptedMediaTestBase : public MediaBrowserTest { | 
|  110  public: |  100  public: | 
|  111   EncryptedMediaTestBase() : is_pepper_cdm_registered_(false) {} |  101   EncryptedMediaTestBase() {} | 
|  112  |  102  | 
|  113   bool IsExternalClearKey(const std::string& key_system) { |  103   bool IsExternalClearKey(const std::string& key_system) { | 
|  114     if (key_system == kExternalClearKeyKeySystem) |  104     if (key_system == kExternalClearKeyKeySystem) | 
|  115       return true; |  105       return true; | 
|  116     std::string prefix = std::string(kExternalClearKeyKeySystem) + '.'; |  106     std::string prefix = std::string(kExternalClearKeyKeySystem) + '.'; | 
|  117     return key_system.substr(0, prefix.size()) == prefix; |  107     return key_system.substr(0, prefix.size()) == prefix; | 
|  118   } |  108   } | 
|  119  |  109  | 
|  120 #if defined(WIDEVINE_CDM_AVAILABLE) |  110 #if defined(WIDEVINE_CDM_AVAILABLE) | 
|  121   bool IsWidevine(const std::string& key_system) { |  111   bool IsWidevine(const std::string& key_system) { | 
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  254   void SetUpCommandLineForKeySystem(const std::string& key_system, |  244   void SetUpCommandLineForKeySystem(const std::string& key_system, | 
|  255                                     base::CommandLine* command_line) { |  245                                     base::CommandLine* command_line) { | 
|  256     if (GetServerConfig(key_system)) |  246     if (GetServerConfig(key_system)) | 
|  257       // Since the web and license servers listen on different ports, we need to |  247       // Since the web and license servers listen on different ports, we need to | 
|  258       // disable web-security to send license requests to the license server. |  248       // disable web-security to send license requests to the license server. | 
|  259       // TODO(shadi): Add port forwarding to the test web server configuration. |  249       // TODO(shadi): Add port forwarding to the test web server configuration. | 
|  260       command_line->AppendSwitch(switches::kDisableWebSecurity); |  250       command_line->AppendSwitch(switches::kDisableWebSecurity); | 
|  261  |  251  | 
|  262 #if defined(ENABLE_PEPPER_CDMS) |  252 #if defined(ENABLE_PEPPER_CDMS) | 
|  263     if (IsExternalClearKey(key_system)) { |  253     if (IsExternalClearKey(key_system)) { | 
|  264       RegisterPepperCdm(command_line, kClearKeyCdmAdapterFileName, key_system); |  254       RegisterPepperCdm(command_line, kClearKeyCdmAdapterFileName, | 
 |  255                         GetPepperType(key_system)); | 
|  265     } |  256     } | 
|  266 #if defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT) |  257 #if defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT) | 
|  267     else if (IsWidevine(key_system)) {  // NOLINT |  258     else if (IsWidevine(key_system)) {  // NOLINT | 
|  268       RegisterPepperCdm(command_line, kWidevineCdmAdapterFileName, key_system); |  259       RegisterPepperCdm(command_line, kWidevineCdmAdapterFileName, | 
 |  260                         GetPepperType(key_system)); | 
|  269     } |  261     } | 
|  270 #endif  // defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT) |  262 #endif  // defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT) | 
|  271 #endif  // defined(ENABLE_PEPPER_CDMS) |  263 #endif  // defined(ENABLE_PEPPER_CDMS) | 
|  272   } |  264   } | 
|  273  |  265  | 
|  274  private: |  266  private: | 
|  275 #if defined(ENABLE_PEPPER_CDMS) |  267 #if defined(ENABLE_PEPPER_CDMS) | 
|  276   void RegisterPepperCdm(base::CommandLine* command_line, |  | 
|  277                          const std::string& adapter_name, |  | 
|  278                          const std::string& key_system) { |  | 
|  279     DCHECK(!is_pepper_cdm_registered_) |  | 
|  280         << "RegisterPepperCdm() can only be called once."; |  | 
|  281     is_pepper_cdm_registered_ = true; |  | 
|  282  |  | 
|  283     // Append the switch to register the Clear Key CDM Adapter. |  | 
|  284     base::FilePath plugin_dir; |  | 
|  285     EXPECT_TRUE(PathService::Get(base::DIR_MODULE, &plugin_dir)); |  | 
|  286     base::FilePath plugin_lib = plugin_dir.AppendASCII(adapter_name); |  | 
|  287     EXPECT_TRUE(base::PathExists(plugin_lib)) << plugin_lib.value(); |  | 
|  288     base::FilePath::StringType pepper_plugin = plugin_lib.value(); |  | 
|  289     pepper_plugin.append(FILE_PATH_LITERAL("#CDM#0.1.0.0;")); |  | 
|  290 #if defined(OS_WIN) |  | 
|  291     pepper_plugin.append(base::ASCIIToUTF16(GetPepperType(key_system))); |  | 
|  292 #else |  | 
|  293     pepper_plugin.append(GetPepperType(key_system)); |  | 
|  294 #endif |  | 
|  295     command_line->AppendSwitchNative(switches::kRegisterPepperPlugins, |  | 
|  296                                      pepper_plugin); |  | 
|  297   } |  | 
|  298  |  | 
|  299   // Adapted from key_systems.cc. |  268   // Adapted from key_systems.cc. | 
|  300   std::string GetPepperType(const std::string& key_system) { |  269   std::string GetPepperType(const std::string& key_system) { | 
|  301     if (IsExternalClearKey(key_system)) |  270     if (IsExternalClearKey(key_system)) | 
|  302       return kClearKeyCdmPluginMimeType; |  271       return kClearKeyCdmPepperMimeType; | 
|  303 #if defined(WIDEVINE_CDM_AVAILABLE) |  272 #if defined(WIDEVINE_CDM_AVAILABLE) | 
|  304     if (IsWidevine(key_system)) |  273     if (IsWidevine(key_system)) | 
|  305       return kWidevineCdmPluginMimeType; |  274       return kWidevineCdmPluginMimeType; | 
|  306 #endif  // WIDEVINE_CDM_AVAILABLE |  275 #endif  // WIDEVINE_CDM_AVAILABLE | 
|  307  |  276  | 
|  308     NOTREACHED(); |  277     NOTREACHED(); | 
|  309     return ""; |  278     return ""; | 
|  310   } |  279   } | 
|  311 #endif  // defined(ENABLE_PEPPER_CDMS) |  280 #endif  // defined(ENABLE_PEPPER_CDMS) | 
|  312  |  | 
|  313   bool is_pepper_cdm_registered_; |  | 
|  314 }; |  281 }; | 
|  315  |  282  | 
|  316 #if defined(ENABLE_PEPPER_CDMS) |  283 #if defined(ENABLE_PEPPER_CDMS) | 
|  317 // Tests encrypted media playback using ExternalClearKey key system in |  284 // Tests encrypted media playback using ExternalClearKey key system in | 
|  318 // decrypt-and-decode mode. |  285 // decrypt-and-decode mode. | 
|  319 class ECKEncryptedMediaTest : public EncryptedMediaTestBase { |  286 class ECKEncryptedMediaTest : public EncryptedMediaTestBase { | 
|  320  public: |  287  public: | 
|  321   // We use special |key_system| names to do non-playback related tests, e.g. |  288   // We use special |key_system| names to do non-playback related tests, e.g. | 
|  322   // kExternalClearKeyFileIOTestKeySystem is used to test file IO. |  289   // kExternalClearKeyFileIOTestKeySystem is used to test file IO. | 
|  323   void TestNonPlaybackCases(const std::string& key_system, |  290   void TestNonPlaybackCases(const std::string& key_system, | 
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  670  |  637  | 
|  671 IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, LoadLoadableSession) { |  638 IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, LoadLoadableSession) { | 
|  672   TestPlaybackCase(kLoadableSession, kEnded); |  639   TestPlaybackCase(kLoadableSession, kEnded); | 
|  673 } |  640 } | 
|  674  |  641  | 
|  675 IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, LoadUnknownSession) { |  642 IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, LoadUnknownSession) { | 
|  676   TestPlaybackCase(kUnknownSession, kEmeSessionNotFound); |  643   TestPlaybackCase(kUnknownSession, kEmeSessionNotFound); | 
|  677 } |  644 } | 
|  678  |  645  | 
|  679 #endif  // defined(ENABLE_PEPPER_CDMS) |  646 #endif  // defined(ENABLE_PEPPER_CDMS) | 
| OLD | NEW |