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

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

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

Powered by Google App Engine
This is Rietveld 408576698