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

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: Rebase 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 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 int routing_id) { 166 int routing_id) {
167 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 167 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
168 RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer(); 168 RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer();
169 RoutingIDFrameMap::iterator it = frames->find( 169 RoutingIDFrameMap::iterator it = frames->find(
170 RenderFrameHostID(process_id, routing_id)); 170 RenderFrameHostID(process_id, routing_id));
171 return it == frames->end() ? NULL : it->second; 171 return it == frames->end() ? NULL : it->second;
172 } 172 }
173 173
174 RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host, 174 RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host,
175 RenderFrameHostDelegate* delegate, 175 RenderFrameHostDelegate* delegate,
176 RenderWidgetHostDelegate* rwh_delegate,
176 FrameTree* frame_tree, 177 FrameTree* frame_tree,
177 FrameTreeNode* frame_tree_node, 178 FrameTreeNode* frame_tree_node,
178 int routing_id, 179 int routing_id,
179 bool is_swapped_out) 180 int flags)
180 : render_view_host_(render_view_host), 181 : render_view_host_(render_view_host),
181 delegate_(delegate), 182 delegate_(delegate),
182 cross_process_frame_connector_(NULL), 183 cross_process_frame_connector_(NULL),
183 render_frame_proxy_host_(NULL), 184 render_frame_proxy_host_(NULL),
184 frame_tree_(frame_tree), 185 frame_tree_(frame_tree),
185 frame_tree_node_(frame_tree_node), 186 frame_tree_node_(frame_tree_node),
186 routing_id_(routing_id), 187 routing_id_(routing_id),
187 render_frame_created_(false), 188 render_frame_created_(false),
188 navigations_suspended_(false), 189 navigations_suspended_(false),
189 is_waiting_for_beforeunload_ack_(false), 190 is_waiting_for_beforeunload_ack_(false),
190 unload_ack_is_for_cross_site_transition_(false), 191 unload_ack_is_for_cross_site_transition_(false),
191 weak_ptr_factory_(this) { 192 weak_ptr_factory_(this) {
193 bool is_swapped_out = flags & SWAPPED_OUT;
194 bool hidden = flags & HIDDEN;
192 frame_tree_->RegisterRenderFrameHost(this); 195 frame_tree_->RegisterRenderFrameHost(this);
193 GetProcess()->AddRoute(routing_id_, this); 196 GetProcess()->AddRoute(routing_id_, this);
194 g_routing_id_frame_map.Get().insert(std::make_pair( 197 g_routing_id_frame_map.Get().insert(std::make_pair(
195 RenderFrameHostID(GetProcess()->GetID(), routing_id_), 198 RenderFrameHostID(GetProcess()->GetID(), routing_id_),
196 this)); 199 this));
197 200
198 if (is_swapped_out) { 201 if (is_swapped_out) {
199 rfh_state_ = STATE_SWAPPED_OUT; 202 rfh_state_ = STATE_SWAPPED_OUT;
200 } else { 203 } else {
201 rfh_state_ = STATE_DEFAULT; 204 rfh_state_ = STATE_DEFAULT;
202 GetSiteInstance()->increment_active_frame_count(); 205 GetSiteInstance()->increment_active_frame_count();
203 } 206 }
204 207
205 if (GetProcess()->GetServiceRegistry()) { 208 if (GetProcess()->GetServiceRegistry()) {
206 RenderFrameSetupPtr setup; 209 RenderFrameSetupPtr setup;
207 GetProcess()->GetServiceRegistry()->ConnectToRemoteService(&setup); 210 GetProcess()->GetServiceRegistry()->ConnectToRemoteService(&setup);
208 mojo::ServiceProviderPtr service_provider; 211 mojo::ServiceProviderPtr service_provider;
209 setup->GetServiceProviderForFrame(routing_id_, 212 setup->GetServiceProviderForFrame(routing_id_,
210 mojo::GetProxy(&service_provider)); 213 mojo::GetProxy(&service_provider));
211 service_registry_.BindRemoteServiceProvider( 214 service_registry_.BindRemoteServiceProvider(
212 service_provider.PassMessagePipe()); 215 service_provider.PassMessagePipe());
213 } 216 }
214 217
215 swapout_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind( 218 swapout_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind(
216 &RenderFrameHostImpl::OnSwappedOut, weak_ptr_factory_.GetWeakPtr()))); 219 &RenderFrameHostImpl::OnSwappedOut, weak_ptr_factory_.GetWeakPtr())));
220
221 if (flags & CREATE_RENDER_WIDGET_HOST) {
222 render_widget_host_.reset(
223 new RenderWidgetHostImpl(rwh_delegate,
224 GetProcess(),
225 MSG_ROUTING_NONE,
226 hidden));
227 }
217 } 228 }
218 229
219 RenderFrameHostImpl::~RenderFrameHostImpl() { 230 RenderFrameHostImpl::~RenderFrameHostImpl() {
220 GetProcess()->RemoveRoute(routing_id_); 231 GetProcess()->RemoveRoute(routing_id_);
221 g_routing_id_frame_map.Get().erase( 232 g_routing_id_frame_map.Get().erase(
222 RenderFrameHostID(GetProcess()->GetID(), routing_id_)); 233 RenderFrameHostID(GetProcess()->GetID(), routing_id_));
223 234
224 if (delegate_) 235 if (delegate_)
225 delegate_->RenderFrameDeleted(this); 236 delegate_->RenderFrameDeleted(this);
226 237
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
549 560
550 // The process may (if we're sharing a process with another host that already 561 // The process may (if we're sharing a process with another host that already
551 // initialized it) or may not (we have our own process or the old process 562 // initialized it) or may not (we have our own process or the old process
552 // crashed) have been initialized. Calling Init multiple times will be 563 // crashed) have been initialized. Calling Init multiple times will be
553 // ignored, so this is safe. 564 // ignored, so this is safe.
554 if (!GetProcess()->Init()) 565 if (!GetProcess()->Init())
555 return false; 566 return false;
556 567
557 DCHECK(GetProcess()->HasConnection()); 568 DCHECK(GetProcess()->HasConnection());
558 569
559 Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id)); 570 FrameMsg_NewFrame_WidgetParams widget_params;
571 if (render_widget_host_) {
572 widget_params.routing_id = render_widget_host_->GetRoutingID();
573 widget_params.surface_id = render_widget_host_->surface_id();
574 widget_params.hidden = render_widget_host_->is_hidden();
575 } else {
576 // MSG_ROUTING_NONE will prevent a new RenderWidget from being created in
577 // the renderer process.
578 widget_params.routing_id = MSG_ROUTING_NONE;
579 widget_params.surface_id = 0;
580 widget_params.hidden = true;
581 }
582
583 Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id, widget_params));
584
585 // The lifetime of the view gets tied to the lifetime of the
586 // current render process for this RenderFrameHost.
587 if (render_widget_host_)
588 new RenderWidgetHostViewChildFrame(render_widget_host_.get());
560 589
561 // The renderer now has a RenderFrame for this RenderFrameHost. Note that 590 // The renderer now has a RenderFrame for this RenderFrameHost. Note that
562 // this path is only used for out-of-process iframes. Main frame RenderFrames 591 // this path is only used for out-of-process iframes. Main frame RenderFrames
563 // are created with their RenderView, and same-site iframes are created at the 592 // are created with their RenderView, and same-site iframes are created at the
564 // time of OnCreateChildFrame. 593 // time of OnCreateChildFrame.
565 set_render_frame_created(true); 594 set_render_frame_created(true);
566 595
567 return true; 596 return true;
568 } 597 }
569 598
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 if (!render_view_host_->CanAccessFilesOfPageState( 768 if (!render_view_host_->CanAccessFilesOfPageState(
740 validated_params.page_state)) { 769 validated_params.page_state)) {
741 GetProcess()->ReceivedBadMessage(); 770 GetProcess()->ReceivedBadMessage();
742 return; 771 return;
743 } 772 }
744 773
745 frame_tree_node()->navigator()->DidNavigate(this, validated_params); 774 frame_tree_node()->navigator()->DidNavigate(this, validated_params);
746 } 775 }
747 776
748 RenderWidgetHostImpl* RenderFrameHostImpl::GetRenderWidgetHost() { 777 RenderWidgetHostImpl* RenderFrameHostImpl::GetRenderWidgetHost() {
778 if (render_widget_host_)
779 return render_widget_host_.get();
780
781 // TODO(kenrb): When RenderViewHost no longer inherits RenderWidgetHost,
782 // we can remove this fallback. Currently it is only used for the main
783 // frame.
749 return static_cast<RenderWidgetHostImpl*>(render_view_host_); 784 return static_cast<RenderWidgetHostImpl*>(render_view_host_);
750 } 785 }
751 786
787 RenderWidgetHostView* RenderFrameHostImpl::GetView() {
788 RenderFrameHostImpl* frame = this;
789 while (frame) {
790 if (frame->render_widget_host_)
791 return frame->render_widget_host_->GetView();
792 frame = static_cast<RenderFrameHostImpl*>(frame->GetParent());
793 }
794
795 return render_view_host_->GetView();
796 }
797
752 int RenderFrameHostImpl::GetEnabledBindings() { 798 int RenderFrameHostImpl::GetEnabledBindings() {
753 return render_view_host_->GetEnabledBindings(); 799 return render_view_host_->GetEnabledBindings();
754 } 800 }
755 801
756 void RenderFrameHostImpl::OnCrossSiteResponse( 802 void RenderFrameHostImpl::OnCrossSiteResponse(
757 const GlobalRequestID& global_request_id, 803 const GlobalRequestID& global_request_id,
758 scoped_ptr<CrossSiteTransferringRequest> cross_site_transferring_request, 804 scoped_ptr<CrossSiteTransferringRequest> cross_site_transferring_request,
759 const std::vector<GURL>& transfer_url_chain, 805 const std::vector<GURL>& transfer_url_chain,
760 const Referrer& referrer, 806 const Referrer& referrer,
761 ui::PageTransition page_transition, 807 ui::PageTransition page_transition,
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
1547 // Clear any state if a pending navigation is canceled or preempted. 1593 // Clear any state if a pending navigation is canceled or preempted.
1548 if (suspended_nav_params_) 1594 if (suspended_nav_params_)
1549 suspended_nav_params_.reset(); 1595 suspended_nav_params_.reset();
1550 1596
1551 TRACE_EVENT_ASYNC_END0("navigation", 1597 TRACE_EVENT_ASYNC_END0("navigation",
1552 "RenderFrameHostImpl navigation suspended", this); 1598 "RenderFrameHostImpl navigation suspended", this);
1553 navigations_suspended_ = false; 1599 navigations_suspended_ = false;
1554 } 1600 }
1555 1601
1556 } // namespace content 1602 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698