From c3873375836cd2eef211d378fc2fd314e2ef5e01 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Mon, 7 Oct 2019 14:54:59 +0000 Subject: [PATCH] Move GrantLoadLocalResources to WebNavigationParams This is decided per navigation, no need to later change it through WebDocument. Bug: none Change-Id: Ibae0f2ea53d56163f1dd59fa2f89ddd6993676f6 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1844194 Reviewed-by: Bo Commit-Queue: Dmitry Gozman Cr-Commit-Position: refs/heads/master@{#703302} --- android_webview/renderer/aw_render_frame_ext.cc | 9 +-------- content/public/renderer/document_state.cc | 4 +--- content/public/renderer/document_state.h | 7 ------- content/renderer/render_frame_impl.cc | 10 ++++++++-- third_party/blink/public/web/web_document.h | 1 - third_party/blink/public/web/web_navigation_params.h | 2 ++ third_party/blink/renderer/core/dom/document.cc | 3 +++ third_party/blink/renderer/core/dom/document_init.cc | 6 ++++++ third_party/blink/renderer/core/dom/document_init.h | 5 +++++ .../blink/renderer/core/exported/web_document.cc | 5 ----- .../blink/renderer/core/loader/document_loader.cc | 2 ++ .../blink/renderer/core/loader/document_loader.h | 1 + 12 files changed, 29 insertions(+), 26 deletions(-) diff --git a/android_webview/renderer/aw_render_frame_ext.cc b/android_webview/renderer/aw_render_frame_ext.cc index c6c220b3d253b4..d80aefa9d843ac 100644 --- a/android_webview/renderer/aw_render_frame_ext.cc +++ b/android_webview/renderer/aw_render_frame_ext.cc @@ -15,12 +15,10 @@ #include "components/autofill/content/renderer/password_autofill_agent.h" #include "components/content_capture/common/content_capture_features.h" #include "components/content_capture/renderer/content_capture_sender.h" -#include "content/public/renderer/document_state.h" #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_view.h" #include "third_party/blink/public/platform/web_security_origin.h" #include "third_party/blink/public/platform/web_size.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_element_collection.h" #include "third_party/blink/public/web/web_frame_widget.h" @@ -202,12 +200,6 @@ bool AwRenderFrameExt::OnAssociatedInterfaceRequestForFrame( void AwRenderFrameExt::DidCommitProvisionalLoad( bool is_same_document_navigation, ui::PageTransition transition) { - blink::WebLocalFrame* frame = render_frame()->GetWebFrame(); - content::DocumentState* document_state = - content::DocumentState::FromDocumentLoader(frame->GetDocumentLoader()); - if (document_state->can_load_local_resources()) - frame->GetDocument().GrantLoadLocalResources(); - // Clear the cache when we cross site boundaries in the main frame. // // We're trying to approximate what happens with a multi-process Chromium, @@ -215,6 +207,7 @@ void AwRenderFrameExt::DidCommitProvisionalLoad( // up, and thus start with a clear cache. Wiring up a signal from browser to // renderer code to say "this navigation would have switched processes" would // be disruptive, so this clearing of the cache is the compromise. + blink::WebLocalFrame* frame = render_frame()->GetWebFrame(); if (!frame->Parent()) { url::Origin new_origin = url::Origin::Create(frame->GetDocument().Url()); if (!new_origin.IsSameOriginWith(last_origin_)) { diff --git a/content/public/renderer/document_state.cc b/content/public/renderer/document_state.cc index 88e4a3544594b9..c8c83fe31b847e 100644 --- a/content/public/renderer/document_state.cc +++ b/content/public/renderer/document_state.cc @@ -11,8 +11,7 @@ DocumentState::DocumentState() was_alpn_negotiated_(false), was_alternate_protocol_available_(false), connection_info_(net::HttpResponseInfo::CONNECTION_INFO_UNKNOWN), - was_load_data_with_base_url_request_(false), - can_load_local_resources_(false) {} + was_load_data_with_base_url_request_(false) {} DocumentState::~DocumentState() {} @@ -27,7 +26,6 @@ std::unique_ptr DocumentState::Clone() { new_document_state->set_was_load_data_with_base_url_request( was_load_data_with_base_url_request_); new_document_state->set_data_url(data_url_); - new_document_state->set_can_load_local_resources(can_load_local_resources_); return new_document_state; } diff --git a/content/public/renderer/document_state.h b/content/public/renderer/document_state.h index e8d715be759eeb..a3a78bb3819d9c 100644 --- a/content/public/renderer/document_state.h +++ b/content/public/renderer/document_state.h @@ -81,11 +81,6 @@ class CONTENT_EXPORT DocumentState : public blink::WebDocumentLoader::ExtraData, data_url_ = data_url; } - bool can_load_local_resources() const { return can_load_local_resources_; } - void set_can_load_local_resources(bool can_load) { - can_load_local_resources_ = can_load; - } - private: bool was_fetched_via_spdy_; bool was_alpn_negotiated_; @@ -95,8 +90,6 @@ class CONTENT_EXPORT DocumentState : public blink::WebDocumentLoader::ExtraData, bool was_load_data_with_base_url_request_; GURL data_url_; - - bool can_load_local_resources_; }; } // namespace content diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 63be2c1c9d0394..e7015e6b6881fe 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -932,8 +932,6 @@ std::unique_ptr BuildDocumentStateFromParams( mojom::NavigationType::RELOAD_ORIGINAL_REQUEST_URL); internal_data->set_previews_state(common_params.previews_state); internal_data->set_request_id(request_id); - document_state->set_can_load_local_resources( - commit_params.can_load_local_resources); if (head) { if (head->headers) @@ -1047,6 +1045,14 @@ void FillMiscNavigationParams( navigation_params->is_browser_initiated = commit_params.is_browser_initiated; +#if defined(OS_ANDROID) + // Only android webview uses this. + navigation_params->grant_load_local_resources = + commit_params.can_load_local_resources; +#else + DCHECK(!commit_params.can_load_local_resources); +#endif + if (commit_params.origin_to_commit) { navigation_params->origin_to_commit = commit_params.origin_to_commit.value(); diff --git a/third_party/blink/public/web/web_document.h b/third_party/blink/public/web/web_document.h index 10a20028df8d3b..230a855dbfee6a 100644 --- a/third_party/blink/public/web/web_document.h +++ b/third_party/blink/public/web/web_document.h @@ -70,7 +70,6 @@ class WebDocument : public WebNode { // Note: Security checks should use the getSecurityOrigin(), not url(). BLINK_EXPORT WebSecurityOrigin GetSecurityOrigin() const; BLINK_EXPORT bool IsSecureContext() const; - BLINK_EXPORT void GrantLoadLocalResources(); BLINK_EXPORT WebString Encoding() const; BLINK_EXPORT WebString ContentLanguage() const; diff --git a/third_party/blink/public/web/web_navigation_params.h b/third_party/blink/public/web/web_navigation_params.h index 1afcb7c5df69c5..8f253523340e9d 100644 --- a/third_party/blink/public/web/web_navigation_params.h +++ b/third_party/blink/public/web/web_navigation_params.h @@ -306,6 +306,8 @@ struct BLINK_EXPORT WebNavigationParams { bool is_user_activated = false; // Whether this navigation was browser initiated. bool is_browser_initiated = false; + // Whether the document should be able to access local file:// resources. + bool grant_load_local_resources = false; // The previews state which should be used for this navigation. WebURLRequest::PreviewsState previews_state = WebURLRequest::kPreviewsUnspecified; diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 55154be1ea2dae..904ec082dc0d47 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc @@ -844,6 +844,9 @@ class Document::SecurityContextInit : public FeaturePolicyParserDelegate { } } } + + if (initializer.GrantLoadLocalResources()) + security_origin_->GrantLoadLocalResources(); } void InitializeFeaturePolicy(const DocumentInit& initializer, diff --git a/third_party/blink/renderer/core/dom/document_init.cc b/third_party/blink/renderer/core/dom/document_init.cc index ee253c993b79b3..bc4df38ace2db6 100644 --- a/third_party/blink/renderer/core/dom/document_init.cc +++ b/third_party/blink/renderer/core/dom/document_init.cc @@ -215,6 +215,12 @@ DocumentInit& DocumentInit::WithBlockedByCSP(bool blocked_by_csp) { return *this; } +DocumentInit& DocumentInit::WithGrantLoadLocalResources( + bool grant_load_local_resources) { + grant_load_local_resources_ = grant_load_local_resources; + return *this; +} + DocumentInit& DocumentInit::WithRegistrationContext( V0CustomElementRegistrationContext* registration_context) { DCHECK(!create_new_registration_context_); diff --git a/third_party/blink/renderer/core/dom/document_init.h b/third_party/blink/renderer/core/dom/document_init.h index db2e011e051211..21d95304518e13 100644 --- a/third_party/blink/renderer/core/dom/document_init.h +++ b/third_party/blink/renderer/core/dom/document_init.h @@ -80,6 +80,7 @@ class CORE_EXPORT DocumentInit final { WebInsecureRequestPolicy GetInsecureRequestPolicy() const; const SecurityContext::InsecureNavigationsSet* InsecureNavigationsToUpgrade() const; + bool GrantLoadLocalResources() const { return grant_load_local_resources_; } Settings* GetSettings() const; @@ -119,6 +120,7 @@ class CORE_EXPORT DocumentInit final { DocumentInit& WithSrcdocDocument(bool is_srcdoc_document); DocumentInit& WithBlockedByCSP(bool blocked_by_csp); + DocumentInit& WithGrantLoadLocalResources(bool grant_load_local_resources); DocumentInit& WithRegistrationContext(V0CustomElementRegistrationContext*); V0CustomElementRegistrationContext* RegistrationContext(Document*) const; @@ -183,6 +185,9 @@ class CORE_EXPORT DocumentInit final { // empty document instead. bool blocked_by_csp_ = false; + // Whether the document should be able to access local file:// resources. + bool grant_load_local_resources_ = false; + Member registration_context_; bool create_new_registration_context_; diff --git a/third_party/blink/renderer/core/exported/web_document.cc b/third_party/blink/renderer/core/exported/web_document.cc index f90d5653d42a30..f159f0c5d9b5d0 100644 --- a/third_party/blink/renderer/core/exported/web_document.cc +++ b/third_party/blink/renderer/core/exported/web_document.cc @@ -84,11 +84,6 @@ WebSecurityOrigin WebDocument::GetSecurityOrigin() const { return WebSecurityOrigin(ConstUnwrap()->GetSecurityOrigin()); } -void WebDocument::GrantLoadLocalResources() { - if (Document* document = Unwrap()) - document->GetMutableSecurityOrigin()->GrantLoadLocalResources(); -} - bool WebDocument::IsSecureContext() const { const Document* document = ConstUnwrap(); return document && document->IsSecureContext(); diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc index 6445f4bb9e7a3c..fb895ffb3f1d0c 100644 --- a/third_party/blink/renderer/core/loader/document_loader.cc +++ b/third_party/blink/renderer/core/loader/document_loader.cc @@ -165,6 +165,7 @@ DocumentLoader::DocumentLoader( unreachable_url_ = params_->unreachable_url; previews_state_ = params_->previews_state; ip_address_space_ = params_->ip_address_space; + grant_load_local_resources_ = params_->grant_load_local_resources; WebNavigationTimings& timings = params_->navigation_timings; if (!timings.input_start.is_null()) @@ -1477,6 +1478,7 @@ void DocumentLoader::InstallNewDocument( .WithIPAddressSpace(ip_address_space_) .WithSrcdocDocument(loading_srcdoc_) .WithBlockedByCSP(was_blocked_by_csp_) + .WithGrantLoadLocalResources(grant_load_local_resources_) .WithNewRegistrationContext() .WithFeaturePolicyHeader(feature_policy.ToString()) .WithOriginTrialsHeader( diff --git a/third_party/blink/renderer/core/loader/document_loader.h b/third_party/blink/renderer/core/loader/document_loader.h index 16f76428010777..af37c149df0578 100644 --- a/third_party/blink/renderer/core/loader/document_loader.h +++ b/third_party/blink/renderer/core/loader/document_loader.h @@ -407,6 +407,7 @@ class CORE_EXPORT DocumentLoader : public GarbageCollected, std::unique_ptr body_loader_; network::mojom::IPAddressSpace ip_address_space_ = network::mojom::IPAddressSpace::kUnknown; + bool grant_load_local_resources_ = false; // Params are saved in constructor and are cleared after StartLoading(). // TODO(dgozman): remove once StartLoading is merged with constructor.