| Index: third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
|
| diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
|
| index ec6f92f5133370fd4c4e1363cd669515cdae0403..e7b07d2bb0fc76b9f4e3e82b9eec1eaa60bbe327 100644
|
| --- a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
|
| +++ b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
|
| @@ -686,11 +686,33 @@ ResourceRequestBlockedReason FrameFetchContext::CanRequest(
|
| return blocked_reason;
|
| }
|
|
|
| +ResourceRequestBlockedReason FrameFetchContext::CanFollowRedirect(
|
| + Resource::Type type,
|
| + const ResourceRequest& resource_request,
|
| + const KURL& url,
|
| + const ResourceLoaderOptions& options,
|
| + SecurityViolationReportingPolicy reporting_policy,
|
| + FetchRequest::OriginRestriction origin_restriction) const {
|
| + // CanRequestInternal checks enforced CSP, so check report-only here to ensure
|
| + // that violations are sent.
|
| + CheckCSPForRequest(resource_request, url, options, reporting_policy,
|
| + RedirectStatus::kFollowedRedirect,
|
| + kContentSecurityPolicyHeaderTypeReport);
|
| + return CanRequest(type, resource_request, url, options, reporting_policy,
|
| + origin_restriction);
|
| +}
|
| +
|
| ResourceRequestBlockedReason FrameFetchContext::AllowResponse(
|
| Resource::Type type,
|
| const ResourceRequest& resource_request,
|
| const KURL& url,
|
| const ResourceLoaderOptions& options) const {
|
| + // canRequestInternal only checks enforced policies: check report-only here
|
| + // to ensure violations are sent.
|
| + CheckCSPForRequest(resource_request, url, options,
|
| + SecurityViolationReportingPolicy::kReport,
|
| + RedirectStatus::kFollowedRedirect,
|
| + kContentSecurityPolicyHeaderTypeReport);
|
| ResourceRequestBlockedReason blocked_reason =
|
| CanRequestInternal(type, resource_request, url, options,
|
| SecurityViolationReportingPolicy::kReport,
|
| @@ -764,21 +786,14 @@ ResourceRequestBlockedReason FrameFetchContext::CanRequestInternal(
|
| break;
|
| }
|
|
|
| - // FIXME: Convert this to check the isolated world's Content Security Policy
|
| - // once webkit.org/b/104520 is solved.
|
| - bool should_bypass_main_world_csp =
|
| - GetFrame()->GetScriptController().ShouldBypassMainWorldCSP() ||
|
| - options.content_security_policy_option ==
|
| - kDoNotCheckContentSecurityPolicy;
|
| -
|
| - if (document_) {
|
| - DCHECK(document_->GetContentSecurityPolicy());
|
| - if (!should_bypass_main_world_csp &&
|
| - !document_->GetContentSecurityPolicy()->AllowRequest(
|
| - resource_request.GetRequestContext(), url,
|
| - options.content_security_policy_nonce, options.integrity_metadata,
|
| - options.parser_disposition, redirect_status, reporting_policy))
|
| - return ResourceRequestBlockedReason::CSP;
|
| + // We check the 'report-only' headers before upgrading the request (in
|
| + // populateResourceRequest). We check the enforced headers here to ensure we
|
| + // block things we ought to block.
|
| + if (CheckCSPForRequest(resource_request, url, options, reporting_policy,
|
| + redirect_status,
|
| + kContentSecurityPolicyHeaderTypeEnforce) ==
|
| + ResourceRequestBlockedReason::CSP) {
|
| + return ResourceRequestBlockedReason::CSP;
|
| }
|
|
|
| if (type == Resource::kScript || type == Resource::kImportResource) {
|
| @@ -863,6 +878,31 @@ ResourceRequestBlockedReason FrameFetchContext::CanRequestInternal(
|
| return ResourceRequestBlockedReason::kNone;
|
| }
|
|
|
| +ResourceRequestBlockedReason FrameFetchContext::CheckCSPForRequest(
|
| + const ResourceRequest& resource_request,
|
| + const KURL& url,
|
| + const ResourceLoaderOptions& options,
|
| + SecurityViolationReportingPolicy reporting_policy,
|
| + ResourceRequest::RedirectStatus redirect_status,
|
| + ContentSecurityPolicyHeaderType header_type) const {
|
| + if (GetFrame()->GetScriptController().ShouldBypassMainWorldCSP() ||
|
| + options.content_security_policy_option ==
|
| + kDoNotCheckContentSecurityPolicy) {
|
| + return ResourceRequestBlockedReason::kNone;
|
| + }
|
| +
|
| + if (document_) {
|
| + DCHECK(document_->GetContentSecurityPolicy());
|
| + if (!document_->GetContentSecurityPolicy()->AllowRequest(
|
| + resource_request.GetRequestContext(), url,
|
| + options.content_security_policy_nonce, options.integrity_metadata,
|
| + options.parser_disposition, redirect_status, reporting_policy,
|
| + header_type))
|
| + return ResourceRequestBlockedReason::CSP;
|
| + }
|
| + return ResourceRequestBlockedReason::kNone;
|
| +}
|
| +
|
| bool FrameFetchContext::IsControlledByServiceWorker() const {
|
| DCHECK(MasterDocumentLoader());
|
|
|
| @@ -1003,11 +1043,22 @@ void FrameFetchContext::AddCSPHeaderIfNecessary(Resource::Type type,
|
| }
|
|
|
| void FrameFetchContext::PopulateResourceRequest(
|
| + const KURL& url,
|
| Resource::Type type,
|
| const ClientHintsPreferences& hints_preferences,
|
| const FetchRequest::ResourceWidth& resource_width,
|
| + const ResourceLoaderOptions& options,
|
| + SecurityViolationReportingPolicy reporting_policy,
|
| ResourceRequest& request) {
|
| SetFirstPartyCookieAndRequestorOrigin(request);
|
| +
|
| + // Before modifying the request for CSP, evaluate report-only headers. This
|
| + // allows site owners to learn about requests that are being modified
|
| + // (e.g. mixed content that is being upgraded by upgrade-insecure-requests).
|
| + CheckCSPForRequest(request, url, options, reporting_policy,
|
| + request.GetRedirectStatus(),
|
| + kContentSecurityPolicyHeaderTypeReport);
|
| +
|
| ModifyRequestForCSP(request);
|
| AddClientHintsIfNecessary(hints_preferences, resource_width, request);
|
| AddCSPHeaderIfNecessary(type, request);
|
|
|