Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/command_line.h" | 5 #include "base/command_line.h" |
| 6 #include "base/logging.h" | 6 #include "base/logging.h" |
| 7 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
| 8 #include "content/browser/frame_host/cross_site_transferring_request.h" | 8 #include "content/browser/frame_host/cross_site_transferring_request.h" |
| 9 #include "content/browser/frame_host/interstitial_page_impl.h" | 9 #include "content/browser/frame_host/interstitial_page_impl.h" |
| 10 #include "content/browser/frame_host/navigation_entry_impl.h" | 10 #include "content/browser/frame_host/navigation_entry_impl.h" |
| (...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 482 // Navigate to URL. First URL should use first RenderViewHost. | 482 // Navigate to URL. First URL should use first RenderViewHost. |
| 483 const GURL url("http://www.google.com"); | 483 const GURL url("http://www.google.com"); |
| 484 controller().LoadURL( | 484 controller().LoadURL( |
| 485 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 485 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 486 orig_rfh->PrepareForCommit(url); | 486 orig_rfh->PrepareForCommit(url); |
| 487 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 487 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); |
| 488 | 488 |
| 489 // Keep the number of active frames in orig_rfh's SiteInstance non-zero so | 489 // Keep the number of active frames in orig_rfh's SiteInstance non-zero so |
| 490 // that orig_rfh doesn't get deleted when it gets swapped out. | 490 // that orig_rfh doesn't get deleted when it gets swapped out. |
| 491 orig_rfh->GetSiteInstance()->increment_active_frame_count(); | 491 orig_rfh->GetSiteInstance()->increment_active_frame_count(); |
| 492 orig_rfh->SendBeforeUnloadHandlersPresent(true); | |
| 492 | 493 |
| 493 EXPECT_FALSE(contents()->cross_navigation_pending()); | 494 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 494 EXPECT_EQ(orig_rfh->GetRenderViewHost(), contents()->GetRenderViewHost()); | 495 EXPECT_EQ(orig_rfh->GetRenderViewHost(), contents()->GetRenderViewHost()); |
| 495 EXPECT_EQ(url, contents()->GetLastCommittedURL()); | 496 EXPECT_EQ(url, contents()->GetLastCommittedURL()); |
| 496 EXPECT_EQ(url, contents()->GetVisibleURL()); | 497 EXPECT_EQ(url, contents()->GetVisibleURL()); |
| 497 | 498 |
| 498 // Navigate to new site | 499 // Navigate to new site |
| 499 const GURL url2("http://www.yahoo.com"); | 500 const GURL url2("http://www.yahoo.com"); |
| 500 controller().LoadURL( | 501 controller().LoadURL( |
| 501 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 502 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 521 | 522 |
| 522 // DidNavigate from the pending page | 523 // DidNavigate from the pending page |
| 523 contents()->TestDidNavigate( | 524 contents()->TestDidNavigate( |
| 524 pending_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED); | 525 pending_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED); |
| 525 SiteInstance* instance2 = contents()->GetSiteInstance(); | 526 SiteInstance* instance2 = contents()->GetSiteInstance(); |
| 526 | 527 |
| 527 // Keep the number of active frames in pending_rfh's SiteInstance | 528 // Keep the number of active frames in pending_rfh's SiteInstance |
| 528 // non-zero so that orig_rfh doesn't get deleted when it gets | 529 // non-zero so that orig_rfh doesn't get deleted when it gets |
| 529 // swapped out. | 530 // swapped out. |
| 530 pending_rfh->GetSiteInstance()->increment_active_frame_count(); | 531 pending_rfh->GetSiteInstance()->increment_active_frame_count(); |
| 532 pending_rfh->SendBeforeUnloadHandlersPresent(true); | |
| 531 | 533 |
| 532 EXPECT_FALSE(contents()->cross_navigation_pending()); | 534 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 533 EXPECT_EQ(pending_rfh, contents()->GetMainFrame()); | 535 EXPECT_EQ(pending_rfh, contents()->GetMainFrame()); |
| 534 EXPECT_EQ(url2, contents()->GetLastCommittedURL()); | 536 EXPECT_EQ(url2, contents()->GetLastCommittedURL()); |
| 535 EXPECT_EQ(url2, contents()->GetVisibleURL()); | 537 EXPECT_EQ(url2, contents()->GetVisibleURL()); |
| 536 EXPECT_NE(instance1, instance2); | 538 EXPECT_NE(instance1, instance2); |
| 537 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL); | 539 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL); |
| 538 // We keep the original RFH around, swapped out. | 540 // We keep the original RFH around, swapped out. |
| 539 EXPECT_TRUE(contents()->GetRenderManagerForTesting()->IsOnSwappedOutList( | 541 EXPECT_TRUE(contents()->GetRenderManagerForTesting()->IsOnSwappedOutList( |
| 540 orig_rfh)); | 542 orig_rfh)); |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 724 EXPECT_FALSE(contents()->cross_navigation_pending()); | 726 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 725 EXPECT_EQ(native_url, contents()->GetLastCommittedURL()); | 727 EXPECT_EQ(native_url, contents()->GetLastCommittedURL()); |
| 726 EXPECT_EQ(url, contents()->GetVisibleURL()); | 728 EXPECT_EQ(url, contents()->GetVisibleURL()); |
| 727 EXPECT_FALSE(contents()->GetPendingMainFrame()); | 729 EXPECT_FALSE(contents()->GetPendingMainFrame()); |
| 728 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 730 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); |
| 729 | 731 |
| 730 // Keep the number of active frames in orig_rfh's SiteInstance | 732 // Keep the number of active frames in orig_rfh's SiteInstance |
| 731 // non-zero so that orig_rfh doesn't get deleted when it gets | 733 // non-zero so that orig_rfh doesn't get deleted when it gets |
| 732 // swapped out. | 734 // swapped out. |
| 733 orig_rfh->GetSiteInstance()->increment_active_frame_count(); | 735 orig_rfh->GetSiteInstance()->increment_active_frame_count(); |
| 736 orig_rfh->SendBeforeUnloadHandlersPresent(true); | |
| 734 | 737 |
| 735 EXPECT_EQ(orig_instance, contents()->GetSiteInstance()); | 738 EXPECT_EQ(orig_instance, contents()->GetSiteInstance()); |
| 736 EXPECT_TRUE( | 739 EXPECT_TRUE( |
| 737 contents()->GetSiteInstance()->GetSiteURL().DomainIs("google.com")); | 740 contents()->GetSiteInstance()->GetSiteURL().DomainIs("google.com")); |
| 738 EXPECT_EQ(url, contents()->GetLastCommittedURL()); | 741 EXPECT_EQ(url, contents()->GetLastCommittedURL()); |
| 739 | 742 |
| 740 // Navigate to another new site (should create a new site instance). | 743 // Navigate to another new site (should create a new site instance). |
| 741 const GURL url2("http://www.yahoo.com"); | 744 const GURL url2("http://www.yahoo.com"); |
| 742 controller().LoadURL( | 745 controller().LoadURL( |
| 743 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 746 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 948 url3, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 951 url3, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 949 EXPECT_FALSE(contents()->cross_navigation_pending()); | 952 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 950 contents()->GetMainFrame()->PrepareForCommit(url3); | 953 contents()->GetMainFrame()->PrepareForCommit(url3); |
| 951 contents()->TestDidNavigate( | 954 contents()->TestDidNavigate( |
| 952 orig_rfh, 3, url3, ui::PAGE_TRANSITION_TYPED); | 955 orig_rfh, 3, url3, ui::PAGE_TRANSITION_TYPED); |
| 953 SiteInstance* instance4 = contents()->GetSiteInstance(); | 956 SiteInstance* instance4 = contents()->GetSiteInstance(); |
| 954 EXPECT_EQ(instance1, instance4); | 957 EXPECT_EQ(instance1, instance4); |
| 955 } | 958 } |
| 956 | 959 |
| 957 // Test that the onbeforeunload and onunload handlers run when navigating | 960 // Test that the onbeforeunload and onunload handlers run when navigating |
| 958 // across site boundaries. | 961 // across site boundaries if needed. |
| 959 TEST_F(WebContentsImplTest, CrossSiteUnloadHandlers) { | 962 TEST_F(WebContentsImplTest, CrossSiteUnloadHandlers) { |
| 960 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 963 TestRenderFrameHost* rfh1 = contents()->GetMainFrame(); |
| 961 SiteInstance* instance1 = contents()->GetSiteInstance(); | 964 SiteInstance* instance1 = contents()->GetSiteInstance(); |
| 962 | 965 |
| 963 // Navigate to URL. First URL should use first RenderViewHost. | 966 // Navigate to URL. First URL should use first RenderViewHost. |
| 964 const GURL url("http://www.google.com"); | 967 const GURL url("http://www.google.com"); |
| 965 controller().LoadURL( | 968 controller().LoadURL( |
| 966 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 969 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 967 contents()->GetMainFrame()->PrepareForCommit(url); | 970 contents()->GetMainFrame()->PrepareForCommit(url); |
| 968 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 971 contents()->TestDidNavigate(rfh1, 1, url, ui::PAGE_TRANSITION_TYPED); |
| 969 EXPECT_FALSE(contents()->cross_navigation_pending()); | 972 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 970 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 973 EXPECT_EQ(rfh1, contents()->GetMainFrame()); |
| 974 rfh1->SendBeforeUnloadHandlersPresent(true); | |
| 971 | 975 |
| 972 // Navigate to new site, but simulate an onbeforeunload denial. | 976 // Navigate to new site, but simulate an onbeforeunload denial. |
| 973 const GURL url2("http://www.yahoo.com"); | 977 const GURL url2("http://www.yahoo.com"); |
| 974 controller().LoadURL( | 978 controller().LoadURL( |
| 975 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 979 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 976 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 980 EXPECT_TRUE(rfh1->IsWaitingForBeforeUnloadACK()); |
| 977 base::TimeTicks now = base::TimeTicks::Now(); | 981 base::TimeTicks now = base::TimeTicks::Now(); |
| 978 orig_rfh->OnMessageReceived( | 982 rfh1->OnMessageReceived( |
| 979 FrameHostMsg_BeforeUnload_ACK(0, false, now, now)); | 983 FrameHostMsg_BeforeUnload_ACK(0, false, now, now)); |
| 980 EXPECT_FALSE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 984 EXPECT_FALSE(rfh1->IsWaitingForBeforeUnloadACK()); |
| 981 EXPECT_FALSE(contents()->cross_navigation_pending()); | 985 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 982 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 986 EXPECT_EQ(rfh1, contents()->GetMainFrame()); |
| 983 | 987 |
| 984 // Navigate again, but simulate an onbeforeunload approval. | 988 // Navigate again, but simulate an onbeforeunload approval. |
| 985 controller().LoadURL( | 989 controller().LoadURL( |
| 986 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 990 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 987 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 991 EXPECT_TRUE(rfh1->IsWaitingForBeforeUnloadACK()); |
| 988 now = base::TimeTicks::Now(); | 992 now = base::TimeTicks::Now(); |
| 989 orig_rfh->PrepareForCommit(url2); | 993 rfh1->PrepareForCommit(url2); |
| 990 EXPECT_FALSE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 994 EXPECT_FALSE(rfh1->IsWaitingForBeforeUnloadACK()); |
| 991 EXPECT_TRUE(contents()->cross_navigation_pending()); | 995 EXPECT_TRUE(contents()->cross_navigation_pending()); |
| 992 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); | 996 TestRenderFrameHost* rfh2 = contents()->GetPendingMainFrame(); |
| 993 | |
| 994 // We won't hear DidNavigate until the onunload handler has finished running. | |
| 995 | 997 |
| 996 // DidNavigate from the pending page. | 998 // DidNavigate from the pending page. |
| 997 contents()->TestDidNavigate( | 999 contents()->TestDidNavigate( |
| 998 pending_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED); | 1000 rfh2, 1, url2, ui::PAGE_TRANSITION_TYPED); |
| 999 SiteInstance* instance2 = contents()->GetSiteInstance(); | 1001 SiteInstance* instance2 = contents()->GetSiteInstance(); |
| 1000 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1002 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 1001 EXPECT_EQ(pending_rfh, contents()->GetMainFrame()); | 1003 EXPECT_EQ(rfh2, contents()->GetMainFrame()); |
| 1002 EXPECT_NE(instance1, instance2); | 1004 EXPECT_NE(instance1, instance2); |
| 1003 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL); | 1005 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL); |
| 1006 | |
|
carlosk
2015/02/17 12:52:09
Suggestion: split it here into a new test.
clamy
2015/02/18 13:27:23
I think it makes sense for it to be in this test,
| |
| 1007 // Now navigate to a new site. There is no beforeUnload handlers, so we should | |
|
Charlie Reis
2015/02/17 23:04:31
nit: There are
clamy
2015/02/18 13:27:23
Done.
| |
| 1008 // not be waiting for a BeforeUnloadACK. | |
| 1009 const GURL url3("http://www.chromium.org"); | |
| 1010 rfh2->GetSiteInstance()->increment_active_frame_count(); | |
| 1011 controller().LoadURL( | |
| 1012 url3, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | |
| 1013 EXPECT_FALSE(rfh2->IsWaitingForBeforeUnloadACK()); | |
| 1014 rfh2->PrepareForCommit(url3); | |
| 1015 EXPECT_TRUE(contents()->cross_navigation_pending()); | |
| 1016 TestRenderFrameHost* rfh3 = contents()->GetPendingMainFrame(); | |
| 1017 | |
| 1018 // DidNavigate from the pending page. | |
| 1019 contents()->TestDidNavigate( | |
| 1020 rfh3, 1, url3, ui::PAGE_TRANSITION_TYPED); | |
| 1021 SiteInstance* instance3 = contents()->GetSiteInstance(); | |
| 1022 EXPECT_FALSE(contents()->cross_navigation_pending()); | |
| 1023 EXPECT_EQ(rfh3, contents()->GetMainFrame()); | |
| 1024 EXPECT_NE(instance2, instance3); | |
| 1025 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL); | |
| 1004 } | 1026 } |
| 1005 | 1027 |
| 1006 // Test that during a slow cross-site navigation, the original renderer can | 1028 // Test that during a slow cross-site navigation, the original renderer can |
| 1007 // navigate to a different URL and have it displayed, canceling the slow | 1029 // navigate to a different URL and have it displayed, canceling the slow |
| 1008 // navigation. | 1030 // navigation. |
| 1009 TEST_F(WebContentsImplTest, CrossSiteNavigationPreempted) { | 1031 TEST_F(WebContentsImplTest, CrossSiteNavigationPreempted) { |
| 1010 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 1032 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
| 1011 SiteInstance* instance1 = contents()->GetSiteInstance(); | 1033 SiteInstance* instance1 = contents()->GetSiteInstance(); |
| 1012 | 1034 |
| 1013 // Navigate to URL. First URL should use first RenderFrameHost. | 1035 // Navigate to URL. First URL should use first RenderFrameHost. |
| 1014 const GURL url("http://www.google.com"); | 1036 const GURL url("http://www.google.com"); |
| 1015 controller().LoadURL( | 1037 controller().LoadURL( |
| 1016 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1038 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1017 contents()->GetMainFrame()->PrepareForCommit(url); | 1039 contents()->GetMainFrame()->PrepareForCommit(url); |
| 1018 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 1040 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); |
| 1019 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1041 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 1020 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 1042 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
| 1043 orig_rfh->SendBeforeUnloadHandlersPresent(true); | |
| 1021 | 1044 |
| 1022 // Navigate to new site, simulating an onbeforeunload approval. | 1045 // Navigate to new site, simulating an onbeforeunload approval. |
| 1023 const GURL url2("http://www.yahoo.com"); | 1046 const GURL url2("http://www.yahoo.com"); |
| 1024 controller().LoadURL( | 1047 controller().LoadURL( |
| 1025 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1048 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1026 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 1049 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); |
| 1027 orig_rfh->PrepareForCommit(url2); | 1050 orig_rfh->PrepareForCommit(url2); |
| 1028 EXPECT_TRUE(contents()->cross_navigation_pending()); | 1051 EXPECT_TRUE(contents()->cross_navigation_pending()); |
| 1029 | 1052 |
| 1030 // Suppose the original renderer navigates before the new one is ready. | 1053 // Suppose the original renderer navigates before the new one is ready. |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 1050 NavigationEntry* entry1 = controller().GetLastCommittedEntry(); | 1073 NavigationEntry* entry1 = controller().GetLastCommittedEntry(); |
| 1051 SiteInstance* instance1 = contents()->GetSiteInstance(); | 1074 SiteInstance* instance1 = contents()->GetSiteInstance(); |
| 1052 | 1075 |
| 1053 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1076 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 1054 EXPECT_EQ(ntp_rfh, contents()->GetMainFrame()); | 1077 EXPECT_EQ(ntp_rfh, contents()->GetMainFrame()); |
| 1055 EXPECT_EQ(url1, entry1->GetURL()); | 1078 EXPECT_EQ(url1, entry1->GetURL()); |
| 1056 EXPECT_EQ(instance1, | 1079 EXPECT_EQ(instance1, |
| 1057 NavigationEntryImpl::FromNavigationEntry(entry1)->site_instance()); | 1080 NavigationEntryImpl::FromNavigationEntry(entry1)->site_instance()); |
| 1058 EXPECT_TRUE(ntp_rfh->GetRenderViewHost()->GetEnabledBindings() & | 1081 EXPECT_TRUE(ntp_rfh->GetRenderViewHost()->GetEnabledBindings() & |
| 1059 BINDINGS_POLICY_WEB_UI); | 1082 BINDINGS_POLICY_WEB_UI); |
| 1083 ntp_rfh->SendBeforeUnloadHandlersPresent(true); | |
| 1060 | 1084 |
| 1061 // Navigate to new site. | 1085 // Navigate to new site. |
| 1062 const GURL url2("http://www.google.com"); | 1086 const GURL url2("http://www.google.com"); |
| 1063 controller().LoadURL( | 1087 controller().LoadURL( |
| 1064 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1088 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1065 EXPECT_TRUE(contents()->cross_navigation_pending()); | 1089 EXPECT_TRUE(contents()->cross_navigation_pending()); |
| 1066 TestRenderFrameHost* google_rfh = contents()->GetPendingMainFrame(); | 1090 TestRenderFrameHost* google_rfh = contents()->GetPendingMainFrame(); |
| 1067 | 1091 |
| 1068 // Simulate beforeunload approval. | 1092 // Simulate beforeunload approval. |
| 1069 EXPECT_TRUE(ntp_rfh->IsWaitingForBeforeUnloadACK()); | 1093 EXPECT_TRUE(ntp_rfh->IsWaitingForBeforeUnloadACK()); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 1097 NavigationEntry* entry3 = controller().GetLastCommittedEntry(); | 1121 NavigationEntry* entry3 = controller().GetLastCommittedEntry(); |
| 1098 SiteInstance* instance3 = contents()->GetSiteInstance(); | 1122 SiteInstance* instance3 = contents()->GetSiteInstance(); |
| 1099 | 1123 |
| 1100 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1124 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 1101 EXPECT_EQ(google_rfh, contents()->GetMainFrame()); | 1125 EXPECT_EQ(google_rfh, contents()->GetMainFrame()); |
| 1102 EXPECT_EQ(instance2, instance3); | 1126 EXPECT_EQ(instance2, instance3); |
| 1103 EXPECT_FALSE(contents()->GetPendingMainFrame()); | 1127 EXPECT_FALSE(contents()->GetPendingMainFrame()); |
| 1104 EXPECT_EQ(url3, entry3->GetURL()); | 1128 EXPECT_EQ(url3, entry3->GetURL()); |
| 1105 EXPECT_EQ(instance3, | 1129 EXPECT_EQ(instance3, |
| 1106 NavigationEntryImpl::FromNavigationEntry(entry3)->site_instance()); | 1130 NavigationEntryImpl::FromNavigationEntry(entry3)->site_instance()); |
| 1131 google_rfh->SendBeforeUnloadHandlersPresent(true); | |
| 1107 | 1132 |
| 1108 // Go back within the site. | 1133 // Go back within the site. |
| 1109 controller().GoBack(); | 1134 controller().GoBack(); |
| 1110 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1135 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 1111 EXPECT_EQ(entry2, controller().GetPendingEntry()); | 1136 EXPECT_EQ(entry2, controller().GetPendingEntry()); |
| 1112 | 1137 |
| 1113 // Before that commits, go back again. | 1138 // Before that commits, go back again. |
| 1114 controller().GoBack(); | 1139 controller().GoBack(); |
| 1115 EXPECT_TRUE(contents()->cross_navigation_pending()); | 1140 EXPECT_TRUE(contents()->cross_navigation_pending()); |
| 1116 EXPECT_TRUE(contents()->GetPendingMainFrame()); | 1141 EXPECT_TRUE(contents()->GetPendingMainFrame()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1148 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 1173 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
| 1149 | 1174 |
| 1150 // Navigate to URL. First URL should use the original RenderFrameHost. | 1175 // Navigate to URL. First URL should use the original RenderFrameHost. |
| 1151 const GURL url("http://www.google.com"); | 1176 const GURL url("http://www.google.com"); |
| 1152 controller().LoadURL( | 1177 controller().LoadURL( |
| 1153 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1178 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1154 contents()->GetMainFrame()->PrepareForCommit(url); | 1179 contents()->GetMainFrame()->PrepareForCommit(url); |
| 1155 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 1180 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); |
| 1156 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1181 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 1157 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 1182 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
| 1183 orig_rfh->SendBeforeUnloadHandlersPresent(true); | |
| 1158 | 1184 |
| 1159 // Start navigating to new site. | 1185 // Start navigating to new site. |
| 1160 const GURL url2("http://www.yahoo.com"); | 1186 const GURL url2("http://www.yahoo.com"); |
| 1161 controller().LoadURL( | 1187 controller().LoadURL( |
| 1162 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1188 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1163 | 1189 |
| 1164 // Simulate a sub-frame navigation arriving and ensure the RVH is still | 1190 // Simulate a sub-frame navigation arriving and ensure the RVH is still |
| 1165 // waiting for a before unload response. | 1191 // waiting for a before unload response. |
| 1166 TestRenderFrameHost* child_rfh = orig_rfh->AppendChild("subframe"); | 1192 TestRenderFrameHost* child_rfh = orig_rfh->AppendChild("subframe"); |
| 1167 child_rfh->SendNavigateWithTransition( | 1193 child_rfh->SendNavigateWithTransition( |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1178 // Test that a cross-site navigation is not preempted if the previous | 1204 // Test that a cross-site navigation is not preempted if the previous |
| 1179 // renderer sends a FrameNavigate message just before being told to stop. | 1205 // renderer sends a FrameNavigate message just before being told to stop. |
| 1180 // We should only preempt the cross-site navigation if the previous renderer | 1206 // We should only preempt the cross-site navigation if the previous renderer |
| 1181 // has started a new navigation. See http://crbug.com/79176. | 1207 // has started a new navigation. See http://crbug.com/79176. |
| 1182 TEST_F(WebContentsImplTest, CrossSiteNotPreemptedDuringBeforeUnload) { | 1208 TEST_F(WebContentsImplTest, CrossSiteNotPreemptedDuringBeforeUnload) { |
| 1183 // Navigate to NTP URL. | 1209 // Navigate to NTP URL. |
| 1184 const GURL url("chrome://blah"); | 1210 const GURL url("chrome://blah"); |
| 1185 controller().LoadURL( | 1211 controller().LoadURL( |
| 1186 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1212 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1187 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); | 1213 TestRenderFrameHost* orig_rfh = contents()->GetMainFrame(); |
| 1214 orig_rfh->SendBeforeUnloadHandlersPresent(true); | |
| 1188 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1215 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 1189 | 1216 |
| 1190 // Navigate to new site, with the beforeunload request in flight. | 1217 // Navigate to new site, with the beforeunload request in flight. |
| 1191 const GURL url2("http://www.yahoo.com"); | 1218 const GURL url2("http://www.yahoo.com"); |
| 1192 controller().LoadURL( | 1219 controller().LoadURL( |
| 1193 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1220 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1194 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); | 1221 TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); |
| 1195 EXPECT_TRUE(contents()->cross_navigation_pending()); | 1222 EXPECT_TRUE(contents()->cross_navigation_pending()); |
| 1196 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 1223 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); |
| 1197 | 1224 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 1216 SiteInstance* instance1 = contents()->GetSiteInstance(); | 1243 SiteInstance* instance1 = contents()->GetSiteInstance(); |
| 1217 | 1244 |
| 1218 // Navigate to URL. First URL should use original RenderFrameHost. | 1245 // Navigate to URL. First URL should use original RenderFrameHost. |
| 1219 const GURL url("http://www.google.com"); | 1246 const GURL url("http://www.google.com"); |
| 1220 controller().LoadURL( | 1247 controller().LoadURL( |
| 1221 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1248 url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1222 contents()->GetMainFrame()->PrepareForCommit(url); | 1249 contents()->GetMainFrame()->PrepareForCommit(url); |
| 1223 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); | 1250 contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED); |
| 1224 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1251 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 1225 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); | 1252 EXPECT_EQ(orig_rfh, contents()->GetMainFrame()); |
| 1253 orig_rfh->SendBeforeUnloadHandlersPresent(true); | |
| 1226 | 1254 |
| 1227 // Navigate to new site, simulating an onbeforeunload approval. | 1255 // Navigate to new site, simulating an onbeforeunload approval. |
| 1228 const GURL url2("http://www.yahoo.com"); | 1256 const GURL url2("http://www.yahoo.com"); |
| 1229 controller().LoadURL( | 1257 controller().LoadURL( |
| 1230 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); | 1258 url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string()); |
| 1231 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); | 1259 EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK()); |
| 1232 contents()->GetMainFrame()->PrepareForCommit(url2); | 1260 contents()->GetMainFrame()->PrepareForCommit(url2); |
| 1233 EXPECT_TRUE(contents()->cross_navigation_pending()); | 1261 EXPECT_TRUE(contents()->cross_navigation_pending()); |
| 1234 | 1262 |
| 1235 // Simulate swap out message when the response arrives. | 1263 // Simulate swap out message when the response arrives. |
| (...skipping 1802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3038 frame->SendBeforeUnloadHandlersPresent(false); | 3066 frame->SendBeforeUnloadHandlersPresent(false); |
| 3039 EXPECT_FALSE(frame->SuddenTerminationAllowed()); | 3067 EXPECT_FALSE(frame->SuddenTerminationAllowed()); |
| 3040 frame->SendBeforeUnloadHandlersPresent(true); | 3068 frame->SendBeforeUnloadHandlersPresent(true); |
| 3041 frame->SendUnloadHandlersPresent(false); | 3069 frame->SendUnloadHandlersPresent(false); |
| 3042 EXPECT_FALSE(frame->SuddenTerminationAllowed()); | 3070 EXPECT_FALSE(frame->SuddenTerminationAllowed()); |
| 3043 frame->SendBeforeUnloadHandlersPresent(false); | 3071 frame->SendBeforeUnloadHandlersPresent(false); |
| 3044 EXPECT_TRUE(frame->SuddenTerminationAllowed()); | 3072 EXPECT_TRUE(frame->SuddenTerminationAllowed()); |
| 3045 } | 3073 } |
| 3046 | 3074 |
| 3047 } // namespace content | 3075 } // namespace content |
| OLD | NEW |