Chromium Code Reviews| 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" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 60 render_frame_delegate_(render_frame_delegate), | 60 render_frame_delegate_(render_frame_delegate), |
| 61 render_view_delegate_(render_view_delegate), | 61 render_view_delegate_(render_view_delegate), |
| 62 render_widget_delegate_(render_widget_delegate), | 62 render_widget_delegate_(render_widget_delegate), |
| 63 interstitial_page_(NULL), | 63 interstitial_page_(NULL), |
| 64 weak_factory_(this) { | 64 weak_factory_(this) { |
| 65 DCHECK(frame_tree_node_); | 65 DCHECK(frame_tree_node_); |
| 66 } | 66 } |
| 67 | 67 |
| 68 RenderFrameHostManager::~RenderFrameHostManager() { | 68 RenderFrameHostManager::~RenderFrameHostManager() { |
| 69 if (pending_render_frame_host_) | 69 if (pending_render_frame_host_) |
| 70 CancelPending(); | 70 UnsetPendingRenderFrameHost(); |
| 71 | 71 |
| 72 // We should always have a current RenderFrameHost except in some tests. | 72 // We should always have a current RenderFrameHost except in some tests. |
| 73 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); | 73 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); |
| 74 | 74 |
| 75 // Delete any swapped out RenderFrameHosts. | 75 // Delete any swapped out RenderFrameHosts. |
| 76 STLDeleteValues(&proxy_hosts_); | 76 STLDeleteValues(&proxy_hosts_); |
| 77 } | 77 } |
| 78 | 78 |
| 79 void RenderFrameHostManager::Init(BrowserContext* browser_context, | 79 void RenderFrameHostManager::Init(BrowserContext* browser_context, |
| 80 SiteInstance* site_instance, | 80 SiteInstance* site_instance, |
| (...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 557 // We shouldn't get here for subframes, since we only swap subframes when | 557 // We shouldn't get here for subframes, since we only swap subframes when |
| 558 // --site-per-process is used. | 558 // --site-per-process is used. |
| 559 DCHECK(is_main_frame); | 559 DCHECK(is_main_frame); |
| 560 | 560 |
| 561 // The old RenderFrameHost will stay alive inside the proxy so that existing | 561 // The old RenderFrameHost will stay alive inside the proxy so that existing |
| 562 // JavaScript window references to it stay valid. | 562 // JavaScript window references to it stay valid. |
| 563 proxy->TakeFrameHostOwnership(old_render_frame_host.Pass()); | 563 proxy->TakeFrameHostOwnership(old_render_frame_host.Pass()); |
| 564 } | 564 } |
| 565 } | 565 } |
| 566 | 566 |
| 567 void RenderFrameHostManager::DiscardUnusedFrame( | |
|
nasko
2014/12/12 21:54:49
In a parallel CL (https://codereview.chromium.org/
ncarter (slow)
2014/12/12 22:33:24
Done. I inlined it in an attempt to control the pr
| |
| 568 scoped_ptr<RenderFrameHostImpl> render_frame_host) { | |
| 569 // TODO(carlosk): this code is very similar to what can be found in | |
| 570 // SwapOutOldFrame and we should see that these are unified at some point. | |
| 571 | |
| 572 // If the SiteInstance for the pending RFH is being used by others don't | |
| 573 // delete the RFH. Just swap it out and it can be reused at a later point. | |
| 574 SiteInstanceImpl* site_instance = render_frame_host->GetSiteInstance(); | |
| 575 if (site_instance->HasSite() && site_instance->active_frame_count() > 1) { | |
| 576 // Any currently suspended navigations are no longer needed. | |
| 577 render_frame_host->CancelSuspendedNavigations(); | |
| 578 | |
| 579 RenderFrameProxyHost* proxy = | |
| 580 new RenderFrameProxyHost(site_instance, frame_tree_node_); | |
| 581 proxy_hosts_[site_instance->GetId()] = proxy; | |
| 582 render_frame_host->SwapOut(proxy); | |
| 583 if (frame_tree_node_->IsMainFrame()) | |
| 584 proxy->TakeFrameHostOwnership(render_frame_host.Pass()); | |
| 585 } else { | |
| 586 // We won't be coming back, so delete this one. | |
| 587 render_frame_host.reset(); | |
| 588 } | |
| 589 } | |
| 590 | |
| 591 void RenderFrameHostManager::MoveToPendingDeleteHosts( | 567 void RenderFrameHostManager::MoveToPendingDeleteHosts( |
| 592 scoped_ptr<RenderFrameHostImpl> render_frame_host) { | 568 scoped_ptr<RenderFrameHostImpl> render_frame_host) { |
| 593 // |render_frame_host| will be deleted when its SwapOut ACK is received, or | 569 // |render_frame_host| will be deleted when its SwapOut ACK is received, or |
| 594 // when the timer times out, or when the RFHM itself is deleted (whichever | 570 // when the timer times out, or when the RFHM itself is deleted (whichever |
| 595 // comes first). | 571 // comes first). |
| 596 pending_delete_hosts_.push_back( | 572 pending_delete_hosts_.push_back( |
| 597 linked_ptr<RenderFrameHostImpl>(render_frame_host.release())); | 573 linked_ptr<RenderFrameHostImpl>(render_frame_host.release())); |
| 598 } | 574 } |
| 599 | 575 |
| 600 bool RenderFrameHostManager::IsPendingDeletion( | 576 bool RenderFrameHostManager::IsPendingDeletion( |
| (...skipping 983 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1584 new ViewMsg_EnableViewSourceMode( | 1560 new ViewMsg_EnableViewSourceMode( |
| 1585 render_frame_host_->render_view_host()->GetRoutingID())); | 1561 render_frame_host_->render_view_host()->GetRoutingID())); |
| 1586 } | 1562 } |
| 1587 | 1563 |
| 1588 return render_frame_host_.get(); | 1564 return render_frame_host_.get(); |
| 1589 } | 1565 } |
| 1590 | 1566 |
| 1591 void RenderFrameHostManager::CancelPending() { | 1567 void RenderFrameHostManager::CancelPending() { |
| 1592 TRACE_EVENT1("navigation", "RenderFrameHostManager::CancelPending", | 1568 TRACE_EVENT1("navigation", "RenderFrameHostManager::CancelPending", |
| 1593 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); | 1569 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); |
| 1570 | |
| 1571 scoped_ptr<RenderFrameHostImpl> render_frame_host = | |
| 1572 UnsetPendingRenderFrameHost(); | |
| 1573 | |
| 1574 // TODO(carlosk): this code is very similar to what can be found in | |
| 1575 // SwapOutOldFrame and we should see that these are unified at some point. | |
| 1576 | |
| 1577 // If the SiteInstance for the pending RFH is being used by others don't | |
| 1578 // delete the RFH. Just swap it out and it can be reused at a later point. | |
| 1579 SiteInstanceImpl* site_instance = render_frame_host->GetSiteInstance(); | |
| 1580 if (site_instance->HasSite() && site_instance->active_frame_count() > 1) { | |
| 1581 // Any currently suspended navigations are no longer needed. | |
| 1582 render_frame_host->CancelSuspendedNavigations(); | |
| 1583 | |
| 1584 RenderFrameProxyHost* proxy = | |
| 1585 new RenderFrameProxyHost(site_instance, frame_tree_node_); | |
| 1586 proxy_hosts_[site_instance->GetId()] = proxy; | |
| 1587 render_frame_host->SwapOut(proxy); | |
| 1588 if (frame_tree_node_->IsMainFrame()) | |
| 1589 proxy->TakeFrameHostOwnership(render_frame_host.Pass()); | |
| 1590 } else { | |
| 1591 // We won't be coming back, so delete this one. | |
| 1592 render_frame_host.reset(); | |
| 1593 } | |
| 1594 } | |
| 1595 | |
| 1596 scoped_ptr<RenderFrameHostImpl> | |
| 1597 RenderFrameHostManager::UnsetPendingRenderFrameHost() { | |
| 1594 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host = | 1598 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host = |
| 1595 pending_render_frame_host_.Pass(); | 1599 pending_render_frame_host_.Pass(); |
| 1596 | 1600 |
| 1597 RenderViewDevToolsAgentHost::OnCancelPendingNavigation( | 1601 RenderViewDevToolsAgentHost::OnCancelPendingNavigation( |
| 1598 pending_render_frame_host->render_view_host(), | 1602 pending_render_frame_host->render_view_host(), |
| 1599 render_frame_host_->render_view_host()); | 1603 render_frame_host_->render_view_host()); |
| 1600 | 1604 |
| 1601 // We no longer need to prevent the process from exiting. | 1605 // We no longer need to prevent the process from exiting. |
| 1602 pending_render_frame_host->GetProcess()->RemovePendingView(); | 1606 pending_render_frame_host->GetProcess()->RemovePendingView(); |
| 1603 | 1607 |
| 1604 DiscardUnusedFrame(pending_render_frame_host.Pass()); | |
| 1605 | |
| 1606 pending_web_ui_.reset(); | 1608 pending_web_ui_.reset(); |
| 1607 pending_and_current_web_ui_.reset(); | 1609 pending_and_current_web_ui_.reset(); |
| 1610 | |
| 1611 return pending_render_frame_host.Pass(); | |
| 1608 } | 1612 } |
| 1609 | 1613 |
| 1610 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost( | 1614 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost( |
| 1611 scoped_ptr<RenderFrameHostImpl> render_frame_host) { | 1615 scoped_ptr<RenderFrameHostImpl> render_frame_host) { |
| 1612 // Swap the two. | 1616 // Swap the two. |
| 1613 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = | 1617 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = |
| 1614 render_frame_host_.Pass(); | 1618 render_frame_host_.Pass(); |
| 1615 render_frame_host_ = render_frame_host.Pass(); | 1619 render_frame_host_ = render_frame_host.Pass(); |
| 1616 | 1620 |
| 1617 if (frame_tree_node_->IsMainFrame()) { | 1621 if (frame_tree_node_->IsMainFrame()) { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1679 void RenderFrameHostManager::DeleteRenderFrameProxyHost( | 1683 void RenderFrameHostManager::DeleteRenderFrameProxyHost( |
| 1680 SiteInstance* instance) { | 1684 SiteInstance* instance) { |
| 1681 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); | 1685 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); |
| 1682 if (iter != proxy_hosts_.end()) { | 1686 if (iter != proxy_hosts_.end()) { |
| 1683 delete iter->second; | 1687 delete iter->second; |
| 1684 proxy_hosts_.erase(iter); | 1688 proxy_hosts_.erase(iter); |
| 1685 } | 1689 } |
| 1686 } | 1690 } |
| 1687 | 1691 |
| 1688 } // namespace content | 1692 } // namespace content |
| OLD | NEW |