| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 // the current RenderFrameHost and uses it during its destructor. | 78 // the current RenderFrameHost and uses it during its destructor. |
| 79 ResetProxyHosts(); | 79 ResetProxyHosts(); |
| 80 | 80 |
| 81 // We should always have a current RenderFrameHost except in some tests. | 81 // We should always have a current RenderFrameHost except in some tests. |
| 82 SetRenderFrameHost(std::unique_ptr<RenderFrameHostImpl>()); | 82 SetRenderFrameHost(std::unique_ptr<RenderFrameHostImpl>()); |
| 83 } | 83 } |
| 84 | 84 |
| 85 void RenderFrameHostManager::Init(SiteInstance* site_instance, | 85 void RenderFrameHostManager::Init(SiteInstance* site_instance, |
| 86 int32_t view_routing_id, | 86 int32_t view_routing_id, |
| 87 int32_t frame_routing_id, | 87 int32_t frame_routing_id, |
| 88 int32_t widget_routing_id) { | 88 int32_t widget_routing_id, |
| 89 bool renderer_initiated_creation) { |
| 89 DCHECK(site_instance); | 90 DCHECK(site_instance); |
| 90 // TODO(avi): While RenderViewHostImpl is-a RenderWidgetHostImpl, this must | 91 // TODO(avi): While RenderViewHostImpl is-a RenderWidgetHostImpl, this must |
| 91 // hold true to avoid having two RenderWidgetHosts for the top-level frame. | 92 // hold true to avoid having two RenderWidgetHosts for the top-level frame. |
| 92 // https://crbug.com/545684 | 93 // https://crbug.com/545684 |
| 93 DCHECK(!frame_tree_node_->IsMainFrame() || | 94 DCHECK(!frame_tree_node_->IsMainFrame() || |
| 94 view_routing_id == widget_routing_id); | 95 view_routing_id == widget_routing_id); |
| 95 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id, | 96 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id, |
| 96 frame_routing_id, widget_routing_id, | 97 frame_routing_id, widget_routing_id, |
| 97 delegate_->IsHidden())); | 98 delegate_->IsHidden(), |
| 99 renderer_initiated_creation)); |
| 98 | 100 |
| 99 // Notify the delegate of the creation of the current RenderFrameHost. | 101 // Notify the delegate of the creation of the current RenderFrameHost. |
| 100 // Do this only for subframes, as the main frame case is taken care of by | 102 // Do this only for subframes, as the main frame case is taken care of by |
| 101 // WebContentsImpl::Init. | 103 // WebContentsImpl::Init. |
| 102 if (!frame_tree_node_->IsMainFrame()) { | 104 if (!frame_tree_node_->IsMainFrame()) { |
| 103 delegate_->NotifySwappedFromRenderManager( | 105 delegate_->NotifySwappedFromRenderManager( |
| 104 nullptr, render_frame_host_.get(), false); | 106 nullptr, render_frame_host_.get(), false); |
| 105 } | 107 } |
| 106 } | 108 } |
| 107 | 109 |
| (...skipping 1526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1634 // cross-site, that proxy would be created as part of swapping out. | 1636 // cross-site, that proxy would be created as part of swapping out. |
| 1635 for (FrameTreeNode* ancestor = opener->parent(); ancestor; | 1637 for (FrameTreeNode* ancestor = opener->parent(); ancestor; |
| 1636 ancestor = ancestor->parent()) { | 1638 ancestor = ancestor->parent()) { |
| 1637 RenderFrameHostImpl* ancestor_rfh = ancestor->current_frame_host(); | 1639 RenderFrameHostImpl* ancestor_rfh = ancestor->current_frame_host(); |
| 1638 if (ancestor_rfh->GetSiteInstance() != current_instance) | 1640 if (ancestor_rfh->GetSiteInstance() != current_instance) |
| 1639 CreateRenderFrameProxy(ancestor_rfh->GetSiteInstance()); | 1641 CreateRenderFrameProxy(ancestor_rfh->GetSiteInstance()); |
| 1640 } | 1642 } |
| 1641 } | 1643 } |
| 1642 | 1644 |
| 1643 std::unique_ptr<RenderFrameHostImpl> | 1645 std::unique_ptr<RenderFrameHostImpl> |
| 1644 RenderFrameHostManager::CreateRenderFrameHost(SiteInstance* site_instance, | 1646 RenderFrameHostManager::CreateRenderFrameHost( |
| 1645 int32_t view_routing_id, | 1647 SiteInstance* site_instance, |
| 1646 int32_t frame_routing_id, | 1648 int32_t view_routing_id, |
| 1647 int32_t widget_routing_id, | 1649 int32_t frame_routing_id, |
| 1648 bool hidden) { | 1650 int32_t widget_routing_id, |
| 1651 bool hidden, |
| 1652 bool renderer_initiated_creation) { |
| 1649 if (frame_routing_id == MSG_ROUTING_NONE) | 1653 if (frame_routing_id == MSG_ROUTING_NONE) |
| 1650 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); | 1654 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); |
| 1651 | 1655 |
| 1652 // Create a RVH for main frames, or find the existing one for subframes. | 1656 // Create a RVH for main frames, or find the existing one for subframes. |
| 1653 FrameTree* frame_tree = frame_tree_node_->frame_tree(); | 1657 FrameTree* frame_tree = frame_tree_node_->frame_tree(); |
| 1654 RenderViewHostImpl* render_view_host = nullptr; | 1658 RenderViewHostImpl* render_view_host = nullptr; |
| 1655 if (frame_tree_node_->IsMainFrame()) { | 1659 if (frame_tree_node_->IsMainFrame()) { |
| 1656 render_view_host = frame_tree->CreateRenderViewHost( | 1660 render_view_host = frame_tree->CreateRenderViewHost( |
| 1657 site_instance, view_routing_id, frame_routing_id, false, hidden); | 1661 site_instance, view_routing_id, frame_routing_id, false, hidden); |
| 1658 // TODO(avi): It's a bit bizarre that this logic lives here instead of in | 1662 // TODO(avi): It's a bit bizarre that this logic lives here instead of in |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1670 DCHECK_EQ(view_routing_id, render_view_host->GetRoutingID()); | 1674 DCHECK_EQ(view_routing_id, render_view_host->GetRoutingID()); |
| 1671 } | 1675 } |
| 1672 } else { | 1676 } else { |
| 1673 render_view_host = frame_tree->GetRenderViewHost(site_instance); | 1677 render_view_host = frame_tree->GetRenderViewHost(site_instance); |
| 1674 CHECK(render_view_host); | 1678 CHECK(render_view_host); |
| 1675 } | 1679 } |
| 1676 | 1680 |
| 1677 return RenderFrameHostFactory::Create( | 1681 return RenderFrameHostFactory::Create( |
| 1678 site_instance, render_view_host, render_frame_delegate_, | 1682 site_instance, render_view_host, render_frame_delegate_, |
| 1679 render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, | 1683 render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, |
| 1680 widget_routing_id, hidden); | 1684 widget_routing_id, hidden, renderer_initiated_creation); |
| 1681 } | 1685 } |
| 1682 | 1686 |
| 1683 // PlzNavigate | 1687 // PlzNavigate |
| 1684 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( | 1688 bool RenderFrameHostManager::CreateSpeculativeRenderFrameHost( |
| 1685 SiteInstance* old_instance, | 1689 SiteInstance* old_instance, |
| 1686 SiteInstance* new_instance) { | 1690 SiteInstance* new_instance) { |
| 1687 CHECK(new_instance); | 1691 CHECK(new_instance); |
| 1688 CHECK_NE(old_instance, new_instance); | 1692 CHECK_NE(old_instance, new_instance); |
| 1689 | 1693 |
| 1690 // The process for the new SiteInstance may (if we're sharing a process with | 1694 // The process for the new SiteInstance may (if we're sharing a process with |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1725 // A RenderFrame in a different process from its parent RenderFrame | 1729 // A RenderFrame in a different process from its parent RenderFrame |
| 1726 // requires a RenderWidget for input/layout/painting. | 1730 // requires a RenderWidget for input/layout/painting. |
| 1727 if (frame_tree_node_->parent() && | 1731 if (frame_tree_node_->parent() && |
| 1728 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != | 1732 frame_tree_node_->parent()->current_frame_host()->GetSiteInstance() != |
| 1729 instance) { | 1733 instance) { |
| 1730 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); | 1734 CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); |
| 1731 widget_routing_id = instance->GetProcess()->GetNextRoutingID(); | 1735 widget_routing_id = instance->GetProcess()->GetNextRoutingID(); |
| 1732 } | 1736 } |
| 1733 | 1737 |
| 1734 new_render_frame_host = CreateRenderFrameHost( | 1738 new_render_frame_host = CreateRenderFrameHost( |
| 1735 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, hidden); | 1739 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, widget_routing_id, hidden, |
| 1740 false); |
| 1736 RenderViewHostImpl* render_view_host = | 1741 RenderViewHostImpl* render_view_host = |
| 1737 new_render_frame_host->render_view_host(); | 1742 new_render_frame_host->render_view_host(); |
| 1738 | 1743 |
| 1739 // Prevent the process from exiting while we're trying to navigate in it. | 1744 // Prevent the process from exiting while we're trying to navigate in it. |
| 1740 new_render_frame_host->GetProcess()->AddPendingView(); | 1745 new_render_frame_host->GetProcess()->AddPendingView(); |
| 1741 | 1746 |
| 1742 if (frame_tree_node_->IsMainFrame()) { | 1747 if (frame_tree_node_->IsMainFrame()) { |
| 1743 success = InitRenderView(render_view_host, proxy); | 1748 success = InitRenderView(render_view_host, proxy); |
| 1744 | 1749 |
| 1745 // If we are reusing the RenderViewHost and it doesn't already have a | 1750 // If we are reusing the RenderViewHost and it doesn't already have a |
| (...skipping 971 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2717 resolved_url)) { | 2722 resolved_url)) { |
| 2718 DCHECK(!dest_instance || | 2723 DCHECK(!dest_instance || |
| 2719 dest_instance == render_frame_host_->GetSiteInstance()); | 2724 dest_instance == render_frame_host_->GetSiteInstance()); |
| 2720 return false; | 2725 return false; |
| 2721 } | 2726 } |
| 2722 | 2727 |
| 2723 return true; | 2728 return true; |
| 2724 } | 2729 } |
| 2725 | 2730 |
| 2726 } // namespace content | 2731 } // namespace content |
| OLD | NEW |