diff options
Diffstat (limited to 'src/core/renderer/content_renderer_client_qt.cpp')
-rw-r--r-- | src/core/renderer/content_renderer_client_qt.cpp | 237 |
1 files changed, 152 insertions, 85 deletions
diff --git a/src/core/renderer/content_renderer_client_qt.cpp b/src/core/renderer/content_renderer_client_qt.cpp index 5d1780cbe..69f5bfefe 100644 --- a/src/core/renderer/content_renderer_client_qt.cpp +++ b/src/core/renderer/content_renderer_client_qt.cpp @@ -43,18 +43,18 @@ #include "base/strings/string_split.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/common/localized_error.h" #if defined(ENABLE_SPELLCHECK) #include "chrome/renderer/spellchecker/spellcheck.h" #include "chrome/renderer/spellchecker/spellcheck_provider.h" #endif -#include "components/cdm/renderer/widevine_key_systems.h" +#include "components/cdm/renderer/widevine_key_system_properties.h" #include "components/error_page/common/error_page_params.h" +#include "components/error_page/common/localized_error.h" #if defined (ENABLE_BASIC_PRINTING) #include "components/printing/renderer/print_web_view_helper.h" #endif // if defined(ENABLE_BASIC_PRINTING) #include "components/visitedlink/renderer/visitedlink_slave.h" -#include "components/web_cache/renderer/web_cache_render_process_observer.h" +#include "components/web_cache/renderer/web_cache_impl.h" #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_thread.h" #include "content/public/renderer/render_view.h" @@ -76,7 +76,7 @@ #include "renderer/render_view_observer_qt.h" #include "renderer/user_resource_controller.h" -#include "grit/renderer_resources.h" +#include "components/grit/components_resources.h" #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. @@ -85,17 +85,6 @@ namespace QtWebEngineCore { static const char kHttpErrorDomain[] = "http"; static const char kQrcSchemeQt[] = "qrc"; -class RenderProcessObserverQt : public content::RenderProcessObserver { -public: - void WebKitInitialized() override - { - // Can only be done after blink is initialized. - blink::WebString qrcScheme(base::ASCIIToUTF16(kQrcSchemeQt)); - // mark qrc as a secure scheme (avoids deprecation warnings) - blink::WebSecurityPolicy::registerURLSchemeAsSecure(qrcScheme); - } -}; - ContentRendererClientQt::ContentRendererClientQt() { } @@ -108,23 +97,24 @@ void ContentRendererClientQt::RenderThreadStarted() { content::RenderThread *renderThread = content::RenderThread::Get(); m_visitedLinkSlave.reset(new visitedlink::VisitedLinkSlave); - m_webCacheObserver.reset(new web_cache::WebCacheRenderProcessObserver()); - m_renderProcessObserver.reset(new RenderProcessObserverQt()); + m_webCacheImpl.reset(new web_cache::WebCacheImpl()); renderThread->AddObserver(m_visitedLinkSlave.data()); - renderThread->AddObserver(m_webCacheObserver.data()); renderThread->AddObserver(UserResourceController::instance()); - renderThread->AddObserver(m_renderProcessObserver.data()); #if defined(ENABLE_SPELLCHECK) m_spellCheck.reset(new SpellCheck()); renderThread->AddObserver(m_spellCheck.data()); #endif + + blink::WebString qrcScheme(base::ASCIIToUTF16(kQrcSchemeQt)); + // mark qrc as a secure scheme (avoids deprecation warnings) + blink::WebSecurityPolicy::registerURLSchemeAsSecure(qrcScheme); } void ContentRendererClientQt::RenderViewCreated(content::RenderView* render_view) { // RenderViewObservers destroy themselves with their RenderView. - new RenderViewObserverQt(render_view, m_webCacheObserver.data()); + new RenderViewObserverQt(render_view, m_webCacheImpl.data()); new WebChannelIPCTransport(render_view); UserResourceController::instance()->renderViewCreated(render_view); #if defined(ENABLE_SPELLCHECK) @@ -133,9 +123,8 @@ void ContentRendererClientQt::RenderViewCreated(content::RenderView* render_view #if defined(ENABLE_BASIC_PRINTING) new printing::PrintWebViewHelper( - render_view, - scoped_ptr<printing::PrintWebViewHelper::Delegate>( - new PrintWebViewHelperDelegateQt())); + render_view, + base::WrapUnique(new PrintWebViewHelperDelegateQt())); #endif // defined(ENABLE_BASIC_PRINTING) } @@ -144,14 +133,38 @@ void ContentRendererClientQt::RenderFrameCreated(content::RenderFrame* render_fr new QtWebEngineCore::RenderFrameObserverQt(render_frame); } +void ContentRendererClientQt::RunScriptsAtDocumentStart(content::RenderFrame* render_frame) +{ + // Check whether the render_frame has been created and has not been detached yet. + // Otherwise the WebFrame is not available. + RenderFrameObserverQt *render_frame_observer = RenderFrameObserverQt::Get(render_frame); + if (!render_frame_observer || render_frame_observer->isFrameDetached()) + return; // The frame is invisible to scripts. + + if (WebChannelIPCTransport *transport = WebChannelIPCTransport::Get(render_frame->GetRenderView())) + transport->RunScriptsAtDocumentStart(render_frame); + UserResourceController::instance()->RunScriptsAtDocumentStart(render_frame); +} + +void ContentRendererClientQt::RunScriptsAtDocumentEnd(content::RenderFrame* render_frame) +{ + // Check whether the render_frame has been created and has not been detached yet. + // Otherwise the WebFrame is not available. + RenderFrameObserverQt *render_frame_observer = RenderFrameObserverQt::Get(render_frame); + if (!render_frame_observer || render_frame_observer->isFrameDetached()) + return; // The frame is invisible to scripts. + + UserResourceController::instance()->RunScriptsAtDocumentEnd(render_frame); +} + bool ContentRendererClientQt::HasErrorPage(int httpStatusCode, std::string *errorDomain) { // Use an internal error page, if we have one for the status code. - if (!LocalizedError::HasStrings(LocalizedError::kHttpErrorDomain, httpStatusCode)) { + if (!error_page::LocalizedError::HasStrings(error_page::LocalizedError::kHttpErrorDomain, httpStatusCode)) { return false; } - *errorDomain = LocalizedError::kHttpErrorDomain; + *errorDomain = error_page::LocalizedError::kHttpErrorDomain; return true; } @@ -173,9 +186,10 @@ void ContentRendererClientQt::GetNavigationErrorStrings(content::RenderFrame* re const std::string locale = content::RenderThread::Get()->GetLocale(); // TODO(elproxy): We could potentially get better diagnostics here by first calling // NetErrorHelper::GetErrorStringsForDnsProbe, but that one is harder to untangle. - LocalizedError::GetStrings(error.reason, error.domain.utf8(), error.unreachableURL, isPost - , error.staleCopyInCache && !isPost, false, error_page::OfflinePageStatus::NONE, locale, renderFrame->GetRenderView()->GetAcceptLanguages() - , scoped_ptr<error_page::ErrorPageParams>(), &errorStrings); + + error_page::LocalizedError::GetStrings(error.reason, error.domain.utf8(), error.unreachableURL, isPost + , error.staleCopyInCache && !isPost, false, false, locale + , std::unique_ptr<error_page::ErrorPageParams>(), &errorStrings); resourceId = IDR_NET_ERROR_HTML; @@ -187,7 +201,7 @@ void ContentRendererClientQt::GetNavigationErrorStrings(content::RenderFrame* re } if (errorDescription) - *errorDescription = LocalizedError::GetErrorDetails(error.domain.utf8(), error.reason, isPost); + *errorDescription = error_page::LocalizedError::GetErrorDetails(error.domain.utf8(), error.reason, isPost); } unsigned long long ContentRendererClientQt::VisitedLinkHash(const char *canonicalUrl, size_t length) @@ -206,6 +220,8 @@ bool ContentRendererClientQt::IsLinkVisited(unsigned long long linkHash) // found in the LICENSE file. #if defined(ENABLE_PEPPER_CDMS) +static const char kExternalClearKeyPepperType[] = "application/x-ppapi-clearkey-cdm"; + static bool IsPepperCdmAvailable(const std::string& pepper_type, std::vector<base::string16>* additional_param_names, std::vector<base::string16>* additional_param_values) @@ -221,21 +237,94 @@ static bool IsPepperCdmAvailable(const std::string& pepper_type, return is_available; } +// KeySystemProperties implementation for external Clear Key systems. +class ExternalClearKeyProperties : public media::KeySystemProperties +{ +public: + explicit ExternalClearKeyProperties(const std::string& key_system_name) + : key_system_name_(key_system_name) {} + + std::string GetKeySystemName() const override { return key_system_name_; } + bool IsSupportedInitDataType(media::EmeInitDataType init_data_type) const override + { + switch (init_data_type) { + case media::EmeInitDataType::WEBM: + case media::EmeInitDataType::KEYIDS: + return true; + + case media::EmeInitDataType::CENC: +#if defined(USE_PROPRIETARY_CODECS) + return true; +#else + return false; +#endif // defined(USE_PROPRIETARY_CODECS) + + case media::EmeInitDataType::UNKNOWN: + return false; + } + NOTREACHED(); + return false; + } + + media::SupportedCodecs GetSupportedCodecs() const override + { +#if defined(USE_PROPRIETARY_CODECS) + return media::EME_CODEC_MP4_ALL | media::EME_CODEC_WEBM_ALL; +#else + return media::EME_CODEC_WEBM_ALL; +#endif + } + + media::EmeConfigRule GetRobustnessConfigRule( + media::EmeMediaType media_type, + const std::string& requested_robustness) const override + { + return requested_robustness.empty() ? media::EmeConfigRule::SUPPORTED + : media::EmeConfigRule::NOT_SUPPORTED; + } + + // Persistent license sessions are faked. + media::EmeSessionTypeSupport GetPersistentLicenseSessionSupport() const override + { + return media::EmeSessionTypeSupport::SUPPORTED; + } + + media::EmeSessionTypeSupport GetPersistentReleaseMessageSessionSupport() const override { + return media::EmeSessionTypeSupport::NOT_SUPPORTED; + } + + media::EmeFeatureSupport GetPersistentStateSupport() const override + { + return media::EmeFeatureSupport::REQUESTABLE; + } + + media::EmeFeatureSupport GetDistinctiveIdentifierSupport() const override + { + return media::EmeFeatureSupport::NOT_SUPPORTED; + } + + std::string GetPepperType() const override + { + return kExternalClearKeyPepperType; + } + +private: + const std::string key_system_name_; +}; + // External Clear Key (used for testing). -static void AddExternalClearKey(std::vector<media::KeySystemInfo>* concrete_key_systems) +static void AddExternalClearKey(std::vector<std::unique_ptr<media::KeySystemProperties>>* concrete_key_systems) { - static const char kExternalClearKeyKeySystem[] = - "org.chromium.externalclearkey"; - static const char kExternalClearKeyDecryptOnlyKeySystem[] = - "org.chromium.externalclearkey.decryptonly"; - static const char kExternalClearKeyFileIOTestKeySystem[] = - "org.chromium.externalclearkey.fileiotest"; - static const char kExternalClearKeyInitializeFailKeySystem[] = - "org.chromium.externalclearkey.initializefail"; - static const char kExternalClearKeyCrashKeySystem[] = - "org.chromium.externalclearkey.crash"; - static const char kExternalClearKeyPepperType[] = - "application/x-ppapi-clearkey-cdm"; + static const char kExternalClearKeyKeySystem[] = + "org.chromium.externalclearkey"; + static const char kExternalClearKeyDecryptOnlyKeySystem[] = + "org.chromium.externalclearkey.decryptonly"; + static const char kExternalClearKeyFileIOTestKeySystem[] = + "org.chromium.externalclearkey.fileiotest"; + static const char kExternalClearKeyInitializeFailKeySystem[] = + "org.chromium.externalclearkey.initializefail"; + static const char kExternalClearKeyCrashKeySystem[] = + "org.chromium.externalclearkey.crash"; std::vector<base::string16> additional_param_names; std::vector<base::string16> additional_param_values; @@ -244,53 +333,31 @@ static void AddExternalClearKey(std::vector<media::KeySystemInfo>* concrete_key_ &additional_param_values)) return; - media::KeySystemInfo info; - info.key_system = kExternalClearKeyKeySystem; - - info.supported_init_data_types = - media::kInitDataTypeMaskWebM | media::kInitDataTypeMaskKeyIds; - info.supported_codecs = media::EME_CODEC_WEBM_ALL; -#if defined(USE_PROPRIETARY_CODECS) - info.supported_init_data_types |= media::kInitDataTypeMaskCenc; - info.supported_codecs |= media::EME_CODEC_MP4_ALL; -#endif // defined(USE_PROPRIETARY_CODECS) - - info.max_audio_robustness = media::EmeRobustness::EMPTY; - info.max_video_robustness = media::EmeRobustness::EMPTY; - - // Persistent sessions are faked. - info.persistent_license_support = media::EmeSessionTypeSupport::SUPPORTED; - info.persistent_release_message_support = - media::EmeSessionTypeSupport::NOT_SUPPORTED; - info.persistent_state_support = media::EmeFeatureSupport::REQUESTABLE; - info.distinctive_identifier_support = media::EmeFeatureSupport::NOT_SUPPORTED; - - info.pepper_type = kExternalClearKeyPepperType; - - concrete_key_systems->push_back(info); + concrete_key_systems->emplace_back( + new ExternalClearKeyProperties(kExternalClearKeyKeySystem)); // Add support of decrypt-only mode in ClearKeyCdm. - info.key_system = kExternalClearKeyDecryptOnlyKeySystem; - concrete_key_systems->push_back(info); + concrete_key_systems->emplace_back( + new ExternalClearKeyProperties(kExternalClearKeyDecryptOnlyKeySystem)); // A key system that triggers FileIO test in ClearKeyCdm. - info.key_system = kExternalClearKeyFileIOTestKeySystem; - concrete_key_systems->push_back(info); + concrete_key_systems->emplace_back( + new ExternalClearKeyProperties(kExternalClearKeyFileIOTestKeySystem)); // A key system that Chrome thinks is supported by ClearKeyCdm, but actually // will be refused by ClearKeyCdm. This is to test the CDM initialization // failure case. - info.key_system = kExternalClearKeyInitializeFailKeySystem; - concrete_key_systems->push_back(info); + concrete_key_systems->emplace_back( + new ExternalClearKeyProperties(kExternalClearKeyInitializeFailKeySystem)); // A key system that triggers a crash in ClearKeyCdm. - info.key_system = kExternalClearKeyCrashKeySystem; - concrete_key_systems->push_back(info); + concrete_key_systems->emplace_back( + new ExternalClearKeyProperties(kExternalClearKeyCrashKeySystem)); } #if defined(WIDEVINE_CDM_AVAILABLE) -static void AddPepperBasedWidevine(std::vector<media::KeySystemInfo>* concrete_key_systems) +static void AddPepperBasedWidevine(std::vector<std::unique_ptr<media::KeySystemProperties>> *concrete_key_systems) { //#if defined(WIDEVINE_CDM_MIN_GLIBC_VERSION) // Version glibc_version(gnu_get_libc_version()); @@ -319,26 +386,26 @@ static void AddPepperBasedWidevine(std::vector<media::KeySystemInfo>* concrete_k supported_codecs |= media::EME_CODEC_MP4_AAC; #endif // defined(USE_PROPRIETARY_CODECS) - cdm::AddWidevineWithCodecs( - cdm::WIDEVINE, supported_codecs, - media::EmeRobustness::SW_SECURE_CRYPTO, // Maximum audio robustness. - media::EmeRobustness::SW_SECURE_DECODE, // Maximum video robustness. + using Robustness = cdm::WidevineKeySystemProperties::Robustness; + concrete_key_systems->emplace_back(new cdm::WidevineKeySystemProperties( + supported_codecs, + Robustness::SW_SECURE_CRYPTO, // Maximum audio robustness. + Robustness::SW_SECURE_DECODE, // Maximum video robustness. media::EmeSessionTypeSupport::NOT_SUPPORTED, // persistent-license. media::EmeSessionTypeSupport::NOT_SUPPORTED, // persistent-release-message. - media::EmeFeatureSupport::REQUESTABLE, // Persistent state. - media::EmeFeatureSupport::NOT_SUPPORTED, // Distinctive identifier. - concrete_key_systems); + media::EmeFeatureSupport::REQUESTABLE, // Persistent state. + media::EmeFeatureSupport::NOT_SUPPORTED)); // Distinctive identifier. } #endif // defined(WIDEVINE_CDM_AVAILABLE) #endif // defined(ENABLE_PEPPER_CDMS) -void ContentRendererClientQt::AddKeySystems(std::vector<media::KeySystemInfo>* key_systems_info) +void ContentRendererClientQt::AddSupportedKeySystems(std::vector<std::unique_ptr<media::KeySystemProperties>> *key_systems) { #if defined(ENABLE_PEPPER_CDMS) - AddExternalClearKey(key_systems_info); + AddExternalClearKey(key_systems); #if defined(WIDEVINE_CDM_AVAILABLE) - AddPepperBasedWidevine(key_systems_info); + AddPepperBasedWidevine(key_systems); #endif // defined(WIDEVINE_CDM_AVAILABLE) #endif // defined(ENABLE_PEPPER_CDMS) } |