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

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

Issue 1151393003: Add ref-count on RenderViewHost for each new RenderFrameProxyHost. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes based on Nick's review. Created 5 years, 7 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_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/logging.h" 10 #include "base/logging.h"
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 // Tell the old RenderFrameHost to swap out, with no proxy to replace it. 591 // Tell the old RenderFrameHost to swap out, with no proxy to replace it.
592 old_render_frame_host->SwapOut(NULL, true); 592 old_render_frame_host->SwapOut(NULL, true);
593 MoveToPendingDeleteHosts(old_render_frame_host.Pass()); 593 MoveToPendingDeleteHosts(old_render_frame_host.Pass());
594 return; 594 return;
595 } 595 }
596 596
597 // Otherwise there are active views and we need a proxy for the old RFH. 597 // Otherwise there are active views and we need a proxy for the old RFH.
598 // (There should not be one yet.) 598 // (There should not be one yet.)
599 CHECK(!GetRenderFrameProxyHost(old_render_frame_host->GetSiteInstance())); 599 CHECK(!GetRenderFrameProxyHost(old_render_frame_host->GetSiteInstance()));
600 RenderFrameProxyHost* proxy = new RenderFrameProxyHost( 600 RenderFrameProxyHost* proxy = new RenderFrameProxyHost(
601 old_render_frame_host->GetSiteInstance(), frame_tree_node_); 601 old_render_frame_host->GetSiteInstance(),
602 old_render_frame_host->render_view_host(), frame_tree_node_);
602 CHECK(proxy_hosts_.insert(std::make_pair(old_site_instance_id, proxy)).second) 603 CHECK(proxy_hosts_.insert(std::make_pair(old_site_instance_id, proxy)).second)
603 << "Inserting a duplicate item."; 604 << "Inserting a duplicate item.";
604 605
605 // Tell the old RenderFrameHost to swap out and be replaced by the proxy. 606 // Tell the old RenderFrameHost to swap out and be replaced by the proxy.
606 old_render_frame_host->SwapOut(proxy, true); 607 old_render_frame_host->SwapOut(proxy, true);
607 608
608 // SwapOut creates a RenderFrameProxy, so set the proxy to be initialized. 609 // SwapOut creates a RenderFrameProxy, so set the proxy to be initialized.
609 proxy->set_render_frame_proxy_created(true); 610 proxy->set_render_frame_proxy_created(true);
610 611
611 bool is_main_frame = frame_tree_node_->IsMainFrame(); 612 bool is_main_frame = frame_tree_node_->IsMainFrame();
(...skipping 21 matching lines...) Expand all
633 // SwapOutOldFrame and we should see that these are unified at some point. 634 // SwapOutOldFrame and we should see that these are unified at some point.
634 635
635 // If the SiteInstance for the pending RFH is being used by others don't 636 // If the SiteInstance for the pending RFH is being used by others don't
636 // delete the RFH. Just swap it out and it can be reused at a later point. 637 // delete the RFH. Just swap it out and it can be reused at a later point.
637 SiteInstanceImpl* site_instance = render_frame_host->GetSiteInstance(); 638 SiteInstanceImpl* site_instance = render_frame_host->GetSiteInstance();
638 if (site_instance->HasSite() && site_instance->active_frame_count() > 1) { 639 if (site_instance->HasSite() && site_instance->active_frame_count() > 1) {
639 // Any currently suspended navigations are no longer needed. 640 // Any currently suspended navigations are no longer needed.
640 render_frame_host->CancelSuspendedNavigations(); 641 render_frame_host->CancelSuspendedNavigations();
641 642
642 CHECK(!GetRenderFrameProxyHost(site_instance)); 643 CHECK(!GetRenderFrameProxyHost(site_instance));
643 RenderFrameProxyHost* proxy = 644 RenderFrameProxyHost* proxy = new RenderFrameProxyHost(
644 new RenderFrameProxyHost(site_instance, frame_tree_node_); 645 site_instance, render_frame_host->render_view_host(), frame_tree_node_);
645 proxy_hosts_[site_instance->GetId()] = proxy; 646 proxy_hosts_[site_instance->GetId()] = proxy;
646 647
647 // Check if the RenderFrameHost is already swapped out, to avoid swapping it 648 // Check if the RenderFrameHost is already swapped out, to avoid swapping it
648 // out again. 649 // out again.
649 if (!render_frame_host->is_swapped_out()) 650 if (!render_frame_host->is_swapped_out())
650 render_frame_host->SwapOut(proxy, false); 651 render_frame_host->SwapOut(proxy, false);
651 652
652 if (frame_tree_node_->IsMainFrame()) 653 if (frame_tree_node_->IsMainFrame())
653 proxy->TakeFrameHostOwnership(render_frame_host.Pass()); 654 proxy->TakeFrameHostOwnership(render_frame_host.Pass());
654 } else { 655 } else {
(...skipping 839 matching lines...) Expand 10 before | Expand all | Expand 10 after
1494 RenderViewHostImpl* render_view_host = 1495 RenderViewHostImpl* render_view_host =
1495 new_render_frame_host->render_view_host(); 1496 new_render_frame_host->render_view_host();
1496 int proxy_routing_id = MSG_ROUTING_NONE; 1497 int proxy_routing_id = MSG_ROUTING_NONE;
1497 1498
1498 // Prevent the process from exiting while we're trying to navigate in it. 1499 // Prevent the process from exiting while we're trying to navigate in it.
1499 // Otherwise, if the new RFH is swapped out already, store it. 1500 // Otherwise, if the new RFH is swapped out already, store it.
1500 if (!swapped_out) { 1501 if (!swapped_out) {
1501 new_render_frame_host->GetProcess()->AddPendingView(); 1502 new_render_frame_host->GetProcess()->AddPendingView();
1502 } else { 1503 } else {
1503 proxy = new RenderFrameProxyHost( 1504 proxy = new RenderFrameProxyHost(
1504 new_render_frame_host->GetSiteInstance(), frame_tree_node_); 1505 new_render_frame_host->GetSiteInstance(),
1506 new_render_frame_host->render_view_host(), frame_tree_node_);
1505 proxy_hosts_[instance->GetId()] = proxy; 1507 proxy_hosts_[instance->GetId()] = proxy;
1506 proxy_routing_id = proxy->GetRoutingID(); 1508 proxy_routing_id = proxy->GetRoutingID();
1507 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); 1509 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass());
1508 } 1510 }
1509 1511
1510 success = 1512 success =
1511 InitRenderView(render_view_host, opener_route_id, proxy_routing_id, 1513 InitRenderView(render_view_host, opener_route_id, proxy_routing_id,
1512 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); 1514 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION));
1513 if (success) { 1515 if (success) {
1514 // Remember that InitRenderView also created the RenderFrameProxy. 1516 // Remember that InitRenderView also created the RenderFrameProxy.
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1561 // A RenderFrameProxyHost should never be created in the same SiteInstance as 1563 // A RenderFrameProxyHost should never be created in the same SiteInstance as
1562 // the current RFH. 1564 // the current RFH.
1563 CHECK(instance); 1565 CHECK(instance);
1564 CHECK_NE(instance, render_frame_host_->GetSiteInstance()); 1566 CHECK_NE(instance, render_frame_host_->GetSiteInstance());
1565 1567
1566 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); 1568 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
1567 if (proxy && proxy->is_render_frame_proxy_live()) 1569 if (proxy && proxy->is_render_frame_proxy_live())
1568 return proxy->GetRoutingID(); 1570 return proxy->GetRoutingID();
1569 1571
1570 if (!proxy) { 1572 if (!proxy) {
1571 proxy = new RenderFrameProxyHost(instance, frame_tree_node_); 1573 proxy = new RenderFrameProxyHost(
1574 instance, frame_tree_node_->frame_tree()->GetRenderViewHost(instance),
1575 frame_tree_node_);
1572 proxy_hosts_[instance->GetId()] = proxy; 1576 proxy_hosts_[instance->GetId()] = proxy;
1573 } 1577 }
1574 proxy->InitRenderFrameProxy(); 1578 proxy->InitRenderFrameProxy();
1575 return proxy->GetRoutingID(); 1579 return proxy->GetRoutingID();
1576 } 1580 }
1577 1581
1578 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) { 1582 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) {
1579 for (const auto& pair : proxy_hosts_) { 1583 for (const auto& pair : proxy_hosts_) {
1580 child->render_manager()->CreateRenderFrameProxy( 1584 child->render_manager()->CreateRenderFrameProxy(
1581 pair.second->GetSiteInstance()); 1585 pair.second->GetSiteInstance());
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after
2110 void RenderFrameHostManager::DeleteRenderFrameProxyHost( 2114 void RenderFrameHostManager::DeleteRenderFrameProxyHost(
2111 SiteInstance* instance) { 2115 SiteInstance* instance) {
2112 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); 2116 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId());
2113 if (iter != proxy_hosts_.end()) { 2117 if (iter != proxy_hosts_.end()) {
2114 delete iter->second; 2118 delete iter->second;
2115 proxy_hosts_.erase(iter); 2119 proxy_hosts_.erase(iter);
2116 } 2120 }
2117 } 2121 }
2118 2122
2119 } // namespace content 2123 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698