OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |