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

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

Issue 1303773002: Give the main frame a RenderWidget. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes when navigating from swapped out main frame. Created 5 years, 2 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 <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 ResetProxyHosts(); 246 ResetProxyHosts();
247 247
248 // Release the WebUI prior to resetting the current RenderFrameHost, as the 248 // Release the WebUI prior to resetting the current RenderFrameHost, as the
249 // WebUI accesses the RenderFrameHost during cleanup. 249 // WebUI accesses the RenderFrameHost during cleanup.
250 web_ui_.reset(); 250 web_ui_.reset();
251 251
252 // We should always have a current RenderFrameHost except in some tests. 252 // We should always have a current RenderFrameHost except in some tests.
253 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); 253 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>());
254 } 254 }
255 255
256 void RenderFrameHostManager::Init(BrowserContext* browser_context, 256 void RenderFrameHostManager::Init(SiteInstance* site_instance,
257 SiteInstance* site_instance,
258 int32 view_routing_id, 257 int32 view_routing_id,
259 int32 frame_routing_id, 258 int32 frame_routing_id,
260 int32 widget_routing_id) { 259 int32 widget_routing_id) {
261 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It 260 DCHECK(site_instance);
262 // is important to immediately give this SiteInstance to a RenderViewHost so 261 // TODO(avi): While RenderViewHostImpl is-a RenderWidgetHostImpl, this must
263 // that the SiteInstance is ref counted. 262 // hold true to avoid having two RenderWidgetHosts for the top-level frame.
264 if (!site_instance) 263 // https://crbug.com/545684
265 site_instance = SiteInstance::Create(browser_context); 264 DCHECK_IMPLIES(frame_tree_node_->IsMainFrame(),
266 265 view_routing_id == widget_routing_id);
267 int flags = delegate_->IsHidden() ? CREATE_RF_HIDDEN : 0; 266 int flags = delegate_->IsHidden() ? CREATE_RF_HIDDEN : 0;
268 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id, 267 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id,
269 frame_routing_id, widget_routing_id, 268 frame_routing_id, widget_routing_id,
270 flags)); 269 flags));
271 270
272 // Notify the delegate of the creation of the current RenderFrameHost. 271 // Notify the delegate of the creation of the current RenderFrameHost.
273 // Do this only for subframes, as the main frame case is taken care of by 272 // Do this only for subframes, as the main frame case is taken care of by
274 // WebContentsImpl::Init. 273 // WebContentsImpl::Init.
275 if (!frame_tree_node_->IsMainFrame()) { 274 if (!frame_tree_node_->IsMainFrame()) {
276 delegate_->NotifySwappedFromRenderManager( 275 delegate_->NotifySwappedFromRenderManager(
(...skipping 1414 matching lines...) Expand 10 before | Expand all | Expand 10 after
1691 1690
1692 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); 1691 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT);
1693 bool hidden = !!(flags & CREATE_RF_HIDDEN); 1692 bool hidden = !!(flags & CREATE_RF_HIDDEN);
1694 1693
1695 // Create a RVH for main frames, or find the existing one for subframes. 1694 // Create a RVH for main frames, or find the existing one for subframes.
1696 FrameTree* frame_tree = frame_tree_node_->frame_tree(); 1695 FrameTree* frame_tree = frame_tree_node_->frame_tree();
1697 RenderViewHostImpl* render_view_host = nullptr; 1696 RenderViewHostImpl* render_view_host = nullptr;
1698 if (frame_tree_node_->IsMainFrame()) { 1697 if (frame_tree_node_->IsMainFrame()) {
1699 render_view_host = frame_tree->CreateRenderViewHost( 1698 render_view_host = frame_tree->CreateRenderViewHost(
1700 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden); 1699 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden);
1700 // TODO(avi): It's a bit bizarre that this logic lives here instead of in
1701 // CreateRenderFrame(). It turns out that FrameTree::CreateRenderViewHost
1702 // doesn't /always/ create a new RenderViewHost. It first tries to find an
1703 // already existing one to reuse by a SiteInstance lookup. If it finds one,
1704 // then the supplied routing IDs are completely ignored.
1705 // CreateRenderFrame() could do this lookup too, but it seems redundant to
ncarter (slow) 2015/10/26 22:27:42 Agree, gross to do the lookup in two places (since
1706 // do this lookup in two places. This is a good yak shave to clean up, or,
1707 // if just ignored, should be an easy cleanup once RenderViewHostImpl has-a
1708 // RenderWidgetHostImpl. https://crbug.com/545684
1709 if (view_routing_id == MSG_ROUTING_NONE) {
1710 widget_routing_id = render_view_host->GetRoutingID();
1711 } else {
1712 DCHECK_EQ(view_routing_id, render_view_host->GetRoutingID());
ncarter (slow) 2015/10/26 22:27:43 Wow. I see why this is safe but it's darn subtle.
1713 }
1701 } else { 1714 } else {
1702 render_view_host = frame_tree->GetRenderViewHost(site_instance); 1715 render_view_host = frame_tree->GetRenderViewHost(site_instance);
1703 CHECK(render_view_host); 1716 CHECK(render_view_host);
1704 } 1717 }
1705 1718
1706 return RenderFrameHostFactory::Create( 1719 return RenderFrameHostFactory::Create(
1707 site_instance, render_view_host, render_frame_delegate_, 1720 site_instance, render_view_host, render_frame_delegate_,
1708 render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id, 1721 render_widget_delegate_, frame_tree, frame_tree_node_, frame_routing_id,
1709 widget_routing_id, flags); 1722 widget_routing_id, flags);
1710 } 1723 }
(...skipping 937 matching lines...) Expand 10 before | Expand all | Expand 10 after
2648 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { 2661 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) {
2649 if (!frame_tree_node_->opener()) 2662 if (!frame_tree_node_->opener())
2650 return MSG_ROUTING_NONE; 2663 return MSG_ROUTING_NONE;
2651 2664
2652 return frame_tree_node_->opener() 2665 return frame_tree_node_->opener()
2653 ->render_manager() 2666 ->render_manager()
2654 ->GetRoutingIdForSiteInstance(instance); 2667 ->GetRoutingIdForSiteInstance(instance);
2655 } 2668 }
2656 2669
2657 } // namespace content 2670 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/render_frame_host_manager.h ('k') | content/browser/renderer_host/render_message_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698