Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(409)

Side by Side Diff: content/browser/frame_host/render_frame_host_impl.cc

Issue 2797813002: Replicate feature policy container policies. (Closed)
Patch Set: Addressing review comments Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/frame_host/render_frame_host_impl.h" 5 #include "content/browser/frame_host/render_frame_host_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 render_widget_host_ = new RenderWidgetHostImpl(rwh_delegate, GetProcess(), 439 render_widget_host_ = new RenderWidgetHostImpl(rwh_delegate, GetProcess(),
440 widget_routing_id, hidden); 440 widget_routing_id, hidden);
441 render_widget_host_->set_owned_by_render_frame_host(true); 441 render_widget_host_->set_owned_by_render_frame_host(true);
442 } else { 442 } else {
443 DCHECK(!render_widget_host_->owned_by_render_frame_host()); 443 DCHECK(!render_widget_host_->owned_by_render_frame_host());
444 } 444 }
445 InputRouterImpl* ir = 445 InputRouterImpl* ir =
446 static_cast<InputRouterImpl*>(render_widget_host_->input_router()); 446 static_cast<InputRouterImpl*>(render_widget_host_->input_router());
447 ir->SetFrameTreeNodeId(frame_tree_node_->frame_tree_node_id()); 447 ir->SetFrameTreeNodeId(frame_tree_node_->frame_tree_node_id());
448 } 448 }
449 ResetFeaturePolicy();
449 } 450 }
450 451
451 RenderFrameHostImpl::~RenderFrameHostImpl() { 452 RenderFrameHostImpl::~RenderFrameHostImpl() {
452 // Destroying navigation handle may call into delegates/observers, 453 // Destroying navigation handle may call into delegates/observers,
453 // so we do it early while |this| object is still in a sane state. 454 // so we do it early while |this| object is still in a sane state.
454 navigation_handle_.reset(); 455 navigation_handle_.reset();
455 456
456 // Release the WebUI instances before all else as the WebUI may accesses the 457 // Release the WebUI instances before all else as the WebUI may accesses the
457 // RenderFrameHost during cleanup. 458 // RenderFrameHost during cleanup.
458 ClearAllWebUI(); 459 ClearAllWebUI();
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
771 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeOpener, OnDidChangeOpener) 772 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeOpener, OnDidChangeOpener)
772 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeName, OnDidChangeName) 773 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeName, OnDidChangeName)
773 IPC_MESSAGE_HANDLER(FrameHostMsg_DidSetFeaturePolicyHeader, 774 IPC_MESSAGE_HANDLER(FrameHostMsg_DidSetFeaturePolicyHeader,
774 OnDidSetFeaturePolicyHeader) 775 OnDidSetFeaturePolicyHeader)
775 IPC_MESSAGE_HANDLER(FrameHostMsg_DidAddContentSecurityPolicies, 776 IPC_MESSAGE_HANDLER(FrameHostMsg_DidAddContentSecurityPolicies,
776 OnDidAddContentSecurityPolicies) 777 OnDidAddContentSecurityPolicies)
777 IPC_MESSAGE_HANDLER(FrameHostMsg_EnforceInsecureRequestPolicy, 778 IPC_MESSAGE_HANDLER(FrameHostMsg_EnforceInsecureRequestPolicy,
778 OnEnforceInsecureRequestPolicy) 779 OnEnforceInsecureRequestPolicy)
779 IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateToUniqueOrigin, 780 IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateToUniqueOrigin,
780 OnUpdateToUniqueOrigin) 781 OnUpdateToUniqueOrigin)
781 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeSandboxFlags, 782 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeFramePolicy,
782 OnDidChangeSandboxFlags) 783 OnDidChangeFramePolicy)
783 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeFrameOwnerProperties, 784 IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeFrameOwnerProperties,
784 OnDidChangeFrameOwnerProperties) 785 OnDidChangeFrameOwnerProperties)
785 IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateTitle, OnUpdateTitle) 786 IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateTitle, OnUpdateTitle)
786 IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateEncoding, OnUpdateEncoding) 787 IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateEncoding, OnUpdateEncoding)
787 IPC_MESSAGE_HANDLER(FrameHostMsg_BeginNavigation, 788 IPC_MESSAGE_HANDLER(FrameHostMsg_BeginNavigation,
788 OnBeginNavigation) 789 OnBeginNavigation)
789 IPC_MESSAGE_HANDLER(FrameHostMsg_AbortNavigation, OnAbortNavigation) 790 IPC_MESSAGE_HANDLER(FrameHostMsg_AbortNavigation, OnAbortNavigation)
790 IPC_MESSAGE_HANDLER(FrameHostMsg_DispatchLoad, OnDispatchLoad) 791 IPC_MESSAGE_HANDLER(FrameHostMsg_DispatchLoad, OnDispatchLoad)
791 IPC_MESSAGE_HANDLER(FrameHostMsg_TextSurroundingSelectionResponse, 792 IPC_MESSAGE_HANDLER(FrameHostMsg_TextSurroundingSelectionResponse,
792 OnTextSurroundingSelectionResponse) 793 OnTextSurroundingSelectionResponse)
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
1090 << ")"; 1091 << ")";
1091 } 1092 }
1092 } 1093 }
1093 1094
1094 void RenderFrameHostImpl::OnCreateChildFrame( 1095 void RenderFrameHostImpl::OnCreateChildFrame(
1095 int new_routing_id, 1096 int new_routing_id,
1096 blink::WebTreeScopeType scope, 1097 blink::WebTreeScopeType scope,
1097 const std::string& frame_name, 1098 const std::string& frame_name,
1098 const std::string& frame_unique_name, 1099 const std::string& frame_unique_name,
1099 blink::WebSandboxFlags sandbox_flags, 1100 blink::WebSandboxFlags sandbox_flags,
1101 const ParsedFeaturePolicyHeader& container_policy,
1100 const FrameOwnerProperties& frame_owner_properties) { 1102 const FrameOwnerProperties& frame_owner_properties) {
1101 // TODO(lukasza): Call ReceivedBadMessage when |frame_unique_name| is empty. 1103 // TODO(lukasza): Call ReceivedBadMessage when |frame_unique_name| is empty.
1102 DCHECK(!frame_unique_name.empty()); 1104 DCHECK(!frame_unique_name.empty());
1103 1105
1104 // The RenderFrame corresponding to this host sent an IPC message to create a 1106 // The RenderFrame corresponding to this host sent an IPC message to create a
1105 // child, but by the time we get here, it's possible for the host to have been 1107 // child, but by the time we get here, it's possible for the host to have been
1106 // swapped out, or for its process to have disconnected (maybe due to browser 1108 // swapped out, or for its process to have disconnected (maybe due to browser
1107 // shutdown). Ignore such messages. 1109 // shutdown). Ignore such messages.
1108 if (!is_active() || frame_tree_node_->current_frame_host() != this || 1110 if (!is_active() || frame_tree_node_->current_frame_host() != this ||
1109 !render_frame_created_) 1111 !render_frame_created_)
1110 return; 1112 return;
1111 1113
1112 frame_tree_->AddFrame( 1114 frame_tree_->AddFrame(frame_tree_node_, GetProcess()->GetID(), new_routing_id,
1113 frame_tree_node_, GetProcess()->GetID(), new_routing_id, scope, 1115 scope, frame_name, frame_unique_name, sandbox_flags,
1114 frame_name, frame_unique_name, sandbox_flags, frame_owner_properties); 1116 container_policy, frame_owner_properties);
1115 } 1117 }
1116 1118
1117 void RenderFrameHostImpl::OnCreateNewWindow( 1119 void RenderFrameHostImpl::OnCreateNewWindow(
1118 int32_t render_view_route_id, 1120 int32_t render_view_route_id,
1119 int32_t main_frame_route_id, 1121 int32_t main_frame_route_id,
1120 int32_t main_frame_widget_route_id, 1122 int32_t main_frame_widget_route_id,
1121 const mojom::CreateNewWindowParams& params, 1123 const mojom::CreateNewWindowParams& params,
1122 SessionStorageNamespace* session_storage_namespace) { 1124 SessionStorageNamespace* session_storage_namespace) {
1123 mojom::CreateNewWindowParamsPtr validated_params(params.Clone()); 1125 mojom::CreateNewWindowParamsPtr validated_params(params.Clone());
1124 GetProcess()->FilterURL(false, &validated_params->target_url); 1126 GetProcess()->FilterURL(false, &validated_params->target_url);
(...skipping 855 matching lines...) Expand 10 before | Expand all | Expand 10 after
1980 GetProcess()->GetID(), child_frame_routing_id); 1982 GetProcess()->GetID(), child_frame_routing_id);
1981 // A race can result in |child| to be nullptr. Avoid killing the renderer in 1983 // A race can result in |child| to be nullptr. Avoid killing the renderer in
1982 // that case. 1984 // that case.
1983 if (child && child->parent() != frame_tree_node()) { 1985 if (child && child->parent() != frame_tree_node()) {
1984 bad_message::ReceivedBadMessage(GetProcess(), reason); 1986 bad_message::ReceivedBadMessage(GetProcess(), reason);
1985 return nullptr; 1987 return nullptr;
1986 } 1988 }
1987 return child; 1989 return child;
1988 } 1990 }
1989 1991
1990 void RenderFrameHostImpl::OnDidChangeSandboxFlags( 1992 void RenderFrameHostImpl::OnDidChangeFramePolicy(
1991 int32_t frame_routing_id, 1993 int32_t frame_routing_id,
1992 blink::WebSandboxFlags flags) { 1994 blink::WebSandboxFlags flags,
1993 // Ensure that a frame can only update sandbox flags for its immediate 1995 const ParsedFeaturePolicyHeader& container_policy) {
1994 // children. If this is not the case, the renderer is considered malicious 1996 // Ensure that a frame can only update sandbox flags or feature policy for its
1995 // and is killed. 1997 // immediate children. If this is not the case, the renderer is considered
1998 // malicious and is killed.
1996 FrameTreeNode* child = FindAndVerifyChild( 1999 FrameTreeNode* child = FindAndVerifyChild(
2000 // TODO(iclelland): Rename this message
1997 frame_routing_id, bad_message::RFH_SANDBOX_FLAGS); 2001 frame_routing_id, bad_message::RFH_SANDBOX_FLAGS);
1998 if (!child) 2002 if (!child)
1999 return; 2003 return;
2000 2004
2001 child->SetPendingSandboxFlags(flags); 2005 child->SetPendingSandboxFlags(flags);
2006 child->SetPendingContainerPolicy(container_policy);
2002 2007
2003 // Notify the RenderFrame if it lives in a different process from its 2008 // Notify the RenderFrame if it lives in a different process from its parent.
2004 // parent. The frame's proxies in other processes also need to learn about 2009 // The frame's proxies in other processes also need to learn about the updated
2005 // the updated sandbox flags, but these notifications are sent later in 2010 // flags and policy, but these notifications are sent later in
2006 // RenderFrameHostManager::CommitPendingSandboxFlags(), when the frame 2011 // RenderFrameHostManager::CommitPendingFramePolicy(), when the frame
2007 // navigates and the new sandbox flags take effect. 2012 // navigates and the new policies take effect.
2008 RenderFrameHost* child_rfh = child->current_frame_host(); 2013 RenderFrameHost* child_rfh = child->current_frame_host();
2009 if (child_rfh->GetSiteInstance() != GetSiteInstance()) { 2014 if (child_rfh->GetSiteInstance() != GetSiteInstance()) {
2010 child_rfh->Send( 2015 child_rfh->Send(new FrameMsg_DidUpdateFramePolicy(child_rfh->GetRoutingID(),
2011 new FrameMsg_DidUpdateSandboxFlags(child_rfh->GetRoutingID(), flags)); 2016 flags, container_policy));
2012 } 2017 }
2013 } 2018 }
2014 2019
2015 void RenderFrameHostImpl::OnDidChangeFrameOwnerProperties( 2020 void RenderFrameHostImpl::OnDidChangeFrameOwnerProperties(
2016 int32_t frame_routing_id, 2021 int32_t frame_routing_id,
2017 const FrameOwnerProperties& properties) { 2022 const FrameOwnerProperties& properties) {
2018 FrameTreeNode* child = FindAndVerifyChild( 2023 FrameTreeNode* child = FindAndVerifyChild(
2019 frame_routing_id, bad_message::RFH_OWNER_PROPERTY); 2024 frame_routing_id, bad_message::RFH_OWNER_PROPERTY);
2020 if (!child) 2025 if (!child)
2021 return; 2026 return;
(...skipping 1469 matching lines...) Expand 10 before | Expand all | Expand 10 after
3491 return web_bluetooth_service == service.get(); 3496 return web_bluetooth_service == service.get();
3492 }); 3497 });
3493 DCHECK(it != web_bluetooth_services_.end()); 3498 DCHECK(it != web_bluetooth_services_.end());
3494 web_bluetooth_services_.erase(it); 3499 web_bluetooth_services_.erase(it);
3495 } 3500 }
3496 3501
3497 void RenderFrameHostImpl::ResetFeaturePolicy() { 3502 void RenderFrameHostImpl::ResetFeaturePolicy() {
3498 RenderFrameHostImpl* parent_frame_host = GetParent(); 3503 RenderFrameHostImpl* parent_frame_host = GetParent();
3499 const FeaturePolicy* parent_policy = 3504 const FeaturePolicy* parent_policy =
3500 parent_frame_host ? parent_frame_host->get_feature_policy() : nullptr; 3505 parent_frame_host ? parent_frame_host->get_feature_policy() : nullptr;
3501 // TODO(iclelland): Get the frame owner properties here to reset properly. 3506 ParsedFeaturePolicyHeader container_policy =
3502 ParsedFeaturePolicyHeader container_policy; 3507 frame_tree_node()->effective_container_policy();
3503 feature_policy_ = FeaturePolicy::CreateFromParentPolicy( 3508 feature_policy_ = FeaturePolicy::CreateFromParentPolicy(
3504 parent_policy, container_policy, last_committed_origin_); 3509 parent_policy, container_policy, last_committed_origin_);
3505 } 3510 }
3506 3511
3507 void RenderFrameHostImpl::Create( 3512 void RenderFrameHostImpl::Create(
3508 const service_manager::Identity& remote_identity, 3513 const service_manager::Identity& remote_identity,
3509 media::mojom::InterfaceFactoryRequest request) { 3514 media::mojom::InterfaceFactoryRequest request) {
3510 DCHECK(!media_interface_proxy_); 3515 DCHECK(!media_interface_proxy_);
3511 media_interface_proxy_.reset(new MediaInterfaceProxy( 3516 media_interface_proxy_.reset(new MediaInterfaceProxy(
3512 this, std::move(request), 3517 this, std::move(request),
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
3664 } 3669 }
3665 3670
3666 void RenderFrameHostImpl::ForwardGetInterfaceToRenderFrame( 3671 void RenderFrameHostImpl::ForwardGetInterfaceToRenderFrame(
3667 const std::string& interface_name, 3672 const std::string& interface_name,
3668 mojo::ScopedMessagePipeHandle pipe) { 3673 mojo::ScopedMessagePipeHandle pipe) {
3669 GetRemoteInterfaces()->GetInterface(interface_name, std::move(pipe)); 3674 GetRemoteInterfaces()->GetInterface(interface_name, std::move(pipe));
3670 } 3675 }
3671 #endif 3676 #endif
3672 3677
3673 } // namespace content 3678 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/render_frame_host_impl.h ('k') | content/browser/frame_host/render_frame_host_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698