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

Side by Side Diff: content/browser/frame_host/render_frame_host_impl.cc

Issue 404613005: Start using RenderFrameProxyHost objects. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Bug fix + ncarter review comments addressed Created 6 years, 4 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 | Annotate | Revision Log
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/containers/hash_tables.h" 8 #include "base/containers/hash_tables.h"
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/metrics/user_metrics_action.h" 10 #include "base/metrics/user_metrics_action.h"
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 } 136 }
137 137
138 } // namespace 138 } // namespace
139 139
140 RenderFrameHost* RenderFrameHost::FromID(int render_process_id, 140 RenderFrameHost* RenderFrameHost::FromID(int render_process_id,
141 int render_frame_id) { 141 int render_frame_id) {
142 return RenderFrameHostImpl::FromID(render_process_id, render_frame_id); 142 return RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
143 } 143 }
144 144
145 // static 145 // static
146 RenderFrameHostImpl* RenderFrameHostImpl::FromID( 146 RenderFrameHostImpl* RenderFrameHostImpl::FromID(int process_id,
147 int process_id, int routing_id) { 147 int routing_id) {
148 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 148 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
149 RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer(); 149 RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer();
150 RoutingIDFrameMap::iterator it = frames->find( 150 RoutingIDFrameMap::iterator it = frames->find(
151 RenderFrameHostID(process_id, routing_id)); 151 RenderFrameHostID(process_id, routing_id));
152 return it == frames->end() ? NULL : it->second; 152 return it == frames->end() ? NULL : it->second;
153 } 153 }
154 154
155 RenderFrameHostImpl::RenderFrameHostImpl( 155 RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host,
156 RenderViewHostImpl* render_view_host, 156 RenderFrameHostDelegate* delegate,
157 RenderFrameHostDelegate* delegate, 157 FrameTree* frame_tree,
158 FrameTree* frame_tree, 158 FrameTreeNode* frame_tree_node,
159 FrameTreeNode* frame_tree_node, 159 int routing_id,
160 int routing_id, 160 bool is_swapped_out)
161 bool is_swapped_out)
162 : render_view_host_(render_view_host), 161 : render_view_host_(render_view_host),
163 delegate_(delegate), 162 delegate_(delegate),
164 cross_process_frame_connector_(NULL), 163 cross_process_frame_connector_(NULL),
165 render_frame_proxy_host_(NULL), 164 render_frame_proxy_host_(NULL),
166 frame_tree_(frame_tree), 165 frame_tree_(frame_tree),
167 frame_tree_node_(frame_tree_node), 166 frame_tree_node_(frame_tree_node),
168 routing_id_(routing_id), 167 routing_id_(routing_id),
169 is_swapped_out_(is_swapped_out), 168 is_swapped_out_(is_swapped_out),
169 renderer_initialized_(false),
170 has_received_swap_out_ack_(false),
170 weak_ptr_factory_(this) { 171 weak_ptr_factory_(this) {
171 frame_tree_->RegisterRenderFrameHost(this); 172 frame_tree_->RegisterRenderFrameHost(this);
172 GetProcess()->AddRoute(routing_id_, this); 173 GetProcess()->AddRoute(routing_id_, this);
173 g_routing_id_frame_map.Get().insert(std::make_pair( 174 g_routing_id_frame_map.Get().insert(std::make_pair(
174 RenderFrameHostID(GetProcess()->GetID(), routing_id_), 175 RenderFrameHostID(GetProcess()->GetID(), routing_id_),
175 this)); 176 this));
176 177
177 if (GetProcess()->GetServiceRegistry()) { 178 if (GetProcess()->GetServiceRegistry()) {
178 RenderFrameSetupPtr setup; 179 RenderFrameSetupPtr setup;
179 GetProcess()->GetServiceRegistry()->ConnectToRemoteService(&setup); 180 GetProcess()->GetServiceRegistry()->ConnectToRemoteService(&setup);
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 static_cast<RenderProcessHostImpl*>(GetProcess())->EnsureMojoActivated(); 268 static_cast<RenderProcessHostImpl*>(GetProcess())->EnsureMojoActivated();
268 return &service_registry_; 269 return &service_registry_;
269 } 270 }
270 271
271 bool RenderFrameHostImpl::Send(IPC::Message* message) { 272 bool RenderFrameHostImpl::Send(IPC::Message* message) {
272 if (IPC_MESSAGE_ID_CLASS(message->type()) == InputMsgStart) { 273 if (IPC_MESSAGE_ID_CLASS(message->type()) == InputMsgStart) {
273 return render_view_host_->input_router()->SendInput( 274 return render_view_host_->input_router()->SendInput(
274 make_scoped_ptr(message)); 275 make_scoped_ptr(message));
275 } 276 }
276 277
277 if (render_view_host_->IsSwappedOut()) { 278 // Route IPCs through the RenderFrameProxyHost when in swapped out state.
279 // Note: For subframes in --site-per-process mode, we don't use swapped out
280 // RenderFrameHosts.
281 if (frame_tree_node_->IsMainFrame() && render_view_host_->IsSwappedOut()) {
278 DCHECK(render_frame_proxy_host_); 282 DCHECK(render_frame_proxy_host_);
279 return render_frame_proxy_host_->Send(message); 283 return render_frame_proxy_host_->Send(message);
280 } 284 }
281 285
282 return GetProcess()->Send(message); 286 return GetProcess()->Send(message);
283 } 287 }
284 288
285 bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { 289 bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) {
286 // Filter out most IPC messages if this renderer is swapped out. 290 // Filter out most IPC messages if this renderer is swapped out.
287 // We still want to handle certain ACKs to keep our state consistent. 291 // We still want to handle certain ACKs to keep our state consistent.
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 425
422 void RenderFrameHostImpl::AccessibilityHitTest(const gfx::Point& point) { 426 void RenderFrameHostImpl::AccessibilityHitTest(const gfx::Point& point) {
423 Send(new AccessibilityMsg_HitTest(routing_id_, point)); 427 Send(new AccessibilityMsg_HitTest(routing_id_, point));
424 } 428 }
425 429
426 void RenderFrameHostImpl::AccessibilityFatalError() { 430 void RenderFrameHostImpl::AccessibilityFatalError() {
427 Send(new AccessibilityMsg_FatalError(routing_id_)); 431 Send(new AccessibilityMsg_FatalError(routing_id_));
428 browser_accessibility_manager_.reset(NULL); 432 browser_accessibility_manager_.reset(NULL);
429 } 433 }
430 434
435 bool RenderFrameHostImpl::CreateRenderFrame(int parent_routing_id) {
436 TRACE_EVENT0("frame_host", "RenderFrameHostImpl::CreateRenderFrame");
437 DCHECK(!IsRenderFrameLive()) << "Creating frame twice";
438
439 // The process may (if we're sharing a process with another host that already
440 // initialized it) or may not (we have our own process or the old process
441 // crashed) have been initialized. Calling Init multiple times will be
442 // ignored, so this is safe.
443 if (!GetProcess()->Init())
444 return false;
445
446 DCHECK(GetProcess()->HasConnection());
447
448 renderer_initialized_ = true;
449 Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id));
450
451 return true;
452 }
453
454 bool RenderFrameHostImpl::IsRenderFrameLive() {
455 return GetProcess()->HasConnection() && renderer_initialized_;
456 }
457
431 void RenderFrameHostImpl::Init() { 458 void RenderFrameHostImpl::Init() {
432 GetProcess()->ResumeRequestsForView(routing_id_); 459 GetProcess()->ResumeRequestsForView(routing_id_);
433 } 460 }
434 461
435 void RenderFrameHostImpl::OnAddMessageToConsole( 462 void RenderFrameHostImpl::OnAddMessageToConsole(
436 int32 level, 463 int32 level,
437 const base::string16& message, 464 const base::string16& message,
438 int32 line_no, 465 int32 line_no,
439 const base::string16& source_id) { 466 const base::string16& source_id) {
440 if (delegate_->AddMessageToConsole(level, message, line_no, source_id)) 467 if (delegate_->AddMessageToConsole(level, message, line_no, source_id))
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 659
633 render_view_host_->SetState( 660 render_view_host_->SetState(
634 RenderViewHostImpl::STATE_WAITING_FOR_UNLOAD_ACK); 661 RenderViewHostImpl::STATE_WAITING_FOR_UNLOAD_ACK);
635 render_view_host_->unload_event_monitor_timeout_->Start( 662 render_view_host_->unload_event_monitor_timeout_->Start(
636 base::TimeDelta::FromMilliseconds( 663 base::TimeDelta::FromMilliseconds(
637 RenderViewHostImpl::kUnloadTimeoutMS)); 664 RenderViewHostImpl::kUnloadTimeoutMS));
638 } 665 }
639 666
640 set_render_frame_proxy_host(proxy); 667 set_render_frame_proxy_host(proxy);
641 668
642 if (render_view_host_->IsRenderViewLive()) 669 if (render_view_host_->IsRenderViewLive()) {
670 has_received_swap_out_ack_ = false;
643 Send(new FrameMsg_SwapOut(routing_id_, proxy->GetRoutingID())); 671 Send(new FrameMsg_SwapOut(routing_id_, proxy->GetRoutingID()));
672 }
644 673
645 if (!GetParent()) 674 if (!GetParent())
646 delegate_->SwappedOut(this); 675 delegate_->SwappedOut(this);
647 676
648 // Allow the navigation to proceed. 677 // Allow the navigation to proceed.
649 frame_tree_node_->render_manager()->SwappedOut(this); 678 frame_tree_node_->render_manager()->SwappedOut(this);
650 } 679 }
651 680
652 void RenderFrameHostImpl::OnBeforeUnloadACK( 681 void RenderFrameHostImpl::OnBeforeUnloadACK(
653 bool proceed, 682 bool proceed,
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 frame_tree_node_->render_manager()->OnBeforeUnloadACK( 729 frame_tree_node_->render_manager()->OnBeforeUnloadACK(
701 render_view_host_->unload_ack_is_for_cross_site_transition_, proceed, 730 render_view_host_->unload_ack_is_for_cross_site_transition_, proceed,
702 before_unload_end_time); 731 before_unload_end_time);
703 732
704 // If canceled, notify the delegate to cancel its pending navigation entry. 733 // If canceled, notify the delegate to cancel its pending navigation entry.
705 if (!proceed) 734 if (!proceed)
706 render_view_host_->GetDelegate()->DidCancelLoading(); 735 render_view_host_->GetDelegate()->DidCancelLoading();
707 } 736 }
708 737
709 void RenderFrameHostImpl::OnSwapOutACK() { 738 void RenderFrameHostImpl::OnSwapOutACK() {
739 has_received_swap_out_ack_ = true;
710 OnSwappedOut(false); 740 OnSwappedOut(false);
711 } 741 }
712 742
713 void RenderFrameHostImpl::OnSwappedOut(bool timed_out) { 743 void RenderFrameHostImpl::OnSwappedOut(bool timed_out) {
714 // For now, we only need to update the RVH state machine for top-level swaps. 744 // For now, we only need to update the RVH state machine for top-level swaps.
715 // Subframe swaps (in --site-per-process) can just continue via RFHM. 745 // Subframe swaps (in --site-per-process) can just continue via RFHM.
716 if (!GetParent()) 746 if (!GetParent())
717 render_view_host_->OnSwappedOut(timed_out); 747 render_view_host_->OnSwappedOut(timed_out);
718 else 748 else
719 frame_tree_node_->render_manager()->SwappedOut(this); 749 frame_tree_node_->render_manager()->SwappedOut(this);
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
842 WebTextDirectionToChromeTextDirection( 872 WebTextDirectionToChromeTextDirection(
843 title_direction)); 873 title_direction));
844 } 874 }
845 875
846 void RenderFrameHostImpl::OnUpdateEncoding(const std::string& encoding_name) { 876 void RenderFrameHostImpl::OnUpdateEncoding(const std::string& encoding_name) {
847 // This message is only sent for top-level frames. TODO(avi): when frame tree 877 // This message is only sent for top-level frames. TODO(avi): when frame tree
848 // mirroring works correctly, add a check here to enforce it. 878 // mirroring works correctly, add a check here to enforce it.
849 delegate_->UpdateEncoding(this, encoding_name); 879 delegate_->UpdateEncoding(this, encoding_name);
850 } 880 }
851 881
852
853 void RenderFrameHostImpl::OnBeginNavigation( 882 void RenderFrameHostImpl::OnBeginNavigation(
854 const FrameHostMsg_BeginNavigation_Params& params) { 883 const FrameHostMsg_BeginNavigation_Params& params) {
855 #if defined(USE_BROWSER_SIDE_NAVIGATION) 884 #if defined(USE_BROWSER_SIDE_NAVIGATION)
856 frame_tree_node()->render_manager()->OnBeginNavigation(params); 885 frame_tree_node()->render_manager()->OnBeginNavigation(params);
857 #endif 886 #endif
858 } 887 }
859 888
860 void RenderFrameHostImpl::OnAccessibilityEvents( 889 void RenderFrameHostImpl::OnAccessibilityEvents(
861 const std::vector<AccessibilityHostMsg_EventParams>& params) { 890 const std::vector<AccessibilityHostMsg_EventParams>& params) {
862 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( 891 RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
1143 FROM_HERE, 1172 FROM_HERE,
1144 base::Bind( 1173 base::Bind(
1145 &TransitionRequestManager::SetHasPendingTransitionRequest, 1174 &TransitionRequestManager::SetHasPendingTransitionRequest,
1146 base::Unretained(TransitionRequestManager::GetInstance()), 1175 base::Unretained(TransitionRequestManager::GetInstance()),
1147 GetProcess()->GetID(), 1176 GetProcess()->GetID(),
1148 routing_id_, 1177 routing_id_,
1149 has_pending_request)); 1178 has_pending_request));
1150 } 1179 }
1151 1180
1152 } // namespace content 1181 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698