| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 contents()->GetPendingMainFrame()->GetProcess()->GetID(); | 242 contents()->GetPendingMainFrame()->GetProcess()->GetID(); |
| 243 contents()->GetPendingMainFrame()->SimulateNavigationError(kUrl2, | 243 contents()->GetPendingMainFrame()->SimulateNavigationError(kUrl2, |
| 244 net::ERR_ABORTED); | 244 net::ERR_ABORTED); |
| 245 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl2); | 245 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl2); |
| 246 site_instance->set_process_reuse_policy( | 246 site_instance->set_process_reuse_policy( |
| 247 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | 247 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
| 248 EXPECT_NE(speculative_process_host_id, site_instance->GetProcess()->GetID()); | 248 EXPECT_NE(speculative_process_host_id, site_instance->GetProcess()->GetID()); |
| 249 } | 249 } |
| 250 | 250 |
| 251 // Tests that RenderProcessHost reuse considers navigations correctly during | 251 // Tests that RenderProcessHost reuse considers navigations correctly during |
| 252 // redirects. | 252 // redirects in a renderer-initiated navigation. |
| 253 TEST_F(RenderProcessHostUnitTest, ReuseNavigationProcessRedirects) { | 253 TEST_F(RenderProcessHostUnitTest, |
| 254 ReuseNavigationProcessRedirectsRendererInitiated) { |
| 254 // This is only applicable to PlzNavigate. | 255 // This is only applicable to PlzNavigate. |
| 255 if (!IsBrowserSideNavigationEnabled()) | 256 if (!IsBrowserSideNavigationEnabled()) |
| 256 return; | 257 return; |
| 257 | 258 |
| 258 const GURL kUrl("http://foo.com"); | 259 const GURL kUrl("http://foo.com"); |
| 259 const GURL kRedirectUrl1("http://foo.com/redirect"); | 260 const GURL kRedirectUrl1("http://foo.com/redirect"); |
| 260 const GURL kRedirectUrl2("http://bar.com"); | 261 const GURL kRedirectUrl2("http://bar.com"); |
| 261 | 262 |
| 262 // At first, trying to get a RenderProcessHost with the | 263 // At first, trying to get a RenderProcessHost with the |
| 263 // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. | 264 // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 276 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | 277 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
| 277 | 278 |
| 278 // Simulate a same-site redirect. Getting RenderProcessHost with the | 279 // Simulate a same-site redirect. Getting RenderProcessHost with the |
| 279 // REUSE_PENDING_OR_COMMITTED_SITE policy should return the current process. | 280 // REUSE_PENDING_OR_COMMITTED_SITE policy should return the current process. |
| 280 main_test_rfh()->SimulateRedirect(kRedirectUrl1); | 281 main_test_rfh()->SimulateRedirect(kRedirectUrl1); |
| 281 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); | 282 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
| 282 site_instance->set_process_reuse_policy( | 283 site_instance->set_process_reuse_policy( |
| 283 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | 284 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
| 284 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | 285 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
| 285 | 286 |
| 286 // Simulate a cross-site redirect. Getting RenderProcessHost with the | 287 // Simulate a cross-site redirect. Getting a RenderProcessHost with the |
| 287 // REUSE_PENDING_OR_COMMITTED_SITE policy should not return the current | 288 // REUSE_PENDING_OR_COMMITTED_SITE policy should return the current |
| 288 // process, whether for the old site or the new site. | 289 // process for the new site since this is a renderer-intiated navigation which |
| 290 // does not swap processes on cross-site redirects. However, getting a |
| 291 // RenderProcessHost with the REUSE_PENDING_OR_COMMITTED_SITE policy should no |
| 292 // longer return the current process for the initial site we were trying to |
| 293 // navigate to. |
| 289 main_test_rfh()->SimulateRedirect(kRedirectUrl2); | 294 main_test_rfh()->SimulateRedirect(kRedirectUrl2); |
| 290 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); | 295 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
| 291 site_instance->set_process_reuse_policy( | 296 site_instance->set_process_reuse_policy( |
| 292 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | 297 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
| 293 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | 298 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
| 294 site_instance = | 299 site_instance = |
| 295 SiteInstanceImpl::CreateForURL(browser_context(), kRedirectUrl2); | 300 SiteInstanceImpl::CreateForURL(browser_context(), kRedirectUrl2); |
| 296 site_instance->set_process_reuse_policy( | 301 site_instance->set_process_reuse_policy( |
| 297 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | 302 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
| 298 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | 303 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
| 299 | 304 |
| 300 // Once the navigation is ready to commit, Getting RenderProcessHost with the | 305 // Once the navigation is ready to commit, Getting RenderProcessHost with the |
| 301 // REUSE_PENDING_OR_COMMITTED_SITE policy should not return the current | 306 // REUSE_PENDING_OR_COMMITTED_SITE policy should return the current |
| 302 // process for the final site, but not the initial one. | 307 // process for the final site, but not the initial one. |
| 303 main_test_rfh()->PrepareForCommit(); | 308 main_test_rfh()->PrepareForCommit(); |
| 304 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); | 309 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
| 305 site_instance->set_process_reuse_policy( | 310 site_instance->set_process_reuse_policy( |
| 306 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | 311 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
| 307 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | 312 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
| 308 site_instance = | 313 site_instance = |
| 309 SiteInstanceImpl::CreateForURL(browser_context(), kRedirectUrl2); | 314 SiteInstanceImpl::CreateForURL(browser_context(), kRedirectUrl2); |
| 310 site_instance->set_process_reuse_policy( | 315 site_instance->set_process_reuse_policy( |
| 311 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | 316 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
| 312 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | 317 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
| 313 } | 318 } |
| 314 | 319 |
| 320 // Tests that RenderProcessHost reuse considers navigations correctly during |
| 321 // redirects in a browser-initiated navigation. |
| 322 TEST_F(RenderProcessHostUnitTest, |
| 323 ReuseNavigationProcessRedirectsBrowserInitiated) { |
| 324 // This is only applicable to PlzNavigate. |
| 325 if (!IsBrowserSideNavigationEnabled()) |
| 326 return; |
| 327 |
| 328 const GURL kInitialUrl("http://google.com"); |
| 329 const GURL kUrl("http://foo.com"); |
| 330 const GURL kRedirectUrl1("http://foo.com/redirect"); |
| 331 const GURL kRedirectUrl2("http://bar.com"); |
| 332 |
| 333 NavigateAndCommit(kInitialUrl); |
| 334 |
| 335 // At first, trying to get a RenderProcessHost with the |
| 336 // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. |
| 337 scoped_refptr<SiteInstanceImpl> site_instance = |
| 338 SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
| 339 site_instance->set_process_reuse_policy( |
| 340 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
| 341 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
| 342 |
| 343 // Start a navigation. Now getting RenderProcessHost with the |
| 344 // REUSE_PENDING_OR_COMMITTED_SITE policy should return the speculative |
| 345 // process. |
| 346 contents()->GetController().LoadURL(kUrl, Referrer(), |
| 347 ui::PAGE_TRANSITION_TYPED, std::string()); |
| 348 main_test_rfh()->SendBeforeUnloadACK(true); |
| 349 int speculative_process_host_id = |
| 350 contents()->GetPendingMainFrame()->GetProcess()->GetID(); |
| 351 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
| 352 site_instance->set_process_reuse_policy( |
| 353 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
| 354 EXPECT_EQ(speculative_process_host_id, site_instance->GetProcess()->GetID()); |
| 355 |
| 356 // Simulate a same-site redirect. Getting RenderProcessHost with the |
| 357 // REUSE_PENDING_OR_COMMITTED_SITE policy should return the speculative |
| 358 // process. |
| 359 main_test_rfh()->SimulateRedirect(kRedirectUrl1); |
| 360 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
| 361 site_instance->set_process_reuse_policy( |
| 362 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
| 363 EXPECT_EQ(speculative_process_host_id, site_instance->GetProcess()->GetID()); |
| 364 |
| 365 // Simulate a cross-site redirect. Getting a RenderProcessHost with the |
| 366 // REUSE_PENDING_OR_COMMITTED_SITE policy should no longer return the |
| 367 // speculative process: neither for the new site nor for the initial site we |
| 368 // were trying to navigate to. It shouldn't return the current process either. |
| 369 main_test_rfh()->SimulateRedirect(kRedirectUrl2); |
| 370 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
| 371 site_instance->set_process_reuse_policy( |
| 372 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
| 373 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
| 374 EXPECT_NE(speculative_process_host_id, site_instance->GetProcess()->GetID()); |
| 375 site_instance = |
| 376 SiteInstanceImpl::CreateForURL(browser_context(), kRedirectUrl2); |
| 377 site_instance->set_process_reuse_policy( |
| 378 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
| 379 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
| 380 EXPECT_NE(speculative_process_host_id, site_instance->GetProcess()->GetID()); |
| 381 |
| 382 // Once the navigation is ready to commit, Getting RenderProcessHost with the |
| 383 // REUSE_PENDING_OR_COMMITTED_SITE policy should return the new speculative |
| 384 // process for the final site, but not the initial one. The current process |
| 385 // shouldn't be returned either. |
| 386 main_test_rfh()->PrepareForCommit(); |
| 387 speculative_process_host_id = |
| 388 contents()->GetPendingMainFrame()->GetProcess()->GetID(); |
| 389 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
| 390 site_instance->set_process_reuse_policy( |
| 391 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
| 392 EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
| 393 EXPECT_NE(speculative_process_host_id, site_instance->GetProcess()->GetID()); |
| 394 site_instance = |
| 395 SiteInstanceImpl::CreateForURL(browser_context(), kRedirectUrl2); |
| 396 site_instance->set_process_reuse_policy( |
| 397 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
| 398 EXPECT_EQ(speculative_process_host_id, site_instance->GetProcess()->GetID()); |
| 399 } |
| 400 |
| 315 class EffectiveURLContentBrowserClient : public ContentBrowserClient { | 401 class EffectiveURLContentBrowserClient : public ContentBrowserClient { |
| 316 public: | 402 public: |
| 317 EffectiveURLContentBrowserClient(const GURL& url_to_modify, | 403 EffectiveURLContentBrowserClient(const GURL& url_to_modify, |
| 318 const GURL& url_to_return) | 404 const GURL& url_to_return) |
| 319 : url_to_modify_(url_to_modify), url_to_return_(url_to_return) {} | 405 : url_to_modify_(url_to_modify), url_to_return_(url_to_return) {} |
| 320 ~EffectiveURLContentBrowserClient() override {} | 406 ~EffectiveURLContentBrowserClient() override {} |
| 321 | 407 |
| 322 private: | 408 private: |
| 323 GURL GetEffectiveURL(BrowserContext* browser_context, | 409 GURL GetEffectiveURL(BrowserContext* browser_context, |
| 324 const GURL& url) override { | 410 const GURL& url) override { |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 472 // main RFH, as it was registered with the regular site URL when it committed. | 558 // main RFH, as it was registered with the regular site URL when it committed. |
| 473 main_test_rfh()->PrepareForCommit(); | 559 main_test_rfh()->PrepareForCommit(); |
| 474 main_test_rfh()->SendNavigate(0, true, kUrl); | 560 main_test_rfh()->SendNavigate(0, true, kUrl); |
| 475 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); | 561 site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
| 476 site_instance->set_process_reuse_policy( | 562 site_instance->set_process_reuse_policy( |
| 477 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); | 563 SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
| 478 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); | 564 EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
| 479 } | 565 } |
| 480 | 566 |
| 481 } // namespace content | 567 } // namespace content |
| OLD | NEW |