Avi Drissman | 4e1b7bc3 | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2014 The Chromium Authors |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
danakj | c492bf8 | 2020-09-09 20:02:44 | [diff] [blame] | 5 | #include "content/browser/renderer_host/navigator.h" |
arthursonzogni | a275452 | 2019-07-03 18:25:36 | [diff] [blame] | 6 | |
avi | b734894 | 2015-12-25 20:57:10 | [diff] [blame] | 7 | #include <stdint.h> |
| 8 | |
toyoshim | 7ae0fd5 | 2016-07-08 09:29:50 | [diff] [blame] | 9 | #include "base/feature_list.h" |
Todd Sahl | b2f79830 | 2021-01-21 16:32:07 | [diff] [blame] | 10 | #include "base/test/test_simple_task_runner.h" |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 11 | #include "base/time/time.h" |
avi | b734894 | 2015-12-25 20:57:10 | [diff] [blame] | 12 | #include "build/build_config.h" |
danakj | c492bf8 | 2020-09-09 20:02:44 | [diff] [blame] | 13 | #include "content/browser/renderer_host/navigation_controller_impl.h" |
| 14 | #include "content/browser/renderer_host/navigation_entry_impl.h" |
| 15 | #include "content/browser/renderer_host/navigation_request.h" |
| 16 | #include "content/browser/renderer_host/navigation_request_info.h" |
danakj | c492bf8 | 2020-09-09 20:02:44 | [diff] [blame] | 17 | #include "content/browser/renderer_host/render_frame_host_manager.h" |
Sharon Yang | d70a539 | 2021-10-26 23:06:32 | [diff] [blame] | 18 | #include "content/browser/site_info.h" |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 19 | #include "content/browser/site_instance_impl.h" |
[email protected] | ee8ae33 | 2020-01-29 03:49:45 | [diff] [blame] | 20 | #include "content/common/content_navigation_policy.h" |
Ken Rockot | 4878545 | 2017-10-25 19:33:14 | [diff] [blame] | 21 | #include "content/common/frame.mojom.h" |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 22 | #include "content/public/browser/child_process_security_policy.h" |
toyoshim | 7ae0fd5 | 2016-07-08 09:29:50 | [diff] [blame] | 23 | #include "content/public/common/content_features.h" |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 24 | #include "content/public/common/url_constants.h" |
| 25 | #include "content/public/common/url_utils.h" |
Dominique Fauteux-Chapleau | 3e8d345 | 2021-07-14 17:20:02 | [diff] [blame] | 26 | #include "content/public/test/back_forward_cache_util.h" |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 27 | #include "content/public/test/mock_render_process_host.h" |
arthursonzogni | 63aa3f37 | 2017-08-09 14:28:39 | [diff] [blame] | 28 | #include "content/public/test/navigation_simulator.h" |
Todd Sahl | b2f79830 | 2021-01-21 16:32:07 | [diff] [blame] | 29 | #include "content/public/test/test_navigation_throttle_inserter.h" |
carlosk | 15fb0f0 | 2015-07-29 17:07:51 | [diff] [blame] | 30 | #include "content/public/test/test_utils.h" |
Arthur Hemery | 4aa413c4 | 2019-01-14 18:53:30 | [diff] [blame] | 31 | #include "content/test/navigation_simulator_impl.h" |
Todd Sahl | b2f79830 | 2021-01-21 16:32:07 | [diff] [blame] | 32 | #include "content/test/task_runner_deferring_throttle.h" |
clamy | 72c7279 | 2014-11-18 18:09:46 | [diff] [blame] | 33 | #include "content/test/test_navigation_url_loader.h" |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 34 | #include "content/test/test_render_frame_host.h" |
| 35 | #include "content/test/test_web_contents.h" |
| 36 | #include "net/base/load_flags.h" |
davidben | 8b33913 | 2014-10-08 02:27:01 | [diff] [blame] | 37 | #include "net/http/http_response_headers.h" |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 38 | #include "net/url_request/redirect_info.h" |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 39 | #include "ui/base/page_transition_types.h" |
davidben | 61814fd | 2014-10-15 19:45:07 | [diff] [blame] | 40 | #include "url/url_constants.h" |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 41 | |
| 42 | namespace content { |
| 43 | |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 44 | namespace { |
| 45 | |
| 46 | // Helper function that determines if a test should expect a cross-site |
| 47 | // navigation to trigger a SiteInstance change based on the current process |
| 48 | // model. |
| 49 | bool ExpectSiteInstanceChange(SiteInstanceImpl* site_instance) { |
| 50 | return AreAllSitesIsolatedForTesting() || |
| 51 | CanCrossSiteNavigationsProactivelySwapBrowsingInstances() || |
| 52 | !site_instance->IsDefaultSiteInstance(); |
| 53 | } |
| 54 | |
Dominique Fauteux-Chapleau | 3e8d345 | 2021-07-14 17:20:02 | [diff] [blame] | 55 | // Same as above but does not return true if back/forward cache is the only |
| 56 | // trigger for SiteInstance change. This function is useful if, e.g. the test |
| 57 | // intends to disable back/forward cache. |
| 58 | bool ExpectSiteInstanceChangeWithoutBackForwardCache( |
| 59 | SiteInstanceImpl* site_instance) { |
| 60 | return AreAllSitesIsolatedForTesting() || |
Dominique Fauteux-Chapleau | 3e8d345 | 2021-07-14 17:20:02 | [diff] [blame] | 61 | !site_instance->IsDefaultSiteInstance(); |
| 62 | } |
| 63 | |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 64 | } // namespace |
| 65 | |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 66 | class NavigatorTest : public RenderViewHostImplTestHarness { |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 67 | public: |
nick | d5bbd0b | 2016-03-31 19:52:44 | [diff] [blame] | 68 | using SiteInstanceDescriptor = RenderFrameHostManager::SiteInstanceDescriptor; |
| 69 | using SiteInstanceRelation = RenderFrameHostManager::SiteInstanceRelation; |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 70 | |
Aran Gilman | 37d1163 | 2019-10-08 23:07:15 | [diff] [blame] | 71 | void SetUp() override { RenderViewHostImplTestHarness::SetUp(); } |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 72 | |
Aran Gilman | 37d1163 | 2019-10-08 23:07:15 | [diff] [blame] | 73 | void TearDown() override { RenderViewHostImplTestHarness::TearDown(); } |
kenrb | 99afb08 | 2015-06-02 13:35:58 | [diff] [blame] | 74 | |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 75 | TestNavigationURLLoader* GetLoaderForNavigationRequest( |
| 76 | NavigationRequest* request) const { |
| 77 | return static_cast<TestNavigationURLLoader*>(request->loader_for_testing()); |
| 78 | } |
| 79 | |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 80 | TestRenderFrameHost* GetSpeculativeRenderFrameHost(FrameTreeNode* node) { |
| 81 | return static_cast<TestRenderFrameHost*>( |
| 82 | node->render_manager()->speculative_render_frame_host_.get()); |
| 83 | } |
| 84 | |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 85 | scoped_refptr<SiteInstanceImpl> ConvertToSiteInstance( |
dcheng | bccd6b8 | 2016-03-30 16:24:19 | [diff] [blame] | 86 | RenderFrameHostManager* rfhm, |
| 87 | const SiteInstanceDescriptor& descriptor, |
| 88 | SiteInstance* candidate_instance) { |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 89 | return static_cast<SiteInstanceImpl*>( |
| 90 | rfhm->ConvertToSiteInstance( |
Arthur Hemery | 3a991c09 | 2021-12-22 12:04:24 | [diff] [blame] | 91 | descriptor, static_cast<SiteInstanceImpl*>(candidate_instance)) |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 92 | .get()); |
| 93 | } |
| 94 | |
| 95 | SiteInfo CreateExpectedSiteInfo(const GURL& url) { |
| 96 | return SiteInfo::CreateForTesting(IsolationContext(browser_context()), url); |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 97 | } |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 98 | }; |
| 99 | |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 100 | // Tests a complete browser-initiated navigation starting with a non-live |
| 101 | // renderer. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 102 | TEST_F(NavigatorTest, SimpleBrowserInitiatedNavigationFromNonLiveRenderer) { |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 103 | const GURL kUrl("http://chromium.org/"); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 104 | |
| 105 | EXPECT_FALSE(main_test_rfh()->IsRenderFrameLive()); |
| 106 | |
| 107 | // Start a browser-initiated navigation. |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 108 | auto navigation = |
| 109 | NavigationSimulator::CreateBrowserInitiated(kUrl, contents()); |
Lukasz Anforowicz | 1de0a22 | 2021-07-26 22:02:32 | [diff] [blame] | 110 | auto site_instance_id = main_test_rfh()->GetSiteInstance()->GetId(); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 111 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 112 | navigation->Start(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 113 | NavigationRequest* request = node->navigation_request(); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 114 | ASSERT_TRUE(request); |
| 115 | EXPECT_EQ(kUrl, request->common_params().url); |
| 116 | EXPECT_TRUE(request->browser_initiated()); |
| 117 | |
| 118 | // As there's no live renderer the navigation should not wait for a |
Antonio Gomes | 8678a20 | 2020-03-02 20:03:25 | [diff] [blame] | 119 | // beforeUnload completion callback being invoked by the renderer and |
| 120 | // start right away. |
Mohamed Abdelhalim | ccd149af | 2019-10-31 14:48:53 | [diff] [blame] | 121 | EXPECT_EQ(NavigationRequest::WILL_START_REQUEST, request->state()); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 122 | ASSERT_TRUE(GetLoaderForNavigationRequest(request)); |
| 123 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 124 | |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 125 | navigation->ReadyToCommit(); |
clamy | efdb7a4 | 2015-07-01 16:55:47 | [diff] [blame] | 126 | EXPECT_TRUE(main_test_rfh()->is_loading()); |
| 127 | EXPECT_FALSE(node->navigation_request()); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 128 | |
| 129 | // Commit the navigation. |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 130 | navigation->Commit(); |
Sreeja Kamishetty | e49854f8 | 2021-06-02 00:52:03 | [diff] [blame] | 131 | EXPECT_TRUE(main_test_rfh()->IsActive()); |
Sreeja Kamishetty | e25ac75 | 2020-05-12 18:15:48 | [diff] [blame] | 132 | EXPECT_EQ(main_test_rfh()->lifecycle_state(), |
Sreeja Kamishetty | 299329ad | 2021-03-25 14:06:01 | [diff] [blame] | 133 | RenderFrameHostImpl::LifecycleStateImpl::kActive); |
Sharon Yang | 47453bb | 2025-04-25 14:48:09 | [diff] [blame] | 134 | if (AreStrictSiteInstancesEnabled()) { |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 135 | EXPECT_EQ(CreateExpectedSiteInfo(kUrl), |
| 136 | main_test_rfh()->GetSiteInstance()->GetSiteInfo()); |
Sharon Yang | 0227922 | 2025-01-15 19:09:19 | [diff] [blame] | 137 | } else { |
| 138 | EXPECT_TRUE(main_test_rfh()->GetSiteInstance()->IsDefaultSiteInstance()); |
Aaron Colwell | e953e56 | 2019-07-24 16:47:36 | [diff] [blame] | 139 | } |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 140 | EXPECT_EQ(kUrl, contents()->GetLastCommittedURL()); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 141 | |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 142 | // The main RenderFrameHost should not have been changed, and the renderer |
| 143 | // should have been initialized. |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 144 | EXPECT_EQ(site_instance_id, main_test_rfh()->GetSiteInstance()->GetId()); |
| 145 | EXPECT_TRUE(main_test_rfh()->IsRenderFrameLive()); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 146 | |
| 147 | // After a navigation is finished no speculative RenderFrameHost should |
| 148 | // exist. |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 149 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 150 | } |
| 151 | |
Arthur Hemery | 0dd6581 | 2019-08-01 14:18:45 | [diff] [blame] | 152 | // Tests a complete renderer-initiated same-site navigation. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 153 | TEST_F(NavigatorTest, SimpleRendererInitiatedSameSiteNavigation) { |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 154 | const GURL kUrl1("http://www.chromium.org/"); |
| 155 | const GURL kUrl2("http://www.chromium.org/Home"); |
| 156 | |
| 157 | contents()->NavigateAndCommit(kUrl1); |
| 158 | EXPECT_TRUE(main_test_rfh()->IsRenderFrameLive()); |
Mario Sanchez Prada | cb83d6c8 | 2020-09-11 13:11:51 | [diff] [blame] | 159 | static_cast<mojom::FrameHost*>(main_test_rfh())->DidStopLoading(); |
Nasko Oskov | 2e9e011 | 2020-12-22 21:34:43 | [diff] [blame] | 160 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 161 | |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 162 | // Start a renderer-initiated non-user-initiated navigation. |
Nasko Oskov | 2e9e011 | 2020-12-22 21:34:43 | [diff] [blame] | 163 | EXPECT_FALSE(node->navigation_request()); |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 164 | auto navigation = |
| 165 | NavigationSimulator::CreateRendererInitiated(kUrl2, main_test_rfh()); |
| 166 | navigation->SetTransition(ui::PageTransitionFromInt( |
| 167 | ui::PAGE_TRANSITION_LINK | ui::PAGE_TRANSITION_CLIENT_REDIRECT)); |
| 168 | navigation->SetHasUserGesture(false); |
| 169 | navigation->Start(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 170 | NavigationRequest* request = node->navigation_request(); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 171 | ASSERT_TRUE(request); |
| 172 | |
| 173 | // The navigation is immediately started as there's no need to wait for |
| 174 | // beforeUnload to be executed. |
Mohamed Abdelhalim | ccd149af | 2019-10-31 14:48:53 | [diff] [blame] | 175 | EXPECT_EQ(NavigationRequest::WILL_START_REQUEST, request->state()); |
Arthur Hemery | 14a71ad2 | 2017-10-27 10:54:39 | [diff] [blame] | 176 | EXPECT_FALSE(request->common_params().has_user_gesture); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 177 | EXPECT_EQ(kUrl2, request->common_params().url); |
| 178 | EXPECT_FALSE(request->browser_initiated()); |
Rakina Zata Amni | 1d15cfb | 2020-08-05 02:32:55 | [diff] [blame] | 179 | |
| 180 | if (CanSameSiteMainFrameNavigationsChangeRenderFrameHosts()) { |
| 181 | // If same-site ProactivelySwapBrowsingInstance or main-frame RenderDocument |
| 182 | // is enabled, the RFH should change so we should have a speculative RFH. |
| 183 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 184 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)->is_loading()); |
| 185 | } else { |
| 186 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 187 | } |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 188 | EXPECT_FALSE(main_test_rfh()->is_loading()); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 189 | |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 190 | // Have the current RenderFrameHost commit the navigation |
| 191 | navigation->ReadyToCommit(); |
Rakina Zata Amni | 1d15cfb | 2020-08-05 02:32:55 | [diff] [blame] | 192 | if (CanSameSiteMainFrameNavigationsChangeRenderFrameHosts()) { |
| 193 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)->is_loading()); |
| 194 | } else { |
| 195 | EXPECT_TRUE(main_test_rfh()->is_loading()); |
| 196 | } |
clamy | efdb7a4 | 2015-07-01 16:55:47 | [diff] [blame] | 197 | EXPECT_FALSE(node->navigation_request()); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 198 | |
| 199 | // Commit the navigation. |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 200 | navigation->Commit(); |
Sreeja Kamishetty | e49854f8 | 2021-06-02 00:52:03 | [diff] [blame] | 201 | EXPECT_TRUE(main_test_rfh()->IsActive()); |
Sharon Yang | 47453bb | 2025-04-25 14:48:09 | [diff] [blame] | 202 | if (AreStrictSiteInstancesEnabled()) { |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 203 | EXPECT_EQ(CreateExpectedSiteInfo(kUrl2), |
| 204 | main_test_rfh()->GetSiteInstance()->GetSiteInfo()); |
Sharon Yang | 0227922 | 2025-01-15 19:09:19 | [diff] [blame] | 205 | } else { |
| 206 | EXPECT_TRUE(main_test_rfh()->GetSiteInstance()->IsDefaultSiteInstance()); |
Aaron Colwell | e953e56 | 2019-07-24 16:47:36 | [diff] [blame] | 207 | } |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 208 | EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL()); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 209 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 210 | } |
| 211 | |
Arthur Hemery | 0dd6581 | 2019-08-01 14:18:45 | [diff] [blame] | 212 | // Tests a complete renderer-initiated navigation that should be |
carlosk | 42f59e6 | 2015-03-16 19:02:36 | [diff] [blame] | 213 | // cross-site but does not result in a SiteInstance swap because its |
| 214 | // renderer-initiated. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 215 | TEST_F(NavigatorTest, SimpleRendererInitiatedCrossSiteNavigation) { |
carlosk | 42f59e6 | 2015-03-16 19:02:36 | [diff] [blame] | 216 | const GURL kUrl1("http://www.chromium.org/"); |
| 217 | const GURL kUrl2("http://www.google.com"); |
| 218 | |
| 219 | contents()->NavigateAndCommit(kUrl1); |
| 220 | EXPECT_TRUE(main_test_rfh()->IsRenderFrameLive()); |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 221 | scoped_refptr<SiteInstanceImpl> site_instance_1 = |
| 222 | main_test_rfh()->GetSiteInstance(); |
| 223 | bool expect_site_instance_change = |
| 224 | ExpectSiteInstanceChange(site_instance_1.get()); |
Nasko Oskov | 2e9e011 | 2020-12-22 21:34:43 | [diff] [blame] | 225 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
carlosk | 42f59e6 | 2015-03-16 19:02:36 | [diff] [blame] | 226 | |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 227 | // Start a renderer-initiated navigation. |
Nasko Oskov | 2e9e011 | 2020-12-22 21:34:43 | [diff] [blame] | 228 | EXPECT_FALSE(node->navigation_request()); |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 229 | auto navigation = |
| 230 | NavigationSimulator::CreateRendererInitiated(kUrl2, main_test_rfh()); |
| 231 | navigation->Start(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 232 | NavigationRequest* request = node->navigation_request(); |
carlosk | 42f59e6 | 2015-03-16 19:02:36 | [diff] [blame] | 233 | ASSERT_TRUE(request); |
| 234 | |
| 235 | // The navigation is immediately started as there's no need to wait for |
| 236 | // beforeUnload to be executed. |
Mohamed Abdelhalim | ccd149af | 2019-10-31 14:48:53 | [diff] [blame] | 237 | EXPECT_EQ(NavigationRequest::WILL_START_REQUEST, request->state()); |
carlosk | 42f59e6 | 2015-03-16 19:02:36 | [diff] [blame] | 238 | EXPECT_EQ(kUrl2, request->common_params().url); |
| 239 | EXPECT_FALSE(request->browser_initiated()); |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 240 | if (expect_site_instance_change) { |
clamy | 61dfb23 | 2016-02-26 18:08:49 | [diff] [blame] | 241 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 242 | } else { |
| 243 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 244 | } |
carlosk | 42f59e6 | 2015-03-16 19:02:36 | [diff] [blame] | 245 | |
| 246 | // Have the current RenderFrameHost commit the navigation. |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 247 | navigation->ReadyToCommit(); |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 248 | if (expect_site_instance_change) { |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 249 | EXPECT_EQ(navigation->GetFinalRenderFrameHost(), |
| 250 | GetSpeculativeRenderFrameHost(node)); |
clamy | 61dfb23 | 2016-02-26 18:08:49 | [diff] [blame] | 251 | } |
clamy | efdb7a4 | 2015-07-01 16:55:47 | [diff] [blame] | 252 | EXPECT_FALSE(node->navigation_request()); |
carlosk | 42f59e6 | 2015-03-16 19:02:36 | [diff] [blame] | 253 | |
| 254 | // Commit the navigation. |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 255 | navigation->Commit(); |
Sreeja Kamishetty | e49854f8 | 2021-06-02 00:52:03 | [diff] [blame] | 256 | EXPECT_TRUE(main_test_rfh()->IsActive()); |
carlosk | 42f59e6 | 2015-03-16 19:02:36 | [diff] [blame] | 257 | EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL()); |
carlosk | 42f59e6 | 2015-03-16 19:02:36 | [diff] [blame] | 258 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
carlosk | 42f59e6 | 2015-03-16 19:02:36 | [diff] [blame] | 259 | |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 260 | if (expect_site_instance_change) { |
| 261 | EXPECT_NE(site_instance_1->GetId(), |
| 262 | main_test_rfh()->GetSiteInstance()->GetId()); |
| 263 | EXPECT_EQ(site_instance_1->IsDefaultSiteInstance(), |
| 264 | main_test_rfh()->GetSiteInstance()->IsDefaultSiteInstance()); |
clamy | 5d947f5 | 2017-05-24 19:51:18 | [diff] [blame] | 265 | } else { |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 266 | EXPECT_EQ(site_instance_1->GetId(), |
| 267 | main_test_rfh()->GetSiteInstance()->GetId()); |
clamy | 5d947f5 | 2017-05-24 19:51:18 | [diff] [blame] | 268 | } |
carlosk | 42f59e6 | 2015-03-16 19:02:36 | [diff] [blame] | 269 | } |
| 270 | |
Todd Sahl | b2f79830 | 2021-01-21 16:32:07 | [diff] [blame] | 271 | // Tests that when a navigation to about:blank is renderer-aborted, |
| 272 | // after another cross-site navigation has been initiated, that the |
| 273 | // second navigation is undisturbed. |
| 274 | TEST_F(NavigatorTest, RendererAbortedAboutBlankNavigation) { |
| 275 | const GURL kUrl0("http://www.google.com/"); |
| 276 | const GURL kUrl1("about:blank"); |
| 277 | const GURL kUrl2("http://www.chromium.org/Home"); |
| 278 | |
| 279 | contents()->NavigateAndCommit(kUrl0); |
| 280 | EXPECT_TRUE(main_test_rfh()->IsRenderFrameLive()); |
Dominique Fauteux-Chapleau | 3e8d345 | 2021-07-14 17:20:02 | [diff] [blame] | 281 | |
Rakina Zata Amni | dfcab2e5 | 2023-08-26 07:11:59 | [diff] [blame] | 282 | // The test expects cross-site navigations to change RenderFrameHosts, but not |
| 283 | // same-site navigations. Return if that can't be satisfied. |
Dominique Fauteux-Chapleau | 3e8d345 | 2021-07-14 17:20:02 | [diff] [blame] | 284 | DisableBackForwardCacheForTesting( |
| 285 | contents(), BackForwardCache::TEST_ASSUMES_NO_RENDER_FRAME_CHANGE); |
| 286 | if (!ExpectSiteInstanceChangeWithoutBackForwardCache( |
Rakina Zata Amni | dfcab2e5 | 2023-08-26 07:11:59 | [diff] [blame] | 287 | main_test_rfh()->GetSiteInstance()) || |
| 288 | ShouldCreateNewHostForAllFrames()) { |
| 289 | GTEST_SKIP(); |
Dominique Fauteux-Chapleau | 3e8d345 | 2021-07-14 17:20:02 | [diff] [blame] | 290 | } |
Todd Sahl | b2f79830 | 2021-01-21 16:32:07 | [diff] [blame] | 291 | |
| 292 | // Start a renderer-initiated navigation to about:blank. |
| 293 | EXPECT_FALSE(main_test_rfh()->is_loading()); |
| 294 | auto navigation1 = |
| 295 | NavigationSimulator::CreateRendererInitiated(kUrl1, main_test_rfh()); |
| 296 | navigation1->SetTransition(ui::PAGE_TRANSITION_LINK); |
| 297 | navigation1->Start(); |
| 298 | navigation1->ReadyToCommit(); |
| 299 | |
| 300 | // about:blank should load on the main rfhi, not a speculative one, |
| 301 | // and automatically advance to READY_TO_COMMIT since it requires |
| 302 | // no network resources. |
| 303 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
| 304 | ASSERT_FALSE(node->navigation_request()); |
| 305 | EXPECT_TRUE(main_test_rfh()->is_loading()); |
| 306 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 307 | |
| 308 | // Start a second, cross-origin navigation. |
| 309 | auto navigation2 = |
| 310 | NavigationSimulator::CreateRendererInitiated(kUrl2, main_test_rfh()); |
| 311 | navigation2->SetTransition(ui::PAGE_TRANSITION_LINK); |
| 312 | navigation2->Start(); |
| 313 | ASSERT_TRUE(node->navigation_request()); |
| 314 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 315 | |
| 316 | // Abort the initial navigation. |
| 317 | navigation1->AbortFromRenderer(); |
| 318 | |
| 319 | // But the speculative rfhi and second navigation request |
| 320 | // should be unaffected. |
| 321 | ASSERT_TRUE(node->navigation_request()); |
| 322 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 323 | } |
| 324 | |
| 325 | // Tests that when a navigation to about:blank is renderer-aborted, |
| 326 | // after another cross-site navigation has been initiated, that the |
| 327 | // second navigation is undisturbed. In this variation, the second |
| 328 | // navigation is initially same-site, then redirects cross-site, |
| 329 | // and a throttle DEFERs during WillProcessResponse(). The initial |
| 330 | // navigation gets aborted during this defer. |
| 331 | TEST_F(NavigatorTest, |
| 332 | RedirectedRendererAbortedAboutBlankNavigationwithDeferredCommit) { |
| 333 | const GURL kUrl0("http://www.google.com/"); |
| 334 | const GURL kUrl0SameSiteVariation("http://www.google.com/home"); |
| 335 | const GURL kUrl1("about:blank"); |
| 336 | const GURL kUrl2("http://www.chromium.org/Home"); |
| 337 | |
| 338 | contents()->NavigateAndCommit(kUrl0); |
| 339 | EXPECT_TRUE(main_test_rfh()->IsRenderFrameLive()); |
Dominique Fauteux-Chapleau | 3e8d345 | 2021-07-14 17:20:02 | [diff] [blame] | 340 | |
Rakina Zata Amni | dfcab2e5 | 2023-08-26 07:11:59 | [diff] [blame] | 341 | // The test expects cross-site navigations to change RenderFrameHosts, but not |
| 342 | // same-site navigations. Return if that can't be satisfied. |
Dominique Fauteux-Chapleau | 3e8d345 | 2021-07-14 17:20:02 | [diff] [blame] | 343 | DisableBackForwardCacheForTesting( |
| 344 | contents(), BackForwardCache::TEST_ASSUMES_NO_RENDER_FRAME_CHANGE); |
| 345 | if (!ExpectSiteInstanceChangeWithoutBackForwardCache( |
Rakina Zata Amni | dfcab2e5 | 2023-08-26 07:11:59 | [diff] [blame] | 346 | main_test_rfh()->GetSiteInstance()) || |
| 347 | ShouldCreateNewHostForAllFrames()) { |
| 348 | GTEST_SKIP(); |
Dominique Fauteux-Chapleau | 3e8d345 | 2021-07-14 17:20:02 | [diff] [blame] | 349 | } |
Todd Sahl | b2f79830 | 2021-01-21 16:32:07 | [diff] [blame] | 350 | |
| 351 | // Start a renderer-initiated navigation to about:blank. |
| 352 | EXPECT_FALSE(main_test_rfh()->is_loading()); |
| 353 | auto navigation1 = |
| 354 | NavigationSimulator::CreateRendererInitiated(kUrl1, main_test_rfh()); |
| 355 | navigation1->SetTransition(ui::PAGE_TRANSITION_LINK); |
| 356 | navigation1->Start(); |
| 357 | navigation1->ReadyToCommit(); |
| 358 | |
| 359 | // about:blank should load on the main rfhi, not a speculative one, |
| 360 | // and automatically advance to READY_TO_COMMIT since it requires |
| 361 | // no network resources. |
| 362 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
| 363 | ASSERT_FALSE(node->navigation_request()); |
| 364 | EXPECT_TRUE(main_test_rfh()->is_loading()); |
| 365 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 366 | |
| 367 | // Start a second, same-origin navigation. |
| 368 | auto navigation2 = NavigationSimulator::CreateRendererInitiated( |
| 369 | kUrl0SameSiteVariation, main_test_rfh()); |
| 370 | navigation2->SetTransition(ui::PAGE_TRANSITION_LINK); |
| 371 | navigation2->SetAutoAdvance(false); |
| 372 | |
| 373 | // Insert a TaskRunnerDeferringThrottle that will defer |
| 374 | // during WillProcessResponse() of navigation2. |
| 375 | auto task_runner = base::MakeRefCounted<base::TestSimpleTaskRunner>(); |
| 376 | auto* raw_runner = task_runner.get(); |
| 377 | TestNavigationThrottleInserter throttle_inserter( |
| 378 | web_contents(), |
| 379 | base::BindRepeating(&TaskRunnerDeferringThrottle::Create, |
| 380 | std::move(task_runner), false /* defer_start */, |
| 381 | false /* defer-redirect */, |
| 382 | true /* defer_response */)); |
| 383 | |
| 384 | navigation2->Start(); |
| 385 | ASSERT_TRUE(node->navigation_request()); |
| 386 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 387 | |
| 388 | // Redirect navigation2 cross-site, which, once ReadyCommit() |
| 389 | // is called, will force a speculative RFHI to be created, |
| 390 | // and update the associated site instance type of the |
| 391 | // NavigationRequest for navigation2. This will prevent |
| 392 | // the abort of navigation1 from destroying the speculative |
| 393 | // RFHI that navigation2 depends on. |
| 394 | navigation2->Redirect(kUrl2); |
| 395 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
Rakina Zata Amni | 8d4ed05 | 2022-12-07 23:03:30 | [diff] [blame] | 396 | EXPECT_TRUE(node->navigation_request()->GetAssociatedRFHType() == |
Rakina Zata Amni | 7af54b1 | 2022-06-28 10:36:17 | [diff] [blame] | 397 | NavigationRequest::AssociatedRenderFrameHostType::CURRENT); |
Todd Sahl | b2f79830 | 2021-01-21 16:32:07 | [diff] [blame] | 398 | |
| 399 | navigation2->ReadyToCommit(); |
| 400 | EXPECT_EQ(1u, raw_runner->NumPendingTasks()); |
| 401 | EXPECT_TRUE(navigation2->IsDeferred()); |
| 402 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
Rakina Zata Amni | 8d4ed05 | 2022-12-07 23:03:30 | [diff] [blame] | 403 | EXPECT_EQ(node->navigation_request()->GetRenderFrameHost(), |
| 404 | GetSpeculativeRenderFrameHost(node)); |
Todd Sahl | b2f79830 | 2021-01-21 16:32:07 | [diff] [blame] | 405 | |
| 406 | // Abort the initial navigation. |
| 407 | navigation1->AbortFromRenderer(); |
| 408 | |
| 409 | // The speculative rfhi and second navigation request |
| 410 | // should be unaffected. |
| 411 | ASSERT_TRUE(node->navigation_request()); |
| 412 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 413 | } |
| 414 | |
Arthur Hemery | 0dd6581 | 2019-08-01 14:18:45 | [diff] [blame] | 415 | // Tests that a beforeUnload denial cancels the navigation. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 416 | TEST_F(NavigatorTest, BeforeUnloadDenialCancelNavigation) { |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 417 | const GURL kUrl1("http://www.google.com/"); |
| 418 | const GURL kUrl2("http://www.chromium.org/"); |
| 419 | |
| 420 | contents()->NavigateAndCommit(kUrl1); |
Minoru Chikamune | 99f1bf6d | 2025-02-19 05:34:19 | [diff] [blame] | 421 | // This test assumes a beforeunload handler is present. |
| 422 | main_test_rfh()->SuddenTerminationDisablerChanged( |
| 423 | true, blink::mojom::SuddenTerminationDisablerType::kBeforeUnloadHandler); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 424 | |
| 425 | // Start a new navigation. |
| 426 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
Arthur Hemery | 56fb25c | 2019-02-08 17:55:13 | [diff] [blame] | 427 | auto navigation = |
| 428 | NavigationSimulatorImpl::CreateBrowserInitiated(kUrl2, contents()); |
| 429 | navigation->BrowserInitiatedStartAndWaitBeforeUnload(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 430 | NavigationRequest* request = node->navigation_request(); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 431 | ASSERT_TRUE(request); |
| 432 | EXPECT_TRUE(request->browser_initiated()); |
| 433 | EXPECT_EQ(NavigationRequest::WAITING_FOR_RENDERER_RESPONSE, request->state()); |
carlosk | c49005eb | 2015-06-16 11:25:07 | [diff] [blame] | 434 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
carlosk | a0350db | 2015-07-30 20:10:57 | [diff] [blame] | 435 | RenderFrameDeletedObserver rfh_deleted_observer( |
| 436 | GetSpeculativeRenderFrameHost(node)); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 437 | |
| 438 | // Simulate a beforeUnload denial. |
Antonio Gomes | 8678a20 | 2020-03-02 20:03:25 | [diff] [blame] | 439 | main_test_rfh()->SimulateBeforeUnloadCompleted(false); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 440 | EXPECT_FALSE(node->navigation_request()); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 441 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
carlosk | a0350db | 2015-07-30 20:10:57 | [diff] [blame] | 442 | EXPECT_TRUE(rfh_deleted_observer.deleted()); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 443 | } |
| 444 | |
Arthur Hemery | 56fb25c | 2019-02-08 17:55:13 | [diff] [blame] | 445 | // Test that a proper NavigationRequest is created at navigation start. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 446 | TEST_F(NavigatorTest, BeginNavigation) { |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 447 | const GURL kUrl1("http://www.google.com/"); |
| 448 | const GURL kUrl2("http://www.chromium.org/"); |
| 449 | const GURL kUrl3("http://www.gmail.com/"); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 450 | |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 451 | contents()->NavigateAndCommit(kUrl1); |
| 452 | |
| 453 | // Add a subframe. |
Carlos Caballero | 15caeeb | 2021-10-27 09:57:55 | [diff] [blame] | 454 | FrameTreeNode* root_node = contents()->GetPrimaryFrameTree().root(); |
carlosk | fdf32b5 | 2015-02-06 17:58:30 | [diff] [blame] | 455 | TestRenderFrameHost* subframe_rfh = main_test_rfh()->AppendChild("Child"); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 456 | ASSERT_TRUE(subframe_rfh); |
Minoru Chikamune | 99f1bf6d | 2025-02-19 05:34:19 | [diff] [blame] | 457 | // This test assumes a beforeunload handler is present on the subframe. |
| 458 | subframe_rfh->SuddenTerminationDisablerChanged( |
| 459 | true, blink::mojom::SuddenTerminationDisablerType::kBeforeUnloadHandler); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 460 | |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 461 | // Start a navigation at the subframe. |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 462 | FrameTreeNode* subframe_node = subframe_rfh->frame_tree_node(); |
Arthur Hemery | 56fb25c | 2019-02-08 17:55:13 | [diff] [blame] | 463 | auto navigation = |
| 464 | NavigationSimulatorImpl::CreateBrowserInitiated(kUrl2, contents()); |
| 465 | NavigationController::LoadURLParams load_url_params(kUrl2); |
| 466 | load_url_params.frame_tree_node_id = subframe_node->frame_tree_node_id(); |
| 467 | navigation->SetLoadURLParams(&load_url_params); |
| 468 | navigation->BrowserInitiatedStartAndWaitBeforeUnload(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 469 | NavigationRequest* subframe_request = subframe_node->navigation_request(); |
clamy | 3f8ab9c | 2017-01-26 14:42:14 | [diff] [blame] | 470 | |
jam | 4044498 | 2017-04-11 03:01:41 | [diff] [blame] | 471 | // We should be waiting for the BeforeUnload event to execute in the subframe. |
clamy | 3f8ab9c | 2017-01-26 14:42:14 | [diff] [blame] | 472 | ASSERT_TRUE(subframe_request); |
jam | 4044498 | 2017-04-11 03:01:41 | [diff] [blame] | 473 | EXPECT_EQ(NavigationRequest::WAITING_FOR_RENDERER_RESPONSE, |
| 474 | subframe_request->state()); |
Antonio Gomes | 8678a20 | 2020-03-02 20:03:25 | [diff] [blame] | 475 | EXPECT_TRUE(subframe_rfh->is_waiting_for_beforeunload_completion()); |
clamy | 3f8ab9c | 2017-01-26 14:42:14 | [diff] [blame] | 476 | |
Arthur Hemery | 56fb25c | 2019-02-08 17:55:13 | [diff] [blame] | 477 | // Start the navigation, which will internally simulate that the beforeUnload |
Antonio Gomes | 8678a20 | 2020-03-02 20:03:25 | [diff] [blame] | 478 | // completion callback has been invoked. |
Arthur Hemery | 56fb25c | 2019-02-08 17:55:13 | [diff] [blame] | 479 | navigation->Start(); |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 480 | TestNavigationURLLoader* subframe_loader = |
| 481 | GetLoaderForNavigationRequest(subframe_request); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 482 | ASSERT_TRUE(subframe_loader); |
Mohamed Abdelhalim | ccd149af | 2019-10-31 14:48:53 | [diff] [blame] | 483 | EXPECT_EQ(NavigationRequest::WILL_START_REQUEST, subframe_request->state()); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 484 | EXPECT_EQ(kUrl2, subframe_request->common_params().url); |
Lucas Furukawa Gadani | ef8290a | 2019-07-29 20:27:51 | [diff] [blame] | 485 | EXPECT_EQ(kUrl2, subframe_loader->request_info()->common_params->url); |
Matt Menke | a56c599 | 2020-04-10 20:53:56 | [diff] [blame] | 486 | EXPECT_TRUE( |
Joshua Thomas | 81febb3 | 2025-06-17 18:16:32 | [diff] [blame] | 487 | net::IsolationInfo::Create( |
| 488 | net::IsolationInfo::RequestType::kSubFrame, |
| 489 | url::Origin::Create(kUrl1), url::Origin::Create(kUrl2), |
| 490 | net::SiteForCookies::FromUrl(kUrl1), /*nonce=*/std::nullopt, |
| 491 | net::NetworkIsolationPartition::kGeneral, |
| 492 | net::IsolationInfo::FrameAncestorRelation::kSameOrigin) |
Matt Menke | a56c599 | 2020-04-10 20:53:56 | [diff] [blame] | 493 | .IsEqualForTesting(subframe_loader->request_info()->isolation_info)); |
Shivani Sharma | 8ae506c | 2019-07-21 21:08:27 | [diff] [blame] | 494 | |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 495 | EXPECT_FALSE(subframe_loader->request_info()->is_main_frame); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 496 | EXPECT_TRUE(subframe_request->browser_initiated()); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 497 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(root_node)); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 498 | |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 499 | // Subframe navigations should never create a speculative RenderFrameHost, |
Sharon Yang | 6a61229f | 2025-02-11 17:56:54 | [diff] [blame] | 500 | // unless site-per-process or another mode where a SiteInstance cannot contain |
| 501 | // multiple sites is enabled. In that case, as the subframe navigation is to a |
| 502 | // different site and is still ongoing, it should have one. |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 503 | bool expect_site_instance_change = AreStrictSiteInstancesEnabled(); |
| 504 | if (expect_site_instance_change) { |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 505 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(subframe_node)); |
| 506 | } else { |
| 507 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(subframe_node)); |
| 508 | } |
| 509 | |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 510 | // Now start a navigation at the root node. |
Arthur Hemery | 56fb25c | 2019-02-08 17:55:13 | [diff] [blame] | 511 | auto navigation2 = |
| 512 | NavigationSimulatorImpl::CreateBrowserInitiated(kUrl3, contents()); |
| 513 | navigation2->BrowserInitiatedStartAndWaitBeforeUnload(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 514 | NavigationRequest* main_request = root_node->navigation_request(); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 515 | ASSERT_TRUE(main_request); |
jam | 4044498 | 2017-04-11 03:01:41 | [diff] [blame] | 516 | EXPECT_EQ(NavigationRequest::WAITING_FOR_RENDERER_RESPONSE, |
| 517 | main_request->state()); |
carlosk | c49005eb | 2015-06-16 11:25:07 | [diff] [blame] | 518 | |
| 519 | // Main frame navigation to a different site should use a speculative |
| 520 | // RenderFrameHost. |
| 521 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(root_node)); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 522 | |
Arthur Hemery | 56fb25c | 2019-02-08 17:55:13 | [diff] [blame] | 523 | // Start the navigation, which will internally simulate that the beforeUnload |
Antonio Gomes | 8678a20 | 2020-03-02 20:03:25 | [diff] [blame] | 524 | // completion callback has been invoked. |
Arthur Hemery | 56fb25c | 2019-02-08 17:55:13 | [diff] [blame] | 525 | navigation2->Start(); |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 526 | TestNavigationURLLoader* main_loader = |
| 527 | GetLoaderForNavigationRequest(main_request); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 528 | EXPECT_EQ(kUrl3, main_request->common_params().url); |
Lucas Furukawa Gadani | ef8290a | 2019-07-29 20:27:51 | [diff] [blame] | 529 | EXPECT_EQ(kUrl3, main_loader->request_info()->common_params->url); |
Matt Menke | a56c599 | 2020-04-10 20:53:56 | [diff] [blame] | 530 | EXPECT_TRUE( |
Chris Fredrickson | e7ba521 | 2023-09-26 14:54:42 | [diff] [blame] | 531 | net::IsolationInfo::Create(net::IsolationInfo::RequestType::kMainFrame, |
| 532 | url::Origin::Create(kUrl3), |
| 533 | url::Origin::Create(kUrl3), |
| 534 | net::SiteForCookies::FromUrl(kUrl3)) |
Matt Menke | a56c599 | 2020-04-10 20:53:56 | [diff] [blame] | 535 | .IsEqualForTesting(main_loader->request_info()->isolation_info)); |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 536 | EXPECT_TRUE(main_loader->request_info()->is_main_frame); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 537 | EXPECT_TRUE(main_request->browser_initiated()); |
Antonio Gomes | 8678a20 | 2020-03-02 20:03:25 | [diff] [blame] | 538 | // BeforeUnloadCompleted callback was invoked by the renderer so the |
| 539 | // navigation should have started. |
Mohamed Abdelhalim | ccd149af | 2019-10-31 14:48:53 | [diff] [blame] | 540 | EXPECT_EQ(NavigationRequest::WILL_START_REQUEST, main_request->state()); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 541 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(root_node)); |
| 542 | |
| 543 | // As the main frame hasn't yet committed the subframe still exists. Thus, the |
| 544 | // above situation regarding subframe navigations is valid here. |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 545 | if (expect_site_instance_change) { |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 546 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(subframe_node)); |
| 547 | } else { |
| 548 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(subframe_node)); |
| 549 | } |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 550 | } |
| 551 | |
Arthur Hemery | 0dd6581 | 2019-08-01 14:18:45 | [diff] [blame] | 552 | // Tests that committing an HTTP 204 or HTTP 205 response cancels |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 553 | // the navigation. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 554 | TEST_F(NavigatorTest, NoContent) { |
davidben | 8b33913 | 2014-10-08 02:27:01 | [diff] [blame] | 555 | const GURL kUrl1("http://www.chromium.org/"); |
| 556 | const GURL kUrl2("http://www.google.com/"); |
| 557 | |
| 558 | // Load a URL. |
| 559 | contents()->NavigateAndCommit(kUrl1); |
davidben | 8b33913 | 2014-10-08 02:27:01 | [diff] [blame] | 560 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
| 561 | |
davidben | 8b33913 | 2014-10-08 02:27:01 | [diff] [blame] | 562 | // Navigate to a different site. |
Nasko Oskov | 2e9e011 | 2020-12-22 21:34:43 | [diff] [blame] | 563 | EXPECT_FALSE(node->navigation_request()); |
Arthur Hemery | 56fb25c | 2019-02-08 17:55:13 | [diff] [blame] | 564 | auto navigation = |
| 565 | NavigationSimulator::CreateBrowserInitiated(kUrl2, contents()); |
| 566 | navigation->Start(); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 567 | |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 568 | NavigationRequest* main_request = node->navigation_request(); |
davidben | 8b33913 | 2014-10-08 02:27:01 | [diff] [blame] | 569 | ASSERT_TRUE(main_request); |
| 570 | |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 571 | // Navigations to a different site do create a speculative RenderFrameHost. |
| 572 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 573 | |
davidben | 8b33913 | 2014-10-08 02:27:01 | [diff] [blame] | 574 | // Commit an HTTP 204 response. |
Lucas Furukawa Gadani | d661c0d | 2019-12-02 19:58:16 | [diff] [blame] | 575 | auto response = network::mojom::URLResponseHead::New(); |
davidben | 8b33913 | 2014-10-08 02:27:01 | [diff] [blame] | 576 | const char kNoContentHeaders[] = "HTTP/1.1 204 No Content\0\0"; |
Lucas Furukawa Gadani | d661c0d | 2019-12-02 19:58:16 | [diff] [blame] | 577 | response->headers = new net::HttpResponseHeaders( |
Daniel Cheng | ad44af2f | 2022-02-26 18:07:54 | [diff] [blame] | 578 | std::string(kNoContentHeaders, std::size(kNoContentHeaders))); |
Lucas Furukawa Gadani | d661c0d | 2019-12-02 19:58:16 | [diff] [blame] | 579 | GetLoaderForNavigationRequest(main_request) |
Alexander Timin | 66dab13 | 2021-09-23 14:36:04 | [diff] [blame] | 580 | ->CallOnResponseStarted(std::move(response), |
Leszek Swirski | 154cddb | 2022-08-29 17:57:19 | [diff] [blame] | 581 | mojo::ScopedDataPipeConsumerHandle(), |
Arthur Sonzogni | c686e8f | 2024-01-11 08:36:37 | [diff] [blame] | 582 | std::nullopt); |
davidben | 8b33913 | 2014-10-08 02:27:01 | [diff] [blame] | 583 | |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 584 | // There should be no pending nor speculative RenderFrameHost; the navigation |
| 585 | // was aborted. |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 586 | EXPECT_FALSE(node->navigation_request()); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 587 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
davidben | 8b33913 | 2014-10-08 02:27:01 | [diff] [blame] | 588 | |
| 589 | // Now, repeat the test with 205 Reset Content. |
| 590 | |
| 591 | // Navigate to a different site again. |
Arthur Hemery | 56fb25c | 2019-02-08 17:55:13 | [diff] [blame] | 592 | auto navigation2 = |
| 593 | NavigationSimulator::CreateBrowserInitiated(kUrl2, contents()); |
| 594 | navigation2->Start(); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 595 | |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 596 | main_request = node->navigation_request(); |
davidben | 8b33913 | 2014-10-08 02:27:01 | [diff] [blame] | 597 | ASSERT_TRUE(main_request); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 598 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
davidben | 8b33913 | 2014-10-08 02:27:01 | [diff] [blame] | 599 | |
| 600 | // Commit an HTTP 205 response. |
Lucas Furukawa Gadani | d661c0d | 2019-12-02 19:58:16 | [diff] [blame] | 601 | response = network::mojom::URLResponseHead::New(); |
davidben | 8b33913 | 2014-10-08 02:27:01 | [diff] [blame] | 602 | const char kResetContentHeaders[] = "HTTP/1.1 205 Reset Content\0\0"; |
Lucas Furukawa Gadani | d661c0d | 2019-12-02 19:58:16 | [diff] [blame] | 603 | response->headers = new net::HttpResponseHeaders( |
Daniel Cheng | ad44af2f | 2022-02-26 18:07:54 | [diff] [blame] | 604 | std::string(kResetContentHeaders, std::size(kResetContentHeaders))); |
Lucas Furukawa Gadani | d661c0d | 2019-12-02 19:58:16 | [diff] [blame] | 605 | GetLoaderForNavigationRequest(main_request) |
Alexander Timin | 66dab13 | 2021-09-23 14:36:04 | [diff] [blame] | 606 | ->CallOnResponseStarted(std::move(response), |
Leszek Swirski | 154cddb | 2022-08-29 17:57:19 | [diff] [blame] | 607 | mojo::ScopedDataPipeConsumerHandle(), |
Arthur Sonzogni | c686e8f | 2024-01-11 08:36:37 | [diff] [blame] | 608 | std::nullopt); |
davidben | 8b33913 | 2014-10-08 02:27:01 | [diff] [blame] | 609 | |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 610 | // There should be no pending nor speculative RenderFrameHost; the navigation |
| 611 | // was aborted. |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 612 | EXPECT_FALSE(node->navigation_request()); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 613 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
davidben | 8b33913 | 2014-10-08 02:27:01 | [diff] [blame] | 614 | } |
| 615 | |
arthursonzogni | f34adf09 | 2018-04-24 17:06:13 | [diff] [blame] | 616 | // Test that a new RenderFrameHost is created when doing a cross site |
| 617 | // navigation. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 618 | TEST_F(NavigatorTest, CrossSiteNavigation) { |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 619 | const GURL kUrl1("http://www.chromium.org/"); |
| 620 | const GURL kUrl2("http://www.google.com/"); |
| 621 | |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 622 | contents()->NavigateAndCommit(kUrl1); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 623 | RenderFrameHostImpl* initial_rfh = main_test_rfh(); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 624 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
| 625 | |
| 626 | // Navigate to a different site. |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 627 | EXPECT_EQ(main_test_rfh()->navigation_requests().size(), 0u); |
| 628 | auto navigation = |
| 629 | NavigationSimulator::CreateBrowserInitiated(kUrl2, contents()); |
| 630 | navigation->Start(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 631 | NavigationRequest* main_request = node->navigation_request(); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 632 | ASSERT_TRUE(main_request); |
carlosk | c49005eb | 2015-06-16 11:25:07 | [diff] [blame] | 633 | TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node); |
| 634 | ASSERT_TRUE(speculative_rfh); |
carlosk | c49005eb | 2015-06-16 11:25:07 | [diff] [blame] | 635 | EXPECT_EQ(speculative_rfh, GetSpeculativeRenderFrameHost(node)); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 636 | |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 637 | navigation->ReadyToCommit(); |
carlosk | c49005eb | 2015-06-16 11:25:07 | [diff] [blame] | 638 | EXPECT_EQ(speculative_rfh, GetSpeculativeRenderFrameHost(node)); |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 639 | EXPECT_EQ(speculative_rfh->navigation_requests().size(), 1u); |
| 640 | EXPECT_EQ(main_test_rfh()->navigation_requests().size(), 0u); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 641 | |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 642 | navigation->Commit(); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 643 | RenderFrameHostImpl* final_rfh = main_test_rfh(); |
| 644 | EXPECT_EQ(speculative_rfh, final_rfh); |
| 645 | EXPECT_NE(initial_rfh, final_rfh); |
| 646 | EXPECT_TRUE(final_rfh->IsRenderFrameLive()); |
| 647 | EXPECT_TRUE(final_rfh->render_view_host()->IsRenderViewLive()); |
| 648 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 649 | } |
| 650 | |
arthursonzogni | f34adf09 | 2018-04-24 17:06:13 | [diff] [blame] | 651 | // Test that redirects are followed and the speculative RenderFrameHost logic |
| 652 | // behaves as expected. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 653 | TEST_F(NavigatorTest, RedirectCrossSite) { |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 654 | const GURL kUrl1("http://www.chromium.org/"); |
| 655 | const GURL kUrl2("http://www.google.com/"); |
| 656 | |
| 657 | contents()->NavigateAndCommit(kUrl1); |
| 658 | RenderFrameHostImpl* rfh = main_test_rfh(); |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 659 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
| 660 | |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 661 | // Navigate to a URL on the same site. |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 662 | EXPECT_EQ(main_test_rfh()->navigation_requests().size(), 0u); |
| 663 | auto navigation = |
| 664 | NavigationSimulator::CreateBrowserInitiated(kUrl1, contents()); |
| 665 | navigation->Start(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 666 | NavigationRequest* main_request = node->navigation_request(); |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 667 | ASSERT_TRUE(main_request); |
Rakina Zata Amni | dfcab2e5 | 2023-08-26 07:11:59 | [diff] [blame] | 668 | if (ShouldCreateNewHostForAllFrames()) { |
| 669 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 670 | } else { |
| 671 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 672 | } |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 673 | |
| 674 | // It then redirects to another site. |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 675 | navigation->Redirect(kUrl2); |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 676 | |
| 677 | // The redirect should have been followed. |
| 678 | EXPECT_EQ(1, GetLoaderForNavigationRequest(main_request)->redirect_count()); |
Rakina Zata Amni | dfcab2e5 | 2023-08-26 07:11:59 | [diff] [blame] | 679 | if (ShouldCreateNewHostForAllFrames()) { |
| 680 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 681 | } else { |
| 682 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 683 | } |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 684 | |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 685 | navigation->ReadyToCommit(); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 686 | TestRenderFrameHost* final_speculative_rfh = |
| 687 | GetSpeculativeRenderFrameHost(node); |
| 688 | EXPECT_TRUE(final_speculative_rfh); |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 689 | EXPECT_EQ(final_speculative_rfh->navigation_requests().size(), 1u); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 690 | |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 691 | navigation->Commit(); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 692 | RenderFrameHostImpl* final_rfh = main_test_rfh(); |
| 693 | ASSERT_TRUE(final_rfh); |
| 694 | EXPECT_NE(rfh, final_rfh); |
| 695 | EXPECT_EQ(final_speculative_rfh, final_rfh); |
| 696 | EXPECT_TRUE(final_rfh->IsRenderFrameLive()); |
| 697 | EXPECT_TRUE(final_rfh->render_view_host()->IsRenderViewLive()); |
| 698 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 699 | } |
| 700 | |
arthursonzogni | f34adf09 | 2018-04-24 17:06:13 | [diff] [blame] | 701 | // Test that a navigation is canceled if another browser-initiated request has |
| 702 | // been issued in the meantime. Also confirms that the speculative |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 703 | // RenderFrameHost is correctly updated in the process. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 704 | TEST_F(NavigatorTest, BrowserInitiatedNavigationCancel) { |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 705 | const GURL kUrl0("http://www.wikipedia.org/"); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 706 | const GURL kUrl1("http://www.chromium.org/"); |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 707 | const auto kUrl1SiteInfo = CreateExpectedSiteInfo(kUrl1); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 708 | const GURL kUrl2("http://www.google.com/"); |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 709 | const auto kUrl2SiteInfo = CreateExpectedSiteInfo(kUrl2); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 710 | |
| 711 | // Initialization. |
| 712 | contents()->NavigateAndCommit(kUrl0); |
| 713 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 714 | |
davidben | a5496d6 | 2014-10-07 18:52:04 | [diff] [blame] | 715 | // Request navigation to the 1st URL. |
Nasko Oskov | 2e9e011 | 2020-12-22 21:34:43 | [diff] [blame] | 716 | EXPECT_FALSE(node->navigation_request()); |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 717 | auto navigation1 = |
| 718 | NavigationSimulator::CreateBrowserInitiated(kUrl1, contents()); |
| 719 | navigation1->Start(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 720 | NavigationRequest* request1 = node->navigation_request(); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 721 | ASSERT_TRUE(request1); |
davidben | a5496d6 | 2014-10-07 18:52:04 | [diff] [blame] | 722 | EXPECT_EQ(kUrl1, request1->common_params().url); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 723 | EXPECT_TRUE(request1->browser_initiated()); |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 724 | base::WeakPtr<TestNavigationURLLoader> loader1 = |
| 725 | GetLoaderForNavigationRequest(request1)->AsWeakPtr(); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 726 | EXPECT_TRUE(loader1); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 727 | |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 728 | // Confirm a speculative RenderFrameHost was created. |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 729 | TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node); |
| 730 | ASSERT_TRUE(speculative_rfh); |
Lukasz Anforowicz | 1de0a22 | 2021-07-26 22:02:32 | [diff] [blame] | 731 | auto site_instance_id_1 = speculative_rfh->GetSiteInstance()->GetId(); |
Sharon Yang | 47453bb | 2025-04-25 14:48:09 | [diff] [blame] | 732 | if (AreStrictSiteInstancesEnabled()) { |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 733 | EXPECT_EQ(kUrl1SiteInfo, speculative_rfh->GetSiteInstance()->GetSiteInfo()); |
Sharon Yang | 0227922 | 2025-01-15 19:09:19 | [diff] [blame] | 734 | } else { |
| 735 | EXPECT_TRUE(speculative_rfh->GetSiteInstance()->IsDefaultSiteInstance()); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 736 | } |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 737 | |
davidben | a5496d6 | 2014-10-07 18:52:04 | [diff] [blame] | 738 | // Request navigation to the 2nd URL; the NavigationRequest must have been |
| 739 | // replaced by a new one with a different URL. |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 740 | auto navigation2 = |
| 741 | NavigationSimulator::CreateBrowserInitiated(kUrl2, contents()); |
| 742 | navigation2->Start(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 743 | NavigationRequest* request2 = node->navigation_request(); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 744 | ASSERT_TRUE(request2); |
davidben | a5496d6 | 2014-10-07 18:52:04 | [diff] [blame] | 745 | EXPECT_EQ(kUrl2, request2->common_params().url); |
carlosk | e24d1178 | 2015-02-13 10:10:02 | [diff] [blame] | 746 | EXPECT_TRUE(request2->browser_initiated()); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 747 | |
davidben | 6b77cd7 | 2014-10-29 21:13:45 | [diff] [blame] | 748 | // Confirm that the first loader got destroyed. |
| 749 | EXPECT_FALSE(loader1); |
| 750 | |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 751 | // Confirm that a new speculative RenderFrameHost was created. |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 752 | speculative_rfh = GetSpeculativeRenderFrameHost(node); |
| 753 | ASSERT_TRUE(speculative_rfh); |
Lukasz Anforowicz | 1de0a22 | 2021-07-26 22:02:32 | [diff] [blame] | 754 | auto site_instance_id_2 = speculative_rfh->GetSiteInstance()->GetId(); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 755 | |
Sharon Yang | 47453bb | 2025-04-25 14:48:09 | [diff] [blame] | 756 | if (AreStrictSiteInstancesEnabled()) { |
Sharon Yang | 0227922 | 2025-01-15 19:09:19 | [diff] [blame] | 757 | EXPECT_NE(site_instance_id_1, site_instance_id_2); |
| 758 | } else { |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 759 | EXPECT_TRUE(speculative_rfh->GetSiteInstance()->IsDefaultSiteInstance()); |
| 760 | EXPECT_EQ(site_instance_id_1, site_instance_id_2); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 761 | } |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 762 | |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 763 | navigation2->ReadyToCommit(); |
| 764 | EXPECT_EQ(speculative_rfh->navigation_requests().size(), 1u); |
| 765 | EXPECT_EQ(main_test_rfh()->navigation_requests().size(), 0u); |
| 766 | |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 767 | // Have the RenderFrameHost commit the navigation. |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 768 | navigation2->Commit(); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 769 | |
| 770 | // Confirm that the commit corresponds to the new request. |
| 771 | ASSERT_TRUE(main_test_rfh()); |
Sharon Yang | 47453bb | 2025-04-25 14:48:09 | [diff] [blame] | 772 | if (AreStrictSiteInstancesEnabled()) { |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 773 | EXPECT_EQ(kUrl2SiteInfo, main_test_rfh()->GetSiteInstance()->GetSiteInfo()); |
Sharon Yang | 0227922 | 2025-01-15 19:09:19 | [diff] [blame] | 774 | } else { |
| 775 | EXPECT_TRUE(main_test_rfh()->GetSiteInstance()->IsDefaultSiteInstance()); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 776 | } |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 777 | EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL()); |
| 778 | |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 779 | // Confirm that the committed RenderFrameHost is the latest speculative one. |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 780 | EXPECT_EQ(site_instance_id_2, main_test_rfh()->GetSiteInstance()->GetId()); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 781 | } |
| 782 | |
arthursonzogni | f34adf09 | 2018-04-24 17:06:13 | [diff] [blame] | 783 | // Test that a browser-initiated navigation is canceled if a renderer-initiated |
| 784 | // user-initiated request has been issued in the meantime. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 785 | TEST_F(NavigatorTest, RendererUserInitiatedNavigationCancel) { |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 786 | const GURL kUrl0("http://www.wikipedia.org/"); |
| 787 | const GURL kUrl1("http://www.chromium.org/"); |
| 788 | const GURL kUrl2("http://www.google.com/"); |
| 789 | |
| 790 | // Initialization. |
| 791 | contents()->NavigateAndCommit(kUrl0); |
| 792 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 793 | bool expect_site_instance_change = |
| 794 | ExpectSiteInstanceChange(main_test_rfh()->GetSiteInstance()); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 795 | |
Antonio Gomes | 8678a20 | 2020-03-02 20:03:25 | [diff] [blame] | 796 | // Start a browser-initiated navigation to the 1st URL and invoke its |
| 797 | // beforeUnload completion callback. |
Nasko Oskov | 2e9e011 | 2020-12-22 21:34:43 | [diff] [blame] | 798 | EXPECT_FALSE(node->navigation_request()); |
Arthur Hemery | 56fb25c | 2019-02-08 17:55:13 | [diff] [blame] | 799 | auto navigation2 = |
| 800 | NavigationSimulator::CreateBrowserInitiated(kUrl1, contents()); |
| 801 | navigation2->Start(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 802 | NavigationRequest* request1 = node->navigation_request(); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 803 | ASSERT_TRUE(request1); |
| 804 | EXPECT_EQ(kUrl1, request1->common_params().url); |
| 805 | EXPECT_TRUE(request1->browser_initiated()); |
| 806 | base::WeakPtr<TestNavigationURLLoader> loader1 = |
| 807 | GetLoaderForNavigationRequest(request1)->AsWeakPtr(); |
| 808 | EXPECT_TRUE(loader1); |
| 809 | |
carlosk | 42f59e6 | 2015-03-16 19:02:36 | [diff] [blame] | 810 | // Confirm that a speculative RenderFrameHost was created. |
| 811 | ASSERT_TRUE(GetSpeculativeRenderFrameHost(node)); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 812 | |
| 813 | // Now receive a renderer-initiated user-initiated request. It should replace |
| 814 | // the current NavigationRequest. |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 815 | auto navigation = |
| 816 | NavigationSimulator::CreateRendererInitiated(kUrl2, main_test_rfh()); |
| 817 | navigation->SetTransition(ui::PAGE_TRANSITION_LINK); |
| 818 | navigation->SetHasUserGesture(true); |
| 819 | navigation->Start(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 820 | NavigationRequest* request2 = node->navigation_request(); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 821 | ASSERT_TRUE(request2); |
| 822 | EXPECT_EQ(kUrl2, request2->common_params().url); |
| 823 | EXPECT_FALSE(request2->browser_initiated()); |
Arthur Hemery | 14a71ad2 | 2017-10-27 10:54:39 | [diff] [blame] | 824 | EXPECT_TRUE(request2->common_params().has_user_gesture); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 825 | |
| 826 | // Confirm that the first loader got destroyed. |
| 827 | EXPECT_FALSE(loader1); |
| 828 | |
clamy | 61dfb23 | 2016-02-26 18:08:49 | [diff] [blame] | 829 | // Confirm that the speculative RenderFrameHost was destroyed in the non |
| 830 | // SitePerProcess case. |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 831 | if (expect_site_instance_change) { |
clamy | 61dfb23 | 2016-02-26 18:08:49 | [diff] [blame] | 832 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 833 | } else { |
| 834 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 835 | } |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 836 | |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 837 | // Commit the navigation. |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 838 | navigation->Commit(); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 839 | |
| 840 | // Confirm that the commit corresponds to the new request. |
| 841 | ASSERT_TRUE(main_test_rfh()); |
| 842 | EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL()); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 843 | } |
| 844 | |
Arthur Hemery | 0dd6581 | 2019-08-01 14:18:45 | [diff] [blame] | 845 | // Tests that a renderer-initiated user-initiated navigation is |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 846 | // canceled if a renderer-initiated non-user-initiated request is issued in the |
| 847 | // meantime. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 848 | TEST_F(NavigatorTest, |
Nasko Oskov | 6cbfad5 | 2017-08-17 11:31:01 | [diff] [blame] | 849 | RendererNonUserInitiatedNavigationCancelsRendererUserInitiated) { |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 850 | const GURL kUrl0("http://www.wikipedia.org/"); |
| 851 | const GURL kUrl1("http://www.chromium.org/"); |
| 852 | const GURL kUrl2("http://www.google.com/"); |
| 853 | |
| 854 | // Initialization. |
| 855 | contents()->NavigateAndCommit(kUrl0); |
| 856 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 857 | bool expect_site_instance_change = |
| 858 | ExpectSiteInstanceChange(main_test_rfh()->GetSiteInstance()); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 859 | |
| 860 | // Start a renderer-initiated user-initiated navigation to the 1st URL. |
Nasko Oskov | 2e9e011 | 2020-12-22 21:34:43 | [diff] [blame] | 861 | EXPECT_FALSE(node->navigation_request()); |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 862 | auto user_initiated_navigation = |
| 863 | NavigationSimulator::CreateRendererInitiated(kUrl1, main_test_rfh()); |
| 864 | user_initiated_navigation->SetTransition(ui::PAGE_TRANSITION_LINK); |
| 865 | user_initiated_navigation->SetHasUserGesture(true); |
| 866 | user_initiated_navigation->Start(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 867 | NavigationRequest* request1 = node->navigation_request(); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 868 | ASSERT_TRUE(request1); |
| 869 | EXPECT_EQ(kUrl1, request1->common_params().url); |
| 870 | EXPECT_FALSE(request1->browser_initiated()); |
Arthur Hemery | 14a71ad2 | 2017-10-27 10:54:39 | [diff] [blame] | 871 | EXPECT_TRUE(request1->common_params().has_user_gesture); |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 872 | if (expect_site_instance_change) { |
clamy | 61dfb23 | 2016-02-26 18:08:49 | [diff] [blame] | 873 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 874 | } else { |
| 875 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 876 | } |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 877 | |
Nasko Oskov | 6cbfad5 | 2017-08-17 11:31:01 | [diff] [blame] | 878 | // Now receive a renderer-initiated non-user-initiated request. The previous |
| 879 | // navigation should be replaced. |
| 880 | auto non_user_initiated_navigation = |
| 881 | NavigationSimulator::CreateRendererInitiated(kUrl2, main_test_rfh()); |
| 882 | non_user_initiated_navigation->SetTransition(ui::PAGE_TRANSITION_LINK); |
| 883 | non_user_initiated_navigation->SetHasUserGesture(false); |
| 884 | non_user_initiated_navigation->Start(); |
| 885 | |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 886 | NavigationRequest* request2 = node->navigation_request(); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 887 | ASSERT_TRUE(request2); |
Nasko Oskov | 6cbfad5 | 2017-08-17 11:31:01 | [diff] [blame] | 888 | EXPECT_NE(request1, request2); |
| 889 | EXPECT_EQ(kUrl2, request2->common_params().url); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 890 | EXPECT_FALSE(request2->browser_initiated()); |
Arthur Hemery | 14a71ad2 | 2017-10-27 10:54:39 | [diff] [blame] | 891 | EXPECT_FALSE(request2->common_params().has_user_gesture); |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 892 | if (expect_site_instance_change) { |
clamy | 61dfb23 | 2016-02-26 18:08:49 | [diff] [blame] | 893 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 894 | } else { |
| 895 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 896 | } |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 897 | |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 898 | // Commit the navigation. |
Nasko Oskov | 6cbfad5 | 2017-08-17 11:31:01 | [diff] [blame] | 899 | non_user_initiated_navigation->Commit(); |
| 900 | EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL()); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 901 | } |
| 902 | |
| 903 | // PlzNavigate: Test that a browser-initiated navigation is NOT canceled if a |
| 904 | // renderer-initiated non-user-initiated request is issued in the meantime. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 905 | TEST_F(NavigatorTest, |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 906 | RendererNonUserInitiatedNavigationDoesntCancelBrowserInitiated) { |
| 907 | const GURL kUrl0("http://www.wikipedia.org/"); |
| 908 | const GURL kUrl1("http://www.chromium.org/"); |
| 909 | const GURL kUrl2("http://www.google.com/"); |
| 910 | |
| 911 | // Initialization. |
| 912 | contents()->NavigateAndCommit(kUrl0); |
| 913 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
| 914 | |
| 915 | // Start a browser-initiated navigation to the 1st URL. |
Nasko Oskov | 2e9e011 | 2020-12-22 21:34:43 | [diff] [blame] | 916 | EXPECT_FALSE(node->navigation_request()); |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 917 | auto navigation = |
| 918 | NavigationSimulator::CreateBrowserInitiated(kUrl1, contents()); |
| 919 | navigation->Start(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 920 | NavigationRequest* request1 = node->navigation_request(); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 921 | ASSERT_TRUE(request1); |
| 922 | EXPECT_EQ(kUrl1, request1->common_params().url); |
| 923 | EXPECT_TRUE(request1->browser_initiated()); |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 924 | TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node); |
| 925 | ASSERT_TRUE(speculative_rfh); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 926 | |
| 927 | // Now receive a renderer-initiated non-user-initiated request. Nothing should |
| 928 | // change. |
Arthur Hemery | 7b67a97 | 2017-12-01 15:24:49 | [diff] [blame] | 929 | main_test_rfh()->SendRendererInitiatedNavigationRequest( |
| 930 | kUrl2, false /* has_user_gesture */); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 931 | NavigationRequest* request2 = node->navigation_request(); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 932 | ASSERT_TRUE(request2); |
| 933 | EXPECT_EQ(request1, request2); |
| 934 | EXPECT_EQ(kUrl1, request2->common_params().url); |
| 935 | EXPECT_TRUE(request2->browser_initiated()); |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 936 | EXPECT_TRUE(speculative_rfh); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 937 | |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 938 | navigation->ReadyToCommit(); |
| 939 | EXPECT_EQ(speculative_rfh->navigation_requests().size(), 1u); |
| 940 | EXPECT_EQ(main_test_rfh()->navigation_requests().size(), 0u); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 941 | |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 942 | navigation->Commit(); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 943 | EXPECT_EQ(kUrl1, contents()->GetLastCommittedURL()); |
| 944 | } |
| 945 | |
| 946 | // PlzNavigate: Test that a renderer-initiated non-user-initiated navigation is |
| 947 | // canceled if a another similar request is issued in the meantime. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 948 | TEST_F(NavigatorTest, |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 949 | RendererNonUserInitiatedNavigationCancelSimilarNavigation) { |
| 950 | const GURL kUrl0("http://www.wikipedia.org/"); |
| 951 | const GURL kUrl1("http://www.chromium.org/"); |
| 952 | const GURL kUrl2("http://www.google.com/"); |
| 953 | |
| 954 | // Initialization. |
| 955 | contents()->NavigateAndCommit(kUrl0); |
| 956 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
Lukasz Anforowicz | 1de0a22 | 2021-07-26 22:02:32 | [diff] [blame] | 957 | auto site_instance_id_0 = main_test_rfh()->GetSiteInstance()->GetId(); |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 958 | bool expect_site_instance_change = |
| 959 | ExpectSiteInstanceChange(main_test_rfh()->GetSiteInstance()); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 960 | |
| 961 | // Start a renderer-initiated non-user-initiated navigation to the 1st URL. |
Nasko Oskov | 2e9e011 | 2020-12-22 21:34:43 | [diff] [blame] | 962 | EXPECT_FALSE(node->navigation_request()); |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 963 | auto navigation1 = |
| 964 | NavigationSimulator::CreateRendererInitiated(kUrl1, main_test_rfh()); |
| 965 | navigation1->SetTransition(ui::PageTransitionFromInt( |
| 966 | ui::PAGE_TRANSITION_LINK | ui::PAGE_TRANSITION_CLIENT_REDIRECT)); |
| 967 | navigation1->SetHasUserGesture(false); |
| 968 | navigation1->Start(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 969 | NavigationRequest* request1 = node->navigation_request(); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 970 | ASSERT_TRUE(request1); |
| 971 | EXPECT_EQ(kUrl1, request1->common_params().url); |
| 972 | EXPECT_FALSE(request1->browser_initiated()); |
Arthur Hemery | 14a71ad2 | 2017-10-27 10:54:39 | [diff] [blame] | 973 | EXPECT_FALSE(request1->common_params().has_user_gesture); |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 974 | if (expect_site_instance_change) { |
clamy | 61dfb23 | 2016-02-26 18:08:49 | [diff] [blame] | 975 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 976 | } else { |
| 977 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 978 | } |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 979 | base::WeakPtr<TestNavigationURLLoader> loader1 = |
| 980 | GetLoaderForNavigationRequest(request1)->AsWeakPtr(); |
| 981 | EXPECT_TRUE(loader1); |
| 982 | |
| 983 | // Now receive a 2nd similar request that should replace the current one. |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 984 | auto navigation2 = |
| 985 | NavigationSimulator::CreateRendererInitiated(kUrl2, main_test_rfh()); |
| 986 | navigation2->SetTransition(ui::PageTransitionFromInt( |
| 987 | ui::PAGE_TRANSITION_LINK | ui::PAGE_TRANSITION_CLIENT_REDIRECT)); |
| 988 | navigation2->SetHasUserGesture(false); |
| 989 | navigation2->Start(); |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 990 | NavigationRequest* request2 = node->navigation_request(); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 991 | EXPECT_EQ(kUrl2, request2->common_params().url); |
| 992 | EXPECT_FALSE(request2->browser_initiated()); |
Arthur Hemery | 14a71ad2 | 2017-10-27 10:54:39 | [diff] [blame] | 993 | EXPECT_FALSE(request2->common_params().has_user_gesture); |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 994 | if (expect_site_instance_change) { |
clamy | 61dfb23 | 2016-02-26 18:08:49 | [diff] [blame] | 995 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 996 | } else { |
| 997 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 998 | } |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 999 | |
| 1000 | // Confirm that the first loader got destroyed. |
| 1001 | EXPECT_FALSE(loader1); |
| 1002 | |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 1003 | // Commit the navigation. |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 1004 | navigation2->Commit(); |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 1005 | EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL()); |
carlosk | 42f59e6 | 2015-03-16 19:02:36 | [diff] [blame] | 1006 | |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 1007 | if (expect_site_instance_change) { |
arthursonzogni | 9143943 | 2017-08-16 16:32:37 | [diff] [blame] | 1008 | EXPECT_NE(site_instance_id_0, main_test_rfh()->GetSiteInstance()->GetId()); |
| 1009 | } else { |
| 1010 | EXPECT_EQ(site_instance_id_0, main_test_rfh()->GetSiteInstance()->GetId()); |
| 1011 | } |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 1012 | } |
| 1013 | |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 1014 | // PlzNavigate: Test that a reload navigation is properly signaled to the |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1015 | // RenderFrame when the navigation can commit. A speculative RenderFrameHost |
Rakina Zata Amni | dfcab2e5 | 2023-08-26 07:11:59 | [diff] [blame] | 1016 | // should not be created at any step, unless RenderDocument is enabled. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 1017 | TEST_F(NavigatorTest, Reload) { |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 1018 | const GURL kUrl("http://www.google.com/"); |
| 1019 | contents()->NavigateAndCommit(kUrl); |
| 1020 | |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 1021 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
toyoshim | 6142d96f | 2016-12-19 09:07:25 | [diff] [blame] | 1022 | controller().Reload(ReloadType::NORMAL, false); |
Matt Falkenhagen | 197a3b6a | 2021-09-29 18:24:03 | [diff] [blame] | 1023 | auto reload1 = |
| 1024 | NavigationSimulator::CreateFromPending(contents()->GetController()); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 1025 | // A NavigationRequest should have been generated. |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 1026 | NavigationRequest* main_request = node->navigation_request(); |
Ivan Kotenkov | 2c0d2bb3 | 2017-11-01 15:41:28 | [diff] [blame] | 1027 | ASSERT_TRUE(main_request != nullptr); |
Minggang Wang | b9f3fa9 | 2021-07-01 15:30:31 | [diff] [blame] | 1028 | EXPECT_EQ(blink::mojom::NavigationType::RELOAD, |
toyoshim | 980f117 | 2016-12-02 08:15:53 | [diff] [blame] | 1029 | main_request->common_params().navigation_type); |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 1030 | reload1->ReadyToCommit(); |
Rakina Zata Amni | dfcab2e5 | 2023-08-26 07:11:59 | [diff] [blame] | 1031 | if (ShouldCreateNewHostForAllFrames()) { |
| 1032 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 1033 | } else { |
| 1034 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 1035 | } |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1036 | |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 1037 | reload1->Commit(); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1038 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 1039 | |
| 1040 | // Now do a shift+reload. |
toyoshim | 6142d96f | 2016-12-19 09:07:25 | [diff] [blame] | 1041 | controller().Reload(ReloadType::BYPASSING_CACHE, false); |
Matt Falkenhagen | 197a3b6a | 2021-09-29 18:24:03 | [diff] [blame] | 1042 | auto reload2 = |
| 1043 | NavigationSimulator::CreateFromPending(contents()->GetController()); |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 1044 | // A NavigationRequest should have been generated. |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 1045 | main_request = node->navigation_request(); |
Ivan Kotenkov | 2c0d2bb3 | 2017-11-01 15:41:28 | [diff] [blame] | 1046 | ASSERT_TRUE(main_request != nullptr); |
Minggang Wang | b9f3fa9 | 2021-07-01 15:30:31 | [diff] [blame] | 1047 | EXPECT_EQ(blink::mojom::NavigationType::RELOAD_BYPASSING_CACHE, |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 1048 | main_request->common_params().navigation_type); |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 1049 | reload2->ReadyToCommit(); |
Rakina Zata Amni | dfcab2e5 | 2023-08-26 07:11:59 | [diff] [blame] | 1050 | if (ShouldCreateNewHostForAllFrames()) { |
| 1051 | EXPECT_TRUE(GetSpeculativeRenderFrameHost(node)); |
| 1052 | } else { |
| 1053 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 1054 | } |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1055 | } |
| 1056 | |
| 1057 | // PlzNavigate: Confirm that a speculative RenderFrameHost is used when |
| 1058 | // navigating from one site to another. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 1059 | TEST_F(NavigatorTest, SpeculativeRendererWorksBaseCase) { |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1060 | // Navigate to an initial site. |
| 1061 | const GURL kUrlInit("http://wikipedia.org/"); |
| 1062 | contents()->NavigateAndCommit(kUrlInit); |
| 1063 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
| 1064 | |
| 1065 | // Begin navigating to another site. |
| 1066 | const GURL kUrl("http://google.com/"); |
Nasko Oskov | 2e9e011 | 2020-12-22 21:34:43 | [diff] [blame] | 1067 | EXPECT_FALSE(node->navigation_request()); |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 1068 | auto navigation = |
| 1069 | NavigationSimulator::CreateBrowserInitiated(kUrl, contents()); |
| 1070 | navigation->Start(); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1071 | TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node); |
Lukasz Anforowicz | 1de0a22 | 2021-07-26 22:02:32 | [diff] [blame] | 1072 | auto site_instance_id = speculative_rfh->GetSiteInstance()->GetId(); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1073 | ASSERT_TRUE(speculative_rfh); |
| 1074 | EXPECT_NE(speculative_rfh, main_test_rfh()); |
Sharon Yang | 47453bb | 2025-04-25 14:48:09 | [diff] [blame] | 1075 | if (AreStrictSiteInstancesEnabled()) { |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 1076 | EXPECT_EQ(CreateExpectedSiteInfo(kUrl), |
| 1077 | speculative_rfh->GetSiteInstance()->GetSiteInfo()); |
Sharon Yang | 0227922 | 2025-01-15 19:09:19 | [diff] [blame] | 1078 | } else { |
| 1079 | EXPECT_TRUE(speculative_rfh->GetSiteInstance()->IsDefaultSiteInstance()); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 1080 | } |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1081 | |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 1082 | navigation->ReadyToCommit(); |
| 1083 | EXPECT_EQ(speculative_rfh->navigation_requests().size(), 1u); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1084 | |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 1085 | // Ask the navigation to commit. |
| 1086 | navigation->Commit(); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1087 | EXPECT_EQ(site_instance_id, main_test_rfh()->GetSiteInstance()->GetId()); |
| 1088 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1089 | } |
| 1090 | |
| 1091 | // PlzNavigate: Confirm that a speculative RenderFrameHost is thrown away when |
| 1092 | // the final URL's site differs from the initial one due to redirects. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 1093 | TEST_F(NavigatorTest, SpeculativeRendererDiscardedAfterRedirectToAnotherSite) { |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1094 | // Navigate to an initial site. |
| 1095 | const GURL kUrlInit("http://wikipedia.org/"); |
| 1096 | contents()->NavigateAndCommit(kUrlInit); |
| 1097 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
Lukasz Anforowicz | 1de0a22 | 2021-07-26 22:02:32 | [diff] [blame] | 1098 | auto init_site_instance_id = main_test_rfh()->GetSiteInstance()->GetId(); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1099 | |
| 1100 | // Begin navigating to another site. |
| 1101 | const GURL kUrl("http://google.com/"); |
Nasko Oskov | 2e9e011 | 2020-12-22 21:34:43 | [diff] [blame] | 1102 | EXPECT_FALSE(node->navigation_request()); |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 1103 | auto navigation = |
| 1104 | NavigationSimulator::CreateBrowserInitiated(kUrl, contents()); |
| 1105 | navigation->Start(); |
| 1106 | |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1107 | TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node); |
carlosk | c49005eb | 2015-06-16 11:25:07 | [diff] [blame] | 1108 | ASSERT_TRUE(speculative_rfh); |
Lukasz Anforowicz | 1de0a22 | 2021-07-26 22:02:32 | [diff] [blame] | 1109 | auto site_instance_id = speculative_rfh->GetSiteInstance()->GetId(); |
carlosk | a0350db | 2015-07-30 20:10:57 | [diff] [blame] | 1110 | RenderFrameDeletedObserver rfh_deleted_observer(speculative_rfh); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1111 | EXPECT_NE(init_site_instance_id, site_instance_id); |
| 1112 | EXPECT_EQ(init_site_instance_id, main_test_rfh()->GetSiteInstance()->GetId()); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1113 | EXPECT_NE(speculative_rfh, main_test_rfh()); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 1114 | |
Sharon Yang | 47453bb | 2025-04-25 14:48:09 | [diff] [blame] | 1115 | if (AreStrictSiteInstancesEnabled()) { |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 1116 | EXPECT_EQ(CreateExpectedSiteInfo(kUrl), |
| 1117 | speculative_rfh->GetSiteInstance()->GetSiteInfo()); |
Sharon Yang | 0227922 | 2025-01-15 19:09:19 | [diff] [blame] | 1118 | } else { |
| 1119 | EXPECT_TRUE(speculative_rfh->GetSiteInstance()->IsDefaultSiteInstance()); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 1120 | } |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1121 | |
| 1122 | // It then redirects to yet another site. |
clamy | dcb434c1 | 2015-04-16 19:29:16 | [diff] [blame] | 1123 | NavigationRequest* main_request = node->navigation_request(); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1124 | ASSERT_TRUE(main_request); |
| 1125 | const GURL kUrlRedirect("https://www.google.com/"); |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 1126 | navigation->Redirect(kUrlRedirect); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1127 | EXPECT_EQ(init_site_instance_id, main_test_rfh()->GetSiteInstance()->GetId()); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1128 | |
carlosk | f470789 | 2015-02-19 18:47:40 | [diff] [blame] | 1129 | // For now, ensure that the speculative RenderFrameHost does not change after |
| 1130 | // the redirect. |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1131 | // TODO(carlosk): once the speculative RenderFrameHost updates with redirects |
| 1132 | // this next check will be changed to verify that it actually happens. |
carlosk | c49005eb | 2015-06-16 11:25:07 | [diff] [blame] | 1133 | EXPECT_EQ(speculative_rfh, GetSpeculativeRenderFrameHost(node)); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1134 | EXPECT_EQ(site_instance_id, speculative_rfh->GetSiteInstance()->GetId()); |
carlosk | a0350db | 2015-07-30 20:10:57 | [diff] [blame] | 1135 | EXPECT_FALSE(rfh_deleted_observer.deleted()); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1136 | |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 1137 | // Send the commit to the renderer. |
| 1138 | navigation->ReadyToCommit(); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 1139 | |
| 1140 | // Once commit happens the speculative RenderFrameHost is updated to match the |
| 1141 | // known final SiteInstance. |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1142 | speculative_rfh = GetSpeculativeRenderFrameHost(node); |
carlosk | c49005eb | 2015-06-16 11:25:07 | [diff] [blame] | 1143 | ASSERT_TRUE(speculative_rfh); |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 1144 | EXPECT_EQ(speculative_rfh->navigation_requests().size(), 1u); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1145 | EXPECT_EQ(init_site_instance_id, main_test_rfh()->GetSiteInstance()->GetId()); |
| 1146 | |
Lukasz Anforowicz | 1de0a22 | 2021-07-26 22:02:32 | [diff] [blame] | 1147 | auto redirect_site_instance_id = speculative_rfh->GetSiteInstance()->GetId(); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 1148 | |
| 1149 | // Expect the initial and redirect SiteInstances to be different because |
| 1150 | // they should be associated with different BrowsingInstances. |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1151 | EXPECT_NE(init_site_instance_id, redirect_site_instance_id); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 1152 | |
Sharon Yang | 47453bb | 2025-04-25 14:48:09 | [diff] [blame] | 1153 | if (AreStrictSiteInstancesEnabled()) { |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 1154 | EXPECT_EQ(CreateExpectedSiteInfo(kUrlRedirect), |
| 1155 | speculative_rfh->GetSiteInstance()->GetSiteInfo()); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 1156 | EXPECT_NE(site_instance_id, redirect_site_instance_id); |
| 1157 | |
| 1158 | // Verify the old speculative RenderFrameHost was deleted because |
| 1159 | // the SiteInstance changed. |
| 1160 | EXPECT_TRUE(rfh_deleted_observer.deleted()); |
Sharon Yang | 0227922 | 2025-01-15 19:09:19 | [diff] [blame] | 1161 | } else { |
| 1162 | EXPECT_TRUE(speculative_rfh->GetSiteInstance()->IsDefaultSiteInstance()); |
| 1163 | EXPECT_EQ(site_instance_id, redirect_site_instance_id); |
| 1164 | |
| 1165 | // Verify the old speculative RenderFrameHost was not deleted because |
| 1166 | // the SiteInstance stayed the same. |
| 1167 | EXPECT_FALSE(rfh_deleted_observer.deleted()); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 1168 | } |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1169 | |
Balazs Engedy | a40712f | 2017-09-15 15:01:11 | [diff] [blame] | 1170 | // Invoke DidCommitProvisionalLoad. |
Arthur Hemery | 859f346 | 2019-01-29 16:29:07 | [diff] [blame] | 1171 | navigation->Commit(); |
carlosk | 3933711 | 2015-01-14 21:44:51 | [diff] [blame] | 1172 | |
| 1173 | // Check that the speculative RenderFrameHost was swapped in. |
| 1174 | EXPECT_EQ(redirect_site_instance_id, |
| 1175 | main_test_rfh()->GetSiteInstance()->GetId()); |
| 1176 | EXPECT_FALSE(GetSpeculativeRenderFrameHost(node)); |
| 1177 | } |
| 1178 | |
clamy | 4cc9b820 | 2015-03-02 13:51:36 | [diff] [blame] | 1179 | // PlzNavigate: Verify that data urls are properly handled. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 1180 | TEST_F(NavigatorTest, DataUrls) { |
clamy | 4cc9b820 | 2015-03-02 13:51:36 | [diff] [blame] | 1181 | const GURL kUrl1("http://wikipedia.org/"); |
| 1182 | const GURL kUrl2("data:text/html,test"); |
| 1183 | |
Aaron Colwell | e953e56 | 2019-07-24 16:47:36 | [diff] [blame] | 1184 | // Isolate kUrl1 so it can't be mapped into a default SiteInstance along with |
| 1185 | // kUrl2. This ensures that the speculative RenderFrameHost will always be |
| 1186 | // used because the URLs map to different SiteInstances. |
Alex Moshchuk | ef8c256 | 2021-03-12 06:37:45 | [diff] [blame] | 1187 | ChildProcessSecurityPolicy::GetInstance()->AddFutureIsolatedOrigins( |
Aaron Colwell | e953e56 | 2019-07-24 16:47:36 | [diff] [blame] | 1188 | {url::Origin::Create(kUrl1)}, |
| 1189 | ChildProcessSecurityPolicy::IsolatedOriginSource::TEST, |
| 1190 | browser_context()); |
| 1191 | |
clamy | 4cc9b820 | 2015-03-02 13:51:36 | [diff] [blame] | 1192 | // Navigate to an initial site. |
| 1193 | contents()->NavigateAndCommit(kUrl1); |
| 1194 | FrameTreeNode* node = main_test_rfh()->frame_tree_node(); |
| 1195 | |
Aaron Colwell | e953e56 | 2019-07-24 16:47:36 | [diff] [blame] | 1196 | EXPECT_FALSE(main_test_rfh()->GetSiteInstance()->IsDefaultSiteInstance()); |
| 1197 | |
arthursonzogni | 0749938 | 2016-09-20 10:24:29 | [diff] [blame] | 1198 | // Navigate to a data url. The request should have been sent to the IO |
| 1199 | // thread and not committed immediately. |
Arthur Hemery | 56fb25c | 2019-02-08 17:55:13 | [diff] [blame] | 1200 | auto navigation = |
| 1201 | NavigationSimulator::CreateBrowserInitiated(kUrl2, contents()); |
| 1202 | navigation->Start(); |
clamy | 4cc9b820 | 2015-03-02 13:51:36 | [diff] [blame] | 1203 | TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node); |
| 1204 | ASSERT_TRUE(speculative_rfh); |
arthursonzogni | 0749938 | 2016-09-20 10:24:29 | [diff] [blame] | 1205 | EXPECT_FALSE(speculative_rfh->is_loading()); |
| 1206 | EXPECT_TRUE(node->navigation_request()); |
Arthur Hemery | 56fb25c | 2019-02-08 17:55:13 | [diff] [blame] | 1207 | navigation->ReadyToCommit(); |
clamy | efdb7a4 | 2015-07-01 16:55:47 | [diff] [blame] | 1208 | EXPECT_TRUE(speculative_rfh->is_loading()); |
| 1209 | EXPECT_FALSE(node->navigation_request()); |
arthursonzogni | 0749938 | 2016-09-20 10:24:29 | [diff] [blame] | 1210 | EXPECT_NE(main_test_rfh(), speculative_rfh); |
Arthur Hemery | 56fb25c | 2019-02-08 17:55:13 | [diff] [blame] | 1211 | navigation->Commit(); |
clamy | 4cc9b820 | 2015-03-02 13:51:36 | [diff] [blame] | 1212 | EXPECT_EQ(main_test_rfh(), speculative_rfh); |
| 1213 | |
| 1214 | // Go back to the initial site. |
| 1215 | contents()->NavigateAndCommit(kUrl1); |
| 1216 | |
arthursonzogni | 0749938 | 2016-09-20 10:24:29 | [diff] [blame] | 1217 | // Do a renderer-initiated navigation to a data url. The request should be |
| 1218 | // sent to the IO thread. |
arthursonzogni | 63aa3f37 | 2017-08-09 14:28:39 | [diff] [blame] | 1219 | auto navigation_to_data_url = |
| 1220 | NavigationSimulator::CreateRendererInitiated(kUrl2, main_test_rfh()); |
| 1221 | navigation_to_data_url->Start(); |
Arthur Hemery | 70030a1 | 2019-08-05 10:51:16 | [diff] [blame] | 1222 | EXPECT_FALSE(main_test_rfh()->is_loading()); |
arthursonzogni | 0749938 | 2016-09-20 10:24:29 | [diff] [blame] | 1223 | EXPECT_TRUE(node->navigation_request()); |
clamy | 4cc9b820 | 2015-03-02 13:51:36 | [diff] [blame] | 1224 | } |
| 1225 | |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1226 | // Tests several cases for converting SiteInstanceDescriptors into |
| 1227 | // SiteInstances: |
| 1228 | // 1) Pointer to the current SiteInstance. |
| 1229 | // 2) Pointer to an unrelated SiteInstance. |
| 1230 | // 3) Same-site URL, related. |
| 1231 | // 4) Cross-site URL, related. |
| 1232 | // 5) Same-site URL, unrelated (with and without candidate SiteInstances). |
| 1233 | // 6) Cross-site URL, unrelated (with candidate SiteInstance). |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 1234 | TEST_F(NavigatorTest, SiteInstanceDescriptionConversion) { |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1235 | // Navigate to set a current SiteInstance on the RenderFrameHost. |
| 1236 | GURL kUrl1("http://a.com"); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 1237 | // Isolate one of the sites so the both can't be mapped to the default |
| 1238 | // site instance. |
Alex Moshchuk | ef8c256 | 2021-03-12 06:37:45 | [diff] [blame] | 1239 | ChildProcessSecurityPolicy::GetInstance()->AddFutureIsolatedOrigins( |
Alex Moshchuk | c467942 | 2019-06-11 17:04:48 | [diff] [blame] | 1240 | {url::Origin::Create(kUrl1)}, |
| 1241 | ChildProcessSecurityPolicy::IsolatedOriginSource::TEST, |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 1242 | browser_context()); |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1243 | contents()->NavigateAndCommit(kUrl1); |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 1244 | SiteInstanceImpl* current_instance = main_test_rfh()->GetSiteInstance(); |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1245 | ASSERT_TRUE(current_instance); |
| 1246 | |
| 1247 | // 1) Convert a descriptor pointing to the current instance. |
| 1248 | RenderFrameHostManager* rfhm = |
| 1249 | main_test_rfh()->frame_tree_node()->render_manager(); |
| 1250 | { |
| 1251 | SiteInstanceDescriptor descriptor(current_instance); |
dcheng | bccd6b8 | 2016-03-30 16:24:19 | [diff] [blame] | 1252 | scoped_refptr<SiteInstance> converted_instance = |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1253 | ConvertToSiteInstance(rfhm, descriptor, nullptr); |
| 1254 | EXPECT_EQ(current_instance, converted_instance); |
| 1255 | } |
| 1256 | |
| 1257 | // 2) Convert a descriptor pointing an instance unrelated to the current one, |
| 1258 | // with a different site. |
| 1259 | GURL kUrl2("http://b.com"); |
Charlie Reis | 37be268 | 2023-01-10 17:04:47 | [diff] [blame] | 1260 | scoped_refptr<SiteInstanceImpl> unrelated_instance( |
| 1261 | SiteInstanceImpl::CreateForURL(browser_context(), kUrl2)); |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1262 | EXPECT_FALSE( |
| 1263 | current_instance->IsRelatedSiteInstance(unrelated_instance.get())); |
| 1264 | { |
| 1265 | SiteInstanceDescriptor descriptor(unrelated_instance.get()); |
dcheng | bccd6b8 | 2016-03-30 16:24:19 | [diff] [blame] | 1266 | scoped_refptr<SiteInstance> converted_instance = |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1267 | ConvertToSiteInstance(rfhm, descriptor, nullptr); |
| 1268 | EXPECT_EQ(unrelated_instance.get(), converted_instance); |
| 1269 | } |
| 1270 | |
| 1271 | // 3) Convert a descriptor of a related instance with the same site as the |
| 1272 | // current one. |
| 1273 | GURL kUrlSameSiteAs1("http://www.a.com/foo"); |
| 1274 | { |
Arthur Hemery | 2e1d149b | 2020-08-21 14:23:54 | [diff] [blame] | 1275 | SiteInstanceDescriptor descriptor( |
W. James MacLean | 46cf2621 | 2020-10-01 16:43:37 | [diff] [blame] | 1276 | UrlInfo::CreateForTesting(kUrlSameSiteAs1), |
Arthur Hemery | 821fa5d | 2021-08-30 13:32:42 | [diff] [blame] | 1277 | SiteInstanceRelation::RELATED); |
dcheng | bccd6b8 | 2016-03-30 16:24:19 | [diff] [blame] | 1278 | scoped_refptr<SiteInstance> converted_instance = |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1279 | ConvertToSiteInstance(rfhm, descriptor, nullptr); |
| 1280 | EXPECT_EQ(current_instance, converted_instance); |
| 1281 | } |
| 1282 | |
| 1283 | // 4) Convert a descriptor of a related instance with a site different from |
| 1284 | // the current one. |
| 1285 | GURL kUrlSameSiteAs2("http://www.b.com/foo"); |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 1286 | scoped_refptr<SiteInstanceImpl> related_instance; |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1287 | { |
Arthur Hemery | 2e1d149b | 2020-08-21 14:23:54 | [diff] [blame] | 1288 | SiteInstanceDescriptor descriptor( |
W. James MacLean | 46cf2621 | 2020-10-01 16:43:37 | [diff] [blame] | 1289 | UrlInfo::CreateForTesting(kUrlSameSiteAs2), |
Arthur Hemery | 821fa5d | 2021-08-30 13:32:42 | [diff] [blame] | 1290 | SiteInstanceRelation::RELATED); |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1291 | related_instance = ConvertToSiteInstance(rfhm, descriptor, nullptr); |
Aaron Colwell | ddeccbdb | 2019-03-08 01:11:03 | [diff] [blame] | 1292 | // If kUrlSameSiteAs2 requires a dedicated process on this platform, this |
| 1293 | // should return a new instance, related to the current and set to the new |
| 1294 | // site URL. |
| 1295 | // Otherwise, this should return the default site instance |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1296 | EXPECT_TRUE( |
| 1297 | current_instance->IsRelatedSiteInstance(related_instance.get())); |
| 1298 | EXPECT_NE(current_instance, related_instance.get()); |
| 1299 | EXPECT_NE(unrelated_instance.get(), related_instance.get()); |
Aaron Colwell | ddeccbdb | 2019-03-08 01:11:03 | [diff] [blame] | 1300 | |
Sharon Yang | 47453bb | 2025-04-25 14:48:09 | [diff] [blame] | 1301 | if (AreStrictSiteInstancesEnabled()) { |
Aaron Colwell | 9d0f939 | 2021-02-11 21:51:52 | [diff] [blame] | 1302 | EXPECT_EQ(SiteInfo::CreateForTesting( |
Aaron Colwell | 5fb87804 | 2020-12-17 19:48:44 | [diff] [blame] | 1303 | current_instance->GetIsolationContext(), kUrlSameSiteAs2), |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 1304 | related_instance->GetSiteInfo()); |
Sharon Yang | 0227922 | 2025-01-15 19:09:19 | [diff] [blame] | 1305 | } else { |
| 1306 | ASSERT_TRUE(related_instance->IsDefaultSiteInstance()); |
Aaron Colwell | ddeccbdb | 2019-03-08 01:11:03 | [diff] [blame] | 1307 | } |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1308 | } |
| 1309 | |
| 1310 | // 5) Convert a descriptor of an unrelated instance with the same site as the |
| 1311 | // current one, several times, with and without candidate sites. |
| 1312 | { |
Arthur Hemery | 2e1d149b | 2020-08-21 14:23:54 | [diff] [blame] | 1313 | SiteInstanceDescriptor descriptor( |
W. James MacLean | 46cf2621 | 2020-10-01 16:43:37 | [diff] [blame] | 1314 | UrlInfo::CreateForTesting(kUrlSameSiteAs1), |
Arthur Hemery | 821fa5d | 2021-08-30 13:32:42 | [diff] [blame] | 1315 | SiteInstanceRelation::UNRELATED); |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 1316 | scoped_refptr<SiteInstanceImpl> converted_instance_1 = |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1317 | ConvertToSiteInstance(rfhm, descriptor, nullptr); |
| 1318 | // Should return a new instance, unrelated to the current one, set to the |
| 1319 | // provided site URL. |
| 1320 | EXPECT_FALSE( |
| 1321 | current_instance->IsRelatedSiteInstance(converted_instance_1.get())); |
| 1322 | EXPECT_NE(current_instance, converted_instance_1.get()); |
| 1323 | EXPECT_NE(unrelated_instance.get(), converted_instance_1.get()); |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 1324 | EXPECT_EQ(CreateExpectedSiteInfo(kUrlSameSiteAs1), |
| 1325 | converted_instance_1->GetSiteInfo()); |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1326 | |
| 1327 | // Does the same but this time using unrelated_instance as a candidate, |
| 1328 | // which has a different site. |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 1329 | scoped_refptr<SiteInstanceImpl> converted_instance_2 = |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1330 | ConvertToSiteInstance(rfhm, descriptor, unrelated_instance.get()); |
| 1331 | // Should return yet another new instance, unrelated to the current one, set |
| 1332 | // to the same site URL. |
| 1333 | EXPECT_FALSE( |
| 1334 | current_instance->IsRelatedSiteInstance(converted_instance_2.get())); |
| 1335 | EXPECT_NE(current_instance, converted_instance_2.get()); |
| 1336 | EXPECT_NE(unrelated_instance.get(), converted_instance_2.get()); |
| 1337 | EXPECT_NE(converted_instance_1.get(), converted_instance_2.get()); |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 1338 | EXPECT_EQ(CreateExpectedSiteInfo(kUrlSameSiteAs1), |
| 1339 | converted_instance_1->GetSiteInfo()); |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1340 | |
| 1341 | // Converts once more but with |converted_instance_1| as a candidate. |
dcheng | bccd6b8 | 2016-03-30 16:24:19 | [diff] [blame] | 1342 | scoped_refptr<SiteInstance> converted_instance_3 = |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1343 | ConvertToSiteInstance(rfhm, descriptor, converted_instance_1.get()); |
| 1344 | // Should return |converted_instance_1| because its site matches and it is |
| 1345 | // unrelated to the current SiteInstance. |
| 1346 | EXPECT_EQ(converted_instance_1.get(), converted_instance_3); |
| 1347 | } |
| 1348 | |
| 1349 | // 6) Convert a descriptor of an unrelated instance with the same site of |
| 1350 | // related_instance and using it as a candidate. |
| 1351 | { |
Arthur Hemery | 2e1d149b | 2020-08-21 14:23:54 | [diff] [blame] | 1352 | SiteInstanceDescriptor descriptor( |
W. James MacLean | 46cf2621 | 2020-10-01 16:43:37 | [diff] [blame] | 1353 | UrlInfo::CreateForTesting(kUrlSameSiteAs2), |
Arthur Hemery | 821fa5d | 2021-08-30 13:32:42 | [diff] [blame] | 1354 | SiteInstanceRelation::UNRELATED); |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 1355 | scoped_refptr<SiteInstanceImpl> converted_instance_1 = |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1356 | ConvertToSiteInstance(rfhm, descriptor, related_instance.get()); |
| 1357 | // Should return a new instance, unrelated to the current, set to the |
| 1358 | // provided site URL. |
| 1359 | EXPECT_FALSE( |
| 1360 | current_instance->IsRelatedSiteInstance(converted_instance_1.get())); |
| 1361 | EXPECT_NE(related_instance.get(), converted_instance_1.get()); |
| 1362 | EXPECT_NE(unrelated_instance.get(), converted_instance_1.get()); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 1363 | |
Sharon Yang | 47453bb | 2025-04-25 14:48:09 | [diff] [blame] | 1364 | if (AreStrictSiteInstancesEnabled()) { |
Aaron Colwell | 91e32b1 | 2021-02-17 01:40:56 | [diff] [blame] | 1365 | EXPECT_EQ(CreateExpectedSiteInfo(kUrlSameSiteAs2), |
| 1366 | converted_instance_1->GetSiteInfo()); |
Sharon Yang | 0227922 | 2025-01-15 19:09:19 | [diff] [blame] | 1367 | } else { |
| 1368 | EXPECT_TRUE(converted_instance_1->IsDefaultSiteInstance()); |
Aaron Colwell | f45e3a85 | 2019-06-06 00:48:27 | [diff] [blame] | 1369 | } |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1370 | |
dcheng | bccd6b8 | 2016-03-30 16:24:19 | [diff] [blame] | 1371 | scoped_refptr<SiteInstance> converted_instance_2 = |
carlosk | 078298a8 | 2015-04-07 10:33:20 | [diff] [blame] | 1372 | ConvertToSiteInstance(rfhm, descriptor, unrelated_instance.get()); |
| 1373 | // Should return |unrelated_instance| because its site matches and it is |
| 1374 | // unrelated to the current SiteInstance. |
| 1375 | EXPECT_EQ(unrelated_instance.get(), converted_instance_2); |
| 1376 | } |
| 1377 | } |
| 1378 | |
gzobqq | 8be1ff1 | 2016-03-01 17:12:01 | [diff] [blame] | 1379 | // A renderer process might try and claim that a cross site navigation was |
Balazs Engedy | a40712f | 2017-09-15 15:01:11 | [diff] [blame] | 1380 | // within the same document by setting was_within_same_document = true in |
arthursonzogni | 73fe321 | 2020-11-17 13:24:07 | [diff] [blame] | 1381 | // DidCommitProvisionalLoadParams. Such case should be detected on the browser |
| 1382 | // side and the renderer process should be killed. |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 1383 | TEST_F(NavigatorTest, CrossSiteClaimWithinPage) { |
gzobqq | 8be1ff1 | 2016-03-01 17:12:01 | [diff] [blame] | 1384 | const GURL kUrl1("http://www.chromium.org/"); |
| 1385 | const GURL kUrl2("http://www.google.com/"); |
| 1386 | |
Arthur Hemery | 7b0ae49 | 2018-02-05 16:04:45 | [diff] [blame] | 1387 | NavigationSimulator::NavigateAndCommitFromBrowser(contents(), kUrl1); |
gzobqq | 8be1ff1 | 2016-03-01 17:12:01 | [diff] [blame] | 1388 | |
Arthur Hemery | 7b0ae49 | 2018-02-05 16:04:45 | [diff] [blame] | 1389 | // Navigate to a different site and claim that the navigation was within same |
| 1390 | // page. |
gzobqq | 8be1ff1 | 2016-03-01 17:12:01 | [diff] [blame] | 1391 | int bad_msg_count = process()->bad_msg_count(); |
Arthur Hemery | 7b0ae49 | 2018-02-05 16:04:45 | [diff] [blame] | 1392 | auto simulator = |
| 1393 | NavigationSimulator::CreateRendererInitiated(kUrl2, main_test_rfh()); |
| 1394 | simulator->CommitSameDocument(); |
gzobqq | 8be1ff1 | 2016-03-01 17:12:01 | [diff] [blame] | 1395 | EXPECT_EQ(process()->bad_msg_count(), bad_msg_count + 1); |
| 1396 | } |
| 1397 | |
Charlie Hu | 5130d25e | 2021-03-05 21:53:39 | [diff] [blame] | 1398 | // Permissions Policy: Test that the permissions policy is reset when navigating |
| 1399 | // pages within a site. |
Charlie Hu | bb5943d | 2021-03-09 19:46:12 | [diff] [blame] | 1400 | TEST_F(NavigatorTest, PermissionsPolicySameSiteNavigation) { |
iclelland | f46f88a | 2017-03-04 14:01:44 | [diff] [blame] | 1401 | const GURL kUrl1("http://www.chromium.org/"); |
| 1402 | const GURL kUrl2("http://www.chromium.org/Home"); |
| 1403 | |
| 1404 | contents()->NavigateAndCommit(kUrl1); |
| 1405 | |
Charlie Hu | 5130d25e | 2021-03-05 21:53:39 | [diff] [blame] | 1406 | // Check the permissions policy before navigation. |
Sandor Major | 07aa8b06 | 2025-02-28 17:24:35 | [diff] [blame] | 1407 | const network::PermissionsPolicy* original_permissions_policy = |
Sandor Major | d1bbf775 | 2025-01-09 22:49:30 | [diff] [blame] | 1408 | main_test_rfh()->GetPermissionsPolicy(); |
Charlie Hu | e20fe2f | 2021-03-07 03:39:59 | [diff] [blame] | 1409 | ASSERT_TRUE(original_permissions_policy); |
iclelland | f46f88a | 2017-03-04 14:01:44 | [diff] [blame] | 1410 | |
| 1411 | // Navigate to the new URL. |
| 1412 | contents()->NavigateAndCommit(kUrl2); |
| 1413 | |
Charlie Hu | 5130d25e | 2021-03-05 21:53:39 | [diff] [blame] | 1414 | // Check the permissions policy after navigation. |
Sandor Major | 07aa8b06 | 2025-02-28 17:24:35 | [diff] [blame] | 1415 | const network::PermissionsPolicy* final_permissions_policy = |
Sandor Major | d1bbf775 | 2025-01-09 22:49:30 | [diff] [blame] | 1416 | main_test_rfh()->GetPermissionsPolicy(); |
Charlie Hu | e20fe2f | 2021-03-07 03:39:59 | [diff] [blame] | 1417 | ASSERT_TRUE(final_permissions_policy); |
| 1418 | ASSERT_NE(original_permissions_policy, final_permissions_policy); |
iclelland | f46f88a | 2017-03-04 14:01:44 | [diff] [blame] | 1419 | } |
| 1420 | |
Charlie Hu | 5130d25e | 2021-03-05 21:53:39 | [diff] [blame] | 1421 | // Permissions Policy: Test that the permissions policy is not reset when |
| 1422 | // navigating within a page. |
Charlie Hu | bb5943d | 2021-03-09 19:46:12 | [diff] [blame] | 1423 | TEST_F(NavigatorTest, PermissionsPolicyFragmentNavigation) { |
iclelland | f46f88a | 2017-03-04 14:01:44 | [diff] [blame] | 1424 | const GURL kUrl1("http://www.chromium.org/"); |
| 1425 | const GURL kUrl2("http://www.chromium.org/#Home"); |
| 1426 | |
| 1427 | contents()->NavigateAndCommit(kUrl1); |
| 1428 | |
Charlie Hu | 5130d25e | 2021-03-05 21:53:39 | [diff] [blame] | 1429 | // Check the permissions policy before navigation. |
Sandor Major | 07aa8b06 | 2025-02-28 17:24:35 | [diff] [blame] | 1430 | const network::PermissionsPolicy* original_permissions_policy = |
Sandor Major | d1bbf775 | 2025-01-09 22:49:30 | [diff] [blame] | 1431 | main_test_rfh()->GetPermissionsPolicy(); |
Charlie Hu | e20fe2f | 2021-03-07 03:39:59 | [diff] [blame] | 1432 | ASSERT_TRUE(original_permissions_policy); |
iclelland | f46f88a | 2017-03-04 14:01:44 | [diff] [blame] | 1433 | |
| 1434 | // Navigate to the new URL. |
| 1435 | contents()->NavigateAndCommit(kUrl2); |
| 1436 | |
Charlie Hu | 5130d25e | 2021-03-05 21:53:39 | [diff] [blame] | 1437 | // Check the permissions policy after navigation. |
Sandor Major | 07aa8b06 | 2025-02-28 17:24:35 | [diff] [blame] | 1438 | const network::PermissionsPolicy* final_permissions_policy = |
Sandor Major | d1bbf775 | 2025-01-09 22:49:30 | [diff] [blame] | 1439 | main_test_rfh()->GetPermissionsPolicy(); |
Charlie Hu | e20fe2f | 2021-03-07 03:39:59 | [diff] [blame] | 1440 | ASSERT_EQ(original_permissions_policy, final_permissions_policy); |
iclelland | f46f88a | 2017-03-04 14:01:44 | [diff] [blame] | 1441 | } |
| 1442 | |
Charlie Hu | 5130d25e | 2021-03-05 21:53:39 | [diff] [blame] | 1443 | // Permissions Policy: Test that the permissions policy is set correctly when |
| 1444 | // inserting a new child frame. |
Charlie Hu | bb5943d | 2021-03-09 19:46:12 | [diff] [blame] | 1445 | TEST_F(NavigatorTest, PermissionsPolicyNewChild) { |
Ian Clelland | 784f56a9 | 2017-04-24 17:25:03 | [diff] [blame] | 1446 | const GURL kUrl1("http://www.chromium.org/"); |
| 1447 | const GURL kUrl2("http://www.chromium.org/Home"); |
| 1448 | |
| 1449 | contents()->NavigateAndCommit(kUrl1); |
| 1450 | |
Camille Lamy | b815500 | 2019-03-13 13:46:39 | [diff] [blame] | 1451 | // Simulate the navigation triggered by inserting a child frame into a page. |
Ian Clelland | 784f56a9 | 2017-04-24 17:25:03 | [diff] [blame] | 1452 | TestRenderFrameHost* subframe_rfh = |
Dave Tapuska | 327c06c9 | 2022-06-13 20:31:51 | [diff] [blame] | 1453 | contents()->GetPrimaryMainFrame()->AppendChild("child"); |
Camille Lamy | b815500 | 2019-03-13 13:46:39 | [diff] [blame] | 1454 | NavigationSimulator::NavigateAndCommitFromDocument(kUrl2, subframe_rfh); |
Ian Clelland | 784f56a9 | 2017-04-24 17:25:03 | [diff] [blame] | 1455 | |
Sandor Major | 07aa8b06 | 2025-02-28 17:24:35 | [diff] [blame] | 1456 | const network::PermissionsPolicy* subframe_permissions_policy = |
Sandor Major | d1bbf775 | 2025-01-09 22:49:30 | [diff] [blame] | 1457 | subframe_rfh->GetPermissionsPolicy(); |
Charlie Hu | e20fe2f | 2021-03-07 03:39:59 | [diff] [blame] | 1458 | ASSERT_TRUE(subframe_permissions_policy); |
| 1459 | ASSERT_FALSE(subframe_permissions_policy->GetOriginForTest().opaque()); |
Ian Clelland | 784f56a9 | 2017-04-24 17:25:03 | [diff] [blame] | 1460 | } |
| 1461 | |
Camille Lamy | 07c49cdf | 2019-03-11 15:53:57 | [diff] [blame] | 1462 | TEST_F(NavigatorTest, TwoNavigationsRacingCommit) { |
clamy | d3bfdb0 | 2018-07-12 13:52:18 | [diff] [blame] | 1463 | const GURL kUrl1("http://www.chromium.org/"); |
| 1464 | const GURL kUrl2("http://www.chromium.org/Home"); |
| 1465 | |
Dave Tapuska | 327c06c9 | 2022-06-13 20:31:51 | [diff] [blame] | 1466 | EXPECT_EQ(0u, contents()->GetPrimaryMainFrame()->navigation_requests_.size()); |
clamy | d3bfdb0 | 2018-07-12 13:52:18 | [diff] [blame] | 1467 | |
| 1468 | // Have the first navigation reach ReadyToCommit. |
| 1469 | auto first_navigation = |
| 1470 | NavigationSimulator::CreateBrowserInitiated(kUrl1, contents()); |
| 1471 | first_navigation->ReadyToCommit(); |
Dave Tapuska | 327c06c9 | 2022-06-13 20:31:51 | [diff] [blame] | 1472 | EXPECT_EQ(1u, contents()->GetPrimaryMainFrame()->navigation_requests_.size()); |
clamy | d3bfdb0 | 2018-07-12 13:52:18 | [diff] [blame] | 1473 | |
Rakina Zata Amni | dfcab2e5 | 2023-08-26 07:11:59 | [diff] [blame] | 1474 | // A second navigation starts. |
clamy | d3bfdb0 | 2018-07-12 13:52:18 | [diff] [blame] | 1475 | auto second_navigation = |
| 1476 | NavigationSimulator::CreateBrowserInitiated(kUrl1, contents()); |
Rakina Zata Amni | dfcab2e5 | 2023-08-26 07:11:59 | [diff] [blame] | 1477 | second_navigation->Start(); |
| 1478 | EXPECT_EQ(1u, contents()->GetPrimaryMainFrame()->navigation_requests_.size()); |
clamy | d3bfdb0 | 2018-07-12 13:52:18 | [diff] [blame] | 1479 | |
| 1480 | // The first navigation commits. |
| 1481 | first_navigation->Commit(); |
Rakina Zata Amni | dfcab2e5 | 2023-08-26 07:11:59 | [diff] [blame] | 1482 | EXPECT_EQ(0u, contents()->GetPrimaryMainFrame()->navigation_requests_.size()); |
clamy | d3bfdb0 | 2018-07-12 13:52:18 | [diff] [blame] | 1483 | |
| 1484 | // The second navigation commits. |
| 1485 | second_navigation->Commit(); |
Dave Tapuska | 327c06c9 | 2022-06-13 20:31:51 | [diff] [blame] | 1486 | EXPECT_EQ(0u, contents()->GetPrimaryMainFrame()->navigation_requests_.size()); |
clamy | d3bfdb0 | 2018-07-12 13:52:18 | [diff] [blame] | 1487 | } |
| 1488 | |
clamy | 71a42ec | 2014-10-02 18:43:22 | [diff] [blame] | 1489 | } // namespace content |