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

Side by Side 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: Fixed output surface problems, combined RenderFrame and RenderWidget creation Created 6 years, 2 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 "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/containers/hash_tables.h" 9 #include "base/containers/hash_tables.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 int routing_id) { 165 int routing_id) {
166 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 166 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
167 RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer(); 167 RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer();
168 RoutingIDFrameMap::iterator it = frames->find( 168 RoutingIDFrameMap::iterator it = frames->find(
169 RenderFrameHostID(process_id, routing_id)); 169 RenderFrameHostID(process_id, routing_id));
170 return it == frames->end() ? NULL : it->second; 170 return it == frames->end() ? NULL : it->second;
171 } 171 }
172 172
173 RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host, 173 RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host,
174 RenderFrameHostDelegate* delegate, 174 RenderFrameHostDelegate* delegate,
175 RenderWidgetHostDelegate* rwh_delegate,
175 FrameTree* frame_tree, 176 FrameTree* frame_tree,
176 FrameTreeNode* frame_tree_node, 177 FrameTreeNode* frame_tree_node,
177 int routing_id, 178 int routing_id,
178 bool is_swapped_out) 179 int flags)
179 : render_view_host_(render_view_host), 180 : render_view_host_(render_view_host),
180 delegate_(delegate), 181 delegate_(delegate),
181 cross_process_frame_connector_(NULL), 182 cross_process_frame_connector_(NULL),
182 render_frame_proxy_host_(NULL), 183 render_frame_proxy_host_(NULL),
183 frame_tree_(frame_tree), 184 frame_tree_(frame_tree),
184 frame_tree_node_(frame_tree_node), 185 frame_tree_node_(frame_tree_node),
185 routing_id_(routing_id), 186 routing_id_(routing_id),
186 render_frame_created_(false), 187 render_frame_created_(false),
187 navigations_suspended_(false), 188 navigations_suspended_(false),
188 is_waiting_for_beforeunload_ack_(false), 189 is_waiting_for_beforeunload_ack_(false),
189 unload_ack_is_for_cross_site_transition_(false), 190 unload_ack_is_for_cross_site_transition_(false),
190 weak_ptr_factory_(this) { 191 weak_ptr_factory_(this) {
192 bool is_swapped_out = flags & SWAPPED_OUT;
193 bool hidden = flags & HIDDEN;
191 frame_tree_->RegisterRenderFrameHost(this); 194 frame_tree_->RegisterRenderFrameHost(this);
192 GetProcess()->AddRoute(routing_id_, this); 195 GetProcess()->AddRoute(routing_id_, this);
193 g_routing_id_frame_map.Get().insert(std::make_pair( 196 g_routing_id_frame_map.Get().insert(std::make_pair(
194 RenderFrameHostID(GetProcess()->GetID(), routing_id_), 197 RenderFrameHostID(GetProcess()->GetID(), routing_id_),
195 this)); 198 this));
196 199
197 if (is_swapped_out) { 200 if (is_swapped_out) {
198 rfh_state_ = STATE_SWAPPED_OUT; 201 rfh_state_ = STATE_SWAPPED_OUT;
199 } else { 202 } else {
200 rfh_state_ = STATE_DEFAULT; 203 rfh_state_ = STATE_DEFAULT;
201 GetSiteInstance()->increment_active_frame_count(); 204 GetSiteInstance()->increment_active_frame_count();
202 } 205 }
203 206
204 if (GetProcess()->GetServiceRegistry()) { 207 if (GetProcess()->GetServiceRegistry()) {
205 RenderFrameSetupPtr setup; 208 RenderFrameSetupPtr setup;
206 GetProcess()->GetServiceRegistry()->ConnectToRemoteService(&setup); 209 GetProcess()->GetServiceRegistry()->ConnectToRemoteService(&setup);
207 mojo::ServiceProviderPtr service_provider; 210 mojo::ServiceProviderPtr service_provider;
208 setup->GetServiceProviderForFrame(routing_id_, 211 setup->GetServiceProviderForFrame(routing_id_,
209 mojo::Get(&service_provider)); 212 mojo::Get(&service_provider));
210 service_registry_.BindRemoteServiceProvider( 213 service_registry_.BindRemoteServiceProvider(
211 service_provider.PassMessagePipe()); 214 service_provider.PassMessagePipe());
212 } 215 }
213 216
214 swapout_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind( 217 swapout_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind(
215 &RenderFrameHostImpl::OnSwappedOut, weak_ptr_factory_.GetWeakPtr()))); 218 &RenderFrameHostImpl::OnSwappedOut, weak_ptr_factory_.GetWeakPtr())));
219
220 if (flags & CREATE_RENDER_WIDGET_HOST) {
221 render_widget_host_.reset(
222 new RenderWidgetHostImpl(rwh_delegate,
223 GetProcess(),
224 MSG_ROUTING_NONE,
225 hidden));
226 }
216 } 227 }
217 228
218 RenderFrameHostImpl::~RenderFrameHostImpl() { 229 RenderFrameHostImpl::~RenderFrameHostImpl() {
219 GetProcess()->RemoveRoute(routing_id_); 230 GetProcess()->RemoveRoute(routing_id_);
220 g_routing_id_frame_map.Get().erase( 231 g_routing_id_frame_map.Get().erase(
221 RenderFrameHostID(GetProcess()->GetID(), routing_id_)); 232 RenderFrameHostID(GetProcess()->GetID(), routing_id_));
222 233
223 if (delegate_) 234 if (delegate_)
224 delegate_->RenderFrameDeleted(this); 235 delegate_->RenderFrameDeleted(this);
225 236
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 558
548 // The process may (if we're sharing a process with another host that already 559 // The process may (if we're sharing a process with another host that already
549 // initialized it) or may not (we have our own process or the old process 560 // initialized it) or may not (we have our own process or the old process
550 // crashed) have been initialized. Calling Init multiple times will be 561 // crashed) have been initialized. Calling Init multiple times will be
551 // ignored, so this is safe. 562 // ignored, so this is safe.
552 if (!GetProcess()->Init()) 563 if (!GetProcess()->Init())
553 return false; 564 return false;
554 565
555 DCHECK(GetProcess()->HasConnection()); 566 DCHECK(GetProcess()->HasConnection());
556 567
557 Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id)); 568 FrameMsg_NewFrame_WidgetParams widget_params;
569 if (render_widget_host_) {
570 widget_params.routing_id = render_widget_host_->GetRoutingID();
571 widget_params.surface_id = render_widget_host_->surface_id();
572 widget_params.hidden = render_widget_host_->is_hidden();
573 } else {
574 // MSG_ROUTING_NONE will prevent a new RenderWidget from being created in
575 // the renderer process.
576 widget_params.routing_id = MSG_ROUTING_NONE;
577 widget_params.surface_id = 0;
578 widget_params.hidden = true;
579 }
580
581 Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id, widget_params));
582
583 // The lifetime of the view gets tied to the lifetime of the
584 // current render process for this RenderFrameHost.
nasko 2014/10/02 20:41:44 Does that imply that if the process crashes and we
kenrb 2014/10/03 17:23:32 That's the way it is supposed to work, although it
585 if (render_widget_host_)
586 new RenderWidgetHostViewChildFrame(render_widget_host_.get());
558 587
559 // The renderer now has a RenderFrame for this RenderFrameHost. Note that 588 // The renderer now has a RenderFrame for this RenderFrameHost. Note that
560 // this path is only used for out-of-process iframes. Main frame RenderFrames 589 // this path is only used for out-of-process iframes. Main frame RenderFrames
561 // are created with their RenderView, and same-site iframes are created at the 590 // are created with their RenderView, and same-site iframes are created at the
562 // time of OnCreateChildFrame. 591 // time of OnCreateChildFrame.
563 set_render_frame_created(true); 592 set_render_frame_created(true);
564 593
565 return true; 594 return true;
566 } 595 }
567 596
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 if (!render_view_host_->CanAccessFilesOfPageState( 766 if (!render_view_host_->CanAccessFilesOfPageState(
738 validated_params.page_state)) { 767 validated_params.page_state)) {
739 GetProcess()->ReceivedBadMessage(); 768 GetProcess()->ReceivedBadMessage();
740 return; 769 return;
741 } 770 }
742 771
743 frame_tree_node()->navigator()->DidNavigate(this, validated_params); 772 frame_tree_node()->navigator()->DidNavigate(this, validated_params);
744 } 773 }
745 774
746 RenderWidgetHostImpl* RenderFrameHostImpl::GetRenderWidgetHost() { 775 RenderWidgetHostImpl* RenderFrameHostImpl::GetRenderWidgetHost() {
776 if (render_widget_host_)
777 return render_widget_host_.get();
778
779 // TODO(kenrb): When RenderViewHost no longer inherits RenderWidgetHost,
780 // we can remove this fallback. Currently it is only used for the main
781 // frame.
747 return static_cast<RenderWidgetHostImpl*>(render_view_host_); 782 return static_cast<RenderWidgetHostImpl*>(render_view_host_);
748 } 783 }
749 784
750 int RenderFrameHostImpl::GetEnabledBindings() { 785 int RenderFrameHostImpl::GetEnabledBindings() {
751 return render_view_host_->GetEnabledBindings(); 786 return render_view_host_->GetEnabledBindings();
752 } 787 }
753 788
754 void RenderFrameHostImpl::OnCrossSiteResponse( 789 void RenderFrameHostImpl::OnCrossSiteResponse(
755 const GlobalRequestID& global_request_id, 790 const GlobalRequestID& global_request_id,
756 scoped_ptr<CrossSiteTransferringRequest> cross_site_transferring_request, 791 scoped_ptr<CrossSiteTransferringRequest> cross_site_transferring_request,
(...skipping 763 matching lines...) Expand 10 before | Expand all | Expand 10 after
1520 // Clear any state if a pending navigation is canceled or preempted. 1555 // Clear any state if a pending navigation is canceled or preempted.
1521 if (suspended_nav_params_) 1556 if (suspended_nav_params_)
1522 suspended_nav_params_.reset(); 1557 suspended_nav_params_.reset();
1523 1558
1524 TRACE_EVENT_ASYNC_END0("navigation", 1559 TRACE_EVENT_ASYNC_END0("navigation",
1525 "RenderFrameHostImpl navigation suspended", this); 1560 "RenderFrameHostImpl navigation suspended", this);
1526 navigations_suspended_ = false; 1561 navigations_suspended_ = false;
1527 } 1562 }
1528 1563
1529 } // namespace content 1564 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698