| 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 edd5723d8bb547db8e48c0e3ab20d4c5e3457dbd..623853773ac2e779d87d2dfc880b230f4f446c8a 100644
|
| --- a/content/browser/frame_host/render_frame_host_manager.cc
|
| +++ b/content/browser/frame_host/render_frame_host_manager.cc
|
| @@ -86,11 +86,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.
|
| @@ -117,7 +117,8 @@ RenderWidgetHostView* RenderFrameHostManager::GetRenderWidgetHostView() const {
|
| return interstitial_page_->GetView();
|
| if (!render_frame_host_)
|
| return NULL;
|
| - return render_frame_host_->render_view_host()->GetView();
|
| + return static_cast<RenderFrameHostImpl*>(render_frame_host_->
|
| + render_view_host()->GetMainFrame())->GetView();
|
| }
|
|
|
| RenderFrameProxyHost* RenderFrameHostManager::GetProxyToParent() {
|
| @@ -199,8 +200,8 @@ RenderFrameHostImpl* RenderFrameHostManager::Navigate(
|
| // our primary one. Otherwise, we might crash if we try to call Show()
|
| // on it later.
|
| if (dest_render_frame_host != render_frame_host_ &&
|
| - dest_render_frame_host->render_view_host()->GetView()) {
|
| - dest_render_frame_host->render_view_host()->GetView()->Hide();
|
| + dest_render_frame_host->GetView()) {
|
| + dest_render_frame_host->GetView()->Hide();
|
| } else {
|
| // Notify here as we won't be calling CommitPending (which does the
|
| // notify).
|
| @@ -958,6 +959,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).
|
| @@ -971,13 +973,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;
|
| @@ -988,17 +998,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);
|
|
|
| @@ -1009,20 +1025,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.
|
| @@ -1070,8 +1087,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;
|
| @@ -1092,11 +1111,15 @@ 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.
|
| - render_view_host->GetView()->Hide();
|
| + // Only top-level RenderViewHosts have RenderWidgetHostViews;
|
| + // RenderWidgetHosts for out-of-process iframes will be created
|
| + // later and hidden.
|
| + if (render_view_host->GetView())
|
| + render_view_host->GetView()->Hide();
|
| } else if (!swapped_out) {
|
| // Init the RFH, so a RenderFrame is created in the renderer.
|
| DCHECK(new_render_frame_host.get());
|
| @@ -1230,8 +1253,8 @@ void RenderFrameHostManager::CommitPending() {
|
| // Remember if the page was focused so we can focus the new renderer in
|
| // that case.
|
| bool focus_render_view = !will_focus_location_bar &&
|
| - render_frame_host_->render_view_host()->GetView() &&
|
| - render_frame_host_->render_view_host()->GetView()->HasFocus();
|
| + render_frame_host_->GetView() &&
|
| + render_frame_host_->GetView()->HasFocus();
|
|
|
| bool is_main_frame = frame_tree_node_->IsMainFrame();
|
|
|
| @@ -1246,10 +1269,10 @@ void RenderFrameHostManager::CommitPending() {
|
| render_frame_host_->GetProcess()->RemovePendingView();
|
|
|
| // Show the new view (or a sad tab) if necessary.
|
| - bool new_rfh_has_view = !!render_frame_host_->render_view_host()->GetView();
|
| + bool new_rfh_has_view = !!render_frame_host_->GetView();
|
| if (!delegate_->IsHidden() && new_rfh_has_view) {
|
| // In most cases, we need to show the new view.
|
| - render_frame_host_->render_view_host()->GetView()->Show();
|
| + render_frame_host_->GetView()->Show();
|
| }
|
| if (!new_rfh_has_view) {
|
| // If the view is gone, then this RenderViewHost died while it was hidden.
|
| @@ -1273,8 +1296,8 @@ void RenderFrameHostManager::CommitPending() {
|
| if (will_focus_location_bar) {
|
| delegate_->SetFocusToLocationBar(false);
|
| } else if (focus_render_view &&
|
| - render_frame_host_->render_view_host()->GetView()) {
|
| - render_frame_host_->render_view_host()->GetView()->Focus();
|
| + render_frame_host_->GetView()) {
|
| + render_frame_host_->GetView()->Focus();
|
| }
|
|
|
| // Notify that we've swapped RenderFrameHosts. We do this before shutting down
|
| @@ -1300,7 +1323,7 @@ void RenderFrameHostManager::CommitPending() {
|
| RenderFrameProxyHost* proxy_to_parent = GetProxyToParent();
|
| if (proxy_to_parent) {
|
| proxy_to_parent->SetChildRWHView(
|
| - render_frame_host_->render_view_host()->GetView());
|
| + render_frame_host_->GetView());
|
| }
|
| }
|
| }
|
|
|