diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-10-28 14:40:59 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-10-28 14:40:59 +0100 |
commit | de428e1a79708967f97aa8ffcbb2403d3b7d1e7f (patch) | |
tree | 91a18b790249ebc9db57f909dbe6f56c681023ef /src/core/renderer | |
parent | a9fd0fbd8db36bd809c85d45d508b58107614653 (diff) | |
parent | 0de715dec80620482f051f7f29cf6844c0bbf008 (diff) |
Merge remote-tracking branch 'origin/5.15' into dev
Change-Id: Iae246af4df63e4f8cbc18d03f9b37a7be0a0c81b
Diffstat (limited to 'src/core/renderer')
-rw-r--r-- | src/core/renderer/content_renderer_client_qt.cpp | 18 | ||||
-rw-r--r-- | src/core/renderer/extensions/extensions_renderer_client_qt.cpp | 24 | ||||
-rw-r--r-- | src/core/renderer/extensions/extensions_renderer_client_qt.h | 2 | ||||
-rw-r--r-- | src/core/renderer/render_frame_observer_qt.cpp | 12 | ||||
-rw-r--r-- | src/core/renderer/render_frame_observer_qt.h | 9 | ||||
-rw-r--r-- | src/core/renderer/render_view_observer_qt.cpp | 11 | ||||
-rw-r--r-- | src/core/renderer/render_view_observer_qt.h | 10 | ||||
-rw-r--r-- | src/core/renderer/user_resource_controller.cpp | 2 | ||||
-rw-r--r-- | src/core/renderer/web_channel_ipc_transport.cpp | 43 |
9 files changed, 83 insertions, 48 deletions
diff --git a/src/core/renderer/content_renderer_client_qt.cpp b/src/core/renderer/content_renderer_client_qt.cpp index 092e6845d..b9b199087 100644 --- a/src/core/renderer/content_renderer_client_qt.cpp +++ b/src/core/renderer/content_renderer_client_qt.cpp @@ -153,14 +153,18 @@ void ContentRendererClientQt::RenderThreadStarted() // Allow XMLHttpRequests from qrc to file. blink::WebURL qrc(blink::KURL("qrc:")); blink::WebString file(blink::WebString::FromASCII("file")); - blink::WebSecurityPolicy::AddOriginAccessAllowListEntry(qrc, file, blink::WebString(), true, + blink::WebSecurityPolicy::AddOriginAccessAllowListEntry(qrc, file, blink::WebString(), 0, + network::mojom::CorsDomainMatchMode::kAllowSubdomains, + network::mojom::CorsPortMatchMode::kAllowAnyPort, network::mojom::CorsOriginAccessMatchPriority::kDefaultPriority); #if BUILDFLAG(ENABLE_EXTENSIONS) // Allow the pdf viewer extension to access chrome resources blink::WebURL pdfViewerExtension(blink::KURL("chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai")); blink::WebString chromeResources(blink::WebString::FromASCII("chrome")); - blink::WebSecurityPolicy::AddOriginAccessAllowListEntry(pdfViewerExtension, chromeResources, blink::WebString(), true, + blink::WebSecurityPolicy::AddOriginAccessAllowListEntry(pdfViewerExtension, chromeResources, blink::WebString(), 0, + network::mojom::CorsDomainMatchMode::kAllowSubdomains, + network::mojom::CorsPortMatchMode::kAllowAnyPort, network::mojom::CorsOriginAccessMatchPriority::kDefaultPriority); ExtensionsRendererClientQt::GetInstance()->RenderThreadStarted(); @@ -170,13 +174,14 @@ void ContentRendererClientQt::RenderThreadStarted() void ContentRendererClientQt::RenderViewCreated(content::RenderView* render_view) { // RenderViewObservers destroy themselves with their RenderView. - new RenderViewObserverQt(render_view, m_webCacheImpl.data()); + new RenderViewObserverQt(render_view); UserResourceController::instance()->renderViewCreated(render_view); } void ContentRendererClientQt::RenderFrameCreated(content::RenderFrame* render_frame) { - QtWebEngineCore::RenderFrameObserverQt *render_frame_observer = new QtWebEngineCore::RenderFrameObserverQt(render_frame); + QtWebEngineCore::RenderFrameObserverQt *render_frame_observer = + new QtWebEngineCore::RenderFrameObserverQt(render_frame, m_webCacheImpl.data()); #if QT_CONFIG(webengine_webchannel) if (render_frame->IsMainFrame()) new WebChannelIPCTransport(render_frame); @@ -293,7 +298,8 @@ void ContentRendererClientQt::GetNavigationErrorStringsInternal(content::RenderF resourceId = IDR_NET_ERROR_HTML; - const base::StringPiece template_html(ui::ResourceBundle::GetSharedInstance().GetRawDataResource(resourceId)); + std::string extracted_string = ui::ResourceBundle::GetSharedInstance().DecompressDataResource(resourceId); + const base::StringPiece template_html(extracted_string.data(), extracted_string.size()); if (template_html.empty()) NOTREACHED() << "unable to load template. ID: " << resourceId; else // "t" is the id of the templates root node. @@ -518,7 +524,7 @@ static void AddWidevine(std::vector<std::unique_ptr<media::KeySystemProperties>> } // Session types. - bool cdm_supports_temporary_session = base::ContainsValue(capability->session_types, media::CdmSessionType::kTemporary); + bool cdm_supports_temporary_session = base::Contains(capability->session_types, media::CdmSessionType::kTemporary); if (!cdm_supports_temporary_session) { DVLOG(1) << "Temporary session must be supported."; return; diff --git a/src/core/renderer/extensions/extensions_renderer_client_qt.cpp b/src/core/renderer/extensions/extensions_renderer_client_qt.cpp index c25494590..7d4c9a83c 100644 --- a/src/core/renderer/extensions/extensions_renderer_client_qt.cpp +++ b/src/core/renderer/extensions/extensions_renderer_client_qt.cpp @@ -56,6 +56,8 @@ #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_thread.h" #include "extensions/common/constants.h" +#include "extensions/common/extension.h" +#include "extensions/common/manifest_handlers/background_info.h" #include "extensions/common/switches.h" #include "extensions/renderer/dispatcher.h" #include "extensions/renderer/extension_frame_helper.h" @@ -120,6 +122,28 @@ void ExtensionsRendererClientQt::OnExtensionUnloaded(const extensions::Extension resource_request_policy_->OnExtensionUnloaded(extension_id); } +bool ExtensionsRendererClientQt::ExtensionAPIEnabledForServiceWorkerScript(const GURL &scope, const GURL &script_url) const +{ + if (!script_url.SchemeIs(extensions::kExtensionScheme)) + return false; + + if (!extensions::ExtensionsClient::Get()->ExtensionAPIEnabledInExtensionServiceWorkers()) + return false; + + const extensions::Extension* extension = + extensions::RendererExtensionRegistry::Get()->GetExtensionOrAppByURL(script_url); + + if (!extension || !extensions::BackgroundInfo::IsServiceWorkerBased(extension)) + return false; + + if (scope != extension->url()) + return false; + + const std::string& sw_script = extensions::BackgroundInfo::GetBackgroundServiceWorkerScript(extension); + + return extension->GetResourceURL(sw_script) == script_url; +} + void ExtensionsRendererClientQt::RenderThreadStarted() { content::RenderThread *thread = content::RenderThread::Get(); diff --git a/src/core/renderer/extensions/extensions_renderer_client_qt.h b/src/core/renderer/extensions/extensions_renderer_client_qt.h index 2d45d255a..87e324213 100644 --- a/src/core/renderer/extensions/extensions_renderer_client_qt.h +++ b/src/core/renderer/extensions/extensions_renderer_client_qt.h @@ -113,6 +113,8 @@ public: const std::string &mime_type, const GURL &original_url); + bool ExtensionAPIEnabledForServiceWorkerScript(const GURL &scope, const GURL &script_url) const override; + void RunScriptsAtDocumentStart(content::RenderFrame *render_frame); void RunScriptsAtDocumentEnd(content::RenderFrame *render_frame); void RunScriptsAtDocumentIdle(content::RenderFrame *render_frame); diff --git a/src/core/renderer/render_frame_observer_qt.cpp b/src/core/renderer/render_frame_observer_qt.cpp index 5a630357c..c48ef3b5c 100644 --- a/src/core/renderer/render_frame_observer_qt.cpp +++ b/src/core/renderer/render_frame_observer_qt.cpp @@ -46,6 +46,8 @@ #include "base/memory/ptr_util.h" #include "chrome/renderer/pepper/pepper_shared_memory_message_filter.h" +#include "components/web_cache/renderer/web_cache_impl.h" +#include "content/public/renderer/render_frame.h" #include "content/public/renderer/renderer_ppapi_host.h" #include "ppapi/host/ppapi_host.h" @@ -53,10 +55,12 @@ namespace QtWebEngineCore { -RenderFrameObserverQt::RenderFrameObserverQt(content::RenderFrame* render_frame) +RenderFrameObserverQt::RenderFrameObserverQt(content::RenderFrame* render_frame, + web_cache::WebCacheImpl* web_cache_impl) : RenderFrameObserver(render_frame) , RenderFrameObserverTracker<RenderFrameObserverQt>(render_frame) , m_isFrameDetached(false) + , m_web_cache_impl(web_cache_impl) { } @@ -88,4 +92,10 @@ bool RenderFrameObserverQt::isFrameDetached() const return m_isFrameDetached; } +void RenderFrameObserverQt::ReadyToCommitNavigation(blink::WebDocumentLoader *) +{ + if (render_frame()->IsMainFrame() && m_web_cache_impl) + m_web_cache_impl->ExecutePendingClearCache(); +} + } // namespace QtWebEngineCore diff --git a/src/core/renderer/render_frame_observer_qt.h b/src/core/renderer/render_frame_observer_qt.h index 4c05422bb..3c54761f3 100644 --- a/src/core/renderer/render_frame_observer_qt.h +++ b/src/core/renderer/render_frame_observer_qt.h @@ -50,6 +50,9 @@ namespace content { class RenderFrame; } +namespace web_cache { +class WebCacheImpl; +} namespace QtWebEngineCore { @@ -58,7 +61,8 @@ class RenderFrameObserverQt , public content::RenderFrameObserverTracker<RenderFrameObserverQt> { public: - explicit RenderFrameObserverQt(content::RenderFrame* render_frame); + explicit RenderFrameObserverQt(content::RenderFrame* render_frame, + web_cache::WebCacheImpl* web_cache_impl); ~RenderFrameObserverQt(); #if QT_CONFIG(webengine_pepper_plugins) @@ -74,8 +78,11 @@ public: private: DISALLOW_COPY_AND_ASSIGN(RenderFrameObserverQt); + void ReadyToCommitNavigation(blink::WebDocumentLoader *); + bool m_isFrameDetached; service_manager::BinderRegistry registry_; + web_cache::WebCacheImpl *m_web_cache_impl; }; } // namespace QtWebEngineCore diff --git a/src/core/renderer/render_view_observer_qt.cpp b/src/core/renderer/render_view_observer_qt.cpp index 2795de4b9..7e7c7bdf8 100644 --- a/src/core/renderer/render_view_observer_qt.cpp +++ b/src/core/renderer/render_view_observer_qt.cpp @@ -41,7 +41,6 @@ #include "common/qt_messages.h" -#include "components/web_cache/renderer/web_cache_impl.h" #include "content/public/renderer/render_view.h" #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_element.h" @@ -52,10 +51,8 @@ #include "third_party/blink/public/web/web_view.h" RenderViewObserverQt::RenderViewObserverQt( - content::RenderView* render_view, - web_cache::WebCacheImpl* web_cache_impl) + content::RenderView* render_view) : content::RenderViewObserver(render_view) - , m_web_cache_impl(web_cache_impl) { } @@ -99,9 +96,3 @@ bool RenderViewObserverQt::OnMessageReceived(const IPC::Message& message) IPC_END_MESSAGE_MAP() return handled; } - -void RenderViewObserverQt::Navigate(const GURL &) -{ - if (m_web_cache_impl) - m_web_cache_impl->ExecutePendingClearCache(); -} diff --git a/src/core/renderer/render_view_observer_qt.h b/src/core/renderer/render_view_observer_qt.h index abb472f02..a878eebe8 100644 --- a/src/core/renderer/render_view_observer_qt.h +++ b/src/core/renderer/render_view_observer_qt.h @@ -43,14 +43,9 @@ #include <QtGlobal> -namespace web_cache { -class WebCacheImpl; -} - class RenderViewObserverQt : public content::RenderViewObserver { public: - RenderViewObserverQt(content::RenderView* render_view, - web_cache::WebCacheImpl* web_cache_impl); + RenderViewObserverQt(content::RenderView* render_view); private: void onFetchDocumentMarkup(quint64 requestId); @@ -60,9 +55,6 @@ private: void OnDestruct() override; bool OnMessageReceived(const IPC::Message& message) override; - void Navigate(const GURL& url) override; - - web_cache::WebCacheImpl* m_web_cache_impl; DISALLOW_COPY_AND_ASSIGN(RenderViewObserverQt); }; diff --git a/src/core/renderer/user_resource_controller.cpp b/src/core/renderer/user_resource_controller.cpp index 701614341..781c10840 100644 --- a/src/core/renderer/user_resource_controller.cpp +++ b/src/core/renderer/user_resource_controller.cpp @@ -71,7 +71,7 @@ static const int afterLoadTimeout = 500; static int validUserScriptSchemes() { - return URLPattern::SCHEME_HTTP | URLPattern::SCHEME_HTTPS | URLPattern::SCHEME_FILE; + return URLPattern::SCHEME_HTTP | URLPattern::SCHEME_HTTPS | URLPattern::SCHEME_FILE | URLPattern::SCHEME_QRC; } static bool regexMatchesURL(const std::string &pat, const GURL &url) { diff --git a/src/core/renderer/web_channel_ipc_transport.cpp b/src/core/renderer/web_channel_ipc_transport.cpp index 745fe8b1e..108686068 100644 --- a/src/core/renderer/web_channel_ipc_transport.cpp +++ b/src/core/renderer/web_channel_ipc_transport.cpp @@ -92,15 +92,18 @@ void WebChannelTransport::Install(blink::WebLocalFrame *frame, uint worldId) gin::Handle<WebChannelTransport> transport = gin::CreateHandle(isolate, new WebChannelTransport); v8::Local<v8::Object> global = context->Global(); - v8::Local<v8::Value> qtObjectValue = global->Get(gin::StringToV8(isolate, "qt")); + v8::MaybeLocal<v8::Value> qtObjectValue = global->Get(context, gin::StringToV8(isolate, "qt")); v8::Local<v8::Object> qtObject; - if (qtObjectValue.IsEmpty() || !qtObjectValue->IsObject()) { + if (qtObjectValue.IsEmpty() || !qtObjectValue.ToLocalChecked()->IsObject()) { qtObject = v8::Object::New(isolate); - global->Set(gin::StringToV8(isolate, "qt"), qtObject); + auto whocares = global->Set(context, gin::StringToV8(isolate, "qt"), qtObject); + // FIXME: Perhaps error out, but the return value is V8 internal... + Q_UNUSED(whocares); } else { - qtObject = v8::Local<v8::Object>::Cast(qtObjectValue); + qtObject = v8::Local<v8::Object>::Cast(qtObjectValue.ToLocalChecked()); } - qtObject->Set(gin::StringToV8(isolate, "webChannelTransport"), transport.ToV8()); + auto whocares = qtObject->Set(context, gin::StringToV8(isolate, "webChannelTransport"), transport.ToV8()); + Q_UNUSED(whocares); } void WebChannelTransport::Uninstall(blink::WebLocalFrame *frame, uint worldId) @@ -115,11 +118,11 @@ void WebChannelTransport::Uninstall(blink::WebLocalFrame *frame, uint worldId) v8::Context::Scope contextScope(context); v8::Local<v8::Object> global(context->Global()); - v8::Local<v8::Value> qtObjectValue = global->Get(gin::StringToV8(isolate, "qt")); - if (qtObjectValue.IsEmpty() || !qtObjectValue->IsObject()) + v8::MaybeLocal<v8::Value> qtObjectValue = global->Get(context, gin::StringToV8(isolate, "qt")); + if (qtObjectValue.IsEmpty() || !qtObjectValue.ToLocalChecked()->IsObject()) return; - v8::Local<v8::Object> qtObject = v8::Local<v8::Object>::Cast(qtObjectValue); - // FIXME: ? + v8::Local<v8::Object> qtObject = v8::Local<v8::Object>::Cast(qtObjectValue.ToLocalChecked()); + // FIXME: We can't do anything about a failure, so why the .. is it nodiscard? auto whocares = qtObject->Delete(context, gin::StringToV8(isolate, "webChannelTransport")); Q_UNUSED(whocares); } @@ -235,16 +238,16 @@ void WebChannelIPCTransport::DispatchWebChannelMessage(const std::vector<uint8_t v8::Context::Scope contextScope(context); v8::Local<v8::Object> global(context->Global()); - v8::Local<v8::Value> qtObjectValue(global->Get(gin::StringToV8(isolate, "qt"))); - if (qtObjectValue.IsEmpty() || !qtObjectValue->IsObject()) + v8::MaybeLocal<v8::Value> qtObjectValue(global->Get(context, gin::StringToV8(isolate, "qt"))); + if (qtObjectValue.IsEmpty() || !qtObjectValue.ToLocalChecked()->IsObject()) return; - v8::Local<v8::Object> qtObject = v8::Local<v8::Object>::Cast(qtObjectValue); - v8::Local<v8::Value> webChannelObjectValue(qtObject->Get(gin::StringToV8(isolate, "webChannelTransport"))); - if (webChannelObjectValue.IsEmpty() || !webChannelObjectValue->IsObject()) + v8::Local<v8::Object> qtObject = v8::Local<v8::Object>::Cast(qtObjectValue.ToLocalChecked()); + v8::MaybeLocal<v8::Value> webChannelObjectValue(qtObject->Get(context, gin::StringToV8(isolate, "webChannelTransport"))); + if (webChannelObjectValue.IsEmpty() || !webChannelObjectValue.ToLocalChecked()->IsObject()) return; - v8::Local<v8::Object> webChannelObject = v8::Local<v8::Object>::Cast(webChannelObjectValue); - v8::Local<v8::Value> callbackValue(webChannelObject->Get(gin::StringToV8(isolate, "onmessage"))); - if (callbackValue.IsEmpty() || !callbackValue->IsFunction()) { + v8::Local<v8::Object> webChannelObject = v8::Local<v8::Object>::Cast(webChannelObjectValue.ToLocalChecked()); + v8::MaybeLocal<v8::Value> callbackValue(webChannelObject->Get(context, gin::StringToV8(isolate, "onmessage"))); + if (callbackValue.IsEmpty() || !callbackValue.ToLocalChecked()->IsFunction()) { LOG(WARNING) << "onmessage is not a callable property of qt.webChannelTransport. Some things might not work as expected."; return; } @@ -252,12 +255,12 @@ void WebChannelIPCTransport::DispatchWebChannelMessage(const std::vector<uint8_t v8::Local<v8::Object> messageObject(v8::Object::New(isolate)); v8::Maybe<bool> wasSet = messageObject->DefineOwnProperty( context, - v8::String::NewFromUtf8(isolate, "data"), - v8::String::NewFromUtf8(isolate, json.constData(), v8::String::kNormalString, json.size()), + v8::String::NewFromUtf8(isolate, "data").ToLocalChecked(), + v8::String::NewFromUtf8(isolate, json.constData(), v8::NewStringType::kNormal, json.size()).ToLocalChecked(), v8::PropertyAttribute(v8::ReadOnly | v8::DontDelete)); DCHECK(!wasSet.IsNothing() && wasSet.FromJust()); - v8::Local<v8::Function> callback = v8::Local<v8::Function>::Cast(callbackValue); + v8::Local<v8::Function> callback = v8::Local<v8::Function>::Cast(callbackValue.ToLocalChecked()); v8::Local<v8::Value> argv[] = { messageObject }; frame->CallFunctionEvenIfScriptDisabled(callback, webChannelObject, 1, argv); } |