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 d39d388bdc062eb58d16ece657f1bab510623c2e..0dfdeaae6274c6845249c5eab665319a3083c627 100644 |
--- a/content/browser/frame_host/render_frame_host_manager.cc |
+++ b/content/browser/frame_host/render_frame_host_manager.cc |
@@ -22,6 +22,7 @@ |
#include "content/browser/frame_host/render_frame_host_factory.h" |
#include "content/browser/frame_host/render_frame_host_impl.h" |
#include "content/browser/frame_host/render_frame_proxy_host.h" |
+#include "content/browser/frame_host/render_widget_host_view_child_frame.h" |
#include "content/browser/renderer_host/render_process_host_impl.h" |
#include "content/browser/renderer_host/render_view_host_factory.h" |
#include "content/browser/renderer_host/render_view_host_impl.h" |
@@ -34,6 +35,7 @@ |
#include "content/public/browser/notification_service.h" |
#include "content/public/browser/notification_types.h" |
#include "content/public/browser/render_widget_host_iterator.h" |
+#include "content/public/browser/render_widget_host_view.h" |
#include "content/public/browser/user_metrics.h" |
#include "content/public/browser/web_ui_controller.h" |
#include "content/public/common/content_switches.h" |
@@ -176,7 +178,7 @@ RenderFrameHostImpl* RenderFrameHostManager::Navigate( |
// soon anyway, and we don't have the NavigationEntry for this host. |
delegate_->CreateRenderViewForRenderManager( |
render_frame_host_->render_view_host(), MSG_ROUTING_NONE, |
- MSG_ROUTING_NONE, NULL); |
+ MSG_ROUTING_NONE, frame_tree_node_->IsMainFrame()); |
} |
// If the renderer crashed, then try to create a new one to satisfy this |
@@ -186,7 +188,9 @@ RenderFrameHostImpl* RenderFrameHostManager::Navigate( |
int opener_route_id = delegate_->CreateOpenerRenderViewsForRenderManager( |
dest_render_frame_host->GetSiteInstance()); |
if (!InitRenderView(dest_render_frame_host->render_view_host(), |
- opener_route_id, MSG_ROUTING_NONE)) |
+ opener_route_id, |
+ MSG_ROUTING_NONE, |
+ frame_tree_node_->IsMainFrame())) |
return NULL; |
// Now that we've created a new renderer, be sure to hide it if it isn't |
@@ -501,6 +505,9 @@ void RenderFrameHostManager::SwapOutOldPage() { |
// process navigations, but it will be destroyed if the Frame is |
// navigated back to the same site instance as its parent. |
// TODO(kenrb): This will change when RenderFrameProxyHost is created. |
+ // TODO(nasko): Move CrossProcessFrameConnector to be owned by |
+ // RenderFrameProxyHost instead of RenderFrameHostManager once proxy |
+ // support lands. |
if (!cross_process_frame_connector_) { |
cross_process_frame_connector_ = |
new CrossProcessFrameConnector(render_frame_host_.get()); |
@@ -965,7 +972,8 @@ int RenderFrameHostManager::CreateRenderFrame( |
} |
bool success = InitRenderView( |
- render_view_host, opener_route_id, proxy_routing_id); |
+ render_view_host, opener_route_id, proxy_routing_id, |
+ frame_tree_node_->IsMainFrame()); |
if (success && frame_tree_node_->IsMainFrame()) { |
// Don't show the main frame's view until we get a DidNavigate from it. |
render_view_host->GetView()->Hide(); |
@@ -984,7 +992,8 @@ int RenderFrameHostManager::CreateRenderFrame( |
bool RenderFrameHostManager::InitRenderView(RenderViewHost* render_view_host, |
int opener_route_id, |
- int proxy_routing_id) { |
+ int proxy_routing_id, |
+ bool for_main_frame) { |
// We may have initialized this RenderViewHost for another RenderFrameHost. |
if (render_view_host->IsRenderViewLive()) |
return true; |
@@ -1006,8 +1015,7 @@ bool RenderFrameHostManager::InitRenderView(RenderViewHost* render_view_host, |
} |
return delegate_->CreateRenderViewForRenderManager( |
- render_view_host, opener_route_id, proxy_routing_id, |
- cross_process_frame_connector_); |
+ render_view_host, opener_route_id, proxy_routing_id, for_main_frame); |
} |
void RenderFrameHostManager::CommitPending() { |
@@ -1164,8 +1172,20 @@ void RenderFrameHostManager::CommitPending() { |
// this RFH was the last active one in the SiteInstance. Now that we |
// know that all RFHs are swapped out, we can delete all the RFHs and RVHs |
// in this SiteInstance. |
- if (!active_view_count) |
+ if (!active_view_count) { |
ShutdownRenderFrameHostsInSiteInstance(old_site_instance_id); |
+ } else { |
+ // If this is a subframe, it should have a CrossProcessFrameConnector |
+ // created already and we just need to link it to the proper view in the |
+ // new process. |
+ if (!is_main_frame) { |
+ RenderWidgetHostView* rwhv = |
+ render_frame_host_->render_view_host()->GetView(); |
+ RenderWidgetHostViewChildFrame* rwhv_child = |
+ static_cast<RenderWidgetHostViewChildFrame*>(rwhv); |
+ cross_process_frame_connector_->set_view(rwhv_child); |
+ } |
+ } |
} |
} |