OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/frame_host/render_frame_host_manager.h" | 5 #include "content/browser/frame_host/render_frame_host_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 entry.GetTransitionType(), | 392 entry.GetTransitionType(), |
393 entry.restore_type() != NavigationEntryImpl::RESTORE_NONE, | 393 entry.restore_type() != NavigationEntryImpl::RESTORE_NONE, |
394 entry.IsViewSourceMode(), entry.transferred_global_request_id(), | 394 entry.IsViewSourceMode(), entry.transferred_global_request_id(), |
395 entry.bindings()); | 395 entry.bindings()); |
396 if (!dest_render_frame_host) | 396 if (!dest_render_frame_host) |
397 return nullptr; // We weren't able to create a pending render frame host. | 397 return nullptr; // We weren't able to create a pending render frame host. |
398 | 398 |
399 // If the current render_frame_host_ isn't live, we should create it so | 399 // If the current render_frame_host_ isn't live, we should create it so |
400 // that we don't show a sad tab while the dest_render_frame_host fetches | 400 // that we don't show a sad tab while the dest_render_frame_host fetches |
401 // its first page. (Bug 1145340) | 401 // its first page. (Bug 1145340) |
402 if (dest_render_frame_host != render_frame_host_ && | 402 if (dest_render_frame_host != render_frame_host_.get() && |
403 !render_frame_host_->IsRenderFrameLive()) { | 403 !render_frame_host_->IsRenderFrameLive()) { |
404 // Note: we don't call InitRenderView here because we are navigating away | 404 // Note: we don't call InitRenderView here because we are navigating away |
405 // soon anyway, and we don't have the NavigationEntry for this host. | 405 // soon anyway, and we don't have the NavigationEntry for this host. |
406 delegate_->CreateRenderViewForRenderManager( | 406 delegate_->CreateRenderViewForRenderManager( |
407 render_frame_host_->render_view_host(), MSG_ROUTING_NONE, | 407 render_frame_host_->render_view_host(), MSG_ROUTING_NONE, |
408 MSG_ROUTING_NONE, frame_tree_node_->current_replication_state()); | 408 MSG_ROUTING_NONE, frame_tree_node_->current_replication_state()); |
409 } | 409 } |
410 | 410 |
411 // If the renderer isn't live, then try to create a new one to satisfy this | 411 // If the renderer isn't live, then try to create a new one to satisfy this |
412 // navigation request. | 412 // navigation request. |
413 if (!dest_render_frame_host->IsRenderFrameLive()) { | 413 if (!dest_render_frame_host->IsRenderFrameLive()) { |
414 // Instruct the destination render frame host to set up a Mojo connection | 414 // Instruct the destination render frame host to set up a Mojo connection |
415 // with the new render frame if necessary. Note that this call needs to | 415 // with the new render frame if necessary. Note that this call needs to |
416 // occur before initializing the RenderView; the flow of creating the | 416 // occur before initializing the RenderView; the flow of creating the |
417 // RenderView can cause browser-side code to execute that expects the this | 417 // RenderView can cause browser-side code to execute that expects the this |
418 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI | 418 // RFH's ServiceRegistry to be initialized (e.g., if the site is a WebUI |
419 // site that is handled via Mojo, then Mojo WebUI code in //chrome will | 419 // site that is handled via Mojo, then Mojo WebUI code in //chrome will |
420 // add a service to this RFH's ServiceRegistry). | 420 // add a service to this RFH's ServiceRegistry). |
421 dest_render_frame_host->SetUpMojoIfNeeded(); | 421 dest_render_frame_host->SetUpMojoIfNeeded(); |
422 | 422 |
423 // Recreate the opener chain. | 423 // Recreate the opener chain. |
424 CreateOpenerProxies(dest_render_frame_host->GetSiteInstance(), | 424 CreateOpenerProxies(dest_render_frame_host->GetSiteInstance(), |
425 frame_tree_node_); | 425 frame_tree_node_); |
426 if (!InitRenderView(dest_render_frame_host->render_view_host(), nullptr)) | 426 if (!InitRenderView(dest_render_frame_host->render_view_host(), nullptr)) |
427 return nullptr; | 427 return nullptr; |
428 | 428 |
429 // Now that we've created a new renderer, be sure to hide it if it isn't | 429 // Now that we've created a new renderer, be sure to hide it if it isn't |
430 // our primary one. Otherwise, we might crash if we try to call Show() | 430 // our primary one. Otherwise, we might crash if we try to call Show() |
431 // on it later. | 431 // on it later. |
432 if (dest_render_frame_host != render_frame_host_) { | 432 if (dest_render_frame_host != render_frame_host_.get()) { |
433 if (dest_render_frame_host->GetView()) | 433 if (dest_render_frame_host->GetView()) |
434 dest_render_frame_host->GetView()->Hide(); | 434 dest_render_frame_host->GetView()->Hide(); |
435 } else { | 435 } else { |
436 // After a renderer crash we'd have marked the host as invisible, so we | 436 // After a renderer crash we'd have marked the host as invisible, so we |
437 // need to set the visibility of the new View to the correct value here | 437 // need to set the visibility of the new View to the correct value here |
438 // after reload. | 438 // after reload. |
439 if (dest_render_frame_host->GetView() && | 439 if (dest_render_frame_host->GetView() && |
440 dest_render_frame_host->render_view_host() | 440 dest_render_frame_host->render_view_host() |
441 ->GetWidget() | 441 ->GetWidget() |
442 ->is_hidden() != delegate_->IsHidden()) { | 442 ->is_hidden() != delegate_->IsHidden()) { |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
604 bool should_replace_current_entry) { | 604 bool should_replace_current_entry) { |
605 // We should only get here for transfer navigations. Most cross-process | 605 // We should only get here for transfer navigations. Most cross-process |
606 // navigations can just continue and wait to run the unload handler (by | 606 // navigations can just continue and wait to run the unload handler (by |
607 // swapping out) when the new navigation commits. | 607 // swapping out) when the new navigation commits. |
608 CHECK(cross_site_transferring_request); | 608 CHECK(cross_site_transferring_request); |
609 | 609 |
610 // A transfer should only have come from our pending or current RFH. | 610 // A transfer should only have come from our pending or current RFH. |
611 // TODO(creis): We need to handle the case that the pending RFH has changed | 611 // TODO(creis): We need to handle the case that the pending RFH has changed |
612 // in the mean time, while this was being posted from the IO thread. We | 612 // in the mean time, while this was being posted from the IO thread. We |
613 // should probably cancel the request in that case. | 613 // should probably cancel the request in that case. |
614 DCHECK(pending_render_frame_host == pending_render_frame_host_ || | 614 DCHECK(pending_render_frame_host == pending_render_frame_host_.get() || |
615 pending_render_frame_host == render_frame_host_); | 615 pending_render_frame_host == render_frame_host_.get()); |
616 | 616 |
617 // Store the transferring request so that we can release it if the transfer | 617 // Store the transferring request so that we can release it if the transfer |
618 // navigation matches. | 618 // navigation matches. |
619 cross_site_transferring_request_ = cross_site_transferring_request.Pass(); | 619 cross_site_transferring_request_ = cross_site_transferring_request.Pass(); |
620 | 620 |
621 // Store the NavigationHandle to give it to the appropriate RenderFrameHost | 621 // Store the NavigationHandle to give it to the appropriate RenderFrameHost |
622 // after it started navigating. | 622 // after it started navigating. |
623 transfer_navigation_handle_ = | 623 transfer_navigation_handle_ = |
624 pending_render_frame_host->PassNavigationHandleOwnership(); | 624 pending_render_frame_host->PassNavigationHandleOwnership(); |
625 DCHECK(transfer_navigation_handle_); | 625 DCHECK(transfer_navigation_handle_); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 CommitPendingSandboxFlags(); | 672 CommitPendingSandboxFlags(); |
673 } | 673 } |
674 | 674 |
675 void RenderFrameHostManager::CommitPendingIfNecessary( | 675 void RenderFrameHostManager::CommitPendingIfNecessary( |
676 RenderFrameHostImpl* render_frame_host, | 676 RenderFrameHostImpl* render_frame_host, |
677 bool was_caused_by_user_gesture) { | 677 bool was_caused_by_user_gesture) { |
678 if (!pending_render_frame_host_ && !speculative_render_frame_host_) { | 678 if (!pending_render_frame_host_ && !speculative_render_frame_host_) { |
679 DCHECK(!should_reuse_web_ui_ || web_ui_); | 679 DCHECK(!should_reuse_web_ui_ || web_ui_); |
680 | 680 |
681 // We should only hear this from our current renderer. | 681 // We should only hear this from our current renderer. |
682 DCHECK_EQ(render_frame_host_, render_frame_host); | 682 DCHECK_EQ(render_frame_host_.get(), render_frame_host); |
683 | 683 |
684 // Even when there is no pending RVH, there may be a pending Web UI. | 684 // Even when there is no pending RVH, there may be a pending Web UI. |
685 if (pending_web_ui() || speculative_web_ui_) | 685 if (pending_web_ui() || speculative_web_ui_) |
686 CommitPending(); | 686 CommitPending(); |
687 return; | 687 return; |
688 } | 688 } |
689 | 689 |
690 if (render_frame_host == pending_render_frame_host_ || | 690 if (render_frame_host == pending_render_frame_host_.get() || |
691 render_frame_host == speculative_render_frame_host_) { | 691 render_frame_host == speculative_render_frame_host_.get()) { |
692 // The pending cross-process navigation completed, so show the renderer. | 692 // The pending cross-process navigation completed, so show the renderer. |
693 CommitPending(); | 693 CommitPending(); |
694 } else if (render_frame_host == render_frame_host_) { | 694 } else if (render_frame_host == render_frame_host_.get()) { |
695 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 695 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
696 switches::kEnableBrowserSideNavigation)) { | 696 switches::kEnableBrowserSideNavigation)) { |
697 CleanUpNavigation(); | 697 CleanUpNavigation(); |
698 } else { | 698 } else { |
699 if (was_caused_by_user_gesture) { | 699 if (was_caused_by_user_gesture) { |
700 // A navigation in the original page has taken place. Cancel the | 700 // A navigation in the original page has taken place. Cancel the |
701 // pending one. Only do it for user gesture originated navigations to | 701 // pending one. Only do it for user gesture originated navigations to |
702 // prevent page doing any shenanigans to prevent user from navigating. | 702 // prevent page doing any shenanigans to prevent user from navigating. |
703 // See https://code.google.com/p/chromium/issues/detail?id=75195 | 703 // See https://code.google.com/p/chromium/issues/detail?id=75195 |
704 CancelPending(); | 704 CancelPending(); |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1078 | 1078 |
1079 // If the RenderFrame that needs to navigate is not live (its process was just | 1079 // If the RenderFrame that needs to navigate is not live (its process was just |
1080 // created or has crashed), initialize it. | 1080 // created or has crashed), initialize it. |
1081 if (!navigation_rfh->IsRenderFrameLive()) { | 1081 if (!navigation_rfh->IsRenderFrameLive()) { |
1082 // Recreate the opener chain. | 1082 // Recreate the opener chain. |
1083 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_); | 1083 CreateOpenerProxies(navigation_rfh->GetSiteInstance(), frame_tree_node_); |
1084 if (!InitRenderView(navigation_rfh->render_view_host(), nullptr)) { | 1084 if (!InitRenderView(navigation_rfh->render_view_host(), nullptr)) { |
1085 return nullptr; | 1085 return nullptr; |
1086 } | 1086 } |
1087 | 1087 |
1088 if (navigation_rfh == render_frame_host_) { | 1088 if (navigation_rfh == render_frame_host_.get()) { |
1089 // TODO(nasko): This is a very ugly hack. The Chrome extensions process | 1089 // TODO(nasko): This is a very ugly hack. The Chrome extensions process |
1090 // manager still uses NotificationService and expects to see a | 1090 // manager still uses NotificationService and expects to see a |
1091 // RenderViewHost changed notification after WebContents and | 1091 // RenderViewHost changed notification after WebContents and |
1092 // RenderFrameHostManager are completely initialized. This should be | 1092 // RenderFrameHostManager are completely initialized. This should be |
1093 // removed once the process manager moves away from NotificationService. | 1093 // removed once the process manager moves away from NotificationService. |
1094 // See https://crbug.com/462682. | 1094 // See https://crbug.com/462682. |
1095 delegate_->NotifyMainFrameSwappedFromRenderManager( | 1095 delegate_->NotifyMainFrameSwappedFromRenderManager( |
1096 nullptr, render_frame_host_->render_view_host()); | 1096 nullptr, render_frame_host_->render_view_host()); |
1097 } | 1097 } |
1098 } | 1098 } |
(...skipping 1583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2682 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { | 2682 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { |
2683 if (!frame_tree_node_->opener()) | 2683 if (!frame_tree_node_->opener()) |
2684 return MSG_ROUTING_NONE; | 2684 return MSG_ROUTING_NONE; |
2685 | 2685 |
2686 return frame_tree_node_->opener() | 2686 return frame_tree_node_->opener() |
2687 ->render_manager() | 2687 ->render_manager() |
2688 ->GetRoutingIdForSiteInstance(instance); | 2688 ->GetRoutingIdForSiteInstance(instance); |
2689 } | 2689 } |
2690 | 2690 |
2691 } // namespace content | 2691 } // namespace content |
OLD | NEW |