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

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

Issue 2472253002: Fix navigation requests starting too early and not getting associated with the <webview>. (Closed)
Patch Set: nits Created 4 years, 1 month 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 <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
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/frame_host/render_frame_host_manager.h ('k') | content/browser/web_contents/web_contents_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698