Chromium Code Reviews| 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 d6429034aa33cc3a773fc7c3bcb3ce82a040d4e7..fd5a9d2e19a0c27391b84be6aa9fb502e7a55d3a 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" |
| @@ -175,7 +177,8 @@ RenderFrameHostImpl* RenderFrameHostManager::Navigate( |
| // Note: we don't call InitRenderView here because we are navigating away |
| // soon anyway, and we don't have the NavigationEntry for this host. |
| delegate_->CreateRenderViewForRenderManager( |
| - render_frame_host_->render_view_host(), MSG_ROUTING_NONE, NULL); |
| + render_frame_host_->render_view_host(), MSG_ROUTING_NONE, |
| + frame_tree_node_->IsMainFrame()); |
| } |
| // If the renderer crashed, then try to create a new one to satisfy this |
| @@ -185,7 +188,7 @@ 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)) |
| + opener_route_id, frame_tree_node_->IsMainFrame())) |
| return NULL; |
| // Now that we've created a new renderer, be sure to hide it if it isn't |
| @@ -945,7 +948,8 @@ int RenderFrameHostManager::CreateRenderFrame( |
| new_render_frame_host.Pass()); |
| } |
| - bool success = InitRenderView(render_view_host, opener_route_id); |
| + bool success = InitRenderView( |
| + render_view_host, opener_route_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(); |
| @@ -963,7 +967,8 @@ int RenderFrameHostManager::CreateRenderFrame( |
| } |
| bool RenderFrameHostManager::InitRenderView(RenderViewHost* render_view_host, |
| - int opener_route_id) { |
| + int opener_route_id, |
| + bool for_main_frame) { |
| // We may have initialized this RenderViewHost for another RenderFrameHost. |
| if (render_view_host->IsRenderViewLive()) |
| return true; |
| @@ -985,7 +990,7 @@ bool RenderFrameHostManager::InitRenderView(RenderViewHost* render_view_host, |
| } |
| return delegate_->CreateRenderViewForRenderManager( |
| - render_view_host, opener_route_id, cross_process_frame_connector_); |
| + render_view_host, opener_route_id, for_main_frame); |
| } |
| void RenderFrameHostManager::CommitPending() { |
| @@ -1141,6 +1146,16 @@ void RenderFrameHostManager::CommitPending() { |
| old_render_frame_host.reset(); |
| ShutdownRenderFrameHostsInSiteInstance(old_site_instance_id); |
| } else { |
| + // If this is a subframe, it should have a CrossProcessFrameConnector |
|
kenrb
2014/05/16 17:44:54
Would it make sense to make CrossProcessFrameConne
nasko
2014/05/16 18:24:17
I think it might make sense. It will require some
|
| + // 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); |
| + } |
| proxy_hosts_[old_site_instance_id] = new RenderFrameProxyHost( |
| old_render_frame_host.Pass()); |
| } |