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

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: Created 6 years, 5 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 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 } 128 }
129 129
130 } // namespace 130 } // namespace
131 131
132 RenderFrameHost* RenderFrameHost::FromID(int render_process_id, 132 RenderFrameHost* RenderFrameHost::FromID(int render_process_id,
133 int render_frame_id) { 133 int render_frame_id) {
134 return RenderFrameHostImpl::FromID(render_process_id, render_frame_id); 134 return RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
135 } 135 }
136 136
137 // static 137 // static
138 RenderFrameHostImpl* RenderFrameHostImpl::FromID( 138 RenderFrameHostImpl* RenderFrameHostImpl::FromID(int process_id,
139 int process_id, int routing_id) { 139 int routing_id) {
140 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 140 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
141 RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer(); 141 RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer();
142 RoutingIDFrameMap::iterator it = frames->find( 142 RoutingIDFrameMap::iterator it = frames->find(
143 RenderFrameHostID(process_id, routing_id)); 143 RenderFrameHostID(process_id, routing_id));
144 return it == frames->end() ? NULL : it->second; 144 return it == frames->end() ? NULL : it->second;
145 } 145 }
146 146
147 RenderFrameHostImpl::RenderFrameHostImpl( 147 RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host,
148 RenderViewHostImpl* render_view_host, 148 RenderFrameHostDelegate* delegate,
149 RenderFrameHostDelegate* delegate, 149 FrameTree* frame_tree,
150 FrameTree* frame_tree, 150 FrameTreeNode* frame_tree_node,
151 FrameTreeNode* frame_tree_node, 151 int routing_id,
152 int routing_id, 152 bool is_swapped_out)
153 bool is_swapped_out)
154 : render_view_host_(render_view_host), 153 : render_view_host_(render_view_host),
155 delegate_(delegate), 154 delegate_(delegate),
156 cross_process_frame_connector_(NULL), 155 cross_process_frame_connector_(NULL),
157 render_frame_proxy_host_(NULL), 156 render_frame_proxy_host_(NULL),
158 frame_tree_(frame_tree), 157 frame_tree_(frame_tree),
159 frame_tree_node_(frame_tree_node), 158 frame_tree_node_(frame_tree_node),
160 routing_id_(routing_id), 159 routing_id_(routing_id),
161 is_swapped_out_(is_swapped_out), 160 is_swapped_out_(is_swapped_out),
161 renderer_initialized_(false),
162 has_received_swap_out_ack_(false),
162 weak_ptr_factory_(this) { 163 weak_ptr_factory_(this) {
163 frame_tree_->RegisterRenderFrameHost(this); 164 frame_tree_->RegisterRenderFrameHost(this);
164 GetProcess()->AddRoute(routing_id_, this); 165 GetProcess()->AddRoute(routing_id_, this);
165 g_routing_id_frame_map.Get().insert(std::make_pair( 166 g_routing_id_frame_map.Get().insert(std::make_pair(
166 RenderFrameHostID(GetProcess()->GetID(), routing_id_), 167 RenderFrameHostID(GetProcess()->GetID(), routing_id_),
167 this)); 168 this));
168 169
169 if (GetProcess()->GetServiceRegistry()) { 170 if (GetProcess()->GetServiceRegistry()) {
170 RenderFrameSetupPtr setup; 171 RenderFrameSetupPtr setup;
171 GetProcess()->GetServiceRegistry()->ConnectToRemoteService(&setup); 172 GetProcess()->GetServiceRegistry()->ConnectToRemoteService(&setup);
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 static_cast<RenderProcessHostImpl*>(GetProcess())->EnsureMojoActivated(); 260 static_cast<RenderProcessHostImpl*>(GetProcess())->EnsureMojoActivated();
260 return &service_registry_; 261 return &service_registry_;
261 } 262 }
262 263
263 bool RenderFrameHostImpl::Send(IPC::Message* message) { 264 bool RenderFrameHostImpl::Send(IPC::Message* message) {
264 if (IPC_MESSAGE_ID_CLASS(message->type()) == InputMsgStart) { 265 if (IPC_MESSAGE_ID_CLASS(message->type()) == InputMsgStart) {
265 return render_view_host_->input_router()->SendInput( 266 return render_view_host_->input_router()->SendInput(
266 make_scoped_ptr(message)); 267 make_scoped_ptr(message));
267 } 268 }
268 269
269 if (render_view_host_->IsSwappedOut()) { 270 // Route IPCs through the RenderFrameProxyHost when in swapped out state.
271 // Note: For subframes in --site-per-process mode, we don't use swapped out
272 // RenderFrameHosts.
273 if (frame_tree_node_->IsMainFrame() && render_view_host_->IsSwappedOut()) {
270 DCHECK(render_frame_proxy_host_); 274 DCHECK(render_frame_proxy_host_);
271 return render_frame_proxy_host_->Send(message); 275 return render_frame_proxy_host_->Send(message);
272 } 276 }
273 277
274 return GetProcess()->Send(message); 278 return GetProcess()->Send(message);
275 } 279 }
276 280
277 bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { 281 bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) {
278 // Filter out most IPC messages if this renderer is swapped out. 282 // Filter out most IPC messages if this renderer is swapped out.
279 // We still want to handle certain ACKs to keep our state consistent. 283 // We still want to handle certain ACKs to keep our state consistent.
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 OnShowDesktopNotification) 348 OnShowDesktopNotification)
345 IPC_MESSAGE_HANDLER(DesktopNotificationHostMsg_Cancel, 349 IPC_MESSAGE_HANDLER(DesktopNotificationHostMsg_Cancel,
346 OnCancelDesktopNotification) 350 OnCancelDesktopNotification)
347 IPC_MESSAGE_HANDLER(FrameHostMsg_TextSurroundingSelectionResponse, 351 IPC_MESSAGE_HANDLER(FrameHostMsg_TextSurroundingSelectionResponse,
348 OnTextSurroundingSelectionResponse) 352 OnTextSurroundingSelectionResponse)
349 IPC_END_MESSAGE_MAP() 353 IPC_END_MESSAGE_MAP()
350 354
351 return handled; 355 return handled;
352 } 356 }
353 357
358 bool RenderFrameHostImpl::CreateRenderFrame(int parent_routing_id) {
359 TRACE_EVENT0("frame_host", "RenderFrameHostImpl::CreateRenderFrame");
360 DCHECK(!IsRenderFrameLive()) << "Creating frame twice";
361
362 // The process may (if we're sharing a process with another host that already
363 // initialized it) or may not (we have our own process or the old process
364 // crashed) have been initialized. Calling Init multiple times will be
365 // ignored, so this is safe.
366 if (!GetProcess()->Init())
367 return false;
368
369 DCHECK(GetProcess()->HasConnection());
370 DCHECK(GetProcess()->GetBrowserContext());
ncarter (slow) 2014/07/21 20:31:56 This doesn't look like a particularly useful DCHEC
kenrb 2014/07/24 17:53:53 Removed.
371
372 renderer_initialized_ = true;
373 Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id));
374
375 return true;
376 }
377
378 bool RenderFrameHostImpl::IsRenderFrameLive() {
379 return GetProcess()->HasConnection() && renderer_initialized_;
380 }
381
354 void RenderFrameHostImpl::Init() { 382 void RenderFrameHostImpl::Init() {
355 GetProcess()->ResumeRequestsForView(routing_id_); 383 GetProcess()->ResumeRequestsForView(routing_id_);
356 } 384 }
357 385
358 void RenderFrameHostImpl::OnAddMessageToConsole( 386 void RenderFrameHostImpl::OnAddMessageToConsole(
359 int32 level, 387 int32 level,
360 const base::string16& message, 388 const base::string16& message,
361 int32 line_no, 389 int32 line_no,
362 const base::string16& source_id) { 390 const base::string16& source_id) {
363 if (delegate_->AddMessageToConsole(level, message, line_no, source_id)) 391 if (delegate_->AddMessageToConsole(level, message, line_no, source_id))
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 583
556 render_view_host_->SetState( 584 render_view_host_->SetState(
557 RenderViewHostImpl::STATE_WAITING_FOR_UNLOAD_ACK); 585 RenderViewHostImpl::STATE_WAITING_FOR_UNLOAD_ACK);
558 render_view_host_->unload_event_monitor_timeout_->Start( 586 render_view_host_->unload_event_monitor_timeout_->Start(
559 base::TimeDelta::FromMilliseconds( 587 base::TimeDelta::FromMilliseconds(
560 RenderViewHostImpl::kUnloadTimeoutMS)); 588 RenderViewHostImpl::kUnloadTimeoutMS));
561 } 589 }
562 590
563 set_render_frame_proxy_host(proxy); 591 set_render_frame_proxy_host(proxy);
564 592
565 if (render_view_host_->IsRenderViewLive()) 593 if (render_view_host_->IsRenderViewLive()) {
594 has_received_swap_out_ack_ = false;
566 Send(new FrameMsg_SwapOut(routing_id_, proxy->GetRoutingID())); 595 Send(new FrameMsg_SwapOut(routing_id_, proxy->GetRoutingID()));
596 }
567 597
568 if (!GetParent()) 598 if (!GetParent())
569 delegate_->SwappedOut(this); 599 delegate_->SwappedOut(this);
570 600
571 // Allow the navigation to proceed. 601 // Allow the navigation to proceed.
572 frame_tree_node_->render_manager()->SwappedOut(this); 602 frame_tree_node_->render_manager()->SwappedOut(this);
573 } 603 }
574 604
575 void RenderFrameHostImpl::OnBeforeUnloadACK( 605 void RenderFrameHostImpl::OnBeforeUnloadACK(
576 bool proceed, 606 bool proceed,
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 frame_tree_node_->render_manager()->OnBeforeUnloadACK( 653 frame_tree_node_->render_manager()->OnBeforeUnloadACK(
624 render_view_host_->unload_ack_is_for_cross_site_transition_, proceed, 654 render_view_host_->unload_ack_is_for_cross_site_transition_, proceed,
625 before_unload_end_time); 655 before_unload_end_time);
626 656
627 // If canceled, notify the delegate to cancel its pending navigation entry. 657 // If canceled, notify the delegate to cancel its pending navigation entry.
628 if (!proceed) 658 if (!proceed)
629 render_view_host_->GetDelegate()->DidCancelLoading(); 659 render_view_host_->GetDelegate()->DidCancelLoading();
630 } 660 }
631 661
632 void RenderFrameHostImpl::OnSwapOutACK() { 662 void RenderFrameHostImpl::OnSwapOutACK() {
663 has_received_swap_out_ack_ = true;
633 OnSwappedOut(false); 664 OnSwappedOut(false);
634 } 665 }
635 666
636 void RenderFrameHostImpl::OnSwappedOut(bool timed_out) { 667 void RenderFrameHostImpl::OnSwappedOut(bool timed_out) {
637 // For now, we only need to update the RVH state machine for top-level swaps. 668 // For now, we only need to update the RVH state machine for top-level swaps.
638 // Subframe swaps (in --site-per-process) can just continue via RFHM. 669 // Subframe swaps (in --site-per-process) can just continue via RFHM.
639 if (!GetParent()) 670 if (!GetParent())
640 render_view_host_->OnSwappedOut(timed_out); 671 render_view_host_->OnSwappedOut(timed_out);
641 else 672 else
642 frame_tree_node_->render_manager()->SwappedOut(this); 673 frame_tree_node_->render_manager()->SwappedOut(this);
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
953 FROM_HERE, 984 FROM_HERE,
954 base::Bind( 985 base::Bind(
955 &TransitionRequestManager::SetHasPendingTransitionRequest, 986 &TransitionRequestManager::SetHasPendingTransitionRequest,
956 base::Unretained(TransitionRequestManager::GetInstance()), 987 base::Unretained(TransitionRequestManager::GetInstance()),
957 GetProcess()->GetID(), 988 GetProcess()->GetID(),
958 routing_id_, 989 routing_id_,
959 has_pending_request)); 990 has_pending_request));
960 } 991 }
961 992
962 } // namespace content 993 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698