Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Side by Side Diff: content/browser/renderer_host/render_process_host_unittest.cc

Issue 2954623003: PlzNavigate: implement REUSE_COMMITTED_OR_PENDING_SITE for redirects (Closed)
Patch Set: Addressed Charlie's comments Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/loader/navigation_resource_throttle.cc ('k') | content/public/test/navigation_simulator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698