Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: content/browser/frame_host/render_frame_host_manager_unittest.cc

Issue 117693002: Make RenderFrameHostManager swap RenderFrameHosts, not RenderViewHosts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix merge conflicts Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/frame_host/render_frame_host_manager.cc ('k') | content/browser/renderer_host/DEPS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698