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_manager.h" | 5 #include "content/browser/frame_host/render_frame_host_manager.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "content/browser/child_process_security_policy_impl.h" | 12 #include "content/browser/child_process_security_policy_impl.h" |
13 #include "content/browser/devtools/render_view_devtools_agent_host.h" | 13 #include "content/browser/devtools/render_view_devtools_agent_host.h" |
14 #include "content/browser/frame_host/cross_process_frame_connector.h" | 14 #include "content/browser/frame_host/cross_process_frame_connector.h" |
15 #include "content/browser/frame_host/cross_site_transferring_request.h" | 15 #include "content/browser/frame_host/cross_site_transferring_request.h" |
16 #include "content/browser/frame_host/debug_urls.h" | 16 #include "content/browser/frame_host/debug_urls.h" |
17 #include "content/browser/frame_host/interstitial_page_impl.h" | 17 #include "content/browser/frame_host/interstitial_page_impl.h" |
18 #include "content/browser/frame_host/navigation_controller_impl.h" | 18 #include "content/browser/frame_host/navigation_controller_impl.h" |
19 #include "content/browser/frame_host/navigation_entry_impl.h" | 19 #include "content/browser/frame_host/navigation_entry_impl.h" |
20 #include "content/browser/frame_host/navigator.h" | 20 #include "content/browser/frame_host/navigator.h" |
21 #include "content/browser/frame_host/render_frame_host_factory.h" | 21 #include "content/browser/frame_host/render_frame_host_factory.h" |
22 #include "content/browser/frame_host/render_frame_host_impl.h" | 22 #include "content/browser/frame_host/render_frame_host_impl.h" |
23 #include "content/browser/frame_host/render_frame_proxy_host.h" | |
24 #include "content/browser/renderer_host/render_process_host_impl.h" | 23 #include "content/browser/renderer_host/render_process_host_impl.h" |
25 #include "content/browser/renderer_host/render_view_host_factory.h" | 24 #include "content/browser/renderer_host/render_view_host_factory.h" |
26 #include "content/browser/renderer_host/render_view_host_impl.h" | 25 #include "content/browser/renderer_host/render_view_host_impl.h" |
27 #include "content/browser/site_instance_impl.h" | 26 #include "content/browser/site_instance_impl.h" |
28 #include "content/browser/webui/web_ui_controller_factory_registry.h" | 27 #include "content/browser/webui/web_ui_controller_factory_registry.h" |
29 #include "content/browser/webui/web_ui_impl.h" | 28 #include "content/browser/webui/web_ui_impl.h" |
30 #include "content/common/view_messages.h" | 29 #include "content/common/view_messages.h" |
31 #include "content/port/browser/render_widget_host_view_port.h" | 30 #include "content/port/browser/render_widget_host_view_port.h" |
32 #include "content/public/browser/content_browser_client.h" | 31 #include "content/public/browser/content_browser_client.h" |
33 #include "content/public/browser/notification_service.h" | 32 #include "content/public/browser/notification_service.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 RenderFrameHostManager::~RenderFrameHostManager() { | 82 RenderFrameHostManager::~RenderFrameHostManager() { |
84 if (pending_render_frame_host_) | 83 if (pending_render_frame_host_) |
85 CancelPending(); | 84 CancelPending(); |
86 | 85 |
87 if (cross_process_frame_connector_) | 86 if (cross_process_frame_connector_) |
88 delete cross_process_frame_connector_; | 87 delete cross_process_frame_connector_; |
89 | 88 |
90 // We should always have a current RenderFrameHost except in some tests. | 89 // We should always have a current RenderFrameHost except in some tests. |
91 render_frame_host_.reset(); | 90 render_frame_host_.reset(); |
92 | 91 |
| 92 // TODO(creis): Now that we aren't using Shutdown, make RenderFrameHostMap |
| 93 // use scoped_ptrs. |
93 // Delete any swapped out RenderFrameHosts. | 94 // Delete any swapped out RenderFrameHosts. |
94 for (RenderFrameProxyHostMap::iterator iter = proxy_hosts_.begin(); | 95 for (RenderFrameHostMap::iterator iter = swapped_out_hosts_.begin(); |
95 iter != proxy_hosts_.end(); | 96 iter != swapped_out_hosts_.end(); |
96 ++iter) { | 97 ++iter) { |
97 delete iter->second; | 98 delete iter->second; |
98 } | 99 } |
99 } | 100 } |
100 | 101 |
101 void RenderFrameHostManager::Init(BrowserContext* browser_context, | 102 void RenderFrameHostManager::Init(BrowserContext* browser_context, |
102 SiteInstance* site_instance, | 103 SiteInstance* site_instance, |
103 int view_routing_id, | 104 int view_routing_id, |
104 int frame_routing_id) { | 105 int frame_routing_id) { |
105 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It | 106 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It |
106 // is important to immediately give this SiteInstance to a RenderViewHost so | 107 // is important to immediately give this SiteInstance to a RenderViewHost so |
107 // that the SiteInstance is ref counted. | 108 // that the SiteInstance is ref counted. |
108 if (!site_instance) | 109 if (!site_instance) |
109 site_instance = SiteInstance::Create(browser_context); | 110 site_instance = SiteInstance::Create(browser_context); |
110 | 111 |
111 render_frame_host_ = CreateRenderFrameHost(site_instance, | 112 render_frame_host_ = make_scoped_ptr( |
112 view_routing_id, | 113 CreateRenderFrameHost(site_instance, view_routing_id, frame_routing_id, |
113 frame_routing_id, | 114 false, delegate_->IsHidden())); |
114 false, | |
115 delegate_->IsHidden()); | |
116 | 115 |
117 // Keep track of renderer processes as they start to shut down or are | 116 // Keep track of renderer processes as they start to shut down or are |
118 // crashed/killed. | 117 // crashed/killed. |
119 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, | 118 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, |
120 NotificationService::AllSources()); | 119 NotificationService::AllSources()); |
121 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, | 120 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, |
122 NotificationService::AllSources()); | 121 NotificationService::AllSources()); |
123 } | 122 } |
124 | 123 |
125 RenderViewHostImpl* RenderFrameHostManager::current_host() const { | 124 RenderViewHostImpl* RenderFrameHostManager::current_host() const { |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 cross_navigation_pending_ = false; | 440 cross_navigation_pending_ = false; |
442 } else { | 441 } else { |
443 // No one else should be sending us DidNavigate in this state. | 442 // No one else should be sending us DidNavigate in this state. |
444 DCHECK(false); | 443 DCHECK(false); |
445 } | 444 } |
446 } | 445 } |
447 | 446 |
448 // TODO(creis): Take in RenderFrameHost instead, since frames can have openers. | 447 // TODO(creis): Take in RenderFrameHost instead, since frames can have openers. |
449 void RenderFrameHostManager::DidDisownOpener(RenderViewHost* render_view_host) { | 448 void RenderFrameHostManager::DidDisownOpener(RenderViewHost* render_view_host) { |
450 // Notify all swapped out hosts, including the pending RVH. | 449 // Notify all swapped out hosts, including the pending RVH. |
451 for (RenderFrameProxyHostMap::iterator iter = proxy_hosts_.begin(); | 450 for (RenderFrameHostMap::iterator iter = swapped_out_hosts_.begin(); |
452 iter != proxy_hosts_.end(); | 451 iter != swapped_out_hosts_.end(); |
453 ++iter) { | 452 ++iter) { |
454 DCHECK_NE(iter->second->GetSiteInstance(), | 453 DCHECK_NE(iter->second->GetSiteInstance(), |
455 current_frame_host()->GetSiteInstance()); | 454 current_frame_host()->GetSiteInstance()); |
456 iter->second->render_view_host()->DisownOpener(); | 455 iter->second->render_view_host()->DisownOpener(); |
457 } | 456 } |
458 } | 457 } |
459 | 458 |
460 void RenderFrameHostManager::RendererProcessClosing( | 459 void RenderFrameHostManager::RendererProcessClosing( |
461 RenderProcessHost* render_process_host) { | 460 RenderProcessHost* render_process_host) { |
462 // Remove any swapped out RVHs from this process, so that we don't try to | 461 // Remove any swapped out RVHs from this process, so that we don't try to |
463 // swap them back in while the process is exiting. Start by finding them, | 462 // swap them back in while the process is exiting. Start by finding them, |
464 // since there could be more than one. | 463 // since there could be more than one. |
465 std::list<int> ids_to_remove; | 464 std::list<int> ids_to_remove; |
466 for (RenderFrameProxyHostMap::iterator iter = proxy_hosts_.begin(); | 465 for (RenderFrameHostMap::iterator iter = swapped_out_hosts_.begin(); |
467 iter != proxy_hosts_.end(); | 466 iter != swapped_out_hosts_.end(); |
468 ++iter) { | 467 ++iter) { |
469 if (iter->second->GetProcess() == render_process_host) | 468 if (iter->second->GetProcess() == render_process_host) |
470 ids_to_remove.push_back(iter->first); | 469 ids_to_remove.push_back(iter->first); |
471 } | 470 } |
472 | 471 |
473 // Now delete them. | 472 // Now delete them. |
474 while (!ids_to_remove.empty()) { | 473 while (!ids_to_remove.empty()) { |
475 delete proxy_hosts_[ids_to_remove.back()]; | 474 delete swapped_out_hosts_[ids_to_remove.back()]; |
476 proxy_hosts_.erase(ids_to_remove.back()); | 475 swapped_out_hosts_.erase(ids_to_remove.back()); |
477 ids_to_remove.pop_back(); | 476 ids_to_remove.pop_back(); |
478 } | 477 } |
479 } | 478 } |
480 | 479 |
481 void RenderFrameHostManager::SwapOutOldPage() { | 480 void RenderFrameHostManager::SwapOutOldPage() { |
482 // Should only see this while we have a pending renderer or transfer. | 481 // Should only see this while we have a pending renderer or transfer. |
483 CHECK(cross_navigation_pending_ || pending_nav_params_.get()); | 482 CHECK(cross_navigation_pending_ || pending_nav_params_.get()); |
484 | 483 |
485 // Tell the renderer to suppress any further modal dialogs so that we can swap | 484 // Tell the renderer to suppress any further modal dialogs so that we can swap |
486 // it out. This must be done before canceling any current dialog, in case | 485 // it out. This must be done before canceling any current dialog, in case |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 case NOTIFICATION_RENDERER_PROCESS_CLOSING: | 541 case NOTIFICATION_RENDERER_PROCESS_CLOSING: |
543 RendererProcessClosing( | 542 RendererProcessClosing( |
544 Source<RenderProcessHost>(source).ptr()); | 543 Source<RenderProcessHost>(source).ptr()); |
545 break; | 544 break; |
546 | 545 |
547 default: | 546 default: |
548 NOTREACHED(); | 547 NOTREACHED(); |
549 } | 548 } |
550 } | 549 } |
551 | 550 |
552 bool RenderFrameHostManager::ClearProxiesInSiteInstance( | 551 bool RenderFrameHostManager::ClearSwappedOutRFHsInSiteInstance( |
553 int32 site_instance_id, | 552 int32 site_instance_id, |
554 FrameTreeNode* node) { | 553 FrameTreeNode* node) { |
555 RenderFrameProxyHostMap::iterator iter = | 554 RenderFrameHostMap::iterator iter = |
556 node->render_manager()->proxy_hosts_.find(site_instance_id); | 555 node->render_manager()->swapped_out_hosts_.find(site_instance_id); |
557 if (iter != node->render_manager()->proxy_hosts_.end()) { | 556 if (iter != node->render_manager()->swapped_out_hosts_.end()) { |
558 RenderFrameProxyHost* proxy = iter->second; | 557 RenderFrameHostImpl* swapped_out_rfh = iter->second; |
559 // If the RVH is pending swap out, it needs to switch state to | 558 // If the RVH is pending swap out, it needs to switch state to |
560 // pending shutdown. Otherwise it is deleted. | 559 // pending shutdown. Otherwise it is deleted. |
561 if (proxy->render_view_host()->rvh_state() == | 560 if (swapped_out_rfh->render_view_host()->rvh_state() == |
562 RenderViewHostImpl::STATE_PENDING_SWAP_OUT) { | 561 RenderViewHostImpl::STATE_PENDING_SWAP_OUT) { |
563 scoped_ptr<RenderFrameHostImpl> swapped_out_rfh = proxy->PassFrameHost(); | |
564 | |
565 swapped_out_rfh->SetPendingShutdown(base::Bind( | 562 swapped_out_rfh->SetPendingShutdown(base::Bind( |
566 &RenderFrameHostManager::ClearPendingShutdownRFHForSiteInstance, | 563 &RenderFrameHostManager::ClearPendingShutdownRFHForSiteInstance, |
567 node->render_manager()->weak_factory_.GetWeakPtr(), | 564 node->render_manager()->weak_factory_.GetWeakPtr(), |
568 site_instance_id, | 565 site_instance_id, |
569 swapped_out_rfh.get())); | 566 swapped_out_rfh)); |
570 RFHPendingDeleteMap::iterator pending_delete_iter = | 567 RFHPendingDeleteMap::iterator pending_delete_iter = |
571 node->render_manager()->pending_delete_hosts_.find(site_instance_id); | 568 node->render_manager()->pending_delete_hosts_.find(site_instance_id); |
572 if (pending_delete_iter == | 569 if (pending_delete_iter == |
573 node->render_manager()->pending_delete_hosts_.end() || | 570 node->render_manager()->pending_delete_hosts_.end() || |
574 pending_delete_iter->second.get() != swapped_out_rfh) { | 571 pending_delete_iter->second.get() != iter->second) { |
575 node->render_manager()->pending_delete_hosts_[site_instance_id] = | 572 node->render_manager()->pending_delete_hosts_[site_instance_id] = |
576 linked_ptr<RenderFrameHostImpl>(swapped_out_rfh.release()); | 573 linked_ptr<RenderFrameHostImpl>(swapped_out_rfh); |
577 } | 574 } |
578 } else { | 575 } else { |
579 delete proxy; | 576 delete swapped_out_rfh; |
580 } | 577 } |
581 node->render_manager()->proxy_hosts_.erase(site_instance_id); | 578 node->render_manager()->swapped_out_hosts_.erase(site_instance_id); |
582 } | 579 } |
583 | 580 |
584 return true; | 581 return true; |
585 } | 582 } |
586 | 583 |
587 bool RenderFrameHostManager::ShouldTransitionCrossSite() { | 584 bool RenderFrameHostManager::ShouldTransitionCrossSite() { |
588 // False in the single-process mode, as it makes RVHs to accumulate | 585 // False in the single-process mode, as it makes RVHs to accumulate |
589 // in swapped_out_hosts_. | 586 // in swapped_out_hosts_. |
590 // True if we are using process-per-site-instance (default) or | 587 // True if we are using process-per-site-instance (default) or |
591 // process-per-site (kProcessPerSite). | 588 // process-per-site (kProcessPerSite). |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
829 } | 826 } |
830 | 827 |
831 // Start the new renderer in a new SiteInstance, but in the current | 828 // Start the new renderer in a new SiteInstance, but in the current |
832 // BrowsingInstance. It is important to immediately give this new | 829 // BrowsingInstance. It is important to immediately give this new |
833 // SiteInstance to a RenderViewHost (if it is different than our current | 830 // SiteInstance to a RenderViewHost (if it is different than our current |
834 // SiteInstance), so that it is ref counted. This will happen in | 831 // SiteInstance), so that it is ref counted. This will happen in |
835 // CreateRenderView. | 832 // CreateRenderView. |
836 return current_instance->GetRelatedSiteInstance(dest_url); | 833 return current_instance->GetRelatedSiteInstance(dest_url); |
837 } | 834 } |
838 | 835 |
839 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( | 836 RenderFrameHostImpl* RenderFrameHostManager::CreateRenderFrameHost( |
840 SiteInstance* site_instance, | 837 SiteInstance* site_instance, |
841 int view_routing_id, | 838 int view_routing_id, |
842 int frame_routing_id, | 839 int frame_routing_id, |
843 bool swapped_out, | 840 bool swapped_out, |
844 bool hidden) { | 841 bool hidden) { |
845 if (frame_routing_id == MSG_ROUTING_NONE) | 842 if (frame_routing_id == MSG_ROUTING_NONE) |
846 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); | 843 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); |
847 | 844 |
848 // Create a RVH for main frames, or find the existing one for subframes. | 845 // Create a RVH for main frames, or find the existing one for subframes. |
849 FrameTree* frame_tree = frame_tree_node_->frame_tree(); | 846 FrameTree* frame_tree = frame_tree_node_->frame_tree(); |
850 RenderViewHostImpl* render_view_host = NULL; | 847 RenderViewHostImpl* render_view_host = NULL; |
851 if (frame_tree_node_->IsMainFrame()) { | 848 if (frame_tree_node_->IsMainFrame()) { |
852 render_view_host = frame_tree->CreateRenderViewHostForMainFrame( | 849 render_view_host = frame_tree->CreateRenderViewHostForMainFrame( |
853 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden); | 850 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden); |
854 } else { | 851 } else { |
855 render_view_host = frame_tree->GetRenderViewHostForSubFrame(site_instance); | 852 render_view_host = frame_tree->GetRenderViewHostForSubFrame(site_instance); |
856 | 853 |
857 // If we haven't found a RVH for a subframe RFH, it's because we currently | 854 // If we haven't found a RVH for a subframe RFH, it's because we currently |
858 // do not create top-level RFHs for pending subframe navigations. Create | 855 // do not create top-level RFHs for pending subframe navigations. Create |
859 // the RVH here for now. | 856 // the RVH here for now. |
860 // TODO(creis): Mirror the frame tree so this check isn't necessary. | 857 // TODO(creis): Mirror the frame tree so this check isn't necessary. |
861 if (!render_view_host) { | 858 if (!render_view_host) { |
862 render_view_host = frame_tree->CreateRenderViewHostForMainFrame( | 859 render_view_host = frame_tree->CreateRenderViewHostForMainFrame( |
863 site_instance, view_routing_id, frame_routing_id, swapped_out, | 860 site_instance, view_routing_id, frame_routing_id, swapped_out, |
864 hidden); | 861 hidden); |
865 } | 862 } |
866 } | 863 } |
867 | 864 |
| 865 // TODO(creis): Make render_frame_host a scoped_ptr. |
868 // TODO(creis): Pass hidden to RFH. | 866 // TODO(creis): Pass hidden to RFH. |
869 scoped_ptr<RenderFrameHostImpl> render_frame_host = | 867 RenderFrameHostImpl* render_frame_host = |
870 make_scoped_ptr(RenderFrameHostFactory::Create(render_view_host, | 868 RenderFrameHostFactory::Create(render_view_host, |
871 render_frame_delegate_, | 869 render_frame_delegate_, |
872 frame_tree, | 870 frame_tree, |
873 frame_tree_node_, | 871 frame_tree_node_, |
874 frame_routing_id, | 872 frame_routing_id, |
875 swapped_out).release()); | 873 swapped_out).release(); |
876 return render_frame_host.Pass(); | 874 return render_frame_host; |
877 } | 875 } |
878 | 876 |
879 int RenderFrameHostManager::CreateRenderFrame( | 877 int RenderFrameHostManager::CreateRenderFrame( |
880 SiteInstance* instance, | 878 SiteInstance* instance, |
881 int opener_route_id, | 879 int opener_route_id, |
882 bool swapped_out, | 880 bool swapped_out, |
883 bool hidden) { | 881 bool hidden) { |
884 CHECK(instance); | 882 CHECK(instance); |
885 DCHECK(!swapped_out || hidden); // Swapped out views should always be hidden. | 883 DCHECK(!swapped_out || hidden); // Swapped out views should always be hidden. |
886 | 884 |
887 scoped_ptr<RenderFrameHostImpl> new_render_frame_host; | |
888 int routing_id = MSG_ROUTING_NONE; | |
889 | |
890 // We are creating a pending or swapped out RFH here. We should never create | 885 // We are creating a pending or swapped out RFH here. We should never create |
891 // it in the same SiteInstance as our current RFH. | 886 // it in the same SiteInstance as our current RFH. |
892 CHECK_NE(render_frame_host_->GetSiteInstance(), instance); | 887 CHECK_NE(render_frame_host_->GetSiteInstance(), instance); |
893 | 888 |
894 // Check if we've already created an RFH for this SiteInstance. If so, try | 889 // Check if we've already created an RFH for this SiteInstance. If so, try |
895 // to re-use the existing one, which has already been initialized. We'll | 890 // to re-use the existing one, which has already been initialized. We'll |
896 // remove it from the list of swapped out hosts if it commits. | 891 // remove it from the list of swapped out hosts if it commits. |
897 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 892 RenderFrameHostImpl* new_render_frame_host = |
| 893 GetSwappedOutRenderFrameHost(instance); |
898 | 894 |
899 FrameTreeNode* parent_node = NULL; | 895 FrameTreeNode* parent_node = NULL; |
900 if (frame_tree_node_) | 896 if (frame_tree_node_) |
901 parent_node = frame_tree_node_->parent(); | 897 parent_node = frame_tree_node_->parent(); |
902 | 898 |
903 if (proxy) { | 899 if (new_render_frame_host) { |
904 routing_id = proxy->render_view_host()->GetRoutingID(); | |
905 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. | |
906 // Prevent the process from exiting while we're trying to use it. | 900 // Prevent the process from exiting while we're trying to use it. |
907 if (!swapped_out) { | 901 if (!swapped_out) { |
908 new_render_frame_host = proxy->PassFrameHost(); | |
909 new_render_frame_host->GetProcess()->AddPendingView(); | 902 new_render_frame_host->GetProcess()->AddPendingView(); |
910 | |
911 proxy_hosts_.erase(instance->GetId()); | |
912 delete proxy; | |
913 } else { | 903 } else { |
914 // Detect if this is a cross-process child frame that is navigating | 904 // Detect if this is a cross-process child frame that is navigating |
915 // back to the same SiteInstance as its parent. | 905 // back to the same SiteInstance as its parent. |
916 if (parent_node && cross_process_frame_connector_ && | 906 if (parent_node && cross_process_frame_connector_ && |
917 render_frame_host_->GetSiteInstance() == parent_node-> | 907 render_frame_host_->GetSiteInstance() == parent_node-> |
918 render_manager()->current_frame_host()->GetSiteInstance()) { | 908 render_manager()->current_frame_host()->GetSiteInstance()) { |
919 delete cross_process_frame_connector_; | 909 delete cross_process_frame_connector_; |
920 cross_process_frame_connector_ = NULL; | 910 cross_process_frame_connector_ = NULL; |
921 } | 911 } |
922 } | 912 } |
923 } else { | 913 } else { |
924 // Create a new RenderFrameHost if we don't find an existing one. | 914 // Create a new RenderFrameHost if we don't find an existing one. |
925 new_render_frame_host = CreateRenderFrameHost( | 915 // TODO(creis): Make new_render_frame_host a scoped_ptr. |
926 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, swapped_out, hidden); | 916 new_render_frame_host = CreateRenderFrameHost(instance, MSG_ROUTING_NONE, |
| 917 MSG_ROUTING_NONE, swapped_out, |
| 918 hidden); |
| 919 |
| 920 // If the new RFH is swapped out already, store it. Otherwise prevent the |
| 921 // process from exiting while we're trying to navigate in it. |
| 922 if (swapped_out) { |
| 923 swapped_out_hosts_[instance->GetId()] = new_render_frame_host; |
| 924 } else { |
| 925 new_render_frame_host->GetProcess()->AddPendingView(); |
| 926 } |
| 927 |
927 RenderViewHostImpl* render_view_host = | 928 RenderViewHostImpl* render_view_host = |
928 new_render_frame_host->render_view_host(); | 929 new_render_frame_host->render_view_host(); |
929 | |
930 // Prevent the process from exiting while we're trying to navigate in it. | |
931 // Otherwise, if the new RFH is swapped out already, store it. | |
932 if (!swapped_out) { | |
933 new_render_frame_host->GetProcess()->AddPendingView(); | |
934 } else { | |
935 proxy_hosts_[instance->GetId()] = new RenderFrameProxyHost( | |
936 new_render_frame_host.Pass()); | |
937 } | |
938 | |
939 bool success = InitRenderView(render_view_host, opener_route_id); | 930 bool success = InitRenderView(render_view_host, opener_route_id); |
940 if (success && frame_tree_node_->IsMainFrame()) { | 931 if (success && frame_tree_node_->IsMainFrame()) { |
941 // Don't show the main frame's view until we get a DidNavigate from it. | 932 // Don't show the main frame's view until we get a DidNavigate from it. |
942 render_view_host->GetView()->Hide(); | 933 render_view_host->GetView()->Hide(); |
943 } else if (!swapped_out && pending_render_frame_host_) { | 934 } else if (!swapped_out && pending_render_frame_host_) { |
944 CancelPending(); | 935 CancelPending(); |
945 } | 936 } |
946 routing_id = render_view_host->GetRoutingID(); | |
947 } | 937 } |
948 | 938 |
949 // Use this as our new pending RFH if it isn't swapped out. | 939 // Use this as our new pending RFH if it isn't swapped out. |
950 if (!swapped_out) | 940 if (!swapped_out) |
951 pending_render_frame_host_ = new_render_frame_host.Pass(); | 941 pending_render_frame_host_.reset(new_render_frame_host); |
952 | 942 |
953 return routing_id; | 943 return new_render_frame_host->render_view_host()->GetRoutingID(); |
954 } | 944 } |
955 | 945 |
956 bool RenderFrameHostManager::InitRenderView(RenderViewHost* render_view_host, | 946 bool RenderFrameHostManager::InitRenderView(RenderViewHost* render_view_host, |
957 int opener_route_id) { | 947 int opener_route_id) { |
958 // We may have initialized this RenderViewHost for another RenderFrameHost. | 948 // We may have initialized this RenderViewHost for another RenderFrameHost. |
959 if (render_view_host->IsRenderViewLive()) | 949 if (render_view_host->IsRenderViewLive()) |
960 return true; | 950 return true; |
961 | 951 |
962 // If the pending navigation is to a WebUI and the RenderView is not in a | 952 // If the pending navigation is to a WebUI and the RenderView is not in a |
963 // guest process, tell the RenderViewHost about any bindings it will need | 953 // guest process, tell the RenderViewHost about any bindings it will need |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1020 bool focus_render_view = !will_focus_location_bar && | 1010 bool focus_render_view = !will_focus_location_bar && |
1021 render_frame_host_->render_view_host()->GetView() && | 1011 render_frame_host_->render_view_host()->GetView() && |
1022 render_frame_host_->render_view_host()->GetView()->HasFocus(); | 1012 render_frame_host_->render_view_host()->GetView()->HasFocus(); |
1023 | 1013 |
1024 // TODO(creis): As long as show/hide are on RVH, we don't want to do them for | 1014 // TODO(creis): As long as show/hide are on RVH, we don't want to do them for |
1025 // subframe navigations or they'll interfere with the top-level page. | 1015 // subframe navigations or they'll interfere with the top-level page. |
1026 bool is_main_frame = frame_tree_node_->IsMainFrame(); | 1016 bool is_main_frame = frame_tree_node_->IsMainFrame(); |
1027 | 1017 |
1028 // Swap in the pending frame and make it active. Also ensure the FrameTree | 1018 // Swap in the pending frame and make it active. Also ensure the FrameTree |
1029 // stays in sync. | 1019 // stays in sync. |
1030 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = | 1020 RenderFrameHostImpl* old_render_frame_host = render_frame_host_.release(); |
1031 render_frame_host_.Pass(); | |
1032 render_frame_host_ = pending_render_frame_host_.Pass(); | 1021 render_frame_host_ = pending_render_frame_host_.Pass(); |
1033 if (is_main_frame) | 1022 if (is_main_frame) |
1034 render_frame_host_->render_view_host()->AttachToFrameTree(); | 1023 render_frame_host_->render_view_host()->AttachToFrameTree(); |
1035 | 1024 |
1036 // The process will no longer try to exit, so we can decrement the count. | 1025 // The process will no longer try to exit, so we can decrement the count. |
1037 render_frame_host_->GetProcess()->RemovePendingView(); | 1026 render_frame_host_->GetProcess()->RemovePendingView(); |
1038 | 1027 |
1039 // If the view is gone, then this RenderViewHost died while it was hidden. | 1028 // If the view is gone, then this RenderViewHost died while it was hidden. |
1040 // We ignored the RenderProcessGone call at the time, so we should send it now | 1029 // We ignored the RenderProcessGone call at the time, so we should send it now |
1041 // to make sure the sad tab shows up, etc. | 1030 // to make sure the sad tab shows up, etc. |
1042 if (!render_frame_host_->render_view_host()->GetView()) { | 1031 if (!render_frame_host_->render_view_host()->GetView()) { |
1043 delegate_->RenderProcessGoneFromRenderManager( | 1032 delegate_->RenderProcessGoneFromRenderManager( |
1044 render_frame_host_->render_view_host()); | 1033 render_frame_host_->render_view_host()); |
1045 } else if (!delegate_->IsHidden()) { | 1034 } else if (!delegate_->IsHidden()) { |
1046 render_frame_host_->render_view_host()->GetView()->Show(); | 1035 render_frame_host_->render_view_host()->GetView()->Show(); |
1047 } | 1036 } |
1048 | 1037 |
1049 // If the old view is live and top-level, hide it now that the new one is | 1038 // If the old view is live and top-level, hide it now that the new one is |
1050 // visible. | 1039 // visible. |
1051 int32 old_site_instance_id = | 1040 int32 old_site_instance_id = |
1052 old_render_frame_host->GetSiteInstance()->GetId(); | 1041 old_render_frame_host->GetSiteInstance()->GetId(); |
1053 if (old_render_frame_host->render_view_host()->GetView()) { | 1042 if (old_render_frame_host->render_view_host()->GetView()) { |
1054 if (is_main_frame) { | 1043 if (is_main_frame) { |
1055 old_render_frame_host->render_view_host()->GetView()->Hide(); | 1044 old_render_frame_host->render_view_host()->GetView()->Hide(); |
1056 old_render_frame_host->render_view_host()->WasSwappedOut(base::Bind( | 1045 old_render_frame_host->render_view_host()->WasSwappedOut(base::Bind( |
1057 &RenderFrameHostManager::ClearPendingShutdownRFHForSiteInstance, | 1046 &RenderFrameHostManager::ClearPendingShutdownRFHForSiteInstance, |
1058 weak_factory_.GetWeakPtr(), | 1047 weak_factory_.GetWeakPtr(), |
1059 old_site_instance_id, | 1048 old_site_instance_id, |
1060 old_render_frame_host.get())); | 1049 old_render_frame_host)); |
1061 } else { | 1050 } else { |
1062 // TODO(creis): We'll need to set this back to false if we navigate back. | 1051 // TODO(creis): We'll need to set this back to false if we navigate back. |
1063 old_render_frame_host->set_swapped_out(true); | 1052 old_render_frame_host->set_swapped_out(true); |
1064 } | 1053 } |
1065 } | 1054 } |
1066 | 1055 |
1067 // Make sure the size is up to date. (Fix for bug 1079768.) | 1056 // Make sure the size is up to date. (Fix for bug 1079768.) |
1068 delegate_->UpdateRenderViewSizeForRenderManager(); | 1057 delegate_->UpdateRenderViewSizeForRenderManager(); |
1069 | 1058 |
1070 if (will_focus_location_bar) { | 1059 if (will_focus_location_bar) { |
1071 delegate_->SetFocusToLocationBar(false); | 1060 delegate_->SetFocusToLocationBar(false); |
1072 } else if (focus_render_view && | 1061 } else if (focus_render_view && |
1073 render_frame_host_->render_view_host()->GetView()) { | 1062 render_frame_host_->render_view_host()->GetView()) { |
1074 RenderWidgetHostViewPort::FromRWHV( | 1063 RenderWidgetHostViewPort::FromRWHV( |
1075 render_frame_host_->render_view_host()->GetView())->Focus(); | 1064 render_frame_host_->render_view_host()->GetView())->Focus(); |
1076 } | 1065 } |
1077 | 1066 |
1078 // Notify that we've swapped RenderFrameHosts. We do this before shutting down | 1067 // Notify that we've swapped RenderFrameHosts. We do this before shutting down |
1079 // the RFH so that we can clean up RendererResources related to the RFH first. | 1068 // the RFH so that we can clean up RendererResources related to the RFH first. |
1080 // TODO(creis): Only do this on top-level RFHs for now, and later update it to | 1069 // TODO(creis): Only do this on top-level RFHs for now, and later update it to |
1081 // pass the RFHs. | 1070 // pass the RFHs. |
1082 if (is_main_frame) { | 1071 if (is_main_frame) { |
1083 delegate_->NotifySwappedFromRenderManager( | 1072 delegate_->NotifySwappedFromRenderManager( |
1084 old_render_frame_host->render_view_host(), | 1073 old_render_frame_host->render_view_host(), |
1085 render_frame_host_->render_view_host()); | 1074 render_frame_host_->render_view_host()); |
1086 } | 1075 } |
1087 | 1076 |
1088 // If the old RFH is not live, just return as there is no work to do. | 1077 // If the pending frame was on the swapped out list, we can remove it. |
1089 if (!old_render_frame_host->render_view_host()->IsRenderViewLive()) { | 1078 swapped_out_hosts_.erase(render_frame_host_->GetSiteInstance()->GetId()); |
1090 return; | |
1091 } | |
1092 | 1079 |
1093 // If the old RFH is live, we are swapping it out and should keep track of | 1080 if (old_render_frame_host->render_view_host()->IsRenderViewLive()) { |
1094 // it in case we navigate back to it, or it is waiting for the unload event | 1081 // If the old RFH is live, we are swapping it out and should keep track of |
1095 // to execute in the background. | 1082 // it in case we navigate back to it, or it is waiting for the unload event |
1096 // TODO(creis): Swap out the subframe in --site-per-process. | 1083 // to execute in the background. |
1097 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) | 1084 // TODO(creis): Swap out the subframe in --site-per-process. |
1098 DCHECK(old_render_frame_host->is_swapped_out() || | 1085 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) |
1099 !RenderViewHostImpl::IsRVHStateActive( | 1086 DCHECK(old_render_frame_host->is_swapped_out() || |
1100 old_render_frame_host->render_view_host()->rvh_state())); | 1087 !RenderViewHostImpl::IsRVHStateActive( |
1101 // Temp fix for http://crbug.com/90867 until we do a better cleanup to make | 1088 old_render_frame_host->render_view_host()->rvh_state())); |
1102 // sure we don't get different rvh instances for the same site instance | 1089 // Temp fix for http://crbug.com/90867 until we do a better cleanup to make |
1103 // in the same rvhmgr. | 1090 // sure we don't get different rvh instances for the same site instance |
1104 // TODO(creis): Clean this up. | 1091 // in the same rvhmgr. |
1105 RenderFrameProxyHostMap::iterator iter = | 1092 // TODO(creis): Clean this up. |
1106 proxy_hosts_.find(old_site_instance_id); | 1093 RenderFrameHostMap::iterator iter = |
1107 if (iter != proxy_hosts_.end() && | 1094 swapped_out_hosts_.find(old_site_instance_id); |
1108 iter->second->render_frame_host() != old_render_frame_host) { | 1095 if (iter != swapped_out_hosts_.end() && |
1109 // Delete the proxy that will be replaced in the map to avoid a leak. | 1096 iter->second != old_render_frame_host) { |
1110 delete iter->second; | 1097 // Delete the RFH that will be replaced in the map to avoid a leak. |
1111 } | 1098 delete iter->second; |
| 1099 } |
| 1100 // If the RenderViewHost backing the RenderFrameHost is pending shutdown, |
| 1101 // the RenderFrameHost should be put in the map of RenderFrameHosts pending |
| 1102 // shutdown. Otherwise, it is stored in the map of swapped out |
| 1103 // RenderFrameHosts. |
| 1104 if (old_render_frame_host->render_view_host()->rvh_state() == |
| 1105 RenderViewHostImpl::STATE_PENDING_SHUTDOWN) { |
| 1106 swapped_out_hosts_.erase(old_site_instance_id); |
| 1107 RFHPendingDeleteMap::iterator pending_delete_iter = |
| 1108 pending_delete_hosts_.find(old_site_instance_id); |
| 1109 if (pending_delete_iter == pending_delete_hosts_.end() || |
| 1110 pending_delete_iter->second.get() != old_render_frame_host) { |
| 1111 pending_delete_hosts_[old_site_instance_id] = |
| 1112 linked_ptr<RenderFrameHostImpl>(old_render_frame_host); |
| 1113 } |
| 1114 } else { |
| 1115 swapped_out_hosts_[old_site_instance_id] = old_render_frame_host; |
| 1116 } |
1112 | 1117 |
1113 // If the RenderViewHost backing the RenderFrameHost is pending shutdown, | |
1114 // the RenderFrameHost should be put in the map of RenderFrameHosts pending | |
1115 // shutdown. Otherwise, it is stored in the map of proxy hosts. | |
1116 if (old_render_frame_host->render_view_host()->rvh_state() == | |
1117 RenderViewHostImpl::STATE_PENDING_SHUTDOWN) { | |
1118 proxy_hosts_.erase(old_site_instance_id); | |
1119 RFHPendingDeleteMap::iterator pending_delete_iter = | |
1120 pending_delete_hosts_.find(old_site_instance_id); | |
1121 if (pending_delete_iter == pending_delete_hosts_.end() || | |
1122 pending_delete_iter->second.get() != old_render_frame_host) { | |
1123 pending_delete_hosts_[old_site_instance_id] = | |
1124 linked_ptr<RenderFrameHostImpl>(old_render_frame_host.release()); | |
1125 } | |
1126 } else { | |
1127 // If there are no active views in this SiteInstance, it means that | 1118 // If there are no active views in this SiteInstance, it means that |
1128 // this RFH was the last active one in the SiteInstance. Now that we | 1119 // this RFH was the last active one in the SiteInstance. Now that we |
1129 // know that all RFHs are swapped out, we can delete all the RFHs and RVHs | 1120 // know that all RFHs are swapped out, we can delete all the RFHs and RVHs |
1130 // in this SiteInstance. We do this after ensuring the RFH is on the | 1121 // in this SiteInstance. We do this after ensuring the RFH is on the |
1131 // swapped out list to simplify the deletion. | 1122 // swapped out list to simplify the deletion. |
1132 if (!static_cast<SiteInstanceImpl*>( | 1123 if (!static_cast<SiteInstanceImpl*>( |
1133 old_render_frame_host->GetSiteInstance())->active_view_count()) { | 1124 old_render_frame_host->GetSiteInstance())->active_view_count()) { |
1134 old_render_frame_host.reset(); | |
1135 ShutdownRenderFrameHostsInSiteInstance(old_site_instance_id); | 1125 ShutdownRenderFrameHostsInSiteInstance(old_site_instance_id); |
1136 } else { | 1126 // This is deleted while cleaning up the SiteInstance's views. |
1137 proxy_hosts_[old_site_instance_id] = new RenderFrameProxyHost( | 1127 old_render_frame_host = NULL; |
1138 old_render_frame_host.Pass()); | |
1139 } | 1128 } |
| 1129 } else { |
| 1130 delete old_render_frame_host; |
1140 } | 1131 } |
1141 } | 1132 } |
1142 | 1133 |
1143 void RenderFrameHostManager::ShutdownRenderFrameHostsInSiteInstance( | 1134 void RenderFrameHostManager::ShutdownRenderFrameHostsInSiteInstance( |
1144 int32 site_instance_id) { | 1135 int32 site_instance_id) { |
1145 // First remove any swapped out RFH for this SiteInstance from our own list. | 1136 // First remove any swapped out RFH for this SiteInstance from our own list. |
1146 ClearProxiesInSiteInstance(site_instance_id, frame_tree_node_); | 1137 ClearSwappedOutRFHsInSiteInstance(site_instance_id, frame_tree_node_); |
1147 | 1138 |
1148 // Use the safe RenderWidgetHost iterator for now to find all RenderViewHosts | 1139 // Use the safe RenderWidgetHost iterator for now to find all RenderViewHosts |
1149 // in the SiteInstance, then tell their respective FrameTrees to remove all | 1140 // in the SiteInstance, then tell their respective FrameTrees to remove all |
1150 // RenderFrameProxyHosts corresponding to them. | 1141 // swapped out RenderFrameHosts corresponding to them. |
1151 // TODO(creis): Replace this with a RenderFrameHostIterator that protects | 1142 // TODO(creis): Replace this with a RenderFrameHostIterator that protects |
1152 // against use-after-frees if a later element is deleted before getting to it. | 1143 // against use-after-frees if a later element is deleted before getting to it. |
1153 scoped_ptr<RenderWidgetHostIterator> widgets( | 1144 scoped_ptr<RenderWidgetHostIterator> widgets( |
1154 RenderWidgetHostImpl::GetAllRenderWidgetHosts()); | 1145 RenderWidgetHostImpl::GetAllRenderWidgetHosts()); |
1155 while (RenderWidgetHost* widget = widgets->GetNextHost()) { | 1146 while (RenderWidgetHost* widget = widgets->GetNextHost()) { |
1156 if (!widget->IsRenderView()) | 1147 if (!widget->IsRenderView()) |
1157 continue; | 1148 continue; |
1158 RenderViewHostImpl* rvh = | 1149 RenderViewHostImpl* rvh = |
1159 static_cast<RenderViewHostImpl*>(RenderViewHost::From(widget)); | 1150 static_cast<RenderViewHostImpl*>(RenderViewHost::From(widget)); |
1160 if (site_instance_id == rvh->GetSiteInstance()->GetId()) { | 1151 if (site_instance_id == rvh->GetSiteInstance()->GetId()) { |
1161 // This deletes all RenderFrameHosts using the |rvh|, which then causes | 1152 // This deletes all RenderFrameHosts using the |rvh|, which then causes |
1162 // |rvh| to Shutdown. | 1153 // |rvh| to Shutdown. |
1163 FrameTree* tree = rvh->GetDelegate()->GetFrameTree(); | 1154 FrameTree* tree = rvh->GetDelegate()->GetFrameTree(); |
1164 tree->ForEach(base::Bind( | 1155 tree->ForEach(base::Bind( |
1165 &RenderFrameHostManager::ClearProxiesInSiteInstance, | 1156 &RenderFrameHostManager::ClearSwappedOutRFHsInSiteInstance, |
1166 site_instance_id)); | 1157 site_instance_id)); |
1167 } | 1158 } |
1168 } | 1159 } |
1169 } | 1160 } |
1170 | 1161 |
1171 RenderFrameHostImpl* RenderFrameHostManager::UpdateRendererStateForNavigate( | 1162 RenderFrameHostImpl* RenderFrameHostManager::UpdateRendererStateForNavigate( |
1172 const NavigationEntryImpl& entry) { | 1163 const NavigationEntryImpl& entry) { |
1173 // If we are currently navigating cross-process, we want to get back to normal | 1164 // If we are currently navigating cross-process, we want to get back to normal |
1174 // and then navigate as usual. | 1165 // and then navigate as usual. |
1175 if (cross_navigation_pending_) { | 1166 if (cross_navigation_pending_) { |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1333 RenderFrameHostImpl* pending_render_frame_host = | 1324 RenderFrameHostImpl* pending_render_frame_host = |
1334 pending_render_frame_host_.release(); | 1325 pending_render_frame_host_.release(); |
1335 | 1326 |
1336 RenderViewDevToolsAgentHost::OnCancelPendingNavigation( | 1327 RenderViewDevToolsAgentHost::OnCancelPendingNavigation( |
1337 pending_render_frame_host->render_view_host(), | 1328 pending_render_frame_host->render_view_host(), |
1338 render_frame_host_->render_view_host()); | 1329 render_frame_host_->render_view_host()); |
1339 | 1330 |
1340 // We no longer need to prevent the process from exiting. | 1331 // We no longer need to prevent the process from exiting. |
1341 pending_render_frame_host->GetProcess()->RemovePendingView(); | 1332 pending_render_frame_host->GetProcess()->RemovePendingView(); |
1342 | 1333 |
1343 // If the SiteInstance for the pending RFH is being used by others, don't | 1334 // The pending RFH may already be on the swapped out list if we started to |
1344 // delete the RFH, just swap it out and it can be reused at a later point. | 1335 // swap it back in and then canceled. If so, make sure it gets swapped out |
1345 SiteInstanceImpl* site_instance = static_cast<SiteInstanceImpl*>( | 1336 // again. If it's not on the swapped out list (e.g., aborting a pending |
1346 pending_render_frame_host->GetSiteInstance()); | 1337 // load), then it's safe to shut down. |
1347 if (site_instance->active_view_count() > 1) { | 1338 if (IsOnSwappedOutList(pending_render_frame_host)) { |
1348 // Any currently suspended navigations are no longer needed. | 1339 // Any currently suspended navigations are no longer needed. |
1349 pending_render_frame_host->render_view_host()->CancelSuspendedNavigations(); | 1340 pending_render_frame_host->render_view_host()->CancelSuspendedNavigations(); |
1350 | 1341 |
1351 pending_render_frame_host->SwapOut(); | 1342 pending_render_frame_host->SwapOut(); |
1352 } else { | 1343 } else { |
1353 // We won't be coming back, so shut this one down. | 1344 // We won't be coming back, so shut this one down. |
1354 delete pending_render_frame_host; | 1345 delete pending_render_frame_host; |
1355 } | 1346 } |
1356 | 1347 |
1357 pending_web_ui_.reset(); | 1348 pending_web_ui_.reset(); |
(...skipping 13 matching lines...) Expand all Loading... |
1371 NOTREACHED(); | 1362 NOTREACHED(); |
1372 pending_render_frame_host_.reset(); | 1363 pending_render_frame_host_.reset(); |
1373 } | 1364 } |
1374 | 1365 |
1375 // Make sure deleted RVHs are not kept in the swapped out list while we are | 1366 // Make sure deleted RVHs are not kept in the swapped out list while we are |
1376 // still alive. (If render_frame_host_ is null, we're already being deleted.) | 1367 // still alive. (If render_frame_host_ is null, we're already being deleted.) |
1377 if (!render_frame_host_) | 1368 if (!render_frame_host_) |
1378 return; | 1369 return; |
1379 | 1370 |
1380 // We can't look it up by SiteInstance ID, which may no longer be valid. | 1371 // We can't look it up by SiteInstance ID, which may no longer be valid. |
1381 for (RenderFrameProxyHostMap::iterator iter = proxy_hosts_.begin(); | 1372 for (RenderFrameHostMap::iterator iter = swapped_out_hosts_.begin(); |
1382 iter != proxy_hosts_.end(); | 1373 iter != swapped_out_hosts_.end(); |
1383 ++iter) { | 1374 ++iter) { |
1384 if (iter->second->render_view_host() == rvh) { | 1375 if (iter->second->render_view_host() == rvh) { |
1385 proxy_hosts_.erase(iter); | 1376 swapped_out_hosts_.erase(iter); |
1386 break; | 1377 break; |
1387 } | 1378 } |
1388 } | 1379 } |
1389 } | 1380 } |
1390 | 1381 |
1391 bool RenderFrameHostManager::IsRVHOnSwappedOutList( | 1382 bool RenderFrameHostManager::IsRVHOnSwappedOutList( |
1392 RenderViewHostImpl* rvh) const { | 1383 RenderViewHostImpl* rvh) const { |
1393 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost( | 1384 RenderFrameHostImpl* render_frame_host = GetSwappedOutRenderFrameHost( |
1394 rvh->GetSiteInstance()); | 1385 rvh->GetSiteInstance()); |
1395 if (!proxy) | 1386 if (!render_frame_host) |
1396 return false; | 1387 return false; |
1397 return IsOnSwappedOutList(proxy->render_frame_host()); | 1388 return IsOnSwappedOutList(render_frame_host); |
1398 } | 1389 } |
1399 | 1390 |
1400 bool RenderFrameHostManager::IsOnSwappedOutList( | 1391 bool RenderFrameHostManager::IsOnSwappedOutList( |
1401 RenderFrameHostImpl* rfh) const { | 1392 RenderFrameHostImpl* rfh) const { |
1402 if (!rfh->GetSiteInstance()) | 1393 if (!rfh->GetSiteInstance()) |
1403 return false; | 1394 return false; |
1404 | 1395 |
1405 RenderFrameProxyHostMap::const_iterator iter = proxy_hosts_.find( | 1396 RenderFrameHostMap::const_iterator iter = swapped_out_hosts_.find( |
1406 rfh->GetSiteInstance()->GetId()); | 1397 rfh->GetSiteInstance()->GetId()); |
1407 if (iter == proxy_hosts_.end()) | 1398 if (iter == swapped_out_hosts_.end()) |
1408 return false; | 1399 return false; |
1409 | 1400 |
1410 return iter->second->render_frame_host() == rfh; | 1401 return iter->second == rfh; |
1411 } | 1402 } |
1412 | 1403 |
1413 RenderViewHostImpl* RenderFrameHostManager::GetSwappedOutRenderViewHost( | 1404 RenderViewHostImpl* RenderFrameHostManager::GetSwappedOutRenderViewHost( |
1414 SiteInstance* instance) const { | 1405 SiteInstance* instance) const { |
1415 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); | 1406 RenderFrameHostImpl* render_frame_host = |
1416 if (proxy) | 1407 GetSwappedOutRenderFrameHost(instance); |
1417 return proxy->render_view_host(); | 1408 if (render_frame_host) |
| 1409 return render_frame_host->render_view_host(); |
1418 return NULL; | 1410 return NULL; |
1419 } | 1411 } |
1420 | 1412 |
1421 RenderFrameProxyHost* RenderFrameHostManager::GetRenderFrameProxyHost( | 1413 RenderFrameHostImpl* RenderFrameHostManager::GetSwappedOutRenderFrameHost( |
1422 SiteInstance* instance) const { | 1414 SiteInstance* instance) const { |
1423 RenderFrameProxyHostMap::const_iterator iter = | 1415 RenderFrameHostMap::const_iterator iter = |
1424 proxy_hosts_.find(instance->GetId()); | 1416 swapped_out_hosts_.find(instance->GetId()); |
1425 if (iter != proxy_hosts_.end()) | 1417 if (iter != swapped_out_hosts_.end()) |
1426 return iter->second; | 1418 return iter->second; |
1427 | 1419 |
1428 return NULL; | 1420 return NULL; |
1429 } | 1421 } |
1430 | 1422 |
1431 } // namespace content | 1423 } // namespace content |
OLD | NEW |