| // Copyright 2021 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "content/browser/renderer_host/render_frame_host_csp_context.h" | 
 |  | 
 | #include "content/browser/renderer_host/render_frame_host_impl.h" | 
 | #include "services/network/public/mojom/content_security_policy.mojom.h" | 
 |  | 
 | namespace content { | 
 |  | 
 | RenderFrameHostCSPContext::RenderFrameHostCSPContext( | 
 |     RenderFrameHostImpl* render_frame_host) | 
 |     : render_frame_host_(render_frame_host) {} | 
 |  | 
 | void RenderFrameHostCSPContext::ReportContentSecurityPolicyViolation( | 
 |     network::mojom::CSPViolationPtr violation_params) { | 
 |   if (!render_frame_host_) | 
 |     return; | 
 |   render_frame_host_->GetAssociatedLocalFrame() | 
 |       ->ReportContentSecurityPolicyViolation(std::move(violation_params)); | 
 | } | 
 |  | 
 | void RenderFrameHostCSPContext::SanitizeDataForUseInCspViolation( | 
 |     network::mojom::CSPDirectiveName directive, | 
 |     GURL* blocked_url, | 
 |     network::mojom::SourceLocation* source_location) const { | 
 |   DCHECK(blocked_url); | 
 |   DCHECK(source_location); | 
 |   GURL source_location_url(source_location->url); | 
 |  | 
 |   // The main goal of this is to avoid leaking information between potentially | 
 |   // separate renderers, in the event of one of them being compromised. | 
 |   // See https://crbug.com/633306. | 
 |   // | 
 |   // We need to sanitize the `blocked_url` only for frame-src and | 
 |   // fenced-frame-src. All other directive checks pass as `blocked_url` the | 
 |   // initial URL (before redirects), which the renderer already knows. check in | 
 |   // the browser is reporting to the wrong frame. | 
 |   bool sanitize_blocked_url = | 
 |       directive == network::mojom::CSPDirectiveName::FrameSrc || | 
 |       directive == network::mojom::CSPDirectiveName::FencedFrameSrc; | 
 |   bool sanitize_source_location = true; | 
 |  | 
 |   // There is no need to sanitize data when it is same-origin with the current | 
 |   // url of the renderer. | 
 |   if (render_frame_host_) { | 
 |     if (render_frame_host_->GetLastCommittedOrigin().IsSameOriginWith( | 
 |             *blocked_url)) { | 
 |       sanitize_blocked_url = false; | 
 |     } | 
 |     if (render_frame_host_->GetLastCommittedOrigin().IsSameOriginWith( | 
 |             source_location_url)) { | 
 |       sanitize_source_location = false; | 
 |     } | 
 |   } | 
 |  | 
 |   if (sanitize_blocked_url) | 
 |     *blocked_url = blocked_url->DeprecatedGetOriginAsURL(); | 
 |   if (sanitize_source_location) { | 
 |     source_location->url = | 
 |         source_location_url.DeprecatedGetOriginAsURL().spec(); | 
 |     source_location->line = 0u; | 
 |     source_location->column = 0u; | 
 |   } | 
 | } | 
 |  | 
 | }  // namespace content |