diff options
Diffstat (limited to 'src/core/renderer')
20 files changed, 276 insertions, 231 deletions
diff --git a/src/core/renderer/content_renderer_client_qt.cpp b/src/core/renderer/content_renderer_client_qt.cpp index 372c519f1..cc127e55f 100644 --- a/src/core/renderer/content_renderer_client_qt.cpp +++ b/src/core/renderer/content_renderer_client_qt.cpp @@ -3,54 +3,54 @@ #include "renderer/content_renderer_client_qt.h" -#include "extensions/buildflags/buildflags.h" -#include "printing/buildflags/buildflags.h" #include "renderer/content_settings_observer_qt.h" -#include "base/strings/string_split.h" -#if QT_CONFIG(webengine_spellchecker) -#include "components/spellcheck/renderer/spellcheck.h" -#include "components/spellcheck/renderer/spellcheck_provider.h" -#endif +#include "renderer/render_configuration.h" +#include "renderer/render_frame_observer_qt.h" +#include "renderer/user_resource_controller.h" +#include "renderer/web_engine_page_render_frame.h" +#include "web_engine_library_info.h" + +#include "base/task/sequenced_task_runner.h" #include "components/autofill/content/renderer/autofill_agent.h" -#include "components/autofill/content/renderer/autofill_assistant_agent.h" #include "components/autofill/content/renderer/password_autofill_agent.h" #include "components/autofill/content/renderer/password_generation_agent.h" -#include "components/cdm/renderer/external_clear_key_key_system_properties.h" -#include "components/cdm/renderer/widevine_key_system_properties.h" +#include "components/cdm/renderer/external_clear_key_key_system_info.h" +#include "components/cdm/renderer/widevine_key_system_info.h" #include "components/error_page/common/error.h" #include "components/error_page/common/localized_error.h" +#include "components/grit/components_resources.h" #include "components/network_hints/renderer/web_prescient_networking_impl.h" -#if QT_CONFIG(webengine_printing_and_pdf) -#include "components/printing/renderer/print_render_frame_helper.h" -#endif #include "components/visitedlink/renderer/visitedlink_reader.h" #include "components/web_cache/renderer/web_cache_impl.h" #include "content/public/renderer/render_frame.h" -#include "content/public/child/child_thread.h" #include "content/public/common/url_constants.h" #include "content/public/renderer/render_thread.h" -#include "content/public/renderer/render_view.h" -#include "media/base/key_system_properties.h" +#include "extensions/buildflags/buildflags.h" +#include "media/base/key_system_info.h" +#include "media/cdm/cdm_capability.h" #include "media/media_buildflags.h" #include "mojo/public/cpp/bindings/binder_map.h" #include "net/base/net_errors.h" #include "ppapi/buildflags/buildflags.h" -#include "services/service_manager/public/cpp/connector.h" -#include "services/service_manager/public/cpp/interface_provider.h" +#include "printing/buildflags/buildflags.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" #include "third_party/blink/public/platform/web_url_error.h" -#include "third_party/blink/public/platform/web_url_request.h" -#include "third_party/blink/public/web/web_security_policy.h" #include "ui/base/resource/resource_bundle.h" #include "ui/base/webui/jstemplate_builder.h" +#if QT_CONFIG(webengine_spellchecker) +#include "components/spellcheck/renderer/spellcheck.h" +#include "components/spellcheck/renderer/spellcheck_provider.h" +#endif + #if QT_CONFIG(webengine_printing_and_pdf) #include "renderer/print_web_view_helper_delegate_qt.h" + +#include "components/pdf/renderer/internal_plugin_renderer_helpers.h" +#include "components/pdf/renderer/pdf_internal_plugin_delegate.h" +#include "components/printing/renderer/print_render_frame_helper.h" #endif -#include "renderer/render_frame_observer_qt.h" -#include "renderer/web_engine_page_render_frame.h" -#include "renderer/render_configuration.h" -#include "renderer/user_resource_controller.h" #if QT_CONFIG(webengine_webchannel) #include "renderer/web_channel_ipc_transport.h" #endif @@ -58,35 +58,35 @@ #if BUILDFLAG(ENABLE_EXTENSIONS) #include "common/extensions/extensions_client_qt.h" #include "extensions/extensions_renderer_client_qt.h" + +#include "extensions/common/constants.h" #include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_manager.h" #include "mojo/public/cpp/bindings/associated_remote.h" -#endif //ENABLE_EXTENSIONS +#include "services/service_manager/public/cpp/binder_registry.h" +#include "third_party/blink/public/web/web_security_policy.h" +#endif // ENABLE_EXTENSIONS #if BUILDFLAG(ENABLE_PLUGINS) #include "content/renderer/render_frame_impl.h" #include "plugins/loadable_plugin_placeholder_qt.h" #endif // ENABLE_PLUGINS -#include "services/service_manager/public/cpp/binder_registry.h" -#include "services/service_manager/public/cpp/connector.h" - -#include "components/grit/components_resources.h" - #if BUILDFLAG(ENABLE_LIBRARY_CDMS) #include "base/feature_list.h" #include "content/public/renderer/key_system_support.h" #include "media/base/media_switches.h" #include "media/base/video_codecs.h" +#include "media/cdm/clear_key_cdm_common.h" #include "third_party/widevine/cdm/buildflags.h" +#if BUILDFLAG(ENABLE_WIDEVINE) #include "third_party/widevine/cdm/widevine_cdm_common.h" #endif +#endif #if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) #include "chrome/renderer/media/webrtc_logging_agent_impl.h" #endif -#include "web_engine_library_info.h" - namespace QtWebEngineCore { ContentRendererClientQt::ContentRendererClientQt() @@ -131,30 +131,34 @@ void ContentRendererClientQt::RenderThreadStarted() void ContentRendererClientQt::ExposeInterfacesToBrowser(mojo::BinderMap* binders) { - binders->Add(m_visitedLinkReader->GetBindCallback(), base::SequencedTaskRunnerHandle::Get()); + binders->Add<visitedlink::mojom::VisitedLinkNotificationSink>( + m_visitedLinkReader->GetBindCallback(), base::SingleThreadTaskRunner::GetCurrentDefault()); - binders->Add(base::BindRepeating(&web_cache::WebCacheImpl::BindReceiver, - base::Unretained(m_webCacheImpl.get())), - base::SequencedTaskRunnerHandle::Get()); + binders->Add<web_cache::mojom::WebCache>( + base::BindRepeating(&web_cache::WebCacheImpl::BindReceiver, + base::Unretained(m_webCacheImpl.get())), + base::SingleThreadTaskRunner::GetCurrentDefault()); #if QT_CONFIG(webengine_spellchecker) - binders->Add(base::BindRepeating( + binders->Add<spellcheck::mojom::SpellChecker>( + base::BindRepeating( [](ContentRendererClientQt *client, mojo::PendingReceiver<spellcheck::mojom::SpellChecker> receiver) { if (!client->m_spellCheck) client->InitSpellCheck(); client->m_spellCheck->BindReceiver(std::move(receiver)); }, this), - base::SequencedTaskRunnerHandle::Get()); + base::SingleThreadTaskRunner::GetCurrentDefault()); #endif #if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) - binders->Add(base::BindRepeating( + binders->Add<chrome::mojom::WebRtcLoggingAgent>( + base::BindRepeating( [](ContentRendererClientQt *client, mojo::PendingReceiver<chrome::mojom::WebRtcLoggingAgent> receiver) { client->GetWebRtcLoggingAgent()->AddReceiver(std::move(receiver)); }, this), - base::SequencedTaskRunnerHandle::Get()); + base::SingleThreadTaskRunner::GetCurrentDefault()); #endif } @@ -183,16 +187,15 @@ void ContentRendererClientQt::RenderFrameCreated(content::RenderFrame *render_fr blink::AssociatedInterfaceRegistry *associated_interfaces = render_frame_observer->associatedInterfaces(); #if BUILDFLAG(ENABLE_EXTENSIONS) - associated_interfaces->AddInterface(base::BindRepeating( - &extensions::MimeHandlerViewContainerManager::BindReceiver, - render_frame->GetRoutingID())); + associated_interfaces->AddInterface<extensions::mojom::MimeHandlerViewContainerManager>( + base::BindRepeating( + &extensions::MimeHandlerViewContainerManager::BindReceiver, + render_frame->GetRoutingID())); auto registry = std::make_unique<service_manager::BinderRegistry>(); ExtensionsRendererClientQt::GetInstance()->RenderFrameCreated(render_frame, render_frame_observer->registry()); #endif - autofill::AutofillAssistantAgent *autofill_assistant_agent = - new autofill::AutofillAssistantAgent(render_frame); autofill::PasswordAutofillAgent *password_autofill_agent = new autofill::PasswordAutofillAgent(render_frame, associated_interfaces); autofill::PasswordGenerationAgent *password_generation_agent = @@ -200,7 +203,17 @@ void ContentRendererClientQt::RenderFrameCreated(content::RenderFrame *render_fr associated_interfaces); new autofill::AutofillAgent(render_frame, password_autofill_agent, password_generation_agent, - autofill_assistant_agent, associated_interfaces); + associated_interfaces); +} + +void ContentRendererClientQt::WebViewCreated(blink::WebView *web_view, + bool was_created_by_renderer, + const url::Origin *outermost_origin) +{ + Q_UNUSED(was_created_by_renderer); +#if BUILDFLAG(ENABLE_EXTENSIONS) + ExtensionsRendererClientQt::GetInstance()->WebViewCreated(web_view, outermost_origin); +#endif } void ContentRendererClientQt::RunScriptsAtDocumentStart(content::RenderFrame *render_frame) @@ -238,6 +251,7 @@ void ContentRendererClientQt::RunScriptsAtDocumentIdle(content::RenderFrame *ren void ContentRendererClientQt::PrepareErrorPage(content::RenderFrame *renderFrame, const blink::WebURLError &web_error, const std::string &httpMethod, + content::mojom::AlternativeErrorPageOverrideInfoPtr alternative_error_page_info, std::string *errorHtml) { GetNavigationErrorStringsInternal( @@ -251,6 +265,7 @@ void ContentRendererClientQt::PrepareErrorPageForHttpStatusError(content::Render const blink::WebURLError &error, const std::string &httpMethod, int http_status, + content::mojom::AlternativeErrorPageOverrideInfoPtr alternative_error_page_info, std::string *errorHtml) { GetNavigationErrorStringsInternal(renderFrame, httpMethod, @@ -274,11 +289,12 @@ void ContentRendererClientQt::GetNavigationErrorStringsInternal(content::RenderF // TODO(elproxy): We could potentially get better diagnostics here by first calling // NetErrorHelper::GetErrorStringsForDnsProbe, but that one is harder to untangle. + base::Value::Dict error_page_params; error_page::LocalizedError::PageState errorPageState = error_page::LocalizedError::GetPageState( error.reason(), error.domain(), error.url(), isPost, false, error.stale_copy_in_cache(), false, - RenderConfiguration::is_incognito_process(), false, false, false, locale, false); + RenderConfiguration::is_incognito_process(), false, false, false, locale, false, &error_page_params); resourceId = IDR_NET_ERROR_HTML; @@ -287,7 +303,7 @@ void ContentRendererClientQt::GetNavigationErrorStringsInternal(content::RenderF if (template_html.empty()) NOTREACHED() << "unable to load template. ID: " << resourceId; else // "t" is the id of the templates root node. - *errorHtml = webui::GetTemplatesHtml(template_html, &errorPageState.strings, "t"); + *errorHtml = webui::GetTemplatesHtml(template_html, errorPageState.strings, "t"); } } @@ -306,6 +322,66 @@ std::unique_ptr<blink::WebPrescientNetworking> ContentRendererClientQt::CreatePr return std::make_unique<network_hints::WebPrescientNetworkingImpl>(render_frame); } +namespace { +bool IsPdfExtensionOrigin(const url::Origin &origin) +{ +#if BUILDFLAG(ENABLE_EXTENSIONS) + return origin.scheme() == extensions::kExtensionScheme && + origin.host() == extension_misc::kPdfExtensionId; +#else + return false; +#endif +} + +#if BUILDFLAG(ENABLE_PLUGINS) +void AppendParams(const std::vector<content::WebPluginMimeType::Param> &additional_params, + blink::WebVector<blink::WebString> *existing_names, + blink::WebVector<blink::WebString> *existing_values) +{ + DCHECK(existing_names->size() == existing_values->size()); + size_t existing_size = existing_names->size(); + size_t total_size = existing_size + additional_params.size(); + + blink::WebVector<blink::WebString> names(total_size); + blink::WebVector<blink::WebString> values(total_size); + + for (size_t i = 0; i < existing_size; ++i) { + names[i] = (*existing_names)[i]; + values[i] = (*existing_values)[i]; + } + + for (size_t i = 0; i < additional_params.size(); ++i) { + names[existing_size + i] = blink::WebString::FromUTF16(additional_params[i].name); + values[existing_size + i] = blink::WebString::FromUTF16(additional_params[i].value); + } + + existing_names->Swap(names); + existing_values->Swap(values); +} +#endif // BUILDFLAG(ENABLE_PLUGINS) + +#if QT_CONFIG(webengine_printing_and_pdf) +// based on chrome/renderer/pdf/chrome_pdf_internal_plugin_delegate.cc: +class PdfInternalPluginDelegateQt final + : public pdf::PdfInternalPluginDelegate +{ +public: + PdfInternalPluginDelegateQt() = default; + PdfInternalPluginDelegateQt(const PdfInternalPluginDelegateQt &) = delete; + PdfInternalPluginDelegateQt& operator=(const PdfInternalPluginDelegateQt &) = delete; + ~PdfInternalPluginDelegateQt() override = default; + + // `pdf::PdfInternalPluginDelegate`: + bool IsAllowedOrigin(const url::Origin &origin) const override; +}; + +bool PdfInternalPluginDelegateQt::IsAllowedOrigin(const url::Origin &origin) const +{ + return IsPdfExtensionOrigin(origin); +} +#endif +} // namespace + bool ContentRendererClientQt::IsPluginHandledExternally(content::RenderFrame *render_frame, const blink::WebElement &plugin_element, const GURL &original_url, @@ -320,6 +396,8 @@ bool ContentRendererClientQt::IsPluginHandledExternally(content::RenderFrame *re original_url, original_mime_type, &found, &plugin_info, &mime_type); if (!found) return false; + if (IsPdfExtensionOrigin(render_frame->GetWebFrame()->GetSecurityOrigin())) + return true; return extensions::MimeHandlerViewContainerManager::Get( content::RenderFrame::FromWebFrame( plugin_element.GetDocument().GetFrame()), @@ -337,7 +415,7 @@ bool ContentRendererClientQt::OverrideCreatePlugin(content::RenderFrame *render_ #if BUILDFLAG(ENABLE_EXTENSIONS) if (!ExtensionsRendererClientQt::GetInstance()->OverrideCreatePlugin(render_frame, params)) return false; -#endif //ENABLE_EXTENSIONS +#endif // ENABLE_EXTENSIONS #if BUILDFLAG(ENABLE_PLUGINS) content::WebPluginInfo info; @@ -346,11 +424,25 @@ bool ContentRendererClientQt::OverrideCreatePlugin(content::RenderFrame *render_ static_cast<content::RenderFrameImpl *>(render_frame)->GetPepperHost()->GetPluginInfo( params.url, params.mime_type.Utf8(), &found, &info, &mime_type); - if (!found) + if (!found) { *plugin = LoadablePluginPlaceholderQt::CreateLoadableMissingPlugin(render_frame, params)->plugin(); - else - *plugin = render_frame->CreatePlugin(info, params); -#endif // BUILDFLAG(ENABLE_PLUGINS) + return true; + } + if (info.name == u"Chromium PDF Viewer") { + blink::WebPluginParams new_params(params); + for (const auto& mime_type : info.mime_types) { + if (mime_type.mime_type == params.mime_type.Utf8()) { + AppendParams(mime_type.additional_params, &new_params.attribute_names, + &new_params.attribute_values); + break; + } + } + + *plugin = pdf::CreateInternalPlugin(std::move(new_params), render_frame, std::make_unique<PdfInternalPluginDelegateQt>()); + return true; + } + *plugin = render_frame->CreatePlugin(info, params); +#endif // BUILDFLAG(ENABLE_PLUGINS) return true; } @@ -382,22 +474,21 @@ void ContentRendererClientQt::GetInterface(const std::string &interface_name, mo #if BUILDFLAG(ENABLE_LIBRARY_CDMS) // External Clear Key (used for testing). -static void AddExternalClearKey(std::vector<std::unique_ptr<media::KeySystemProperties>> *key_systems) +static void AddExternalClearKey(const media::mojom::KeySystemCapabilityPtr &capability, + media::KeySystemInfos* key_systems) { - static const char kExternalClearKeyKeySystem[] = "org.chromium.externalclearkey"; - - // TODO(xhwang): Actually use `capability` to determine capabilities. - media::mojom::KeySystemCapabilityPtr capability; - if (!content::IsKeySystemSupported(kExternalClearKeyKeySystem, &capability)) { - DVLOG(1) << "External Clear Key not supported"; + Q_UNUSED(capability); + if (!base::FeatureList::IsEnabled(media::kExternalClearKeyForTesting)) { + DLOG(ERROR) << "ExternalClearKey supported despite not enabled."; return; } - key_systems->push_back(std::make_unique<cdm::ExternalClearKeyProperties>()); + // TODO(xhwang): Actually use `capability` to determine capabilities. + key_systems->push_back(std::make_unique<cdm::ExternalClearKeyKeySystemInfo>()); } #if BUILDFLAG(ENABLE_WIDEVINE) -media::SupportedCodecs GetVP9Codecs(const std::vector<media::VideoCodecProfile> &profiles) +media::SupportedCodecs GetVP9Codecs(const base::flat_set<media::VideoCodecProfile> &profiles) { if (profiles.empty()) { // If no profiles are specified, then all are supported. @@ -424,7 +515,7 @@ media::SupportedCodecs GetVP9Codecs(const std::vector<media::VideoCodecProfile> } #if BUILDFLAG(ENABLE_PLATFORM_HEVC) -SupportedCodecs GetHevcCodecs(const std::vector<media::VideoCodecProfile> &profiles) +media::SupportedCodecs GetHevcCodecs(const base::flat_set<media::VideoCodecProfile> &profiles) { // If no profiles are specified, then all are supported. if (profiles.empty()) { @@ -485,7 +576,7 @@ static media::SupportedCodecs GetSupportedCodecs(const media::CdmCapability& cap supported_codecs |= media::EME_CODEC_VP8; break; case media::VideoCodec::kVP9: - supported_codecs |= GetVP9Codecs(codec.second); + supported_codecs |= GetVP9Codecs(codec.second.supported_profiles); break; case media::VideoCodec::kAV1: supported_codecs |= media::EME_CODEC_AV1; @@ -497,7 +588,7 @@ static media::SupportedCodecs GetSupportedCodecs(const media::CdmCapability& cap #endif // BUILDFLAG(USE_PROPRIETARY_CODECS) #if BUILDFLAG(ENABLE_PLATFORM_HEVC) case media::VideoCodec::kHEVC: - supported_codecs |= GetHevcCodecs(codec.second); + supported_codecs |= GetHevcCodecs(codec.second.supported_profiles); break; #endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) default: @@ -509,19 +600,16 @@ static media::SupportedCodecs GetSupportedCodecs(const media::CdmCapability& cap return supported_codecs; } -static void AddWidevine(std::vector<std::unique_ptr<media::KeySystemProperties>> *key_systems) +static void AddWidevine(const media::mojom::KeySystemCapabilityPtr &capability, + media::KeySystemInfos *key_systems) { - media::mojom::KeySystemCapabilityPtr capability; - if (!content::IsKeySystemSupported(kWidevineKeySystem, &capability)) { - DVLOG(1) << "Widevine CDM is not currently available."; - return; - } - // Codecs and encryption schemes. media::SupportedCodecs codecs = media::EME_CODEC_NONE; media::SupportedCodecs hw_secure_codecs = media::EME_CODEC_NONE; base::flat_set<media::EncryptionScheme> encryption_schemes; base::flat_set<media::EncryptionScheme> hw_secure_encryption_schemes; + base::flat_set<media::CdmSessionType> session_types; + base::flat_set<media::CdmSessionType> hw_secure_session_types; if (capability->sw_secure_capability) { codecs = GetSupportedCodecs(capability->sw_secure_capability.value(), /*is_secure=*/false); encryption_schemes = capability->sw_secure_capability->encryption_schemes; @@ -541,7 +629,7 @@ static void AddWidevine(std::vector<std::unique_ptr<media::KeySystemProperties>> } // Robustness. - using Robustness = cdm::WidevineKeySystemProperties::Robustness; + using Robustness = cdm::WidevineKeySystemInfo::Robustness; auto max_audio_robustness = Robustness::SW_SECURE_CRYPTO; auto max_video_robustness = Robustness::SW_SECURE_DECODE; @@ -550,32 +638,52 @@ static void AddWidevine(std::vector<std::unique_ptr<media::KeySystemProperties>> max_video_robustness = Robustness::HW_SECURE_ALL; } - auto persistent_license_support = media::EmeSessionTypeSupport::NOT_SUPPORTED; - // Others. auto persistent_state_support = media::EmeFeatureSupport::REQUESTABLE; auto distinctive_identifier_support = media::EmeFeatureSupport::NOT_SUPPORTED; - key_systems->emplace_back(new cdm::WidevineKeySystemProperties( - codecs, encryption_schemes, hw_secure_codecs, - hw_secure_encryption_schemes, max_audio_robustness, max_video_robustness, - persistent_license_support, persistent_state_support, + key_systems->emplace_back(new cdm::WidevineKeySystemInfo( + codecs, std::move(encryption_schemes), std::move(session_types), + hw_secure_codecs, std::move(hw_secure_encryption_schemes), + std::move(hw_secure_session_types), + max_audio_robustness, max_video_robustness, + persistent_state_support, distinctive_identifier_support)); } #endif // BUILDFLAG(ENABLE_WIDEVINE) #endif // BUILDFLAG(ENABLE_LIBRARY_CDMS) -void ContentRendererClientQt::AddSupportedKeySystems(std::vector<std::unique_ptr<media::KeySystemProperties>> *key_systems) +void OnKeySystemSupportUpdated(media::GetSupportedKeySystemsCB cb, + content::KeySystemCapabilityPtrMap key_system_capabilities) { + media::KeySystemInfos key_systems; + for (const auto &entry : key_system_capabilities) { #if BUILDFLAG(ENABLE_LIBRARY_CDMS) - if (base::FeatureList::IsEnabled(media::kExternalClearKeyForTesting)) - AddExternalClearKey(key_systems); - + const auto &key_system = entry.first; + const auto &capability = entry.second; #if BUILDFLAG(ENABLE_WIDEVINE) - AddWidevine(key_systems); + if (key_system == kWidevineKeySystem) { + AddWidevine(capability, &key_systems); + continue; + } #endif // BUILDFLAG(ENABLE_WIDEVINE) + if (key_system == media::kExternalClearKeyKeySystem) { + AddExternalClearKey(capability, &key_systems); + continue; + } + + DLOG(ERROR) << "Unrecognized key system: " << key_system; #endif // BUILDFLAG(ENABLE_LIBRARY_CDMS) + } + + cb.Run(std::move(key_systems)); +} + +void ContentRendererClientQt::GetSupportedKeySystems(media::GetSupportedKeySystemsCB cb) +{ + content::ObserveKeySystemSupportUpdate( + base::BindRepeating(&OnKeySystemSupportUpdated, std::move(cb))); } #if QT_CONFIG(webengine_spellchecker) diff --git a/src/core/renderer/content_renderer_client_qt.h b/src/core/renderer/content_renderer_client_qt.h index 8ecb0c831..b2231f00a 100644 --- a/src/core/renderer/content_renderer_client_qt.h +++ b/src/core/renderer/content_renderer_client_qt.h @@ -5,7 +5,6 @@ #include "qtwebenginecoreglobal_p.h" #include "content/public/renderer/content_renderer_client.h" -#include "components/spellcheck/spellcheck_buildflags.h" #include "services/service_manager/public/cpp/binder_registry.h" #include "services/service_manager/public/cpp/local_interface_provider.h" @@ -52,22 +51,25 @@ public: void RenderThreadStarted() override; void ExposeInterfacesToBrowser(mojo::BinderMap* binders) override; void RenderFrameCreated(content::RenderFrame *render_frame) override; + void WebViewCreated(blink::WebView *web_view, + bool was_created_by_renderer, + const url::Origin *outermost_origin) override; void PrepareErrorPage(content::RenderFrame *render_frame, const blink::WebURLError &error, const std::string &http_method, + content::mojom::AlternativeErrorPageOverrideInfoPtr alternative_error_page_info, std::string *error_html) override; void PrepareErrorPageForHttpStatusError(content::RenderFrame *render_frame, const blink::WebURLError &error, const std::string &http_method, int http_status, + content::mojom::AlternativeErrorPageOverrideInfoPtr alternative_error_page_info, std::string *error_html) override; - uint64_t VisitedLinkHash(const char *canonical_url, size_t length) override; bool IsLinkVisited(uint64_t linkHash) override; std::unique_ptr<blink::WebPrescientNetworking> CreatePrescientNetworking(content::RenderFrame *render_frame) override; - void AddSupportedKeySystems(std::vector<std::unique_ptr<media::KeySystemProperties>> *key_systems) override; - + void GetSupportedKeySystems(media::GetSupportedKeySystemsCB cb) override; void RunScriptsAtDocumentStart(content::RenderFrame *render_frame) override; void RunScriptsAtDocumentEnd(content::RenderFrame *render_frame) override; void RunScriptsAtDocumentIdle(content::RenderFrame *render_frame) override; @@ -93,7 +95,7 @@ public: private: -#if BUILDFLAG(ENABLE_SPELLCHECK) +#if QT_CONFIG(webengine_spellchecker) void InitSpellCheck(); #endif // service_manager::LocalInterfaceProvider: diff --git a/src/core/renderer/content_settings_observer_qt.cpp b/src/core/renderer/content_settings_observer_qt.cpp index 3a45f28e6..3e3c159f5 100644 --- a/src/core/renderer/content_settings_observer_qt.cpp +++ b/src/core/renderer/content_settings_observer_qt.cpp @@ -10,15 +10,12 @@ #include "content/public/renderer/render_frame.h" #include "third_party/blink/public/platform/web_security_origin.h" -#include "third_party/blink/public/web/web_plugin_document.h" +#include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_local_frame.h" #include "url/origin.h" #include "common/qt_messages.h" -using blink::WebSecurityOrigin; -using blink::WebString; - namespace { bool IsUniqueFrame(blink::WebFrame *frame) diff --git a/src/core/renderer/content_settings_observer_qt.h b/src/core/renderer/content_settings_observer_qt.h index 89dcbad08..415d0b6b7 100644 --- a/src/core/renderer/content_settings_observer_qt.h +++ b/src/core/renderer/content_settings_observer_qt.h @@ -14,10 +14,6 @@ #include "third_party/blink/public/platform/web_content_settings_client.h" #include "url/gurl.h" -namespace blink { -class WebSecurityOrigin; -} - namespace QtWebEngineCore { // Handles blocking content per content settings for each RenderFrame. @@ -57,4 +53,4 @@ private: } // namespace QtWebEngineCore -#endif // RENDERER_CONTENT_SETTINGS_OBSERVER_QT_H +#endif // CONTENT_SETTINGS_OBSERVER_QT_H diff --git a/src/core/renderer/extensions/extensions_renderer_client_qt.cpp b/src/core/renderer/extensions/extensions_renderer_client_qt.cpp index 4f1ec5ba2..b36ed9e8b 100644 --- a/src/core/renderer/extensions/extensions_renderer_client_qt.cpp +++ b/src/core/renderer/extensions/extensions_renderer_client_qt.cpp @@ -16,7 +16,7 @@ #include "base/command_line.h" #include "base/lazy_instance.h" #include "base/stl_util.h" -#include "components/guest_view/renderer/guest_view_container_dispatcher.h" +#include "base/types/optional_util.h" #include "content/public/common/content_constants.h" #include "content/public/common/content_switches.h" #include "content/public/renderer/render_frame.h" @@ -27,6 +27,7 @@ #include "extensions/common/switches.h" #include "extensions/renderer/dispatcher.h" #include "extensions/renderer/extension_frame_helper.h" +#include "extensions/renderer/extension_web_view_helper.h" #include "extensions/renderer/extensions_render_frame_observer.h" #include "extensions/renderer/renderer_extension_registry.h" #include "extensions/renderer/script_context.h" @@ -111,10 +112,13 @@ void ExtensionsRendererClientQt::RenderThreadStarted() extension_dispatcher_->OnRenderThreadStarted(thread); permissions_policy_delegate_.reset(new RendererPermissionsPolicyDelegateQt(extension_dispatcher_.get())); resource_request_policy_.reset(new extensions::ResourceRequestPolicyQt(extension_dispatcher_.get())); - guest_view_container_dispatcher_.reset(new guest_view::GuestViewContainerDispatcher()); thread->AddObserver(extension_dispatcher_.get()); - thread->AddObserver(guest_view_container_dispatcher_.get()); +} + +void ExtensionsRendererClientQt::WebViewCreated(blink::WebView *web_view, const url::Origin *outermost_origin) +{ + new extensions::ExtensionWebViewHelper(web_view, outermost_origin); } void ExtensionsRendererClientQt::RenderFrameCreated(content::RenderFrame *render_frame, diff --git a/src/core/renderer/extensions/extensions_renderer_client_qt.h b/src/core/renderer/extensions/extensions_renderer_client_qt.h index 33395a615..163819cbc 100644 --- a/src/core/renderer/extensions/extensions_renderer_client_qt.h +++ b/src/core/renderer/extensions/extensions_renderer_client_qt.h @@ -16,6 +16,7 @@ namespace blink { class WebLocalFrame; struct WebPluginParams; class WebURL; +class WebView; } namespace content { @@ -35,10 +36,6 @@ class Dispatcher; class ResourceRequestPolicyQt; } -namespace guest_view { -class GuestViewContainerDispatcher; -} - namespace QtWebEngineCore { class ExtensionsDispatcherDelegateQt; @@ -59,6 +56,8 @@ public: // Match ContentRendererClientQt's method names... void RenderThreadStarted(); + void WebViewCreated(blink::WebView *web_view, + const url::Origin *outermost_origin); void RenderFrameCreated(content::RenderFrame *, service_manager::BinderRegistry *); bool OverrideCreatePlugin(content::RenderFrame *render_frame, const blink::WebPluginParams ¶ms); @@ -90,7 +89,6 @@ private: std::unique_ptr<ExtensionsDispatcherDelegateQt> extension_dispatcher_delegate_; std::unique_ptr<RendererPermissionsPolicyDelegateQt> permissions_policy_delegate_; std::unique_ptr<extensions::Dispatcher> extension_dispatcher_; - std::unique_ptr<guest_view::GuestViewContainerDispatcher> guest_view_container_dispatcher_; std::unique_ptr<extensions::ResourceRequestPolicyQt> resource_request_policy_; }; diff --git a/src/core/renderer/extensions/resource_request_policy_qt.cpp b/src/core/renderer/extensions/resource_request_policy_qt.cpp index 21b7be4b6..a61e53310 100644 --- a/src/core/renderer/extensions/resource_request_policy_qt.cpp +++ b/src/core/renderer/extensions/resource_request_policy_qt.cpp @@ -27,8 +27,9 @@ ResourceRequestPolicyQt::ResourceRequestPolicyQt(Dispatcher *dispatcher) void ResourceRequestPolicyQt::OnExtensionLoaded(const Extension &extension) { - if (WebAccessibleResourcesInfo::HasWebAccessibleResources(&extension) - || WebviewInfo::HasWebviewAccessibleResources(extension, m_dispatcher->webview_partition_id()) + if (WebAccessibleResourcesInfo::HasWebAccessibleResources(&extension) || + WebviewInfo::HasWebviewAccessibleResources(extension, + m_dispatcher->webview_partition_id().value_or(std::string())) // // Hosted app icons are accessible. // // TODO(devlin): Should we incorporate this into // // WebAccessibleResourcesInfo? @@ -131,7 +132,9 @@ bool ResourceRequestPolicyQt::CanRequestResource(const GURL &resource_url, // Disallow loading of extension resources which are not explicitly listed // as web or WebView accessible if the manifest version is 2 or greater. if (!WebAccessibleResourcesInfo::IsResourceWebAccessible(extension, resource_url.path(), initiator_origin) && - !WebviewInfo::IsResourceWebviewAccessible(extension, m_dispatcher->webview_partition_id(), resource_url.path())) + !WebviewInfo::IsResourceWebviewAccessible(extension, + m_dispatcher->webview_partition_id().value_or(std::string()), + resource_url.path())) { std::string message = base::StringPrintf( "Denying load of %s. Resources must be listed in the " diff --git a/src/core/renderer/pepper/pepper_renderer_host_factory_qt.cpp b/src/core/renderer/pepper/pepper_renderer_host_factory_qt.cpp index ae3ff26b7..d0daea8c2 100644 --- a/src/core/renderer/pepper/pepper_renderer_host_factory_qt.cpp +++ b/src/core/renderer/pepper/pepper_renderer_host_factory_qt.cpp @@ -9,18 +9,10 @@ #include "pepper_renderer_host_factory_qt.h" #include "qtwebenginecoreglobal_p.h" -#include "base/memory/ptr_util.h" -#include "chrome/renderer/pepper/pepper_uma_host.h" -#if QT_CONFIG(webengine_printing_and_pdf) -#include "chrome/renderer/pepper/pepper_flash_font_file_host.h" -#include "components/pdf/renderer/pepper_pdf_host.h" -#endif // QT_CONFIG(webengine_printing_and_pdf) #include "content/public/renderer/renderer_ppapi_host.h" #include "ppapi/host/ppapi_host.h" #include "ppapi/host/resource_host.h" #include "ppapi/proxy/ppapi_messages.h" -#include "ppapi/proxy/ppapi_message_utils.h" -#include "ppapi/shared_impl/ppapi_permissions.h" namespace QtWebEngineCore { @@ -45,31 +37,6 @@ std::unique_ptr<ppapi::host::ResourceHost> PepperRendererHostFactoryQt::CreateRe if (!host_->IsValidInstance(instance)) return nullptr; - // TODO(raymes): PDF also needs access to the FlashFontFileHost currently. - // We should either rename PPB_FlashFont_File to PPB_FontFile_Private or get - // rid of its use in PDF if possible. -#if QT_CONFIG(webengine_printing_and_pdf) - if (host_->GetPpapiHost()->permissions().HasPermission(ppapi::PERMISSION_FLASH) - || host_->GetPpapiHost()->permissions().HasPermission(ppapi::PERMISSION_PDF)) { - switch (message.type()) { - case PpapiHostMsg_FlashFontFile_Create::ID: { - ppapi::proxy::SerializedFontDescription description; - PP_PrivateFontCharset charset; - if (ppapi::UnpackMessage<PpapiHostMsg_FlashFontFile_Create>(message, &description, &charset)) - return base::WrapUnique(new PepperFlashFontFileHost(host_, instance, resource, description, charset)); - break; - } - } - } - - if (host_->GetPpapiHost()->permissions().HasPermission(ppapi::PERMISSION_PDF)) { - switch (message.type()) { - case PpapiHostMsg_PDF_Create::ID: - return std::make_unique<pdf::PepperPDFHost>(host_, instance, resource); - } - } -#endif // QT_CONFIG(webengine_printing_and_pdf) - // Create a default ResourceHost for this message type to suppress // "Failed to create PPAPI resource host" console error message. switch (message.type()) { diff --git a/src/core/renderer/plugins/loadable_plugin_placeholder_qt.cpp b/src/core/renderer/plugins/loadable_plugin_placeholder_qt.cpp index 70fd791fd..06fd4f71f 100644 --- a/src/core/renderer/plugins/loadable_plugin_placeholder_qt.cpp +++ b/src/core/renderer/plugins/loadable_plugin_placeholder_qt.cpp @@ -40,11 +40,11 @@ LoadablePluginPlaceholderQt* LoadablePluginPlaceholderQt::CreateLoadableMissingP { std::string template_html(ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(IDR_BLOCKED_PLUGIN_HTML)); - base::DictionaryValue values; - values.SetString("name", ""); - values.SetString("message", l10n_util::GetStringUTF8(IDS_PLUGIN_NOT_SUPPORTED)); + base::Value::Dict values; + values.Set("name", ""); + values.Set("message", l10n_util::GetStringUTF8(IDS_PLUGIN_NOT_SUPPORTED)); - const std::string html_data = webui::GetI18nTemplateHtml(template_html, &values); + const std::string html_data = webui::GetI18nTemplateHtml(template_html, std::move(values)); // Will destroy itself when its WebViewPlugin is going away. return new LoadablePluginPlaceholderQt(render_frame, params, html_data, params.mime_type.Utf16()); diff --git a/src/core/renderer/plugins/loadable_plugin_placeholder_qt.h b/src/core/renderer/plugins/loadable_plugin_placeholder_qt.h index fd808f766..9b9d1bca8 100644 --- a/src/core/renderer/plugins/loadable_plugin_placeholder_qt.h +++ b/src/core/renderer/plugins/loadable_plugin_placeholder_qt.h @@ -31,8 +31,6 @@ private: // content::LoadablePluginPlaceholder overrides. blink::WebPlugin* CreatePlugin() override; - void OnBlockedContent(content::RenderFrame::PeripheralContentStatus status, - bool is_same_origin) override {} // WebViewPlugin::Delegate (via PluginPlaceholder) methods: v8::Local<v8::Value> GetV8Handle(v8::Isolate* isolate) override; diff --git a/src/core/renderer/print_web_view_helper_delegate_qt.cpp b/src/core/renderer/print_web_view_helper_delegate_qt.cpp index 9891c654d..f01568e65 100644 --- a/src/core/renderer/print_web_view_helper_delegate_qt.cpp +++ b/src/core/renderer/print_web_view_helper_delegate_qt.cpp @@ -5,52 +5,34 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE.Chromium file. -#include "content/public/renderer/render_frame.h" -#include "content/public/renderer/render_view.h" #include "extensions/buildflags/buildflags.h" #include "extensions/common/constants.h" -#include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_element.h" #include "third_party/blink/public/web/web_local_frame.h" +#include "url/origin.h" #if BUILDFLAG(ENABLE_EXTENSIONS) #include "chrome/common/webui_url_constants.h" #include "extensions/common/constants.h" +#include "third_party/blink/public/web/web_document.h" +#include "extensions/renderer/guest_view/mime_handler_view/post_message_support.h" #endif // BUILDFLAG(ENABLE_EXTENSIONS) +#include "pdf_util_qt.h" #include "print_web_view_helper_delegate_qt.h" #include "web_engine_library_info.h" namespace QtWebEngineCore { -PrintWebViewHelperDelegateQt::~PrintWebViewHelperDelegateQt() {} -bool IsPdfExtensionOrigin(const url::Origin& origin) -{ -#if BUILDFLAG(ENABLE_EXTENSIONS) - return origin.scheme() == extensions::kExtensionScheme - && origin.host() == extension_misc::kPdfExtensionId; -#else - Q_UNUSED(origin); - return false; -#endif -} +PrintWebViewHelperDelegateQt::~PrintWebViewHelperDelegateQt() {} blink::WebElement PrintWebViewHelperDelegateQt::GetPdfElement(blink::WebLocalFrame *frame) { #if BUILDFLAG(ENABLE_EXTENSIONS) - const url::Origin origin = frame->GetDocument().GetSecurityOrigin(); - bool inside_print_preview = origin == url::Origin::Create(GURL(chrome::kChromeUIPrintURL)); - bool inside_pdf_extension = IsPdfExtensionOrigin(origin); - if (inside_print_preview || inside_pdf_extension) { - // <object> with id="plugin" is created in - // chrome/browser/resources/pdf/pdf_viewer_base.js. - auto viewer_element = frame->GetDocument().GetElementById("viewer"); - if (!viewer_element.IsNull() && !viewer_element.ShadowRoot().IsNull()) { - auto plugin_element = viewer_element.ShadowRoot().QuerySelector("#plugin"); - if (!plugin_element.IsNull()) - return plugin_element; - } - NOTREACHED(); + if (frame->Parent() && IsPdfInternalPluginAllowedOrigin(frame->Parent()->GetSecurityOrigin())) { + auto plugin_element = frame->GetDocument().QuerySelector("embed"); + DCHECK(!plugin_element.IsNull()); + return plugin_element; } #endif // BUILDFLAG(ENABLE_EXTENSIONS) return blink::WebElement(); @@ -66,7 +48,7 @@ bool PrintWebViewHelperDelegateQt::OverridePrint(blink::WebLocalFrame *frame) return false; } -} +} // namespace QtWebEngineCore namespace printing { // std::string PrintingContextDelegate::GetAppLocale() diff --git a/src/core/renderer/print_web_view_helper_delegate_qt.h b/src/core/renderer/print_web_view_helper_delegate_qt.h index 0cca02022..5c7dd2431 100644 --- a/src/core/renderer/print_web_view_helper_delegate_qt.h +++ b/src/core/renderer/print_web_view_helper_delegate_qt.h @@ -10,8 +10,8 @@ #include "components/printing/renderer/print_render_frame_helper.h" -namespace content { -class RenderView; +namespace blink { +class WebLocalFrame; } namespace QtWebEngineCore { @@ -26,7 +26,8 @@ public: bool IsPrintPreviewEnabled() override; bool OverridePrint(blink::WebLocalFrame *frame) override; -}; // class PrintWebViewHelperDelegateQt -} +}; + +} // namespace QtWebEngineCore #endif // PRINT_WEB_VIEW_HELPER_DELEGATE_QT_H diff --git a/src/core/renderer/render_configuration.cpp b/src/core/renderer/render_configuration.cpp index 3bf8186dc..7b35cdd48 100644 --- a/src/core/renderer/render_configuration.cpp +++ b/src/core/renderer/render_configuration.cpp @@ -7,7 +7,6 @@ // found in the LICENSE file. #include "renderer/render_configuration.h" -#include "user_resource_controller.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" namespace QtWebEngineCore { @@ -17,7 +16,7 @@ bool RenderConfiguration::m_isIncognitoProcess = false; void RenderConfiguration::RegisterMojoInterfaces( blink::AssociatedInterfaceRegistry *associated_interfaces) { - associated_interfaces->AddInterface( + associated_interfaces->AddInterface<qtwebengine::mojom::RendererConfiguration>( base::BindRepeating(&RenderConfiguration::OnRendererConfigurationAssociatedRequest, base::Unretained(this))); } diff --git a/src/core/renderer/render_frame_observer_qt.cpp b/src/core/renderer/render_frame_observer_qt.cpp index b8163f6eb..e6489eefb 100644 --- a/src/core/renderer/render_frame_observer_qt.cpp +++ b/src/core/renderer/render_frame_observer_qt.cpp @@ -10,6 +10,7 @@ #include "components/web_cache/renderer/web_cache_impl.h" #include "content/public/renderer/render_frame.h" +#include "third_party/blink/public/web/web_document_loader.h" #if QT_CONFIG(webengine_pepper_plugins) #include "base/memory/ptr_util.h" diff --git a/src/core/renderer/user_resource_controller.cpp b/src/core/renderer/user_resource_controller.cpp index 4a0ba9e43..eff304981 100644 --- a/src/core/renderer/user_resource_controller.cpp +++ b/src/core/renderer/user_resource_controller.cpp @@ -4,19 +4,14 @@ #include "user_resource_controller.h" #include "base/memory/weak_ptr.h" -#include "base/pending_task.h" #include "base/strings/pattern.h" +#include "base/task/single_thread_task_runner.h" #include "content/public/renderer/render_frame.h" -#include "content/public/renderer/render_view.h" #include "content/public/renderer/render_frame_observer.h" #include "extensions/common/url_pattern.h" -#include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_script_source.h" -#include "third_party/blink/public/web/web_view.h" -#include "v8/include/v8.h" #include "mojo/public/cpp/bindings/associated_receiver.h" -#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" #include "qtwebengine/userscript/user_script_data.h" @@ -163,7 +158,7 @@ void UserResourceController::runScripts(QtWebEngineCore::UserScriptData::Injecti QList<uint64_t> scriptsToRun = m_frameUserScriptMap.value(globalScriptsIndex); scriptsToRun.append(m_frameUserScriptMap.value(renderFrame)); - for (uint64_t id : qAsConst(scriptsToRun)) { + for (uint64_t id : std::as_const(scriptsToRun)) { const QtWebEngineCore::UserScriptData &script = m_scripts.value(id); if (script.injectionPoint != p || (!script.injectForSubframes && !isMainFrame)) continue; @@ -188,7 +183,7 @@ UserResourceController::RenderFrameObserverHelper::RenderFrameObserverHelper( , m_binding(this) , m_userResourceController(controller) { - render_frame->GetAssociatedInterfaceRegistry()->AddInterface( + render_frame->GetAssociatedInterfaceRegistry()->AddInterface<qtwebengine::mojom::UserResourceControllerRenderFrame>( base::BindRepeating(&UserResourceController::RenderFrameObserverHelper::BindReceiver, base::Unretained(this))); } @@ -209,7 +204,7 @@ void UserResourceController::RenderFrameObserverHelper::DidCommitProvisionalLoad m_runner.reset(new Runner(render_frame()->GetWebFrame(), m_userResourceController)); - base::ThreadTaskRunnerHandle::Get()->PostTask( + base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(&Runner::run, m_runner->AsWeakPtr(), QtWebEngineCore::UserScriptData::DocumentElementCreation)); @@ -220,7 +215,7 @@ void UserResourceController::RenderFrameObserverHelper::DidDispatchDOMContentLoa // Don't run scripts if provisional load failed (DidFailProvisionalLoad // called instead of DidCommitProvisionalLoad). if (m_runner) - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( FROM_HERE, base::BindOnce(&Runner::run, m_runner->AsWeakPtr(), QtWebEngineCore::UserScriptData::AfterLoad), @@ -230,7 +225,7 @@ void UserResourceController::RenderFrameObserverHelper::DidDispatchDOMContentLoa void UserResourceController::RenderFrameObserverHelper::DidFinishLoad() { if (m_runner) - base::ThreadTaskRunnerHandle::Get()->PostTask( + base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(&Runner::run, m_runner->AsWeakPtr(), QtWebEngineCore::UserScriptData::AfterLoad)); @@ -295,10 +290,11 @@ void UserResourceController::renderFrameDestroyed(content::RenderFrame *renderFr FrameUserScriptMap::iterator it = m_frameUserScriptMap.find(renderFrame); if (it == m_frameUserScriptMap.end()) // ASSERT maybe? return; - for (uint64_t id : qAsConst(it.value())) { - m_scripts.remove(id); + if (renderFrame->IsMainFrame()) { + for (uint64_t id : std::as_const(it.value())) + m_scripts.remove(id); } - m_frameUserScriptMap.remove(renderFrame); + m_frameUserScriptMap.erase(it); } void UserResourceController::addScriptForFrame(const QtWebEngineCore::UserScriptData &script, @@ -306,11 +302,12 @@ void UserResourceController::addScriptForFrame(const QtWebEngineCore::UserScript { FrameUserScriptMap::iterator it = m_frameUserScriptMap.find(frame); if (it == m_frameUserScriptMap.end()) - it = m_frameUserScriptMap.insert(frame, UserScriptSet()); + it = m_frameUserScriptMap.insert(frame, UserScriptList()); if (!(*it).contains(script.scriptId)) (*it).append(script.scriptId); - m_scripts.insert(script.scriptId, script); + if (!frame || frame->IsMainFrame()) + m_scripts.insert(script.scriptId, script); } void UserResourceController::removeScriptForFrame(const QtWebEngineCore::UserScriptData &script, @@ -321,7 +318,8 @@ void UserResourceController::removeScriptForFrame(const QtWebEngineCore::UserScr return; (*it).removeOne(script.scriptId); - m_scripts.remove(script.scriptId); + if (!frame || frame->IsMainFrame()) + m_scripts.remove(script.scriptId); } void UserResourceController::clearScriptsForFrame(content::RenderFrame *frame) @@ -329,8 +327,10 @@ void UserResourceController::clearScriptsForFrame(content::RenderFrame *frame) FrameUserScriptMap::iterator it = m_frameUserScriptMap.find(frame); if (it == m_frameUserScriptMap.end()) return; - for (uint64_t id : qAsConst(it.value())) - m_scripts.remove(id); + if (!frame || frame->IsMainFrame()) { + for (uint64_t id : std::as_const(it.value())) + m_scripts.remove(id); + } m_frameUserScriptMap.remove(frame); } @@ -353,7 +353,7 @@ void UserResourceController::ClearScripts() void UserResourceController::RegisterMojoInterfaces( blink::AssociatedInterfaceRegistry *associated_interfaces) { - associated_interfaces->AddInterface( + associated_interfaces->AddInterface<qtwebengine::mojom::UserResourceController>( base::BindRepeating(&UserResourceController::BindReceiver, base::Unretained(this))); } diff --git a/src/core/renderer/user_resource_controller.h b/src/core/renderer/user_resource_controller.h index ba2ca000d..a5dab73f1 100644 --- a/src/core/renderer/user_resource_controller.h +++ b/src/core/renderer/user_resource_controller.h @@ -10,7 +10,7 @@ #include "mojo/public/cpp/bindings/associated_receiver.h" #include <QtCore/QHash> -#include <QtCore/QSet> +#include <QtCore/QList> namespace blink { class WebLocalFrame; @@ -18,7 +18,6 @@ class WebLocalFrame; namespace content { class RenderFrame; -class RenderView; } namespace QtWebEngineCore { @@ -47,7 +46,6 @@ private: void UnregisterMojoInterfaces(blink::AssociatedInterfaceRegistry *associated_interfaces) override; class RenderFrameObserverHelper; - class RenderViewObserverHelper; void AddScript(const QtWebEngineCore::UserScriptData &data) override; void RemoveScript(const QtWebEngineCore::UserScriptData &data) override; @@ -55,12 +53,13 @@ private: void runScripts(QtWebEngineCore::UserScriptData::InjectionPoint, blink::WebLocalFrame *); - typedef QList<uint64_t> UserScriptSet; - typedef QHash<const content::RenderFrame *, UserScriptSet> FrameUserScriptMap; + typedef QList<uint64_t> UserScriptList; + typedef QHash<const content::RenderFrame *, UserScriptList> FrameUserScriptMap; FrameUserScriptMap m_frameUserScriptMap; QHash<uint64_t, QtWebEngineCore::UserScriptData> m_scripts; mojo::AssociatedReceiver<qtwebengine::mojom::UserResourceController> m_binding; friend class RenderFrameObserverHelper; }; -} // namespace + +} // namespace QtWebEngineCore #endif // USER_RESOURCE_CONTROLLER_H diff --git a/src/core/renderer/web_channel_ipc_transport.cpp b/src/core/renderer/web_channel_ipc_transport.cpp index 584c509a1..89b20c7d1 100644 --- a/src/core/renderer/web_channel_ipc_transport.cpp +++ b/src/core/renderer/web_channel_ipc_transport.cpp @@ -16,11 +16,8 @@ #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" #include "v8/include/v8.h" -#include "services/service_manager/public/cpp/interface_provider.h" #include "qtwebengine/browser/qtwebchannel.mojom.h" -#include <QJsonDocument> - namespace QtWebEngineCore { class WebChannelTransport : public gin::Wrappable<WebChannelTransport> @@ -46,8 +43,6 @@ void WebChannelTransport::Install(blink::WebLocalFrame *frame, uint worldId) { v8::Isolate *isolate = blink::MainThreadIsolate(); v8::HandleScope handleScope(isolate); - v8::MicrotasksScope microtasks_scope( - isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); v8::Local<v8::Context> context; if (worldId == 0) context = frame->MainWorldScriptContext(); @@ -62,15 +57,14 @@ void WebChannelTransport::Install(blink::WebLocalFrame *frame, uint worldId) return; v8::Local<v8::Object> global = context->Global(); - v8::Local<v8::Value> qtObjectValue; v8::Local<v8::Object> qtObject; - if (!global->Get(context, gin::StringToV8(isolate, "qt")).ToLocal(&qtObjectValue) || !qtObjectValue->IsObject()) { - qtObject = v8::Object::New(isolate); - global->Set(context, gin::StringToV8(isolate, "qt"), qtObject).Check(); - } else { - qtObject = v8::Local<v8::Object>::Cast(qtObjectValue); - } - qtObject->Set(context, gin::StringToV8(isolate, "webChannelTransport"), transport.ToV8()).Check(); + qtObject = v8::Object::New(isolate); + global->CreateDataProperty(context, + gin::StringToSymbol(isolate, "qt"), + qtObject).Check(); + qtObject->CreateDataProperty(context, + gin::StringToSymbol(isolate, "webChannelTransport"), + transport.ToV8()).Check(); } void WebChannelTransport::Uninstall(blink::WebLocalFrame *frame, uint worldId) @@ -142,7 +136,7 @@ WebChannelIPCTransport::WebChannelIPCTransport(content::RenderFrame *renderFrame , m_worldInitialized(false) , m_binding(this) { - renderFrame->GetAssociatedInterfaceRegistry()->AddInterface( + renderFrame->GetAssociatedInterfaceRegistry()->AddInterface<qtwebchannel::mojom::WebChannelTransportRender>( base::BindRepeating(&WebChannelIPCTransport::BindReceiver, base::Unretained(this))); } diff --git a/src/core/renderer/web_channel_ipc_transport.h b/src/core/renderer/web_channel_ipc_transport.h index ded5ef26c..95aa39850 100644 --- a/src/core/renderer/web_channel_ipc_transport.h +++ b/src/core/renderer/web_channel_ipc_transport.h @@ -5,8 +5,8 @@ #define WEB_CHANNEL_IPC_TRANSPORT_H #include "content/public/renderer/render_frame_observer.h" -#include "services/service_manager/public/cpp/binder_registry.h" -#include "mojo/public/cpp/bindings/associated_receiver_set.h" +#include "mojo/public/cpp/bindings/associated_receiver.h" +#include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/pending_associated_receiver.h" #include "qtwebengine/browser/qtwebchannel.mojom.h" diff --git a/src/core/renderer/web_engine_page_render_frame.cpp b/src/core/renderer/web_engine_page_render_frame.cpp index 87c2cee7f..1e7ac62fc 100644 --- a/src/core/renderer/web_engine_page_render_frame.cpp +++ b/src/core/renderer/web_engine_page_render_frame.cpp @@ -3,14 +3,10 @@ #include "renderer/web_engine_page_render_frame.h" #include "content/public/renderer/render_frame.h" -#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" -#include "third_party/blink/public/web/web_document.h" -#include "third_party/blink/public/web/web_element.h" -#include "third_party/blink/public/web/web_frame.h" +#include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/web/web_frame_content_dumper.h" -#include "third_party/blink/public/web/web_frame_widget.h" #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_view.h" @@ -19,7 +15,7 @@ namespace QtWebEngineCore { WebEnginePageRenderFrame::WebEnginePageRenderFrame(content::RenderFrame *render_frame) : content::RenderFrameObserver(render_frame), m_binding(this), m_ready(false) { - render_frame->GetAssociatedInterfaceRegistry()->AddInterface( + render_frame->GetAssociatedInterfaceRegistry()->AddInterface<qtwebenginepage::mojom::WebEnginePageRenderFrame>( base::BindRepeating(&WebEnginePageRenderFrame::BindReceiver, base::Unretained(this))); } diff --git a/src/core/renderer/web_engine_page_render_frame.h b/src/core/renderer/web_engine_page_render_frame.h index 2d47d46f3..7d0e25267 100644 --- a/src/core/renderer/web_engine_page_render_frame.h +++ b/src/core/renderer/web_engine_page_render_frame.h @@ -36,6 +36,6 @@ private: mojo::AssociatedReceiver<qtwebenginepage::mojom::WebEnginePageRenderFrame> m_binding; bool m_ready; }; -} // namespace +} // namespace QtWebEngineCore #endif // WEB_ENGINE_PAGE_RENDER_FRAME_H |