Chromium Code Reviews| 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 b95ef8cd1813dfa5d0afa24501567072255ab1ac..59cf37d0a81bc5620713bbf07b0e2409ad20d79f 100644 |
| --- a/content/browser/frame_host/render_frame_host_impl.cc |
| +++ b/content/browser/frame_host/render_frame_host_impl.cc |
| @@ -82,6 +82,7 @@ |
| #include "content/public/browser/storage_partition.h" |
| #include "content/public/browser/stream_handle.h" |
| #include "content/public/browser/user_metrics.h" |
| +#include "content/public/common/bindings_policy.h" |
| #include "content/public/common/browser_side_navigation_policy.h" |
| #include "content/public/common/content_constants.h" |
| #include "content/public/common/content_features.h" |
| @@ -953,6 +954,12 @@ void RenderFrameHostImpl::SetRenderFrameCreated(bool created) { |
| if (created && render_widget_host_) |
| render_widget_host_->InitForFrame(); |
| + |
| + if (enabled_bindings_) { |
|
Charlie Reis
2017/01/18 22:18:43
Should this also check |created|? I'm guessing we
Sam McNally
2017/01/19 05:30:37
Done.
|
| + if (!frame_bindings_control_) |
| + GetRemoteAssociatedInterfaces()->GetInterface(&frame_bindings_control_); |
| + frame_bindings_control_->AllowBindings(enabled_bindings_); |
| + } |
| } |
| void RenderFrameHostImpl::Init() { |
| @@ -1018,9 +1025,15 @@ void RenderFrameHostImpl::OnCreateChildFrame( |
| if (!is_active() || frame_tree_node_->current_frame_host() != this) |
| return; |
| - frame_tree_->AddFrame(frame_tree_node_, GetProcess()->GetID(), new_routing_id, |
| - scope, frame_name, frame_unique_name, sandbox_flags, |
| - frame_owner_properties); |
| + bool added = frame_tree_->AddFrame( |
|
Charlie Reis
2017/01/18 22:18:43
Note that AddFrame already calls SetRenderFrameCre
Sam McNally
2017/01/19 05:30:37
Done.
Charlie Reis
2017/01/19 17:58:55
Thanks! That looks better.
|
| + frame_tree_node_, GetProcess()->GetID(), new_routing_id, scope, |
| + frame_name, frame_unique_name, sandbox_flags, frame_owner_properties); |
| + |
| + if (added && enabled_bindings_) { |
| + frame_tree_->FindByRoutingID(GetProcess()->GetID(), new_routing_id) |
| + ->current_frame_host() |
| + ->AllowBindings(enabled_bindings_); |
| + } |
| } |
| void RenderFrameHostImpl::OnCreateNewWindow( |
| @@ -1344,10 +1357,6 @@ GlobalFrameRoutingId RenderFrameHostImpl::GetGlobalFrameRoutingId() { |
| return GlobalFrameRoutingId(GetProcess()->GetID(), GetRoutingID()); |
| } |
| -int RenderFrameHostImpl::GetEnabledBindings() { |
| - return render_view_host_->GetEnabledBindings(); |
| -} |
| - |
| void RenderFrameHostImpl::SetNavigationHandle( |
| std::unique_ptr<NavigationHandleImpl> navigation_handle) { |
| navigation_handle_ = std::move(navigation_handle); |
| @@ -1730,6 +1739,48 @@ void RenderFrameHostImpl::RequestFocusedFormFieldData( |
| Send(new FrameMsg_FocusedFormFieldDataRequest(GetRoutingID(), request_id)); |
| } |
| +void RenderFrameHostImpl::AllowBindings(int bindings_flags) { |
| + // Never grant any bindings to browser plugin guests. |
| + if (GetProcess()->IsForGuestsOnly()) { |
| + NOTREACHED() << "Never grant bindings to a guest process."; |
| + return; |
| + } |
| + |
| + // Ensure we aren't granting WebUI bindings to a process that has already |
| + // been used for non-privileged views. |
| + if (bindings_flags & BINDINGS_POLICY_WEB_UI && |
| + GetProcess()->HasConnection() && |
| + !ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( |
| + GetProcess()->GetID())) { |
| + // This process has no bindings yet. Make sure it does not have more |
| + // than this single active view. |
| + // --single-process only has one renderer. |
| + if (GetProcess()->GetActiveViewCount() > 1 && |
| + !base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kSingleProcess)) |
| + return; |
| + } |
| + |
| + if (bindings_flags & BINDINGS_POLICY_WEB_UI) { |
| + ChildProcessSecurityPolicyImpl::GetInstance()->GrantWebUIBindings( |
| + GetProcess()->GetID()); |
| + } |
| + |
| + enabled_bindings_ |= bindings_flags; |
| + if (GetParent()) |
| + DCHECK_EQ(GetParent()->GetEnabledBindings(), GetEnabledBindings()); |
| + |
| + if (render_frame_created_) { |
| + if (!frame_bindings_control_) |
| + GetRemoteAssociatedInterfaces()->GetInterface(&frame_bindings_control_); |
| + frame_bindings_control_->AllowBindings(enabled_bindings_); |
| + } |
| +} |
| + |
| +int RenderFrameHostImpl::GetEnabledBindings() const { |
| + return enabled_bindings_; |
| +} |
| + |
| void RenderFrameHostImpl::OnFocusedFormFieldDataResponse( |
| int request_id, |
| const FormFieldData& field_data) { |
| @@ -2720,6 +2771,7 @@ void RenderFrameHostImpl::InvalidateMojoConnection() { |
| frame_.reset(); |
| frame_host_binding_.Close(); |
| + frame_bindings_control_.reset(); |
| // Disconnect with ImageDownloader Mojo service in RenderFrame. |
| mojo_image_downloader_.reset(); |
| @@ -2780,9 +2832,8 @@ bool RenderFrameHostImpl::UpdatePendingWebUI(const GURL& dest_url, |
| // If a WebUI was created for the URL and the RenderView is not in a guest |
| // process, then enable missing bindings with the RenderViewHost. |
|
Charlie Reis
2017/01/18 22:18:43
nit: Drop "with the RenderViewHost."
Sam McNally
2017/01/19 05:30:37
Done.
|
| int new_bindings = pending_web_ui_->GetBindings(); |
| - if ((render_view_host_->GetEnabledBindings() & new_bindings) != |
| - new_bindings) { |
| - render_view_host_->AllowBindings(new_bindings); |
| + if ((GetEnabledBindings() & new_bindings) != new_bindings) { |
| + AllowBindings(new_bindings); |
| } |
| } else if (render_view_host_->is_active()) { |
| // If the ongoing navigation is not to a WebUI or the RenderView is in a |