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 "base/strings/utf_string_conversions.h" | 5 #include "base/strings/utf_string_conversions.h" |
6 #include "content/browser/frame_host/navigation_controller_impl.h" | 6 #include "content/browser/frame_host/navigation_controller_impl.h" |
7 #include "content/browser/frame_host/navigation_entry_impl.h" | 7 #include "content/browser/frame_host/navigation_entry_impl.h" |
8 #include "content/browser/frame_host/render_frame_host_manager.h" | 8 #include "content/browser/frame_host/render_frame_host_manager.h" |
9 #include "content/browser/site_instance_impl.h" | 9 #include "content/browser/site_instance_impl.h" |
10 #include "content/browser/webui/web_ui_controller_factory_registry.h" | 10 #include "content/browser/webui/web_ui_controller_factory_registry.h" |
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
560 | 560 |
561 // Tests the Init function by checking the initial RenderViewHost. | 561 // Tests the Init function by checking the initial RenderViewHost. |
562 TEST_F(RenderFrameHostManagerTest, Init) { | 562 TEST_F(RenderFrameHostManagerTest, Init) { |
563 // Using TestBrowserContext. | 563 // Using TestBrowserContext. |
564 SiteInstanceImpl* instance = | 564 SiteInstanceImpl* instance = |
565 static_cast<SiteInstanceImpl*>(SiteInstance::Create(browser_context())); | 565 static_cast<SiteInstanceImpl*>(SiteInstance::Create(browser_context())); |
566 EXPECT_FALSE(instance->HasSite()); | 566 EXPECT_FALSE(instance->HasSite()); |
567 | 567 |
568 scoped_ptr<TestWebContents> web_contents( | 568 scoped_ptr<TestWebContents> web_contents( |
569 TestWebContents::Create(browser_context(), instance)); | 569 TestWebContents::Create(browser_context(), instance)); |
570 RenderFrameHostManager manager(web_contents.get(), web_contents.get(), | 570 FrameTree tree(web_contents->GetFrameTree()->root()->navigator(), |
571 web_contents.get(), web_contents.get()); | 571 web_contents.get(), web_contents.get(), |
| 572 web_contents.get(), web_contents.get()); |
| 573 RenderFrameHostManager* manager = tree.root()->render_manager(); |
572 | 574 |
573 manager.Init(browser_context(), instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE); | 575 manager->Init(browser_context(), instance, MSG_ROUTING_NONE, |
| 576 MSG_ROUTING_NONE); |
574 | 577 |
575 RenderViewHost* host = manager.current_host(); | 578 RenderViewHostImpl* rvh = manager->current_host(); |
576 ASSERT_TRUE(host); | 579 RenderFrameHostImpl* rfh = manager->current_frame_host(); |
577 EXPECT_EQ(instance, host->GetSiteInstance()); | 580 ASSERT_TRUE(rvh); |
578 EXPECT_EQ(web_contents.get(), host->GetDelegate()); | 581 ASSERT_TRUE(rfh); |
579 EXPECT_TRUE(manager.GetRenderWidgetHostView()); | 582 EXPECT_EQ(rvh, rfh->render_view_host()); |
580 EXPECT_FALSE(manager.pending_render_view_host()); | 583 EXPECT_EQ(instance, rvh->GetSiteInstance()); |
| 584 EXPECT_EQ(web_contents.get(), rvh->GetDelegate()); |
| 585 EXPECT_EQ(web_contents.get(), rfh->delegate()); |
| 586 EXPECT_TRUE(manager->GetRenderWidgetHostView()); |
| 587 EXPECT_FALSE(manager->pending_render_view_host()); |
581 } | 588 } |
582 | 589 |
583 // Tests the Navigate function. We navigate three sites consecutively and check | 590 // Tests the Navigate function. We navigate three sites consecutively and check |
584 // how the pending/committed RenderViewHost are modified. | 591 // how the pending/committed RenderViewHost are modified. |
585 TEST_F(RenderFrameHostManagerTest, Navigate) { | 592 TEST_F(RenderFrameHostManagerTest, Navigate) { |
586 TestNotificationTracker notifications; | 593 TestNotificationTracker notifications; |
587 | 594 |
588 SiteInstance* instance = SiteInstance::Create(browser_context()); | 595 SiteInstance* instance = SiteInstance::Create(browser_context()); |
589 | 596 |
590 scoped_ptr<TestWebContents> web_contents( | 597 scoped_ptr<TestWebContents> web_contents( |
591 TestWebContents::Create(browser_context(), instance)); | 598 TestWebContents::Create(browser_context(), instance)); |
592 notifications.ListenFor(NOTIFICATION_RENDER_VIEW_HOST_CHANGED, | 599 notifications.ListenFor(NOTIFICATION_RENDER_VIEW_HOST_CHANGED, |
593 Source<WebContents>(web_contents.get())); | 600 Source<WebContents>(web_contents.get())); |
594 | 601 |
595 // Create. | 602 // Create. |
596 RenderFrameHostManager manager(web_contents.get(), web_contents.get(), | 603 FrameTree tree(web_contents->GetFrameTree()->root()->navigator(), |
597 web_contents.get(), web_contents.get()); | 604 web_contents.get(), web_contents.get(), |
| 605 web_contents.get(), web_contents.get()); |
| 606 RenderFrameHostManager* manager = tree.root()->render_manager(); |
598 | 607 |
599 manager.Init(browser_context(), instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE); | 608 manager->Init(browser_context(), instance, MSG_ROUTING_NONE, |
| 609 MSG_ROUTING_NONE); |
600 | 610 |
601 RenderViewHost* host; | 611 RenderViewHost* host; |
602 | 612 |
603 // 1) The first navigation. -------------------------- | 613 // 1) The first navigation. -------------------------- |
604 const GURL kUrl1("http://www.google.com/"); | 614 const GURL kUrl1("http://www.google.com/"); |
605 NavigationEntryImpl entry1( | 615 NavigationEntryImpl entry1( |
606 NULL /* instance */, -1 /* page_id */, kUrl1, Referrer(), | 616 NULL /* instance */, -1 /* page_id */, kUrl1, Referrer(), |
607 base::string16() /* title */, PAGE_TRANSITION_TYPED, | 617 base::string16() /* title */, PAGE_TRANSITION_TYPED, |
608 false /* is_renderer_init */); | 618 false /* is_renderer_init */); |
609 host = manager.Navigate(entry1); | 619 host = manager->Navigate(entry1); |
610 | 620 |
611 // The RenderViewHost created in Init will be reused. | 621 // The RenderViewHost created in Init will be reused. |
612 EXPECT_TRUE(host == manager.current_host()); | 622 EXPECT_TRUE(host == manager->current_host()); |
613 EXPECT_FALSE(manager.pending_render_view_host()); | 623 EXPECT_FALSE(manager->pending_render_view_host()); |
614 | 624 |
615 // Commit. | 625 // Commit. |
616 manager.DidNavigateMainFrame(host); | 626 manager->DidNavigateMainFrame(host); |
617 // Commit to SiteInstance should be delayed until RenderView commit. | 627 // Commit to SiteInstance should be delayed until RenderView commit. |
618 EXPECT_TRUE(host == manager.current_host()); | 628 EXPECT_TRUE(host == manager->current_host()); |
619 ASSERT_TRUE(host); | 629 ASSERT_TRUE(host); |
620 EXPECT_FALSE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> | 630 EXPECT_FALSE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> |
621 HasSite()); | 631 HasSite()); |
622 static_cast<SiteInstanceImpl*>(host->GetSiteInstance())->SetSite(kUrl1); | 632 static_cast<SiteInstanceImpl*>(host->GetSiteInstance())->SetSite(kUrl1); |
623 | 633 |
624 // 2) Navigate to next site. ------------------------- | 634 // 2) Navigate to next site. ------------------------- |
625 const GURL kUrl2("http://www.google.com/foo"); | 635 const GURL kUrl2("http://www.google.com/foo"); |
626 NavigationEntryImpl entry2( | 636 NavigationEntryImpl entry2( |
627 NULL /* instance */, -1 /* page_id */, kUrl2, | 637 NULL /* instance */, -1 /* page_id */, kUrl2, |
628 Referrer(kUrl1, blink::WebReferrerPolicyDefault), | 638 Referrer(kUrl1, blink::WebReferrerPolicyDefault), |
629 base::string16() /* title */, PAGE_TRANSITION_LINK, | 639 base::string16() /* title */, PAGE_TRANSITION_LINK, |
630 true /* is_renderer_init */); | 640 true /* is_renderer_init */); |
631 host = manager.Navigate(entry2); | 641 host = manager->Navigate(entry2); |
632 | 642 |
633 // The RenderViewHost created in Init will be reused. | 643 // The RenderViewHost created in Init will be reused. |
634 EXPECT_TRUE(host == manager.current_host()); | 644 EXPECT_TRUE(host == manager->current_host()); |
635 EXPECT_FALSE(manager.pending_render_view_host()); | 645 EXPECT_FALSE(manager->pending_render_view_host()); |
636 | 646 |
637 // Commit. | 647 // Commit. |
638 manager.DidNavigateMainFrame(host); | 648 manager->DidNavigateMainFrame(host); |
639 EXPECT_TRUE(host == manager.current_host()); | 649 EXPECT_TRUE(host == manager->current_host()); |
640 ASSERT_TRUE(host); | 650 ASSERT_TRUE(host); |
641 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> | 651 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> |
642 HasSite()); | 652 HasSite()); |
643 | 653 |
644 // 3) Cross-site navigate to next site. -------------- | 654 // 3) Cross-site navigate to next site. -------------- |
645 const GURL kUrl3("http://webkit.org/"); | 655 const GURL kUrl3("http://webkit.org/"); |
646 NavigationEntryImpl entry3( | 656 NavigationEntryImpl entry3( |
647 NULL /* instance */, -1 /* page_id */, kUrl3, | 657 NULL /* instance */, -1 /* page_id */, kUrl3, |
648 Referrer(kUrl2, blink::WebReferrerPolicyDefault), | 658 Referrer(kUrl2, blink::WebReferrerPolicyDefault), |
649 base::string16() /* title */, PAGE_TRANSITION_LINK, | 659 base::string16() /* title */, PAGE_TRANSITION_LINK, |
650 false /* is_renderer_init */); | 660 false /* is_renderer_init */); |
651 host = manager.Navigate(entry3); | 661 host = manager->Navigate(entry3); |
652 | 662 |
653 // A new RenderViewHost should be created. | 663 // A new RenderViewHost should be created. |
654 EXPECT_TRUE(manager.pending_render_view_host()); | 664 EXPECT_TRUE(manager->pending_render_view_host()); |
655 ASSERT_EQ(host, manager.pending_render_view_host()); | 665 ASSERT_EQ(host, manager->pending_render_view_host()); |
656 | 666 |
657 notifications.Reset(); | 667 notifications.Reset(); |
658 | 668 |
659 // Commit. | 669 // Commit. |
660 manager.DidNavigateMainFrame(manager.pending_render_view_host()); | 670 manager->DidNavigateMainFrame(manager->pending_render_view_host()); |
661 EXPECT_TRUE(host == manager.current_host()); | 671 EXPECT_TRUE(host == manager->current_host()); |
662 ASSERT_TRUE(host); | 672 ASSERT_TRUE(host); |
663 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> | 673 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> |
664 HasSite()); | 674 HasSite()); |
665 // Check the pending RenderViewHost has been committed. | 675 // Check the pending RenderViewHost has been committed. |
666 EXPECT_FALSE(manager.pending_render_view_host()); | 676 EXPECT_FALSE(manager->pending_render_view_host()); |
667 | 677 |
668 // We should observe a notification. | 678 // We should observe a notification. |
669 EXPECT_TRUE( | 679 EXPECT_TRUE( |
670 notifications.Check1AndReset(NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); | 680 notifications.Check1AndReset(NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); |
671 } | 681 } |
672 | 682 |
673 // Tests the Navigate function. In this unit test we verify that the Navigate | 683 // Tests the Navigate function. In this unit test we verify that the Navigate |
674 // function can handle a new navigation event before the previous navigation | 684 // function can handle a new navigation event before the previous navigation |
675 // has been committed. This is also a regression test for | 685 // has been committed. This is also a regression test for |
676 // http://crbug.com/104600. | 686 // http://crbug.com/104600. |
677 TEST_F(RenderFrameHostManagerTest, NavigateWithEarlyReNavigation) { | 687 TEST_F(RenderFrameHostManagerTest, NavigateWithEarlyReNavigation) { |
678 TestNotificationTracker notifications; | 688 TestNotificationTracker notifications; |
679 | 689 |
680 SiteInstance* instance = SiteInstance::Create(browser_context()); | 690 SiteInstance* instance = SiteInstance::Create(browser_context()); |
681 | 691 |
682 scoped_ptr<TestWebContents> web_contents( | 692 scoped_ptr<TestWebContents> web_contents( |
683 TestWebContents::Create(browser_context(), instance)); | 693 TestWebContents::Create(browser_context(), instance)); |
684 notifications.ListenFor(NOTIFICATION_RENDER_VIEW_HOST_CHANGED, | 694 notifications.ListenFor(NOTIFICATION_RENDER_VIEW_HOST_CHANGED, |
685 Source<WebContents>(web_contents.get())); | 695 Source<WebContents>(web_contents.get())); |
686 | 696 |
687 // Create. | 697 // Create. |
688 RenderFrameHostManager manager(web_contents.get(), web_contents.get(), | 698 FrameTree tree(web_contents->GetFrameTree()->root()->navigator(), |
689 web_contents.get(), web_contents.get()); | 699 web_contents.get(), web_contents.get(), |
| 700 web_contents.get(), web_contents.get()); |
| 701 RenderFrameHostManager* manager = tree.root()->render_manager(); |
690 | 702 |
691 manager.Init(browser_context(), instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE); | 703 manager->Init(browser_context(), instance, MSG_ROUTING_NONE, |
| 704 MSG_ROUTING_NONE); |
692 | 705 |
693 // 1) The first navigation. -------------------------- | 706 // 1) The first navigation. -------------------------- |
694 const GURL kUrl1("http://www.google.com/"); | 707 const GURL kUrl1("http://www.google.com/"); |
695 NavigationEntryImpl entry1(NULL /* instance */, -1 /* page_id */, kUrl1, | 708 NavigationEntryImpl entry1(NULL /* instance */, -1 /* page_id */, kUrl1, |
696 Referrer(), base::string16() /* title */, | 709 Referrer(), base::string16() /* title */, |
697 PAGE_TRANSITION_TYPED, | 710 PAGE_TRANSITION_TYPED, |
698 false /* is_renderer_init */); | 711 false /* is_renderer_init */); |
699 RenderViewHost* host = manager.Navigate(entry1); | 712 RenderViewHost* host = manager->Navigate(entry1); |
700 | 713 |
701 // The RenderViewHost created in Init will be reused. | 714 // The RenderViewHost created in Init will be reused. |
702 EXPECT_TRUE(host == manager.current_host()); | 715 EXPECT_TRUE(host == manager->current_host()); |
703 EXPECT_FALSE(manager.pending_render_view_host()); | 716 EXPECT_FALSE(manager->pending_render_view_host()); |
704 | 717 |
705 // We should observe a notification. | 718 // We should observe a notification. |
706 EXPECT_TRUE( | 719 EXPECT_TRUE( |
707 notifications.Check1AndReset(NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); | 720 notifications.Check1AndReset(NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); |
708 notifications.Reset(); | 721 notifications.Reset(); |
709 | 722 |
710 // Commit. | 723 // Commit. |
711 manager.DidNavigateMainFrame(host); | 724 manager->DidNavigateMainFrame(host); |
712 | 725 |
713 // Commit to SiteInstance should be delayed until RenderView commit. | 726 // Commit to SiteInstance should be delayed until RenderView commit. |
714 EXPECT_TRUE(host == manager.current_host()); | 727 EXPECT_TRUE(host == manager->current_host()); |
715 ASSERT_TRUE(host); | 728 ASSERT_TRUE(host); |
716 EXPECT_FALSE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> | 729 EXPECT_FALSE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> |
717 HasSite()); | 730 HasSite()); |
718 static_cast<SiteInstanceImpl*>(host->GetSiteInstance())->SetSite(kUrl1); | 731 static_cast<SiteInstanceImpl*>(host->GetSiteInstance())->SetSite(kUrl1); |
719 | 732 |
720 // 2) Cross-site navigate to next site. ------------------------- | 733 // 2) Cross-site navigate to next site. ------------------------- |
721 const GURL kUrl2("http://www.example.com"); | 734 const GURL kUrl2("http://www.example.com"); |
722 NavigationEntryImpl entry2( | 735 NavigationEntryImpl entry2( |
723 NULL /* instance */, -1 /* page_id */, kUrl2, Referrer(), | 736 NULL /* instance */, -1 /* page_id */, kUrl2, Referrer(), |
724 base::string16() /* title */, PAGE_TRANSITION_TYPED, | 737 base::string16() /* title */, PAGE_TRANSITION_TYPED, |
725 false /* is_renderer_init */); | 738 false /* is_renderer_init */); |
726 RenderViewHostImpl* host2 = static_cast<RenderViewHostImpl*>( | 739 RenderViewHostImpl* host2 = static_cast<RenderViewHostImpl*>( |
727 manager.Navigate(entry2)); | 740 manager->Navigate(entry2)); |
728 int host2_process_id = host2->GetProcess()->GetID(); | 741 int host2_process_id = host2->GetProcess()->GetID(); |
729 | 742 |
730 // A new RenderViewHost should be created. | 743 // A new RenderViewHost should be created. |
731 EXPECT_TRUE(manager.pending_render_view_host()); | 744 EXPECT_TRUE(manager->pending_render_view_host()); |
732 ASSERT_EQ(host2, manager.pending_render_view_host()); | 745 ASSERT_EQ(host2, manager->pending_render_view_host()); |
733 EXPECT_NE(host2, host); | 746 EXPECT_NE(host2, host); |
734 | 747 |
735 // Check that the navigation is still suspended because the old RVH | 748 // Check that the navigation is still suspended because the old RVH |
736 // is not swapped out, yet. | 749 // is not swapped out, yet. |
737 EXPECT_TRUE(host2->are_navigations_suspended()); | 750 EXPECT_TRUE(host2->are_navigations_suspended()); |
738 MockRenderProcessHost* test_process_host2 = | 751 MockRenderProcessHost* test_process_host2 = |
739 static_cast<MockRenderProcessHost*>(host2->GetProcess()); | 752 static_cast<MockRenderProcessHost*>(host2->GetProcess()); |
740 test_process_host2->sink().ClearMessages(); | 753 test_process_host2->sink().ClearMessages(); |
741 host2->NavigateToURL(kUrl2); | 754 host2->NavigateToURL(kUrl2); |
742 EXPECT_FALSE(test_process_host2->sink().GetUniqueMessageMatching( | 755 EXPECT_FALSE(test_process_host2->sink().GetUniqueMessageMatching( |
743 ViewMsg_Navigate::ID)); | 756 ViewMsg_Navigate::ID)); |
744 | 757 |
745 // Allow closing the current Render View (precondition for swapping out | 758 // Allow closing the current Render View (precondition for swapping out |
746 // the RVH): Simulate response from RenderView for ViewMsg_ShouldClose sent by | 759 // the RVH): Simulate response from RenderView for ViewMsg_ShouldClose sent by |
747 // FirePageBeforeUnload. | 760 // FirePageBeforeUnload. |
748 TestRenderViewHost* test_host = static_cast<TestRenderViewHost*>(host); | 761 TestRenderViewHost* test_host = static_cast<TestRenderViewHost*>(host); |
749 MockRenderProcessHost* test_process_host = | 762 MockRenderProcessHost* test_process_host = |
750 static_cast<MockRenderProcessHost*>(test_host->GetProcess()); | 763 static_cast<MockRenderProcessHost*>(test_host->GetProcess()); |
751 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( | 764 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( |
752 ViewMsg_ShouldClose::ID)); | 765 ViewMsg_ShouldClose::ID)); |
753 test_host->SendShouldCloseACK(true); | 766 test_host->SendShouldCloseACK(true); |
754 | 767 |
755 // CrossSiteResourceHandler::StartCrossSiteTransition triggers a | 768 // CrossSiteResourceHandler::StartCrossSiteTransition triggers a |
756 // call of RenderFrameHostManager::SwapOutOldPage before | 769 // call of RenderFrameHostManager::SwapOutOldPage before |
757 // RenderFrameHostManager::DidNavigateMainFrame is called. | 770 // RenderFrameHostManager::DidNavigateMainFrame is called. |
758 // The RVH is not swapped out until the commit. | 771 // The RVH is not swapped out until the commit. |
759 manager.SwapOutOldPage(); | 772 manager->SwapOutOldPage(); |
760 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( | 773 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( |
761 ViewMsg_SwapOut::ID)); | 774 ViewMsg_SwapOut::ID)); |
762 test_host->OnSwappedOut(false); | 775 test_host->OnSwappedOut(false); |
763 | 776 |
764 EXPECT_EQ(host, manager.current_host()); | 777 EXPECT_EQ(host, manager->current_host()); |
765 EXPECT_FALSE(static_cast<RenderViewHostImpl*>( | 778 EXPECT_FALSE(static_cast<RenderViewHostImpl*>( |
766 manager.current_host())->is_swapped_out()); | 779 manager->current_host())->is_swapped_out()); |
767 EXPECT_EQ(host2, manager.pending_render_view_host()); | 780 EXPECT_EQ(host2, manager->pending_render_view_host()); |
768 // There should be still no navigation messages being sent. | 781 // There should be still no navigation messages being sent. |
769 EXPECT_FALSE(test_process_host2->sink().GetUniqueMessageMatching( | 782 EXPECT_FALSE(test_process_host2->sink().GetUniqueMessageMatching( |
770 ViewMsg_Navigate::ID)); | 783 ViewMsg_Navigate::ID)); |
771 | 784 |
772 // 3) Cross-site navigate to next site before 2) has committed. -------------- | 785 // 3) Cross-site navigate to next site before 2) has committed. -------------- |
773 const GURL kUrl3("http://webkit.org/"); | 786 const GURL kUrl3("http://webkit.org/"); |
774 NavigationEntryImpl entry3(NULL /* instance */, -1 /* page_id */, kUrl3, | 787 NavigationEntryImpl entry3(NULL /* instance */, -1 /* page_id */, kUrl3, |
775 Referrer(), base::string16() /* title */, | 788 Referrer(), base::string16() /* title */, |
776 PAGE_TRANSITION_TYPED, | 789 PAGE_TRANSITION_TYPED, |
777 false /* is_renderer_init */); | 790 false /* is_renderer_init */); |
778 test_process_host->sink().ClearMessages(); | 791 test_process_host->sink().ClearMessages(); |
779 RenderViewHost* host3 = manager.Navigate(entry3); | 792 RenderViewHost* host3 = manager->Navigate(entry3); |
780 | 793 |
781 // A new RenderViewHost should be created. host2 is now deleted. | 794 // A new RenderViewHost should be created. host2 is now deleted. |
782 EXPECT_TRUE(manager.pending_render_view_host()); | 795 EXPECT_TRUE(manager->pending_render_view_host()); |
783 ASSERT_EQ(host3, manager.pending_render_view_host()); | 796 ASSERT_EQ(host3, manager->pending_render_view_host()); |
784 EXPECT_NE(host3, host); | 797 EXPECT_NE(host3, host); |
785 EXPECT_NE(host3->GetProcess()->GetID(), host2_process_id); | 798 EXPECT_NE(host3->GetProcess()->GetID(), host2_process_id); |
786 | 799 |
787 // Navigations in the new RVH should be suspended, which is ok because the | 800 // Navigations in the new RVH should be suspended, which is ok because the |
788 // old RVH is not yet swapped out and can respond to a second beforeunload | 801 // old RVH is not yet swapped out and can respond to a second beforeunload |
789 // request. | 802 // request. |
790 EXPECT_TRUE(static_cast<RenderViewHostImpl*>( | 803 EXPECT_TRUE(static_cast<RenderViewHostImpl*>( |
791 host3)->are_navigations_suspended()); | 804 host3)->are_navigations_suspended()); |
792 EXPECT_EQ(host, manager.current_host()); | 805 EXPECT_EQ(host, manager->current_host()); |
793 EXPECT_FALSE(static_cast<RenderViewHostImpl*>( | 806 EXPECT_FALSE(static_cast<RenderViewHostImpl*>( |
794 manager.current_host())->is_swapped_out()); | 807 manager->current_host())->is_swapped_out()); |
795 | 808 |
796 // Simulate a response to the second beforeunload request. | 809 // Simulate a response to the second beforeunload request. |
797 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( | 810 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( |
798 ViewMsg_ShouldClose::ID)); | 811 ViewMsg_ShouldClose::ID)); |
799 test_host->SendShouldCloseACK(true); | 812 test_host->SendShouldCloseACK(true); |
800 | 813 |
801 // CrossSiteResourceHandler::StartCrossSiteTransition triggers a | 814 // CrossSiteResourceHandler::StartCrossSiteTransition triggers a |
802 // call of RenderFrameHostManager::SwapOutOldPage before | 815 // call of RenderFrameHostManager::SwapOutOldPage before |
803 // RenderFrameHostManager::DidNavigateMainFrame is called. | 816 // RenderFrameHostManager::DidNavigateMainFrame is called. |
804 // The RVH is not swapped out until the commit. | 817 // The RVH is not swapped out until the commit. |
805 manager.SwapOutOldPage(); | 818 manager->SwapOutOldPage(); |
806 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( | 819 EXPECT_TRUE(test_process_host->sink().GetUniqueMessageMatching( |
807 ViewMsg_SwapOut::ID)); | 820 ViewMsg_SwapOut::ID)); |
808 test_host->OnSwappedOut(false); | 821 test_host->OnSwappedOut(false); |
809 | 822 |
810 // Commit. | 823 // Commit. |
811 manager.DidNavigateMainFrame(host3); | 824 manager->DidNavigateMainFrame(host3); |
812 EXPECT_TRUE(host3 == manager.current_host()); | 825 EXPECT_TRUE(host3 == manager->current_host()); |
813 ASSERT_TRUE(host3); | 826 ASSERT_TRUE(host3); |
814 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host3->GetSiteInstance())-> | 827 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host3->GetSiteInstance())-> |
815 HasSite()); | 828 HasSite()); |
816 // Check the pending RenderViewHost has been committed. | 829 // Check the pending RenderViewHost has been committed. |
817 EXPECT_FALSE(manager.pending_render_view_host()); | 830 EXPECT_FALSE(manager->pending_render_view_host()); |
818 | 831 |
819 // We should observe a notification. | 832 // We should observe a notification. |
820 EXPECT_TRUE( | 833 EXPECT_TRUE( |
821 notifications.Check1AndReset(NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); | 834 notifications.Check1AndReset(NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); |
822 } | 835 } |
823 | 836 |
824 // Tests WebUI creation. | 837 // Tests WebUI creation. |
825 TEST_F(RenderFrameHostManagerTest, WebUI) { | 838 TEST_F(RenderFrameHostManagerTest, WebUI) { |
826 set_should_create_webui(true); | 839 set_should_create_webui(true); |
827 SiteInstance* instance = SiteInstance::Create(browser_context()); | 840 SiteInstance* instance = SiteInstance::Create(browser_context()); |
828 | 841 |
829 scoped_ptr<TestWebContents> web_contents( | 842 scoped_ptr<TestWebContents> web_contents( |
830 TestWebContents::Create(browser_context(), instance)); | 843 TestWebContents::Create(browser_context(), instance)); |
831 RenderFrameHostManager manager(web_contents.get(), web_contents.get(), | 844 FrameTree tree(web_contents->GetFrameTree()->root()->navigator(), |
832 web_contents.get(), web_contents.get()); | 845 web_contents.get(), web_contents.get(), |
| 846 web_contents.get(), web_contents.get()); |
| 847 RenderFrameHostManager* manager = tree.root()->render_manager(); |
833 | 848 |
834 manager.Init(browser_context(), instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE); | 849 manager->Init(browser_context(), instance, MSG_ROUTING_NONE, |
835 EXPECT_FALSE(manager.current_host()->IsRenderViewLive()); | 850 MSG_ROUTING_NONE); |
| 851 EXPECT_FALSE(manager->current_host()->IsRenderViewLive()); |
836 | 852 |
837 const GURL kUrl("chrome://foo"); | 853 const GURL kUrl("chrome://foo"); |
838 NavigationEntryImpl entry(NULL /* instance */, -1 /* page_id */, kUrl, | 854 NavigationEntryImpl entry(NULL /* instance */, -1 /* page_id */, kUrl, |
839 Referrer(), base::string16() /* title */, | 855 Referrer(), base::string16() /* title */, |
840 PAGE_TRANSITION_TYPED, | 856 PAGE_TRANSITION_TYPED, |
841 false /* is_renderer_init */); | 857 false /* is_renderer_init */); |
842 RenderViewHost* host = manager.Navigate(entry); | 858 RenderViewHost* host = manager->Navigate(entry); |
843 | 859 |
844 // We commit the pending RenderViewHost immediately because the previous | 860 // We commit the pending RenderViewHost immediately because the previous |
845 // RenderViewHost was not live. We test a case where it is live in | 861 // RenderViewHost was not live. We test a case where it is live in |
846 // WebUIInNewTab. | 862 // WebUIInNewTab. |
847 EXPECT_TRUE(host); | 863 EXPECT_TRUE(host); |
848 EXPECT_EQ(host, manager.current_host()); | 864 EXPECT_EQ(host, manager->current_host()); |
849 EXPECT_FALSE(manager.pending_render_view_host()); | 865 EXPECT_FALSE(manager->pending_render_view_host()); |
850 | 866 |
851 // It's important that the site instance get set on the Web UI page as soon | 867 // It's important that the site instance get set on the Web UI page as soon |
852 // as the navigation starts, rather than lazily after it commits, so we don't | 868 // as the navigation starts, rather than lazily after it commits, so we don't |
853 // try to re-use the SiteInstance/process for non Web UI things that may | 869 // try to re-use the SiteInstance/process for non Web UI things that may |
854 // get loaded in between. | 870 // get loaded in between. |
855 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> | 871 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> |
856 HasSite()); | 872 HasSite()); |
857 EXPECT_EQ(kUrl, host->GetSiteInstance()->GetSiteURL()); | 873 EXPECT_EQ(kUrl, host->GetSiteInstance()->GetSiteURL()); |
858 | 874 |
859 // The Web UI is committed immediately because the RenderViewHost has not been | 875 // The Web UI is committed immediately because the RenderViewHost has not been |
860 // used yet. UpdateRendererStateForNavigate() took the short cut path. | 876 // used yet. UpdateRendererStateForNavigate() took the short cut path. |
861 EXPECT_FALSE(manager.pending_web_ui()); | 877 EXPECT_FALSE(manager->pending_web_ui()); |
862 EXPECT_TRUE(manager.web_ui()); | 878 EXPECT_TRUE(manager->web_ui()); |
863 | 879 |
864 // Commit. | 880 // Commit. |
865 manager.DidNavigateMainFrame(host); | 881 manager->DidNavigateMainFrame(host); |
866 EXPECT_TRUE(host->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); | 882 EXPECT_TRUE(host->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); |
867 } | 883 } |
868 | 884 |
869 // Tests that we can open a WebUI link in a new tab from a WebUI page and still | 885 // Tests that we can open a WebUI link in a new tab from a WebUI page and still |
870 // grant the correct bindings. http://crbug.com/189101. | 886 // grant the correct bindings. http://crbug.com/189101. |
871 TEST_F(RenderFrameHostManagerTest, WebUIInNewTab) { | 887 TEST_F(RenderFrameHostManagerTest, WebUIInNewTab) { |
872 set_should_create_webui(true); | 888 set_should_create_webui(true); |
873 SiteInstance* blank_instance = SiteInstance::Create(browser_context()); | 889 SiteInstance* blank_instance = SiteInstance::Create(browser_context()); |
874 | 890 |
875 // Create a blank tab. | 891 // Create a blank tab. |
876 scoped_ptr<TestWebContents> web_contents1( | 892 scoped_ptr<TestWebContents> web_contents1( |
877 TestWebContents::Create(browser_context(), blank_instance)); | 893 TestWebContents::Create(browser_context(), blank_instance)); |
878 RenderFrameHostManager manager1(web_contents1.get(), web_contents1.get(), | 894 FrameTree tree1(web_contents1->GetFrameTree()->root()->navigator(), |
879 web_contents1.get(), web_contents1.get()); | 895 web_contents1.get(), web_contents1.get(), |
880 manager1.Init( | 896 web_contents1.get(), web_contents1.get()); |
| 897 RenderFrameHostManager* manager1 = tree1.root()->render_manager(); |
| 898 manager1->Init( |
881 browser_context(), blank_instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE); | 899 browser_context(), blank_instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE); |
882 // Test the case that new RVH is considered live. | 900 // Test the case that new RVH is considered live. |
883 manager1.current_host()->CreateRenderView(base::string16(), -1, -1); | 901 manager1->current_host()->CreateRenderView(base::string16(), -1, -1); |
884 | 902 |
885 // Navigate to a WebUI page. | 903 // Navigate to a WebUI page. |
886 const GURL kUrl1("chrome://foo"); | 904 const GURL kUrl1("chrome://foo"); |
887 NavigationEntryImpl entry1(NULL /* instance */, -1 /* page_id */, kUrl1, | 905 NavigationEntryImpl entry1(NULL /* instance */, -1 /* page_id */, kUrl1, |
888 Referrer(), base::string16() /* title */, | 906 Referrer(), base::string16() /* title */, |
889 PAGE_TRANSITION_TYPED, | 907 PAGE_TRANSITION_TYPED, |
890 false /* is_renderer_init */); | 908 false /* is_renderer_init */); |
891 RenderViewHost* host1 = manager1.Navigate(entry1); | 909 RenderViewHost* host1 = manager1->Navigate(entry1); |
892 | 910 |
893 // We should have a pending navigation to the WebUI RenderViewHost. | 911 // We should have a pending navigation to the WebUI RenderViewHost. |
894 // It should already have bindings. | 912 // It should already have bindings. |
895 EXPECT_EQ(host1, manager1.pending_render_view_host()); | 913 EXPECT_EQ(host1, manager1->pending_render_view_host()); |
896 EXPECT_NE(host1, manager1.current_host()); | 914 EXPECT_NE(host1, manager1->current_host()); |
897 EXPECT_TRUE(host1->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); | 915 EXPECT_TRUE(host1->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); |
898 | 916 |
899 // Commit and ensure we still have bindings. | 917 // Commit and ensure we still have bindings. |
900 manager1.DidNavigateMainFrame(host1); | 918 manager1->DidNavigateMainFrame(host1); |
901 SiteInstance* webui_instance = host1->GetSiteInstance(); | 919 SiteInstance* webui_instance = host1->GetSiteInstance(); |
902 EXPECT_EQ(host1, manager1.current_host()); | 920 EXPECT_EQ(host1, manager1->current_host()); |
903 EXPECT_TRUE(host1->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); | 921 EXPECT_TRUE(host1->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); |
904 | 922 |
905 // Now simulate clicking a link that opens in a new tab. | 923 // Now simulate clicking a link that opens in a new tab. |
906 scoped_ptr<TestWebContents> web_contents2( | 924 scoped_ptr<TestWebContents> web_contents2( |
907 TestWebContents::Create(browser_context(), webui_instance)); | 925 TestWebContents::Create(browser_context(), webui_instance)); |
908 RenderFrameHostManager manager2(web_contents2.get(), web_contents2.get(), | 926 FrameTree tree2(web_contents2->GetFrameTree()->root()->navigator(), |
909 web_contents2.get(), web_contents2.get()); | 927 web_contents2.get(), web_contents2.get(), |
910 manager2.Init( | 928 web_contents2.get(), web_contents2.get()); |
| 929 RenderFrameHostManager* manager2 = tree2.root()->render_manager(); |
| 930 manager2->Init( |
911 browser_context(), webui_instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE); | 931 browser_context(), webui_instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE); |
912 // Make sure the new RVH is considered live. This is usually done in | 932 // Make sure the new RVH is considered live. This is usually done in |
913 // RenderWidgetHost::Init when opening a new tab from a link. | 933 // RenderWidgetHost::Init when opening a new tab from a link. |
914 manager2.current_host()->CreateRenderView(base::string16(), -1, -1); | 934 manager2->current_host()->CreateRenderView(base::string16(), -1, -1); |
915 | 935 |
916 const GURL kUrl2("chrome://foo/bar"); | 936 const GURL kUrl2("chrome://foo/bar"); |
917 NavigationEntryImpl entry2(NULL /* instance */, -1 /* page_id */, kUrl2, | 937 NavigationEntryImpl entry2(NULL /* instance */, -1 /* page_id */, kUrl2, |
918 Referrer(), base::string16() /* title */, | 938 Referrer(), base::string16() /* title */, |
919 PAGE_TRANSITION_LINK, | 939 PAGE_TRANSITION_LINK, |
920 true /* is_renderer_init */); | 940 true /* is_renderer_init */); |
921 RenderViewHost* host2 = manager2.Navigate(entry2); | 941 RenderViewHost* host2 = manager2->Navigate(entry2); |
922 | 942 |
923 // No cross-process transition happens because we are already in the right | 943 // No cross-process transition happens because we are already in the right |
924 // SiteInstance. We should grant bindings immediately. | 944 // SiteInstance. We should grant bindings immediately. |
925 EXPECT_EQ(host2, manager2.current_host()); | 945 EXPECT_EQ(host2, manager2->current_host()); |
926 EXPECT_TRUE(host2->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); | 946 EXPECT_TRUE(host2->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); |
927 | 947 |
928 manager2.DidNavigateMainFrame(host2); | 948 manager2->DidNavigateMainFrame(host2); |
929 } | 949 } |
930 | 950 |
931 // Tests that we don't end up in an inconsistent state if a page does a back and | 951 // Tests that we don't end up in an inconsistent state if a page does a back and |
932 // then reload. http://crbug.com/51680 | 952 // then reload. http://crbug.com/51680 |
933 TEST_F(RenderFrameHostManagerTest, PageDoesBackAndReload) { | 953 TEST_F(RenderFrameHostManagerTest, PageDoesBackAndReload) { |
934 const GURL kUrl1("http://www.google.com/"); | 954 const GURL kUrl1("http://www.google.com/"); |
935 const GURL kUrl2("http://www.evil-site.com/"); | 955 const GURL kUrl2("http://www.evil-site.com/"); |
936 | 956 |
937 // Navigate to a safe site, then an evil site. | 957 // Navigate to a safe site, then an evil site. |
938 // This will switch RenderViewHosts. We cannot assert that the first and | 958 // This will switch RenderViewHosts. We cannot assert that the first and |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1051 | 1071 |
1052 // Navigate to a cross-site URL (different SiteInstance but same | 1072 // Navigate to a cross-site URL (different SiteInstance but same |
1053 // BrowsingInstance). | 1073 // BrowsingInstance). |
1054 contents()->NavigateAndCommit(kUrl2); | 1074 contents()->NavigateAndCommit(kUrl2); |
1055 TestRenderViewHost* rvh2 = test_rvh(); | 1075 TestRenderViewHost* rvh2 = test_rvh(); |
1056 EXPECT_NE(rvh1->GetSiteInstance(), rvh2->GetSiteInstance()); | 1076 EXPECT_NE(rvh1->GetSiteInstance(), rvh2->GetSiteInstance()); |
1057 EXPECT_TRUE(rvh1->GetSiteInstance()->IsRelatedSiteInstance( | 1077 EXPECT_TRUE(rvh1->GetSiteInstance()->IsRelatedSiteInstance( |
1058 rvh2->GetSiteInstance())); | 1078 rvh2->GetSiteInstance())); |
1059 | 1079 |
1060 // Ensure rvh1 is placed on swapped out list of the current tab. | 1080 // Ensure rvh1 is placed on swapped out list of the current tab. |
1061 EXPECT_TRUE(manager->IsOnSwappedOutList(rvh1)); | 1081 EXPECT_TRUE(manager->IsRVHOnSwappedOutList(rvh1)); |
1062 EXPECT_EQ(rvh1, | 1082 EXPECT_EQ(rvh1, |
1063 manager->GetSwappedOutRenderViewHost(rvh1->GetSiteInstance())); | 1083 manager->GetSwappedOutRenderViewHost(rvh1->GetSiteInstance())); |
1064 | 1084 |
1065 // Ensure a swapped out RVH is created in the first opener tab. | 1085 // Ensure a swapped out RVH is created in the first opener tab. |
1066 TestRenderViewHost* opener1_rvh = static_cast<TestRenderViewHost*>( | 1086 TestRenderViewHost* opener1_rvh = static_cast<TestRenderViewHost*>( |
1067 opener1_manager->GetSwappedOutRenderViewHost(rvh2->GetSiteInstance())); | 1087 opener1_manager->GetSwappedOutRenderViewHost(rvh2->GetSiteInstance())); |
1068 EXPECT_TRUE(opener1_manager->IsOnSwappedOutList(opener1_rvh)); | 1088 EXPECT_TRUE(opener1_manager->IsRVHOnSwappedOutList(opener1_rvh)); |
1069 EXPECT_TRUE(opener1_rvh->is_swapped_out()); | 1089 EXPECT_TRUE(opener1_rvh->is_swapped_out()); |
1070 | 1090 |
1071 // Ensure a swapped out RVH is created in the second opener tab. | 1091 // Ensure a swapped out RVH is created in the second opener tab. |
1072 TestRenderViewHost* opener2_rvh = static_cast<TestRenderViewHost*>( | 1092 TestRenderViewHost* opener2_rvh = static_cast<TestRenderViewHost*>( |
1073 opener2_manager->GetSwappedOutRenderViewHost(rvh2->GetSiteInstance())); | 1093 opener2_manager->GetSwappedOutRenderViewHost(rvh2->GetSiteInstance())); |
1074 EXPECT_TRUE(opener2_manager->IsOnSwappedOutList(opener2_rvh)); | 1094 EXPECT_TRUE(opener2_manager->IsRVHOnSwappedOutList(opener2_rvh)); |
1075 EXPECT_TRUE(opener2_rvh->is_swapped_out()); | 1095 EXPECT_TRUE(opener2_rvh->is_swapped_out()); |
1076 | 1096 |
1077 // Navigate to a cross-BrowsingInstance URL. | 1097 // Navigate to a cross-BrowsingInstance URL. |
1078 contents()->NavigateAndCommit(kChromeUrl); | 1098 contents()->NavigateAndCommit(kChromeUrl); |
1079 TestRenderViewHost* rvh3 = test_rvh(); | 1099 TestRenderViewHost* rvh3 = test_rvh(); |
1080 EXPECT_NE(rvh1->GetSiteInstance(), rvh3->GetSiteInstance()); | 1100 EXPECT_NE(rvh1->GetSiteInstance(), rvh3->GetSiteInstance()); |
1081 EXPECT_FALSE(rvh1->GetSiteInstance()->IsRelatedSiteInstance( | 1101 EXPECT_FALSE(rvh1->GetSiteInstance()->IsRelatedSiteInstance( |
1082 rvh3->GetSiteInstance())); | 1102 rvh3->GetSiteInstance())); |
1083 | 1103 |
1084 // No scripting is allowed across BrowsingInstances, so we should not create | 1104 // No scripting is allowed across BrowsingInstances, so we should not create |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1166 // BrowsingInstance). | 1186 // BrowsingInstance). |
1167 contents()->NavigateAndCommit(kPluginUrl); | 1187 contents()->NavigateAndCommit(kPluginUrl); |
1168 TestRenderViewHost* rvh2 = test_rvh(); | 1188 TestRenderViewHost* rvh2 = test_rvh(); |
1169 EXPECT_NE(rvh1->GetSiteInstance(), rvh2->GetSiteInstance()); | 1189 EXPECT_NE(rvh1->GetSiteInstance(), rvh2->GetSiteInstance()); |
1170 EXPECT_TRUE(rvh1->GetSiteInstance()->IsRelatedSiteInstance( | 1190 EXPECT_TRUE(rvh1->GetSiteInstance()->IsRelatedSiteInstance( |
1171 rvh2->GetSiteInstance())); | 1191 rvh2->GetSiteInstance())); |
1172 | 1192 |
1173 // Ensure a swapped out RVH is created in the first opener tab. | 1193 // Ensure a swapped out RVH is created in the first opener tab. |
1174 TestRenderViewHost* opener1_rvh = static_cast<TestRenderViewHost*>( | 1194 TestRenderViewHost* opener1_rvh = static_cast<TestRenderViewHost*>( |
1175 opener1_manager->GetSwappedOutRenderViewHost(rvh2->GetSiteInstance())); | 1195 opener1_manager->GetSwappedOutRenderViewHost(rvh2->GetSiteInstance())); |
1176 EXPECT_TRUE(opener1_manager->IsOnSwappedOutList(opener1_rvh)); | 1196 EXPECT_TRUE(opener1_manager->IsRVHOnSwappedOutList(opener1_rvh)); |
1177 EXPECT_TRUE(opener1_rvh->is_swapped_out()); | 1197 EXPECT_TRUE(opener1_rvh->is_swapped_out()); |
1178 | 1198 |
1179 // Ensure the new RVH has WebUI bindings. | 1199 // Ensure the new RVH has WebUI bindings. |
1180 EXPECT_TRUE(rvh2->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); | 1200 EXPECT_TRUE(rvh2->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); |
1181 } | 1201 } |
1182 | 1202 |
1183 // Test that we reuse the same guest SiteInstance if we navigate across sites. | 1203 // Test that we reuse the same guest SiteInstance if we navigate across sites. |
1184 TEST_F(RenderFrameHostManagerTest, NoSwapOnGuestNavigations) { | 1204 TEST_F(RenderFrameHostManagerTest, NoSwapOnGuestNavigations) { |
1185 TestNotificationTracker notifications; | 1205 TestNotificationTracker notifications; |
1186 | 1206 |
1187 GURL guest_url(std::string(kGuestScheme).append("://abc123")); | 1207 GURL guest_url(std::string(kGuestScheme).append("://abc123")); |
1188 SiteInstance* instance = | 1208 SiteInstance* instance = |
1189 SiteInstance::CreateForURL(browser_context(), guest_url); | 1209 SiteInstance::CreateForURL(browser_context(), guest_url); |
1190 scoped_ptr<TestWebContents> web_contents( | 1210 scoped_ptr<TestWebContents> web_contents( |
1191 TestWebContents::Create(browser_context(), instance)); | 1211 TestWebContents::Create(browser_context(), instance)); |
1192 | 1212 |
1193 // Create. | 1213 // Create. |
1194 RenderFrameHostManager manager(web_contents.get(), web_contents.get(), | 1214 FrameTree tree(web_contents->GetFrameTree()->root()->navigator(), |
1195 web_contents.get(), web_contents.get()); | 1215 web_contents.get(), web_contents.get(), |
| 1216 web_contents.get(), web_contents.get()); |
| 1217 RenderFrameHostManager* manager = tree.root()->render_manager(); |
1196 | 1218 |
1197 manager.Init(browser_context(), instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE); | 1219 manager->Init(browser_context(), instance, MSG_ROUTING_NONE, |
| 1220 MSG_ROUTING_NONE); |
1198 | 1221 |
1199 RenderViewHost* host; | 1222 RenderViewHost* host; |
1200 | 1223 |
1201 // 1) The first navigation. -------------------------- | 1224 // 1) The first navigation. -------------------------- |
1202 const GURL kUrl1("http://www.google.com/"); | 1225 const GURL kUrl1("http://www.google.com/"); |
1203 NavigationEntryImpl entry1( | 1226 NavigationEntryImpl entry1( |
1204 NULL /* instance */, -1 /* page_id */, kUrl1, Referrer(), | 1227 NULL /* instance */, -1 /* page_id */, kUrl1, Referrer(), |
1205 base::string16() /* title */, PAGE_TRANSITION_TYPED, | 1228 base::string16() /* title */, PAGE_TRANSITION_TYPED, |
1206 false /* is_renderer_init */); | 1229 false /* is_renderer_init */); |
1207 host = manager.Navigate(entry1); | 1230 host = manager->Navigate(entry1); |
1208 | 1231 |
1209 // The RenderViewHost created in Init will be reused. | 1232 // The RenderViewHost created in Init will be reused. |
1210 EXPECT_TRUE(host == manager.current_host()); | 1233 EXPECT_TRUE(host == manager->current_host()); |
1211 EXPECT_FALSE(manager.pending_render_view_host()); | 1234 EXPECT_FALSE(manager->pending_render_view_host()); |
1212 EXPECT_EQ(manager.current_host()->GetSiteInstance(), instance); | 1235 EXPECT_EQ(manager->current_host()->GetSiteInstance(), instance); |
1213 | 1236 |
1214 // Commit. | 1237 // Commit. |
1215 manager.DidNavigateMainFrame(host); | 1238 manager->DidNavigateMainFrame(host); |
1216 // Commit to SiteInstance should be delayed until RenderView commit. | 1239 // Commit to SiteInstance should be delayed until RenderView commit. |
1217 EXPECT_EQ(host, manager.current_host()); | 1240 EXPECT_EQ(host, manager->current_host()); |
1218 ASSERT_TRUE(host); | 1241 ASSERT_TRUE(host); |
1219 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> | 1242 EXPECT_TRUE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> |
1220 HasSite()); | 1243 HasSite()); |
1221 | 1244 |
1222 // 2) Navigate to a different domain. ------------------------- | 1245 // 2) Navigate to a different domain. ------------------------- |
1223 // Guests stay in the same process on navigation. | 1246 // Guests stay in the same process on navigation. |
1224 const GURL kUrl2("http://www.chromium.org"); | 1247 const GURL kUrl2("http://www.chromium.org"); |
1225 NavigationEntryImpl entry2( | 1248 NavigationEntryImpl entry2( |
1226 NULL /* instance */, -1 /* page_id */, kUrl2, | 1249 NULL /* instance */, -1 /* page_id */, kUrl2, |
1227 Referrer(kUrl1, blink::WebReferrerPolicyDefault), | 1250 Referrer(kUrl1, blink::WebReferrerPolicyDefault), |
1228 base::string16() /* title */, PAGE_TRANSITION_LINK, | 1251 base::string16() /* title */, PAGE_TRANSITION_LINK, |
1229 true /* is_renderer_init */); | 1252 true /* is_renderer_init */); |
1230 host = manager.Navigate(entry2); | 1253 host = manager->Navigate(entry2); |
1231 | 1254 |
1232 // The RenderViewHost created in Init will be reused. | 1255 // The RenderViewHost created in Init will be reused. |
1233 EXPECT_EQ(host, manager.current_host()); | 1256 EXPECT_EQ(host, manager->current_host()); |
1234 EXPECT_FALSE(manager.pending_render_view_host()); | 1257 EXPECT_FALSE(manager->pending_render_view_host()); |
1235 | 1258 |
1236 // Commit. | 1259 // Commit. |
1237 manager.DidNavigateMainFrame(host); | 1260 manager->DidNavigateMainFrame(host); |
1238 EXPECT_EQ(host, manager.current_host()); | 1261 EXPECT_EQ(host, manager->current_host()); |
1239 ASSERT_TRUE(host); | 1262 ASSERT_TRUE(host); |
1240 EXPECT_EQ(static_cast<SiteInstanceImpl*>(host->GetSiteInstance()), | 1263 EXPECT_EQ(static_cast<SiteInstanceImpl*>(host->GetSiteInstance()), |
1241 instance); | 1264 instance); |
1242 } | 1265 } |
1243 | 1266 |
1244 // Test that we cancel a pending RVH if we close the tab while it's pending. | 1267 // Test that we cancel a pending RVH if we close the tab while it's pending. |
1245 // http://crbug.com/294697. | 1268 // http://crbug.com/294697. |
1246 TEST_F(RenderFrameHostManagerTest, NavigateWithEarlyClose) { | 1269 TEST_F(RenderFrameHostManagerTest, NavigateWithEarlyClose) { |
1247 TestNotificationTracker notifications; | 1270 TestNotificationTracker notifications; |
1248 | 1271 |
1249 SiteInstance* instance = SiteInstance::Create(browser_context()); | 1272 SiteInstance* instance = SiteInstance::Create(browser_context()); |
1250 | 1273 |
1251 BeforeUnloadFiredWebContentsDelegate delegate; | 1274 BeforeUnloadFiredWebContentsDelegate delegate; |
1252 scoped_ptr<TestWebContents> web_contents( | 1275 scoped_ptr<TestWebContents> web_contents( |
1253 TestWebContents::Create(browser_context(), instance)); | 1276 TestWebContents::Create(browser_context(), instance)); |
1254 web_contents->SetDelegate(&delegate); | 1277 web_contents->SetDelegate(&delegate); |
1255 notifications.ListenFor(NOTIFICATION_RENDER_VIEW_HOST_CHANGED, | 1278 notifications.ListenFor(NOTIFICATION_RENDER_VIEW_HOST_CHANGED, |
1256 Source<WebContents>(web_contents.get())); | 1279 Source<WebContents>(web_contents.get())); |
1257 | 1280 |
1258 // Create. | 1281 // Create. |
1259 RenderFrameHostManager manager(web_contents.get(), web_contents.get(), | 1282 FrameTree tree(web_contents->GetFrameTree()->root()->navigator(), |
1260 web_contents.get(), web_contents.get()); | 1283 web_contents.get(), web_contents.get(), |
| 1284 web_contents.get(), web_contents.get()); |
| 1285 RenderFrameHostManager* manager = tree.root()->render_manager(); |
1261 | 1286 |
1262 manager.Init(browser_context(), instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE); | 1287 manager->Init(browser_context(), instance, MSG_ROUTING_NONE, |
| 1288 MSG_ROUTING_NONE); |
1263 | 1289 |
1264 // 1) The first navigation. -------------------------- | 1290 // 1) The first navigation. -------------------------- |
1265 const GURL kUrl1("http://www.google.com/"); | 1291 const GURL kUrl1("http://www.google.com/"); |
1266 NavigationEntryImpl entry1(NULL /* instance */, -1 /* page_id */, kUrl1, | 1292 NavigationEntryImpl entry1(NULL /* instance */, -1 /* page_id */, kUrl1, |
1267 Referrer(), base::string16() /* title */, | 1293 Referrer(), base::string16() /* title */, |
1268 PAGE_TRANSITION_TYPED, | 1294 PAGE_TRANSITION_TYPED, |
1269 false /* is_renderer_init */); | 1295 false /* is_renderer_init */); |
1270 RenderViewHost* host = manager.Navigate(entry1); | 1296 RenderViewHost* host = manager->Navigate(entry1); |
1271 | 1297 |
1272 // The RenderViewHost created in Init will be reused. | 1298 // The RenderViewHost created in Init will be reused. |
1273 EXPECT_EQ(host, manager.current_host()); | 1299 EXPECT_EQ(host, manager->current_host()); |
1274 EXPECT_FALSE(manager.pending_render_view_host()); | 1300 EXPECT_FALSE(manager->pending_render_view_host()); |
1275 | 1301 |
1276 // We should observe a notification. | 1302 // We should observe a notification. |
1277 EXPECT_TRUE( | 1303 EXPECT_TRUE( |
1278 notifications.Check1AndReset(NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); | 1304 notifications.Check1AndReset(NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); |
1279 notifications.Reset(); | 1305 notifications.Reset(); |
1280 | 1306 |
1281 // Commit. | 1307 // Commit. |
1282 manager.DidNavigateMainFrame(host); | 1308 manager->DidNavigateMainFrame(host); |
1283 | 1309 |
1284 // Commit to SiteInstance should be delayed until RenderView commit. | 1310 // Commit to SiteInstance should be delayed until RenderView commit. |
1285 EXPECT_EQ(host, manager.current_host()); | 1311 EXPECT_EQ(host, manager->current_host()); |
1286 EXPECT_FALSE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> | 1312 EXPECT_FALSE(static_cast<SiteInstanceImpl*>(host->GetSiteInstance())-> |
1287 HasSite()); | 1313 HasSite()); |
1288 static_cast<SiteInstanceImpl*>(host->GetSiteInstance())->SetSite(kUrl1); | 1314 static_cast<SiteInstanceImpl*>(host->GetSiteInstance())->SetSite(kUrl1); |
1289 | 1315 |
1290 // 2) Cross-site navigate to next site. ------------------------- | 1316 // 2) Cross-site navigate to next site. ------------------------- |
1291 const GURL kUrl2("http://www.example.com"); | 1317 const GURL kUrl2("http://www.example.com"); |
1292 NavigationEntryImpl entry2( | 1318 NavigationEntryImpl entry2( |
1293 NULL /* instance */, -1 /* page_id */, kUrl2, Referrer(), | 1319 NULL /* instance */, -1 /* page_id */, kUrl2, Referrer(), |
1294 base::string16() /* title */, PAGE_TRANSITION_TYPED, | 1320 base::string16() /* title */, PAGE_TRANSITION_TYPED, |
1295 false /* is_renderer_init */); | 1321 false /* is_renderer_init */); |
1296 RenderViewHostImpl* host2 = static_cast<RenderViewHostImpl*>( | 1322 RenderViewHostImpl* host2 = static_cast<RenderViewHostImpl*>( |
1297 manager.Navigate(entry2)); | 1323 manager->Navigate(entry2)); |
1298 | 1324 |
1299 // A new RenderViewHost should be created. | 1325 // A new RenderViewHost should be created. |
1300 ASSERT_EQ(host2, manager.pending_render_view_host()); | 1326 ASSERT_EQ(host2, manager->pending_render_view_host()); |
1301 EXPECT_NE(host2, host); | 1327 EXPECT_NE(host2, host); |
1302 | 1328 |
1303 EXPECT_EQ(host, manager.current_host()); | 1329 EXPECT_EQ(host, manager->current_host()); |
1304 EXPECT_FALSE(static_cast<RenderViewHostImpl*>( | 1330 EXPECT_FALSE(static_cast<RenderViewHostImpl*>( |
1305 manager.current_host())->is_swapped_out()); | 1331 manager->current_host())->is_swapped_out()); |
1306 EXPECT_EQ(host2, manager.pending_render_view_host()); | 1332 EXPECT_EQ(host2, manager->pending_render_view_host()); |
1307 | 1333 |
1308 // 3) Close the tab. ------------------------- | 1334 // 3) Close the tab. ------------------------- |
1309 notifications.ListenFor(NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, | 1335 notifications.ListenFor(NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, |
1310 Source<RenderWidgetHost>(host2)); | 1336 Source<RenderWidgetHost>(host2)); |
1311 manager.ShouldClosePage(false, true, base::TimeTicks()); | 1337 manager->ShouldClosePage(false, true, base::TimeTicks()); |
1312 | 1338 |
1313 EXPECT_TRUE( | 1339 EXPECT_TRUE( |
1314 notifications.Check1AndReset(NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED)); | 1340 notifications.Check1AndReset(NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED)); |
1315 EXPECT_FALSE(manager.pending_render_view_host()); | 1341 EXPECT_FALSE(manager->pending_render_view_host()); |
1316 EXPECT_EQ(host, manager.current_host()); | 1342 EXPECT_EQ(host, manager->current_host()); |
1317 } | 1343 } |
1318 | 1344 |
1319 } // namespace content | 1345 } // namespace content |
OLD | NEW |