OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/strings/utf_string_conversions.h" | 5 #include "base/strings/utf_string_conversions.h" |
6 #include "content/browser/frame_host/navigation_controller_impl.h" | 6 #include "content/browser/frame_host/navigation_controller_impl.h" |
7 #include "content/browser/frame_host/navigation_entry_impl.h" | 7 #include "content/browser/frame_host/navigation_entry_impl.h" |
8 #include "content/browser/frame_host/render_frame_host_manager.h" | 8 #include "content/browser/frame_host/render_frame_host_manager.h" |
9 #include "content/browser/site_instance_impl.h" | 9 #include "content/browser/site_instance_impl.h" |
10 #include "content/browser/webui/web_ui_controller_factory_registry.h" | 10 #include "content/browser/webui/web_ui_controller_factory_registry.h" |
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
560 | 560 |
561 // Tests the Init function by checking the initial RenderViewHost. | 561 // Tests the Init function by checking the initial RenderViewHost. |
562 TEST_F(RenderFrameHostManagerTest, Init) { | 562 TEST_F(RenderFrameHostManagerTest, Init) { |
563 // Using TestBrowserContext. | 563 // Using TestBrowserContext. |
564 SiteInstanceImpl* instance = | 564 SiteInstanceImpl* instance = |
565 static_cast<SiteInstanceImpl*>(SiteInstance::Create(browser_context())); | 565 static_cast<SiteInstanceImpl*>(SiteInstance::Create(browser_context())); |
566 EXPECT_FALSE(instance->HasSite()); | 566 EXPECT_FALSE(instance->HasSite()); |
567 | 567 |
568 scoped_ptr<TestWebContents> web_contents( | 568 scoped_ptr<TestWebContents> web_contents( |
569 TestWebContents::Create(browser_context(), instance)); | 569 TestWebContents::Create(browser_context(), instance)); |
570 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 Loading... |
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 Loading... |
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 |
OLD | NEW |