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

Unified Diff: content/browser/frame_host/render_frame_host_impl.cc

Issue 616133002: Make RenderFrame(Host) own a RenderWidget(Host). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Moved InitForFrame call, addressed other comments Created 5 years, 11 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 side-by-side diff with in-line comments
Download patch
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 af0c6fcc9a43af5997fc99815ca11e7f44696bee..c8038f180b7b343d02032b0381b95de57ec3394e 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -119,6 +119,7 @@ RenderFrameHostImpl* RenderFrameHostImpl::FromID(int process_id,
RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host,
RenderFrameHostDelegate* delegate,
+ RenderWidgetHostDelegate* rwh_delegate,
FrameTree* frame_tree,
FrameTreeNode* frame_tree_node,
int routing_id,
@@ -139,6 +140,7 @@ RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host,
no_create_browser_accessibility_manager_for_testing_(false),
weak_ptr_factory_(this) {
bool is_swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT);
+ bool hidden = !!(flags & CREATE_RF_HIDDEN);
frame_tree_->RegisterRenderFrameHost(this);
GetProcess()->AddRoute(routing_id_, this);
g_routing_id_frame_map.Get().insert(std::make_pair(
@@ -155,6 +157,12 @@ RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host,
SetUpMojoIfNeeded();
swapout_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind(
&RenderFrameHostImpl::OnSwappedOut, weak_ptr_factory_.GetWeakPtr())));
+
+ if (flags & CREATE_RF_NEEDS_RENDER_WIDGET_HOST) {
+ render_widget_host_.reset(new RenderWidgetHostImpl(
+ rwh_delegate, GetProcess(), MSG_ROUTING_NONE, hidden));
+ render_widget_host_->set_owned_by_render_frame_host(true);
+ }
}
RenderFrameHostImpl::~RenderFrameHostImpl() {
@@ -179,6 +187,9 @@ RenderFrameHostImpl::~RenderFrameHostImpl() {
// NULL out the swapout timer; in crash dumps this member will be null only if
// the dtor has run.
swapout_event_monitor_timeout_.reset();
+
+ if (render_widget_host_)
+ render_widget_host_->Cleanup();
Charlie Reis 2015/01/15 23:06:27 nit: 2 space indent in Chromium.
kenrb 2015/01/16 17:44:00 Done.
}
int RenderFrameHostImpl::GetRoutingID() {
@@ -509,13 +520,35 @@ bool RenderFrameHostImpl::CreateRenderFrame(int parent_routing_id,
DCHECK(GetProcess()->HasConnection());
- Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id, proxy_routing_id));
+ FrameMsg_NewFrame_WidgetParams widget_params;
+ if (render_widget_host_) {
+ widget_params.routing_id = render_widget_host_->GetRoutingID();
+ widget_params.surface_id = render_widget_host_->surface_id();
+ widget_params.hidden = render_widget_host_->is_hidden();
+ } else {
+ // MSG_ROUTING_NONE will prevent a new RenderWidget from being created in
+ // the renderer process.
+ widget_params.routing_id = MSG_ROUTING_NONE;
+ widget_params.surface_id = 0;
+ widget_params.hidden = true;
+ }
+
+ Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id, proxy_routing_id,
+ widget_params));
+
+ // The RenderWidgetHost takes ownership of its view. It is tied to the
+ // lifetime of the current RenderProcessHost for this RenderFrameHost.
+ if (render_widget_host_) {
+ RenderWidgetHostView* rwhv =
+ new RenderWidgetHostViewChildFrame(render_widget_host_.get());
+ rwhv->Hide();
+ }
// The renderer now has a RenderFrame for this RenderFrameHost. Note that
// this path is only used for out-of-process iframes. Main frame RenderFrames
// are created with their RenderView, and same-site iframes are created at the
// time of OnCreateChildFrame.
- set_render_frame_created(true);
+ SetRenderFrameCreated(true);
return true;
}
@@ -534,6 +567,12 @@ bool RenderFrameHostImpl::IsRenderFrameLive() {
return is_live;
}
+void RenderFrameHostImpl::SetRenderFrameCreated(bool created) {
+ render_frame_created_ = created;
Charlie Reis 2015/01/15 23:06:27 nit: 2 space indent in Chromium.
kenrb 2015/01/16 17:44:00 Done.
+ if (created && render_widget_host_)
Charlie Reis 2015/01/15 23:06:27 Do we need to clear RenderWidgetHostImpl::renderer
kenrb 2015/01/16 17:44:00 This is a good point, the flag doesn't get reset.
+ render_widget_host_->InitForFrame();
+}
+
void RenderFrameHostImpl::Init() {
GetProcess()->ResumeRequestsForView(routing_id_);
}
@@ -572,7 +611,7 @@ void RenderFrameHostImpl::OnCreateChildFrame(int new_routing_id,
// We know that the RenderFrame has been created in this case, immediately
// after the CreateChildFrame IPC was sent.
- new_frame->set_render_frame_created(true);
+ new_frame->SetRenderFrameCreated(true);
if (delegate_)
delegate_->RenderFrameCreated(new_frame);
@@ -721,7 +760,27 @@ void RenderFrameHostImpl::OnDidDropNavigation() {
}
RenderWidgetHostImpl* RenderFrameHostImpl::GetRenderWidgetHost() {
- return static_cast<RenderWidgetHostImpl*>(render_view_host_);
+ if (render_widget_host_)
+ return render_widget_host_.get();
+
+ // TODO(kenrb): When RenderViewHost no longer inherits RenderWidgetHost,
+ // we can remove this fallback. Currently it is only used for the main
+ // frame.
+ if (!GetParent())
+ return static_cast<RenderWidgetHostImpl*>(render_view_host_);
+
+ return nullptr;
+}
+
+RenderWidgetHostView* RenderFrameHostImpl::GetView() {
+ RenderFrameHostImpl* frame = this;
+ while (frame) {
+ if (frame->render_widget_host_)
+ return frame->render_widget_host_->GetView();
+ frame = static_cast<RenderFrameHostImpl*>(frame->GetParent());
+ }
+
+ return render_view_host_->GetView();
}
int RenderFrameHostImpl::GetEnabledBindings() {

Powered by Google App Engine
This is Rietveld 408576698