diff --git a/atom/app/atom_content_client.cc b/atom/app/atom_content_client.cc index cd6d36204e42..f17ae3137032 100644 --- a/atom/app/atom_content_client.cc +++ b/atom/app/atom_content_client.cc @@ -20,7 +20,6 @@ #include "content/public/common/user_agent.h" #include "media/media_features.h" #include "ppapi/shared_impl/ppapi_permissions.h" -#include "third_party/widevine/cdm/stub/widevine_cdm_version.h" #include "ui/base/l10n/l10n_util.h" #include "url/url_constants.h" @@ -90,20 +89,6 @@ content::PepperPluginInfo CreateWidevineCdmInfo(const base::FilePath& path, kWidevineCdmPluginMimeType, kWidevineCdmPluginExtension, kWidevineCdmPluginMimeTypeDescription); - // Add the supported codecs as if they came from the component manifest. - std::vector codecs; - codecs.push_back(kCdmSupportedCodecVp8); - codecs.push_back(kCdmSupportedCodecVp9); -#if BUILDFLAG(USE_PROPRIETARY_CODECS) - codecs.push_back(kCdmSupportedCodecAvc1); -#endif // BUILDFLAG(USE_PROPRIETARY_CODECS) - std::string codec_string = base::JoinString( - codecs, std::string(1, kCdmSupportedCodecsValueDelimiter)); - widevine_cdm_mime_type.additional_param_names.push_back( - base::ASCIIToUTF16(kCdmSupportedCodecsParamName)); - widevine_cdm_mime_type.additional_param_values.push_back( - base::ASCIIToUTF16(codec_string)); - widevine_cdm.mime_types.push_back(widevine_cdm_mime_type); widevine_cdm.permissions = kWidevineCdmPluginPermissions; @@ -224,4 +209,36 @@ void AtomContentClient::AddPepperPlugins( #endif // defined(ENABLE_PDF_VIEWER) } +void AtomContentClient::AddContentDecryptionModules( + std::vector* cdms, + std::vector* cdm_host_file_paths) { +#if defined(WIDEVINE_CDM_AVAILABLE) && BUILDFLAG(ENABLE_LIBRARY_CDMS) + auto command_line = base::CommandLine::ForCurrentProcess(); + base::FilePath widevine_cdm_path = + command_line->GetSwitchValuePath(switches::kWidevineCdmPath); + if (widevine_cdm_path.empty()) + return; + + if (!base::PathExists(widevine_cdm_path)) + return; + + auto widevine_cdm_version = + command_line->GetSwitchValueASCII(switches::kWidevineCdmVersion); + if (widevine_cdm_version.empty()) + return; + + std::vector supported_video_codecs; + supported_video_codecs.push_back(media::VideoCodec::kCodecVP8); + supported_video_codecs.push_back(media::VideoCodec::kCodecVP9); +#if BUILDFLAG(USE_PROPRIETARY_CODECS) + supported_video_codecs.push_back(media::VideoCodec::kCodecH264); +#endif // BUILDFLAG(USE_PROPRIETARY_CODECS) + content::CdmRegistry::GetInstance()->RegisterCdm( + content::CdmInfo(kWidevineCdmDisplayName, kWidevineCdmGuid, + base::Version(widevine_cdm_version), widevine_cdm_path, + kWidevineCdmFileSystemId, supported_video_codecs, false, + kWidevineKeySystem, false)); +#endif // defined(WIDEVINE_CDM_AVAILABLE) && BUILDFLAG(ENABLE_LIBRARY_CDMS) +} + } // namespace atom diff --git a/atom/app/atom_content_client.h b/atom/app/atom_content_client.h index d2ed9b78efd8..b6ecc3407d0e 100644 --- a/atom/app/atom_content_client.h +++ b/atom/app/atom_content_client.h @@ -26,6 +26,9 @@ class AtomContentClient : public brightray::ContentClient { void AddAdditionalSchemes(Schemes* schemes) override; void AddPepperPlugins( std::vector* plugins) override; + void AddContentDecryptionModules( + std::vector* cdms, + std::vector* cdm_host_file_paths) override; private: DISALLOW_COPY_AND_ASSIGN(AtomContentClient); diff --git a/atom/browser/atom_browser_client.cc b/atom/browser/atom_browser_client.cc index 5e12bea7e671..65ca3450f466 100644 --- a/atom/browser/atom_browser_client.cc +++ b/atom/browser/atom_browser_client.cc @@ -33,7 +33,6 @@ #include "base/strings/string_util.h" #include "chrome/browser/printing/printing_message_filter.h" #include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h" -#include "chrome/browser/renderer_host/pepper/widevine_cdm_message_filter.h" #include "chrome/browser/speech/tts_message_filter.h" #include "content/public/browser/browser_ppapi_host.h" #include "content/public/browser/client_certificate_delegate.h" @@ -186,8 +185,6 @@ void AtomBrowserClient::RenderProcessWillLaunch( host->AddFilter(new printing::PrintingMessageFilter(process_id)); host->AddFilter(new TtsMessageFilter(process_id, host->GetBrowserContext())); - host->AddFilter( - new WidevineCdmMessageFilter(process_id, host->GetBrowserContext())); ProcessPreferences prefs; auto* web_preferences = diff --git a/atom/common/common_message_generator.h b/atom/common/common_message_generator.h index 1e40d41d98eb..7e9cba51d9f7 100644 --- a/atom/common/common_message_generator.h +++ b/atom/common/common_message_generator.h @@ -8,4 +8,3 @@ #include "chrome/common/chrome_utility_printing_messages.h" #include "chrome/common/print_messages.h" #include "chrome/common/tts_messages.h" -#include "chrome/common/widevine_cdm_messages.h" diff --git a/chromium_src/chrome/browser/renderer_host/pepper/widevine_cdm_message_filter.cc b/chromium_src/chrome/browser/renderer_host/pepper/widevine_cdm_message_filter.cc deleted file mode 100644 index 32bfc759c734..000000000000 --- a/chromium_src/chrome/browser/renderer_host/pepper/widevine_cdm_message_filter.cc +++ /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. - -#include "chrome/browser/renderer_host/pepper/widevine_cdm_message_filter.h" - -#include "base/bind.h" -#include "content/public/browser/browser_context.h" -#include "content/public/browser/plugin_service.h" -#include "content/public/browser/render_process_host.h" -#include "content/public/common/webplugininfo.h" -#include "media/media_features.h" - -using content::BrowserThread; -using content::PluginService; -using content::WebPluginInfo; - -WidevineCdmMessageFilter::WidevineCdmMessageFilter( - int render_process_id, - content::BrowserContext* browser_context) - : BrowserMessageFilter(ChromeMsgStart), - render_process_id_(render_process_id), - browser_context_(browser_context) {} - -bool WidevineCdmMessageFilter::OnMessageReceived(const IPC::Message& message) { - IPC_BEGIN_MESSAGE_MAP(WidevineCdmMessageFilter, message) -#if BUILDFLAG(ENABLE_LIBRARY_CDMS) - IPC_MESSAGE_HANDLER(ChromeViewHostMsg_IsInternalPluginAvailableForMimeType, - OnIsInternalPluginAvailableForMimeType) -#endif // BUILDFLAG(ENABLE_LIBRARY_CDMS) - IPC_MESSAGE_UNHANDLED(return false) - IPC_END_MESSAGE_MAP() - return true; -} - -#if BUILDFLAG(ENABLE_LIBRARY_CDMS) -void WidevineCdmMessageFilter::OnIsInternalPluginAvailableForMimeType( - const std::string& mime_type, - bool* is_available, - std::vector* additional_param_names, - std::vector* additional_param_values) { - std::vector plugins; - PluginService::GetInstance()->GetInternalPlugins(&plugins); - - for (size_t i = 0; i < plugins.size(); ++i) { - const WebPluginInfo& plugin = plugins[i]; - const std::vector& mime_types = - plugin.mime_types; - for (size_t j = 0; j < mime_types.size(); ++j) { - if (mime_types[j].mime_type == mime_type) { - *is_available = true; - *additional_param_names = mime_types[j].additional_param_names; - *additional_param_values = mime_types[j].additional_param_values; - return; - } - } - } - - *is_available = false; -} -#endif // BUILDFLAG(ENABLE_LIBRARY_CDMS) - -void WidevineCdmMessageFilter::OnDestruct() const { - BrowserThread::DeleteOnUIThread::Destruct(this); -} - -WidevineCdmMessageFilter::~WidevineCdmMessageFilter() {} diff --git a/chromium_src/chrome/browser/renderer_host/pepper/widevine_cdm_message_filter.h b/chromium_src/chrome/browser/renderer_host/pepper/widevine_cdm_message_filter.h deleted file mode 100644 index 58e966a0a630..000000000000 --- a/chromium_src/chrome/browser/renderer_host/pepper/widevine_cdm_message_filter.h +++ /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. - -#ifndef CHROME_BROWSER_RENDERER_HOST_PEPPER_WIDEVINE_CDM_MESSAGE_FILTER_H_ -#define CHROME_BROWSER_RENDERER_HOST_PEPPER_WIDEVINE_CDM_MESSAGE_FILTER_H_ - -#include "chrome/common/widevine_cdm_messages.h" -#include "content/public/browser/browser_message_filter.h" -#include "media/media_features.h" - -namespace content { -class BrowserContext; -} - -class WidevineCdmMessageFilter : public content::BrowserMessageFilter { - public: - explicit WidevineCdmMessageFilter(int render_process_id, - content::BrowserContext* browser_context); - bool OnMessageReceived(const IPC::Message& message) override; - void OnDestruct() const override; - - private: - friend class content::BrowserThread; - friend class base::DeleteHelper; - - ~WidevineCdmMessageFilter() override; - -#if BUILDFLAG(ENABLE_LIBRARY_CDMS) - // Returns whether any internal plugin supporting |mime_type| is registered - // and enabled. Does not determine whether the plugin can actually be - // instantiated (e.g. whether it has all its dependencies). - // When the returned *|is_available| is true, |additional_param_names| and - // |additional_param_values| contain the name-value pairs, if any, specified - // for the *first* non-disabled plugin found that is registered for - // |mime_type|. - void OnIsInternalPluginAvailableForMimeType( - const std::string& mime_type, - bool* is_available, - std::vector* additional_param_names, - std::vector* additional_param_values); -#endif // BUILDFLAG(ENABLE_LIBRARY_CDMS) - - int render_process_id_; - content::BrowserContext* browser_context_; - - DISALLOW_COPY_AND_ASSIGN(WidevineCdmMessageFilter); -}; - -#endif // CHROME_BROWSER_RENDERER_HOST_PEPPER_WIDEVINE_CDM_MESSAGE_FILTER_H_ diff --git a/chromium_src/chrome/common/widevine_cdm_constants.h b/chromium_src/chrome/common/widevine_cdm_constants.h index babb61e5ef79..ab0f71d7d00a 100644 --- a/chromium_src/chrome/common/widevine_cdm_constants.h +++ b/chromium_src/chrome/common/widevine_cdm_constants.h @@ -7,6 +7,7 @@ #include "base/files/file_path.h" #include "base/macros.h" +#include "third_party/widevine/cdm/widevine_cdm_common.h" extern const char kWidevineCdmPluginExtension[]; diff --git a/chromium_src/chrome/common/widevine_cdm_messages.h b/chromium_src/chrome/common/widevine_cdm_messages.h deleted file mode 100644 index cb732a47ded6..000000000000 --- a/chromium_src/chrome/common/widevine_cdm_messages.h +++ /dev/null @@ -1,31 +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. - -// Multiply-included message file, hence no include guard. - -#include - -#include "ipc/ipc_message_macros.h" -#include "media/media_features.h" - -#define IPC_MESSAGE_START ChromeMsgStart - -// Renderer -> Browser messages. - -#if BUILDFLAG(ENABLE_LIBRARY_CDMS) -// Returns whether any internal plugin supporting |mime_type| is registered and -// enabled. Does not determine whether the plugin can actually be instantiated -// (e.g. whether it has all its dependencies). -// When the returned *|is_available| is true, |additional_param_names| and -// |additional_param_values| contain the name-value pairs, if any, specified -// for the *first* non-disabled plugin found that is registered for |mime_type|. -IPC_SYNC_MESSAGE_CONTROL1_3( - ChromeViewHostMsg_IsInternalPluginAvailableForMimeType, - std::string /* mime_type */, - bool /* is_available */, - std::vector /* additional_param_names */, - std::vector /* additional_param_values */) -#endif // BUILDFLAG(ENABLE_LIBRARY_CDMS) - -// Browser -> Renderer messages. diff --git a/chromium_src/chrome/renderer/media/chrome_key_systems.cc b/chromium_src/chrome/renderer/media/chrome_key_systems.cc index 902e0c71c9b4..c4ab859f06ba 100644 --- a/chromium_src/chrome/renderer/media/chrome_key_systems.cc +++ b/chromium_src/chrome/renderer/media/chrome_key_systems.cc @@ -13,13 +13,17 @@ #include "base/strings/string16.h" #include "base/strings/string_split.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/common/widevine_cdm_messages.h" #include "components/cdm/renderer/widevine_key_system_properties.h" #include "content/public/renderer/render_thread.h" #include "media/base/eme_constants.h" #include "media/base/key_system_properties.h" #include "media/media_features.h" +#if BUILDFLAG(ENABLE_LIBRARY_CDMS) +#include "content/public/renderer/key_system_support.h" +#include "media/base/video_codecs.h" +#endif + #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. // The following must be after widevine_cdm_version.h. @@ -36,19 +40,6 @@ using media::SupportedCodecs; static const char kExternalClearKeyPepperType[] = "application/x-ppapi-clearkey-cdm"; -static bool IsPepperCdmAvailable( - const std::string& pepper_type, - std::vector* additional_param_names, - std::vector* additional_param_values) { - bool is_available = false; - content::RenderThread::Get()->Send( - new ChromeViewHostMsg_IsInternalPluginAvailableForMimeType( - pepper_type, &is_available, additional_param_names, - additional_param_values)); - - return is_available; -} - // KeySystemProperties implementation for external Clear Key systems. class ExternalClearKeyProperties : public KeySystemProperties { public: @@ -133,11 +124,11 @@ static void AddExternalClearKey( static const char kExternalClearKeyCrashKeySystem[] = "org.chromium.externalclearkey.crash"; - std::vector additional_param_names; - std::vector additional_param_values; - if (!IsPepperCdmAvailable(kExternalClearKeyPepperType, - &additional_param_names, - &additional_param_values)) { + std::vector supported_video_codecs; + bool supports_persistent_license; + if (!content::IsKeySystemSupported(kExternalClearKeyKeySystem, + &supported_video_codecs, + &supports_persistent_license)) { return; } @@ -164,33 +155,6 @@ static void AddExternalClearKey( } #if defined(WIDEVINE_CDM_AVAILABLE) -// This function finds "codecs" and parses the value into the vector |codecs|. -// Converts the codec strings to UTF-8 since we only expect ASCII strings and -// this simplifies the rest of the code in this file. -void GetSupportedCodecsForPepperCdm( - const std::vector& additional_param_names, - const std::vector& additional_param_values, - std::vector* codecs) { - DCHECK(codecs->empty()); - DCHECK_EQ(additional_param_names.size(), additional_param_values.size()); - for (size_t i = 0; i < additional_param_names.size(); ++i) { - if (additional_param_names[i] == - base::ASCIIToUTF16(kCdmSupportedCodecsParamName)) { - const base::string16& codecs_string16 = additional_param_values[i]; - std::string codecs_string; - if (!base::UTF16ToUTF8(codecs_string16.c_str(), codecs_string16.length(), - &codecs_string)) { - DLOG(WARNING) << "Non-UTF-8 codecs string."; - // Continue using the best effort conversion. - } - *codecs = base::SplitString( - codecs_string, std::string(1, kCdmSupportedCodecsValueDelimiter), - base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); - break; - } - } -} - static void AddPepperBasedWidevine( std::vector>* concrete_key_systems) { #if defined(WIDEVINE_CDM_MIN_GLIBC_VERSION) @@ -200,18 +164,15 @@ static void AddPepperBasedWidevine( return; #endif // defined(WIDEVINE_CDM_MIN_GLIBC_VERSION) - std::vector additional_param_names; - std::vector additional_param_values; - if (!IsPepperCdmAvailable(kWidevineCdmPluginMimeType, &additional_param_names, - &additional_param_values)) { + std::vector supported_video_codecs; + bool supports_persistent_license = false; + if (!content::IsKeySystemSupported(kWidevineKeySystem, + &supported_video_codecs, + &supports_persistent_license)) { DVLOG(1) << "Widevine CDM is not currently available."; return; } - std::vector codecs; - GetSupportedCodecsForPepperCdm(additional_param_names, - additional_param_values, &codecs); - SupportedCodecs supported_codecs = media::EME_CODEC_NONE; // Audio codecs are always supported. @@ -223,17 +184,25 @@ static void AddPepperBasedWidevine( supported_codecs |= media::EME_CODEC_MP4_AAC; #endif // BUILDFLAG(USE_PROPRIETARY_CODECS) - for (size_t i = 0; i < codecs.size(); ++i) { - if (codecs[i] == kCdmSupportedCodecVp8) - supported_codecs |= media::EME_CODEC_WEBM_VP8; - if (codecs[i] == kCdmSupportedCodecVp9) { - supported_codecs |= media::EME_CODEC_WEBM_VP9; - supported_codecs |= media::EME_CODEC_COMMON_VP9; - } + // Video codecs are determined by what was registered for the CDM. + for (const auto& codec : supported_video_codecs) { + switch (codec) { + case media::VideoCodec::kCodecVP8: + supported_codecs |= media::EME_CODEC_WEBM_VP8; + break; + case media::VideoCodec::kCodecVP9: + supported_codecs |= media::EME_CODEC_WEBM_VP9; + supported_codecs |= media::EME_CODEC_COMMON_VP9; + break; #if BUILDFLAG(USE_PROPRIETARY_CODECS) - if (codecs[i] == kCdmSupportedCodecAvc1) - supported_codecs |= media::EME_CODEC_MP4_AVC1; + case media::VideoCodec::kCodecH264: + supported_codecs |= media::EME_CODEC_MP4_AVC1; + break; #endif // BUILDFLAG(USE_PROPRIETARY_CODECS) + default: + DVLOG(1) << "Unexpected supported codec: " << GetCodecName(codec); + break; + } } using Robustness = cdm::WidevineKeySystemProperties::Robustness; diff --git a/filenames.gypi b/filenames.gypi index 76527f382a04..159d9c55f96b 100644 --- a/filenames.gypi +++ b/filenames.gypi @@ -607,8 +607,6 @@ 'chromium_src/chrome/browser/renderer_host/pepper/pepper_flash_drm_host.h', 'chromium_src/chrome/browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.cc', 'chromium_src/chrome/browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.h', - 'chromium_src/chrome/browser/renderer_host/pepper/widevine_cdm_message_filter.cc', - 'chromium_src/chrome/browser/renderer_host/pepper/widevine_cdm_message_filter.h', 'chromium_src/chrome/browser/speech/tts_controller.h', 'chromium_src/chrome/browser/speech/tts_controller_impl.cc', 'chromium_src/chrome/browser/speech/tts_controller_impl.h', @@ -642,7 +640,6 @@ 'chromium_src/chrome/common/tts_messages.h', 'chromium_src/chrome/common/tts_utterance_request.cc', 'chromium_src/chrome/common/tts_utterance_request.h', - 'chromium_src/chrome/common/widevine_cdm_messages.h', 'chromium_src/chrome/common/widevine_cdm_constants.cc', 'chromium_src/chrome/common/widevine_cdm_constants.h', 'chromium_src/chrome/renderer/media/chrome_key_systems.cc',