Index: content/browser/frame_host/render_frame_host_impl.cc |
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc |
index ccd8ee7a90b9ac9e586d7e55cd15a34526814c05..a64bf5be64a3f025792bea402a8d7eb096f1e680 100644 |
--- a/content/browser/frame_host/render_frame_host_impl.cc |
+++ b/content/browser/frame_host/render_frame_host_impl.cc |
@@ -446,6 +446,7 @@ RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, |
static_cast<InputRouterImpl*>(render_widget_host_->input_router()); |
ir->SetFrameTreeNodeId(frame_tree_node_->frame_tree_node_id()); |
} |
+ ResetFeaturePolicy(); |
} |
RenderFrameHostImpl::~RenderFrameHostImpl() { |
@@ -778,8 +779,8 @@ bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { |
OnEnforceInsecureRequestPolicy) |
IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateToUniqueOrigin, |
OnUpdateToUniqueOrigin) |
- IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeSandboxFlags, |
- OnDidChangeSandboxFlags) |
+ IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeFramePolicy, |
+ OnDidChangeFramePolicy) |
IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeFrameOwnerProperties, |
OnDidChangeFrameOwnerProperties) |
IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateTitle, OnUpdateTitle) |
@@ -1097,6 +1098,7 @@ void RenderFrameHostImpl::OnCreateChildFrame( |
const std::string& frame_name, |
const std::string& frame_unique_name, |
blink::WebSandboxFlags sandbox_flags, |
+ const ParsedFeaturePolicyHeader& container_policy, |
const FrameOwnerProperties& frame_owner_properties) { |
// TODO(lukasza): Call ReceivedBadMessage when |frame_unique_name| is empty. |
DCHECK(!frame_unique_name.empty()); |
@@ -1109,9 +1111,9 @@ void RenderFrameHostImpl::OnCreateChildFrame( |
!render_frame_created_) |
return; |
- frame_tree_->AddFrame( |
- frame_tree_node_, GetProcess()->GetID(), new_routing_id, scope, |
- frame_name, frame_unique_name, sandbox_flags, frame_owner_properties); |
+ frame_tree_->AddFrame(frame_tree_node_, GetProcess()->GetID(), new_routing_id, |
+ scope, frame_name, frame_unique_name, sandbox_flags, |
+ container_policy, frame_owner_properties); |
} |
void RenderFrameHostImpl::OnCreateNewWindow( |
@@ -1987,28 +1989,31 @@ FrameTreeNode* RenderFrameHostImpl::FindAndVerifyChild( |
return child; |
} |
-void RenderFrameHostImpl::OnDidChangeSandboxFlags( |
+void RenderFrameHostImpl::OnDidChangeFramePolicy( |
int32_t frame_routing_id, |
- blink::WebSandboxFlags flags) { |
- // Ensure that a frame can only update sandbox flags for its immediate |
- // children. If this is not the case, the renderer is considered malicious |
- // and is killed. |
+ blink::WebSandboxFlags flags, |
+ const ParsedFeaturePolicyHeader& container_policy) { |
+ // Ensure that a frame can only update sandbox flags or feature policy for its |
+ // immediate children. If this is not the case, the renderer is considered |
+ // malicious and is killed. |
FrameTreeNode* child = FindAndVerifyChild( |
+ // TODO(iclelland): Rename this message |
frame_routing_id, bad_message::RFH_SANDBOX_FLAGS); |
if (!child) |
return; |
child->SetPendingSandboxFlags(flags); |
+ child->SetPendingContainerPolicy(container_policy); |
- // Notify the RenderFrame if it lives in a different process from its |
- // parent. The frame's proxies in other processes also need to learn about |
- // the updated sandbox flags, but these notifications are sent later in |
- // RenderFrameHostManager::CommitPendingSandboxFlags(), when the frame |
- // navigates and the new sandbox flags take effect. |
+ // Notify the RenderFrame if it lives in a different process from its parent. |
+ // The frame's proxies in other processes also need to learn about the updated |
+ // flags and policy, but these notifications are sent later in |
+ // RenderFrameHostManager::CommitPendingFramePolicy(), when the frame |
+ // navigates and the new policies take effect. |
RenderFrameHost* child_rfh = child->current_frame_host(); |
if (child_rfh->GetSiteInstance() != GetSiteInstance()) { |
- child_rfh->Send( |
- new FrameMsg_DidUpdateSandboxFlags(child_rfh->GetRoutingID(), flags)); |
+ child_rfh->Send(new FrameMsg_DidUpdateFramePolicy(child_rfh->GetRoutingID(), |
+ flags, container_policy)); |
} |
} |
@@ -3498,8 +3503,8 @@ void RenderFrameHostImpl::ResetFeaturePolicy() { |
RenderFrameHostImpl* parent_frame_host = GetParent(); |
const FeaturePolicy* parent_policy = |
parent_frame_host ? parent_frame_host->get_feature_policy() : nullptr; |
- // TODO(iclelland): Get the frame owner properties here to reset properly. |
- ParsedFeaturePolicyHeader container_policy; |
+ ParsedFeaturePolicyHeader container_policy = |
+ frame_tree_node()->effective_container_policy(); |
feature_policy_ = FeaturePolicy::CreateFromParentPolicy( |
parent_policy, container_policy, last_committed_origin_); |
} |