Chromium Code Reviews| 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/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/bind.h" | 6 #include "base/bind.h" |
| 7 #include "base/command_line.h" | |
| 7 #include "base/files/file_util.h" | 8 #include "base/files/file_util.h" |
| 8 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| 10 #include "base/strings/string_util.h" | 11 #include "base/strings/string_util.h" |
| 11 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
| 12 #include "base/time/time.h" | 13 #include "base/time/time.h" |
| 13 #include "content/browser/frame_host/cross_site_transferring_request.h" | 14 #include "content/browser/frame_host/cross_site_transferring_request.h" |
| 14 #include "content/browser/frame_host/navigation_controller_impl.h" | 15 #include "content/browser/frame_host/navigation_controller_impl.h" |
| 15 #include "content/browser/frame_host/navigation_entry_impl.h" | 16 #include "content/browser/frame_host/navigation_entry_impl.h" |
| 16 #include "content/browser/frame_host/navigation_entry_screenshot_manager.h" | 17 #include "content/browser/frame_host/navigation_entry_screenshot_manager.h" |
| 17 #include "content/browser/frame_host/navigator.h" | 18 #include "content/browser/frame_host/navigator.h" |
| 18 #include "content/browser/site_instance_impl.h" | 19 #include "content/browser/site_instance_impl.h" |
| 19 #include "content/browser/web_contents/web_contents_impl.h" | 20 #include "content/browser/web_contents/web_contents_impl.h" |
| 20 #include "content/common/frame_messages.h" | 21 #include "content/common/frame_messages.h" |
| 21 #include "content/common/view_messages.h" | 22 #include "content/common/view_messages.h" |
| 22 #include "content/public/browser/navigation_details.h" | 23 #include "content/public/browser/navigation_details.h" |
| 23 #include "content/public/browser/notification_registrar.h" | 24 #include "content/public/browser/notification_registrar.h" |
| 24 #include "content/public/browser/notification_types.h" | 25 #include "content/public/browser/notification_types.h" |
| 25 #include "content/public/browser/render_view_host.h" | 26 #include "content/public/browser/render_view_host.h" |
| 26 #include "content/public/browser/web_contents_delegate.h" | 27 #include "content/public/browser/web_contents_delegate.h" |
| 27 #include "content/public/browser/web_contents_observer.h" | 28 #include "content/public/browser/web_contents_observer.h" |
| 29 #include "content/public/common/content_switches.h" | |
| 28 #include "content/public/common/page_state.h" | 30 #include "content/public/common/page_state.h" |
| 29 #include "content/public/common/url_constants.h" | 31 #include "content/public/common/url_constants.h" |
| 30 #include "content/public/test/mock_render_process_host.h" | 32 #include "content/public/test/mock_render_process_host.h" |
| 31 #include "content/public/test/test_notification_tracker.h" | 33 #include "content/public/test/test_notification_tracker.h" |
| 32 #include "content/public/test/test_utils.h" | 34 #include "content/public/test/test_utils.h" |
| 33 #include "content/test/test_render_frame_host.h" | 35 #include "content/test/test_render_frame_host.h" |
| 34 #include "content/test/test_render_view_host.h" | 36 #include "content/test/test_render_view_host.h" |
| 35 #include "content/test/test_web_contents.h" | 37 #include "content/test/test_web_contents.h" |
| 36 #include "net/base/net_util.h" | 38 #include "net/base/net_util.h" |
| 37 #include "skia/ext/platform_canvas.h" | 39 #include "skia/ext/platform_canvas.h" |
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 407 EXPECT_EQ(controller.GetPendingEntry(), controller.GetVisibleEntry()); | 409 EXPECT_EQ(controller.GetPendingEntry(), controller.GetVisibleEntry()); |
| 408 // TODO(darin): maybe this should really be true? | 410 // TODO(darin): maybe this should really be true? |
| 409 EXPECT_FALSE(controller.CanGoBack()); | 411 EXPECT_FALSE(controller.CanGoBack()); |
| 410 EXPECT_FALSE(controller.CanGoForward()); | 412 EXPECT_FALSE(controller.CanGoForward()); |
| 411 EXPECT_EQ(contents()->GetMaxPageID(), 0); | 413 EXPECT_EQ(contents()->GetMaxPageID(), 0); |
| 412 | 414 |
| 413 EXPECT_TRUE(controller.GetPendingEntry()->GetTimestamp().is_null()); | 415 EXPECT_TRUE(controller.GetPendingEntry()->GetTimestamp().is_null()); |
| 414 | 416 |
| 415 // Simulate the beforeunload ack for the cross-site transition, and then the | 417 // Simulate the beforeunload ack for the cross-site transition, and then the |
| 416 // commit. | 418 // commit. |
| 417 main_test_rfh()->SendBeforeUnloadACK(true); | 419 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
|
nasko
2014/12/16 01:40:26
This code pattern appears few times in this file.
clamy
2014/12/17 15:47:57
Done.
| |
| 420 switches::kEnableBrowserSideNavigation)) { | |
| 421 main_test_rfh()->SimulateIOThread(controller.GetPendingEntry()->GetURL()); | |
| 422 } else { | |
| 423 main_test_rfh()->SendBeforeUnloadACK(true); | |
| 424 } | |
| 418 contents()->GetPendingMainFrame()->SendNavigate(1, url2); | 425 contents()->GetPendingMainFrame()->SendNavigate(1, url2); |
| 419 EXPECT_EQ(1U, navigation_entry_committed_counter_); | 426 EXPECT_EQ(1U, navigation_entry_committed_counter_); |
| 420 navigation_entry_committed_counter_ = 0; | 427 navigation_entry_committed_counter_ = 0; |
| 421 | 428 |
| 422 // The load should now be committed. | 429 // The load should now be committed. |
| 423 EXPECT_EQ(controller.GetEntryCount(), 2); | 430 EXPECT_EQ(controller.GetEntryCount(), 2); |
| 424 EXPECT_EQ(controller.GetLastCommittedEntryIndex(), 1); | 431 EXPECT_EQ(controller.GetLastCommittedEntryIndex(), 1); |
| 425 EXPECT_EQ(controller.GetPendingEntryIndex(), -1); | 432 EXPECT_EQ(controller.GetPendingEntryIndex(), -1); |
| 426 EXPECT_TRUE(controller.GetLastCommittedEntry()); | 433 EXPECT_TRUE(controller.GetLastCommittedEntry()); |
| 427 EXPECT_FALSE(controller.GetPendingEntry()); | 434 EXPECT_FALSE(controller.GetPendingEntry()); |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 745 EXPECT_EQ(1U, navigation_entry_committed_counter_); | 752 EXPECT_EQ(1U, navigation_entry_committed_counter_); |
| 746 navigation_entry_committed_counter_ = 0; | 753 navigation_entry_committed_counter_ = 0; |
| 747 | 754 |
| 748 // Make a pending entry to somewhere new. | 755 // Make a pending entry to somewhere new. |
| 749 const GURL kExistingURL2("http://bee"); | 756 const GURL kExistingURL2("http://bee"); |
| 750 controller.LoadURL( | 757 controller.LoadURL( |
| 751 kExistingURL2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 758 kExistingURL2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 752 EXPECT_EQ(0U, notifications.size()); | 759 EXPECT_EQ(0U, notifications.size()); |
| 753 | 760 |
| 754 // After the beforeunload but before it commits, do a new navigation. | 761 // After the beforeunload but before it commits, do a new navigation. |
| 755 main_test_rfh()->SendBeforeUnloadACK(true); | 762 main_test_rfh()->SendRendererResponseToNavigation(true, kExistingURL2); |
| 756 const GURL kNewURL("http://see"); | 763 const GURL kNewURL("http://see"); |
| 757 contents()->GetPendingMainFrame()->SendNavigate(3, kNewURL); | 764 contents()->GetMainFrame()->SendNavigate(3, kNewURL); |
|
clamy
2014/12/15 17:01:39
I modified this line because the description of th
Charlie Reis
2014/12/16 23:17:34
Yes, I appear to have broken this in https://coder
| |
| 758 | 765 |
| 759 // There should no longer be any pending entry, and the third navigation we | 766 // There should no longer be any pending entry, and the third navigation we |
| 760 // just made should be committed. | 767 // just made should be committed. |
| 761 EXPECT_EQ(1U, navigation_entry_committed_counter_); | 768 EXPECT_EQ(1U, navigation_entry_committed_counter_); |
| 762 navigation_entry_committed_counter_ = 0; | 769 navigation_entry_committed_counter_ = 0; |
| 763 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); | 770 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); |
| 764 EXPECT_EQ(1, controller.GetLastCommittedEntryIndex()); | 771 EXPECT_EQ(1, controller.GetLastCommittedEntryIndex()); |
| 765 EXPECT_EQ(kNewURL, controller.GetVisibleEntry()->GetURL()); | 772 EXPECT_EQ(kNewURL, controller.GetVisibleEntry()->GetURL()); |
| 766 } | 773 } |
| 767 | 774 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 790 | 797 |
| 791 // Now make a pending back/forward navigation. The zeroth entry should be | 798 // Now make a pending back/forward navigation. The zeroth entry should be |
| 792 // pending. | 799 // pending. |
| 793 controller.GoBack(); | 800 controller.GoBack(); |
| 794 EXPECT_EQ(0U, notifications.size()); | 801 EXPECT_EQ(0U, notifications.size()); |
| 795 EXPECT_EQ(0, controller.GetPendingEntryIndex()); | 802 EXPECT_EQ(0, controller.GetPendingEntryIndex()); |
| 796 EXPECT_EQ(1, controller.GetLastCommittedEntryIndex()); | 803 EXPECT_EQ(1, controller.GetLastCommittedEntryIndex()); |
| 797 | 804 |
| 798 // Before that commits, do a new navigation. | 805 // Before that commits, do a new navigation. |
| 799 const GURL kNewURL("http://foo/see"); | 806 const GURL kNewURL("http://foo/see"); |
| 800 LoadCommittedDetails details; | |
| 801 main_test_rfh()->SendNavigate(3, kNewURL); | 807 main_test_rfh()->SendNavigate(3, kNewURL); |
| 802 | 808 |
| 803 // There should no longer be any pending entry, and the third navigation we | 809 // There should no longer be any pending entry, and the third navigation we |
| 804 // just made should be committed. | 810 // just made should be committed. |
| 805 EXPECT_EQ(1U, navigation_entry_committed_counter_); | 811 EXPECT_EQ(1U, navigation_entry_committed_counter_); |
| 806 navigation_entry_committed_counter_ = 0; | 812 navigation_entry_committed_counter_ = 0; |
| 807 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); | 813 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); |
| 808 EXPECT_EQ(2, controller.GetLastCommittedEntryIndex()); | 814 EXPECT_EQ(2, controller.GetLastCommittedEntryIndex()); |
| 809 EXPECT_EQ(kNewURL, controller.GetVisibleEntry()->GetURL()); | 815 EXPECT_EQ(kNewURL, controller.GetVisibleEntry()->GetURL()); |
| 810 } | 816 } |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 824 // Pretend it has bindings so we can tell if we incorrectly copy it. | 830 // Pretend it has bindings so we can tell if we incorrectly copy it. |
| 825 main_test_rfh()->GetRenderViewHost()->AllowBindings(2); | 831 main_test_rfh()->GetRenderViewHost()->AllowBindings(2); |
| 826 main_test_rfh()->SendNavigate(0, kExistingURL1); | 832 main_test_rfh()->SendNavigate(0, kExistingURL1); |
| 827 EXPECT_EQ(1U, navigation_entry_committed_counter_); | 833 EXPECT_EQ(1U, navigation_entry_committed_counter_); |
| 828 navigation_entry_committed_counter_ = 0; | 834 navigation_entry_committed_counter_ = 0; |
| 829 | 835 |
| 830 // Navigate cross-process to a second URL. | 836 // Navigate cross-process to a second URL. |
| 831 const GURL kExistingURL2("http://foo/eh"); | 837 const GURL kExistingURL2("http://foo/eh"); |
| 832 controller.LoadURL( | 838 controller.LoadURL( |
| 833 kExistingURL2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 839 kExistingURL2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 834 main_test_rfh()->SendBeforeUnloadACK(true); | 840 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 841 switches::kEnableBrowserSideNavigation)) { | |
| 842 main_test_rfh()->SimulateIOThread(kExistingURL2); | |
| 843 } else { | |
| 844 main_test_rfh()->SendBeforeUnloadACK(true); | |
| 845 } | |
| 835 TestRenderFrameHost* foo_rfh = contents()->GetPendingMainFrame(); | 846 TestRenderFrameHost* foo_rfh = contents()->GetPendingMainFrame(); |
| 836 foo_rfh->SendNavigate(1, kExistingURL2); | 847 foo_rfh->SendNavigate(1, kExistingURL2); |
| 837 EXPECT_EQ(1U, navigation_entry_committed_counter_); | 848 EXPECT_EQ(1U, navigation_entry_committed_counter_); |
| 838 navigation_entry_committed_counter_ = 0; | 849 navigation_entry_committed_counter_ = 0; |
| 839 | 850 |
| 840 // Now make a pending back/forward navigation to a privileged entry. | 851 // Now make a pending back/forward navigation to a privileged entry. |
| 841 // The zeroth entry should be pending. | 852 // The zeroth entry should be pending. |
| 842 controller.GoBack(); | 853 controller.GoBack(); |
| 843 foo_rfh->SendBeforeUnloadACK(true); | 854 foo_rfh->SendBeforeUnloadACK(true); |
| 844 EXPECT_EQ(0U, notifications.size()); | 855 EXPECT_EQ(0U, notifications.size()); |
| 845 EXPECT_EQ(0, controller.GetPendingEntryIndex()); | 856 EXPECT_EQ(0, controller.GetPendingEntryIndex()); |
| 846 EXPECT_EQ(1, controller.GetLastCommittedEntryIndex()); | 857 EXPECT_EQ(1, controller.GetLastCommittedEntryIndex()); |
| 847 EXPECT_EQ(2, NavigationEntryImpl::FromNavigationEntry( | 858 EXPECT_EQ(2, NavigationEntryImpl::FromNavigationEntry( |
| 848 controller.GetPendingEntry())->bindings()); | 859 controller.GetPendingEntry())->bindings()); |
| 849 | 860 |
| 850 // Before that commits, do a new navigation. | 861 // Before that commits, do a new navigation. |
| 851 const GURL kNewURL("http://foo/bee"); | 862 const GURL kNewURL("http://foo/bee"); |
| 852 LoadCommittedDetails details; | |
| 853 foo_rfh->SendNavigate(3, kNewURL); | 863 foo_rfh->SendNavigate(3, kNewURL); |
| 854 | 864 |
| 855 // There should no longer be any pending entry, and the third navigation we | 865 // There should no longer be any pending entry, and the third navigation we |
| 856 // just made should be committed. | 866 // just made should be committed. |
| 857 EXPECT_EQ(1U, navigation_entry_committed_counter_); | 867 EXPECT_EQ(1U, navigation_entry_committed_counter_); |
| 858 navigation_entry_committed_counter_ = 0; | 868 navigation_entry_committed_counter_ = 0; |
| 859 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); | 869 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); |
| 860 EXPECT_EQ(2, controller.GetLastCommittedEntryIndex()); | 870 EXPECT_EQ(2, controller.GetLastCommittedEntryIndex()); |
| 861 EXPECT_EQ(kNewURL, controller.GetVisibleEntry()->GetURL()); | 871 EXPECT_EQ(kNewURL, controller.GetVisibleEntry()->GetURL()); |
| 862 EXPECT_EQ(0, NavigationEntryImpl::FromNavigationEntry( | 872 EXPECT_EQ(0, NavigationEntryImpl::FromNavigationEntry( |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1095 // that orig_rfh belongs to, to prevent it from being destroyed when | 1105 // that orig_rfh belongs to, to prevent it from being destroyed when |
| 1096 // it gets swapped out, so that we can reuse orig_rfh when the | 1106 // it gets swapped out, so that we can reuse orig_rfh when the |
| 1097 // controller goes back. | 1107 // controller goes back. |
| 1098 orig_rfh->GetSiteInstance()->increment_active_frame_count(); | 1108 orig_rfh->GetSiteInstance()->increment_active_frame_count(); |
| 1099 | 1109 |
| 1100 // Navigate to a second URL, simulate the beforeunload ack for the cross-site | 1110 // Navigate to a second URL, simulate the beforeunload ack for the cross-site |
| 1101 // transition, and set bindings on the pending RenderViewHost to simulate a | 1111 // transition, and set bindings on the pending RenderViewHost to simulate a |
| 1102 // privileged url. | 1112 // privileged url. |
| 1103 controller.LoadURL( | 1113 controller.LoadURL( |
| 1104 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1114 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1105 orig_rfh->SendBeforeUnloadACK(true); | 1115 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1116 switches::kEnableBrowserSideNavigation)) { | |
| 1117 orig_rfh->SimulateIOThread(url2); | |
| 1118 } else { | |
| 1119 orig_rfh->SendBeforeUnloadACK(true); | |
| 1120 } | |
| 1106 TestRenderFrameHost* new_rfh = contents()->GetPendingMainFrame(); | 1121 TestRenderFrameHost* new_rfh = contents()->GetPendingMainFrame(); |
| 1107 new_rfh->GetRenderViewHost()->AllowBindings(1); | 1122 new_rfh->GetRenderViewHost()->AllowBindings(1); |
| 1108 new_rfh->SendNavigate(1, url2); | 1123 new_rfh->SendNavigate(1, url2); |
| 1109 | 1124 |
| 1110 // The second load should be committed, and bindings should be remembered. | 1125 // The second load should be committed, and bindings should be remembered. |
| 1111 EXPECT_EQ(controller.GetEntryCount(), 2); | 1126 EXPECT_EQ(controller.GetEntryCount(), 2); |
| 1112 EXPECT_EQ(1, controller.GetLastCommittedEntryIndex()); | 1127 EXPECT_EQ(1, controller.GetLastCommittedEntryIndex()); |
| 1113 EXPECT_TRUE(controller.CanGoBack()); | 1128 EXPECT_TRUE(controller.CanGoBack()); |
| 1114 EXPECT_EQ(1, NavigationEntryImpl::FromNavigationEntry( | 1129 EXPECT_EQ(1, NavigationEntryImpl::FromNavigationEntry( |
| 1115 controller.GetLastCommittedEntry())->bindings()); | 1130 controller.GetLastCommittedEntry())->bindings()); |
| (...skipping 2772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3888 NavigationControllerImpl& controller = controller_impl(); | 3903 NavigationControllerImpl& controller = controller_impl(); |
| 3889 const GURL url1("http://foo/1"); | 3904 const GURL url1("http://foo/1"); |
| 3890 const GURL url2("http://foo/2"); | 3905 const GURL url2("http://foo/2"); |
| 3891 const GURL url3("http://foo/3"); | 3906 const GURL url3("http://foo/3"); |
| 3892 | 3907 |
| 3893 NavigateAndCommit(url1); | 3908 NavigateAndCommit(url1); |
| 3894 NavigateAndCommit(url2); | 3909 NavigateAndCommit(url2); |
| 3895 NavigateAndCommit(url3); | 3910 NavigateAndCommit(url3); |
| 3896 controller.GoBack(); | 3911 controller.GoBack(); |
| 3897 contents()->CommitPendingNavigation(); | 3912 contents()->CommitPendingNavigation(); |
| 3913 process()->sink().ClearMessages(); | |
| 3898 | 3914 |
| 3899 // Simulate the page calling history.back(). It should create a pending entry. | 3915 // Simulate the page calling history.back(). It should create a pending entry. |
| 3900 contents()->OnGoToEntryAtOffset(-1); | 3916 contents()->OnGoToEntryAtOffset(-1); |
| 3901 EXPECT_EQ(0, controller.GetPendingEntryIndex()); | 3917 EXPECT_EQ(0, controller.GetPendingEntryIndex()); |
| 3902 // The actual cross-navigation is suspended until the current RVH tells us | 3918 // The actual cross-navigation is suspended until the current RVH tells us |
| 3903 // it unloaded, simulate that. | 3919 // it unloaded, simulate that. |
| 3904 contents()->ProceedWithCrossSiteNavigation(); | 3920 contents()->ProceedWithCrossSiteNavigation(); |
| 3905 // Also make sure we told the page to navigate. | 3921 // Also make sure we told the page to navigate. |
| 3906 const IPC::Message* message = | 3922 GURL nav_url; |
| 3907 process()->sink().GetFirstMessageMatching(FrameMsg_Navigate::ID); | 3923 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 3908 ASSERT_TRUE(message != NULL); | 3924 switches::kEnableBrowserSideNavigation)) { |
| 3909 Tuple1<FrameMsg_Navigate_Params> nav_params; | 3925 const IPC::Message* message = process()->sink().GetFirstMessageMatching( |
|
nasko
2014/12/16 01:40:26
It seems that this branching logic can be put in a
clamy
2014/12/17 15:47:57
Done.
| |
| 3910 FrameMsg_Navigate::Read(message, &nav_params); | 3926 FrameMsg_RequestNavigation::ID); |
| 3911 EXPECT_EQ(url1, nav_params.a.common_params.url); | 3927 ASSERT_TRUE(message != NULL); |
| 3928 Tuple2<CommonNavigationParams, RequestNavigationParams> nav_params; | |
| 3929 FrameMsg_RequestNavigation::Read(message, &nav_params); | |
| 3930 nav_url = nav_params.a.url; | |
| 3931 } else { | |
| 3932 const IPC::Message* message = | |
| 3933 process()->sink().GetFirstMessageMatching(FrameMsg_Navigate::ID); | |
| 3934 ASSERT_TRUE(message != NULL); | |
| 3935 Tuple1<FrameMsg_Navigate_Params> nav_params; | |
| 3936 FrameMsg_Navigate::Read(message, &nav_params); | |
| 3937 nav_url = nav_params.a.common_params.url; | |
| 3938 } | |
| 3939 EXPECT_EQ(url1, nav_url); | |
| 3912 process()->sink().ClearMessages(); | 3940 process()->sink().ClearMessages(); |
| 3913 | 3941 |
| 3914 // Now test history.forward() | 3942 // Now test history.forward() |
| 3915 contents()->OnGoToEntryAtOffset(2); | 3943 contents()->OnGoToEntryAtOffset(2); |
| 3916 EXPECT_EQ(2, controller.GetPendingEntryIndex()); | 3944 EXPECT_EQ(2, controller.GetPendingEntryIndex()); |
| 3917 // The actual cross-navigation is suspended until the current RVH tells us | 3945 // The actual cross-navigation is suspended until the current RVH tells us |
| 3918 // it unloaded, simulate that. | 3946 // it unloaded, simulate that. |
| 3919 contents()->ProceedWithCrossSiteNavigation(); | 3947 contents()->ProceedWithCrossSiteNavigation(); |
| 3920 message = process()->sink().GetFirstMessageMatching(FrameMsg_Navigate::ID); | 3948 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 3921 ASSERT_TRUE(message != NULL); | 3949 switches::kEnableBrowserSideNavigation)) { |
| 3922 FrameMsg_Navigate::Read(message, &nav_params); | 3950 const IPC::Message* message = process()->sink().GetFirstMessageMatching( |
| 3923 EXPECT_EQ(url3, nav_params.a.common_params.url); | 3951 FrameMsg_RequestNavigation::ID); |
| 3952 ASSERT_TRUE(message != NULL); | |
| 3953 Tuple2<CommonNavigationParams, RequestNavigationParams> nav_params; | |
| 3954 FrameMsg_RequestNavigation::Read(message, &nav_params); | |
| 3955 nav_url = nav_params.a.url; | |
| 3956 } else { | |
| 3957 const IPC::Message* message = | |
| 3958 process()->sink().GetFirstMessageMatching(FrameMsg_Navigate::ID); | |
| 3959 ASSERT_TRUE(message != NULL); | |
| 3960 Tuple1<FrameMsg_Navigate_Params> nav_params; | |
| 3961 FrameMsg_Navigate::Read(message, &nav_params); | |
| 3962 nav_url = nav_params.a.common_params.url; | |
| 3963 } | |
| 3964 EXPECT_EQ(url3, nav_url); | |
| 3924 process()->sink().ClearMessages(); | 3965 process()->sink().ClearMessages(); |
| 3925 | 3966 |
| 3926 controller.DiscardNonCommittedEntries(); | 3967 controller.DiscardNonCommittedEntries(); |
| 3927 | 3968 |
| 3928 // Make sure an extravagant history.go() doesn't break. | 3969 // Make sure an extravagant history.go() doesn't break. |
| 3929 contents()->OnGoToEntryAtOffset(120); // Out of bounds. | 3970 contents()->OnGoToEntryAtOffset(120); // Out of bounds. |
| 3930 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); | 3971 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); |
| 3931 message = process()->sink().GetFirstMessageMatching(FrameMsg_Navigate::ID); | 3972 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 3932 EXPECT_TRUE(message == NULL); | 3973 switches::kEnableBrowserSideNavigation)) { |
| 3974 const IPC::Message* message = process()->sink().GetFirstMessageMatching( | |
| 3975 FrameMsg_RequestNavigation::ID); | |
| 3976 EXPECT_TRUE(message == NULL); | |
| 3977 } else { | |
| 3978 const IPC::Message* message = | |
| 3979 process()->sink().GetFirstMessageMatching(FrameMsg_Navigate::ID); | |
| 3980 EXPECT_TRUE(message == NULL); | |
| 3981 } | |
| 3933 } | 3982 } |
| 3934 | 3983 |
| 3935 // Test call to PruneAllButLastCommitted for the only entry. | 3984 // Test call to PruneAllButLastCommitted for the only entry. |
| 3936 TEST_F(NavigationControllerTest, PruneAllButLastCommittedForSingle) { | 3985 TEST_F(NavigationControllerTest, PruneAllButLastCommittedForSingle) { |
| 3937 NavigationControllerImpl& controller = controller_impl(); | 3986 NavigationControllerImpl& controller = controller_impl(); |
| 3938 const GURL url1("http://foo1"); | 3987 const GURL url1("http://foo1"); |
| 3939 NavigateAndCommit(url1); | 3988 NavigateAndCommit(url1); |
| 3940 | 3989 |
| 3941 contents()->ExpectSetHistoryOffsetAndLength(0, 1); | 3990 contents()->ExpectSetHistoryOffsetAndLength(0, 1); |
| 3942 | 3991 |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4308 | 4357 |
| 4309 // Verify that the pending entry correctly indicates that the session history | 4358 // Verify that the pending entry correctly indicates that the session history |
| 4310 // should be cleared. | 4359 // should be cleared. |
| 4311 NavigationEntryImpl* entry = | 4360 NavigationEntryImpl* entry = |
| 4312 NavigationEntryImpl::FromNavigationEntry( | 4361 NavigationEntryImpl::FromNavigationEntry( |
| 4313 controller.GetPendingEntry()); | 4362 controller.GetPendingEntry()); |
| 4314 ASSERT_TRUE(entry); | 4363 ASSERT_TRUE(entry); |
| 4315 EXPECT_TRUE(entry->should_clear_history_list()); | 4364 EXPECT_TRUE(entry->should_clear_history_list()); |
| 4316 | 4365 |
| 4317 // Assume that the RF correctly cleared its history and commit the navigation. | 4366 // Assume that the RF correctly cleared its history and commit the navigation. |
| 4367 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | |
| 4368 switches::kEnableBrowserSideNavigation)) { | |
| 4369 contents()->GetMainFrame()->SimulateIOThread(entry->GetURL()); | |
| 4370 } | |
| 4318 contents()->GetPendingMainFrame()-> | 4371 contents()->GetPendingMainFrame()-> |
| 4319 set_simulate_history_list_was_cleared(true); | 4372 set_simulate_history_list_was_cleared(true); |
| 4320 contents()->CommitPendingNavigation(); | 4373 contents()->CommitPendingNavigation(); |
| 4321 | 4374 |
| 4322 // Verify that the NavigationController's session history was correctly | 4375 // Verify that the NavigationController's session history was correctly |
| 4323 // cleared. | 4376 // cleared. |
| 4324 EXPECT_EQ(1, controller.GetEntryCount()); | 4377 EXPECT_EQ(1, controller.GetEntryCount()); |
| 4325 EXPECT_EQ(0, controller.GetCurrentEntryIndex()); | 4378 EXPECT_EQ(0, controller.GetCurrentEntryIndex()); |
| 4326 EXPECT_EQ(0, controller.GetLastCommittedEntryIndex()); | 4379 EXPECT_EQ(0, controller.GetLastCommittedEntryIndex()); |
| 4327 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); | 4380 EXPECT_EQ(-1, controller.GetPendingEntryIndex()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4360 params.post_id = -1; | 4413 params.post_id = -1; |
| 4361 contents()->GetMainFrame()->SendNavigateWithParams(¶ms); | 4414 contents()->GetMainFrame()->SendNavigateWithParams(¶ms); |
| 4362 | 4415 |
| 4363 // Now reload. replaceState overrides the POST, so we should not show a | 4416 // Now reload. replaceState overrides the POST, so we should not show a |
| 4364 // repost warning dialog. | 4417 // repost warning dialog. |
| 4365 controller_impl().Reload(true); | 4418 controller_impl().Reload(true); |
| 4366 EXPECT_EQ(0, delegate->repost_form_warning_count()); | 4419 EXPECT_EQ(0, delegate->repost_form_warning_count()); |
| 4367 } | 4420 } |
| 4368 | 4421 |
| 4369 } // namespace content | 4422 } // namespace content |
| OLD | NEW |