| Index: content/browser/frame_host/render_frame_host_manager.cc
|
| diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc
|
| index 8d557ace789b3b3c784bab09ebaa946467840a5b..6311d5110dbfbcc7ee6bd8f92f9fd3347e26bfe8 100644
|
| --- a/content/browser/frame_host/render_frame_host_manager.cc
|
| +++ b/content/browser/frame_host/render_frame_host_manager.cc
|
| @@ -128,11 +128,11 @@ void RenderFrameHostManager::Init(BrowserContext* browser_context,
|
| if (!site_instance)
|
| site_instance = SiteInstance::Create(browser_context);
|
|
|
| + int flags = delegate_->IsHidden() ? HIDDEN : 0;
|
| SetRenderFrameHost(CreateRenderFrameHost(site_instance,
|
| view_routing_id,
|
| frame_routing_id,
|
| - false,
|
| - delegate_->IsHidden()));
|
| + flags));
|
|
|
| // Keep track of renderer processes as they start to shut down or are
|
| // crashed/killed.
|
| @@ -1025,6 +1025,7 @@ void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance(
|
| SiteInstance* old_instance,
|
| SiteInstance* new_instance,
|
| bool is_main_frame) {
|
| + int create_render_frame_flags = is_main_frame ? FOR_MAIN_FRAME_NAVIGATION : 0;
|
| // Ensure that we have created RFHs for the new RFH's opener chain if
|
| // we are staying in the same BrowsingInstance. This allows the new RFH
|
| // to send cross-process script calls to its opener(s).
|
| @@ -1038,13 +1039,21 @@ void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance(
|
| // SiteInstance in all nodes except the current one.
|
| frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance(
|
| frame_tree_node_, new_instance);
|
| + // RenderFrames in different processes from their parent RenderFrames
|
| + // in the frame tree require RenderWidgets for rendering and processing
|
| + // input events.
|
| + if (frame_tree_node_->parent() &&
|
| + frame_tree_node_->parent()->render_manager()->
|
| + current_frame_host()->GetSiteInstance() != new_instance)
|
| + create_render_frame_flags |= CREATE_RENDER_WIDGET_HOST;
|
| }
|
| }
|
|
|
| + create_render_frame_flags |= delegate_->IsHidden() ? HIDDEN : 0;
|
| +
|
| // Create a non-swapped-out RFH with the given opener.
|
| int route_id = CreateRenderFrame(
|
| - new_instance, opener_route_id, false, is_main_frame,
|
| - delegate_->IsHidden());
|
| + new_instance, opener_route_id, create_render_frame_flags);
|
| if (route_id == MSG_ROUTING_NONE) {
|
| pending_render_frame_host_.reset();
|
| return;
|
| @@ -1055,17 +1064,23 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost(
|
| SiteInstance* site_instance,
|
| int view_routing_id,
|
| int frame_routing_id,
|
| - bool swapped_out,
|
| - bool hidden) {
|
| + int flags) {
|
| if (frame_routing_id == MSG_ROUTING_NONE)
|
| frame_routing_id = site_instance->GetProcess()->GetNextRoutingID();
|
|
|
| + bool swapped_out = flags & SWAPPED_OUT;
|
| + bool hidden = flags & HIDDEN;
|
| +
|
| // Create a RVH for main frames, or find the existing one for subframes.
|
| FrameTree* frame_tree = frame_tree_node_->frame_tree();
|
| RenderViewHostImpl* render_view_host = NULL;
|
| if (frame_tree_node_->IsMainFrame()) {
|
| render_view_host = frame_tree->CreateRenderViewHost(
|
| - site_instance, view_routing_id, frame_routing_id, swapped_out, hidden);
|
| + site_instance,
|
| + view_routing_id,
|
| + frame_routing_id,
|
| + swapped_out,
|
| + hidden);
|
| } else {
|
| render_view_host = frame_tree->GetRenderViewHost(site_instance);
|
|
|
| @@ -1076,20 +1091,21 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost(
|
| scoped_ptr<RenderFrameHostImpl> render_frame_host =
|
| make_scoped_ptr(RenderFrameHostFactory::Create(render_view_host,
|
| render_frame_delegate_,
|
| + render_widget_delegate_,
|
| frame_tree,
|
| frame_tree_node_,
|
| frame_routing_id,
|
| - swapped_out).release());
|
| + flags).release());
|
| return render_frame_host.Pass();
|
| }
|
|
|
| int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance,
|
| int opener_route_id,
|
| - bool swapped_out,
|
| - bool for_main_frame_navigation,
|
| - bool hidden) {
|
| + int flags) {
|
| + bool swapped_out = flags & SWAPPED_OUT;
|
| CHECK(instance);
|
| - DCHECK(!swapped_out || hidden); // Swapped out views should always be hidden.
|
| + // Swapped out views should always be hidden.
|
| + DCHECK(!swapped_out || (flags & HIDDEN));
|
|
|
| // TODO(nasko): Remove the following CHECK once cross-site navigation no
|
| // longer relies on swapped out RFH for the top-level frame.
|
| @@ -1137,8 +1153,10 @@ int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance,
|
| }
|
| } else {
|
| // Create a new RenderFrameHost if we don't find an existing one.
|
| - new_render_frame_host = CreateRenderFrameHost(
|
| - instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, swapped_out, hidden);
|
| + new_render_frame_host = CreateRenderFrameHost(instance,
|
| + MSG_ROUTING_NONE,
|
| + MSG_ROUTING_NONE,
|
| + flags);
|
| RenderViewHostImpl* render_view_host =
|
| new_render_frame_host->render_view_host();
|
| int proxy_routing_id = MSG_ROUTING_NONE;
|
| @@ -1159,7 +1177,7 @@ int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance,
|
| bool success = InitRenderView(render_view_host,
|
| opener_route_id,
|
| proxy_routing_id,
|
| - for_main_frame_navigation);
|
| + flags & FOR_MAIN_FRAME_NAVIGATION);
|
| if (success) {
|
| if (frame_tree_node_->IsMainFrame()) {
|
| // Don't show the main frame's view until we get a DidNavigate from it.
|
|
|