| Index: content/browser/frame_host/navigation_request.cc
|
| diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc
|
| index dee3a58b6062ec0d4149f9987fbe643216bec222..0032db2aa93c93fff0d773833216f7824be6d819 100644
|
| --- a/content/browser/frame_host/navigation_request.cc
|
| +++ b/content/browser/frame_host/navigation_request.cc
|
| @@ -943,9 +943,43 @@ NavigationRequest::CheckContentSecurityPolicyFrameSrc(bool is_redirect) {
|
| RenderFrameHostImpl* parent = parent_ftn->current_frame_host();
|
| DCHECK(parent);
|
|
|
| + // CSP checking happens in three phases, per steps 3-5 of
|
| + // https://fetch.spec.whatwg.org/#main-fetch:
|
| + //
|
| + // (1) Check report-only policies and trigger reports for any violations.
|
| + // (2) Upgrade the request to HTTPS if necessary.
|
| + // (3) Check enforced policies (triggering reports for any violations of those
|
| + // policies) and block the request if necessary.
|
| + //
|
| + // This sequence of events allows site owners to learn about (via step 1) any
|
| + // requests that are upgraded in step 2.
|
| +
|
| + bool allowed = parent->IsAllowedByCsp(
|
| + CSPDirective::FrameSrc, common_params_.url, is_redirect,
|
| + common_params_.source_location.value_or(SourceLocation()),
|
| + CSPContext::CHECK_REPORT_ONLY_CSP);
|
| +
|
| + // Checking report-only CSP should never return false because no requests are
|
| + // blocked by report-only policies.
|
| + DCHECK(allowed);
|
| +
|
| + // TODO(mkwst,estark): upgrade-insecure-requests does not work when following
|
| + // redirects. Trying to uprade the new URL on redirect here is fruitless: the
|
| + // redirect URL cannot be changed at this point. upgrade-insecure-requests
|
| + // needs to move to the net stack to resolve this. https://crbug.com/615885
|
| + if (!is_redirect) {
|
| + GURL new_url;
|
| + if (parent->ShouldModifyRequestUrlForCsp(
|
| + common_params_.url, true /* is subresource */, &new_url)) {
|
| + common_params_.url = new_url;
|
| + request_params_.original_url = new_url;
|
| + }
|
| + }
|
| +
|
| if (parent->IsAllowedByCsp(
|
| CSPDirective::FrameSrc, common_params_.url, is_redirect,
|
| - common_params_.source_location.value_or(SourceLocation()))) {
|
| + common_params_.source_location.value_or(SourceLocation()),
|
| + CSPContext::CHECK_ENFORCED_CSP)) {
|
| return CONTENT_SECURITY_POLICY_CHECK_PASSED;
|
| }
|
|
|
|
|