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