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..aa0dae5e5746d80c8fd834d48406b323e8d9d3f2 100644 |
--- a/content/browser/frame_host/render_frame_host_manager.cc |
+++ b/content/browser/frame_host/render_frame_host_manager.cc |
@@ -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; |
@@ -1085,11 +1094,11 @@ scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( |
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 +1146,11 @@ 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, |
+ swapped_out, |
+ flags & HIDDEN); |
RenderViewHostImpl* render_view_host = |
new_render_frame_host->render_view_host(); |
int proxy_routing_id = MSG_ROUTING_NONE; |
@@ -1159,7 +1171,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. |
@@ -1179,6 +1191,10 @@ int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance, |
frame_to_announce = new_render_frame_host.get(); |
} |
+ if (flags & CREATE_RENDER_WIDGET_HOST) |
+ new_render_frame_host->CreateRenderWidgetHost(render_widget_delegate_, |
+ flags & HIDDEN); |
+ |
// Use this as our new pending RFH if it isn't swapped out. |
if (!swapped_out) |
pending_render_frame_host_ = new_render_frame_host.Pass(); |