OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/command_line.h" | 5 #include "base/command_line.h" |
6 #include "base/format_macros.h" | 6 #include "base/format_macros.h" |
7 #include "base/memory/scoped_vector.h" | 7 #include "base/memory/scoped_vector.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/metrics/field_trial.h" | 9 #include "base/metrics/field_trial.h" |
10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
11 #include "base/time/time.h" | 11 #include "base/time/time.h" |
12 #include "chrome/browser/prerender/prerender_contents.h" | 12 #include "chrome/browser/prerender/prerender_contents.h" |
13 #include "chrome/browser/prerender/prerender_handle.h" | 13 #include "chrome/browser/prerender/prerender_handle.h" |
14 #include "chrome/browser/prerender/prerender_link_manager.h" | 14 #include "chrome/browser/prerender/prerender_link_manager.h" |
15 #include "chrome/browser/prerender/prerender_manager.h" | 15 #include "chrome/browser/prerender/prerender_manager.h" |
16 #include "chrome/browser/prerender/prerender_origin.h" | 16 #include "chrome/browser/prerender/prerender_origin.h" |
17 #include "chrome/common/chrome_switches.h" | 17 #include "chrome/common/chrome_switches.h" |
| 18 #include "chrome/common/prerender_types.h" |
18 #include "chrome/test/base/testing_browser_process.h" | 19 #include "chrome/test/base/testing_browser_process.h" |
19 #include "chrome/test/base/testing_profile.h" | 20 #include "chrome/test/base/testing_profile.h" |
20 #include "content/public/browser/render_view_host.h" | 21 #include "content/public/browser/render_view_host.h" |
21 #include "content/public/test/test_browser_thread.h" | 22 #include "content/public/test/test_browser_thread.h" |
22 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
23 #include "ui/gfx/size.h" | 24 #include "ui/gfx/size.h" |
24 #include "url/gurl.h" | 25 #include "url/gurl.h" |
25 | 26 |
26 using base::Time; | 27 using base::Time; |
27 using base::TimeDelta; | 28 using base::TimeDelta; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 int route_id_; | 77 int route_id_; |
77 | 78 |
78 UnitTestPrerenderManager* test_prerender_manager_; | 79 UnitTestPrerenderManager* test_prerender_manager_; |
79 FinalStatus expected_final_status_; | 80 FinalStatus expected_final_status_; |
80 }; | 81 }; |
81 | 82 |
82 int DummyPrerenderContents::g_next_route_id_ = 0; | 83 int DummyPrerenderContents::g_next_route_id_ = 0; |
83 | 84 |
84 const gfx::Size kSize(640, 480); | 85 const gfx::Size kSize(640, 480); |
85 | 86 |
| 87 const uint32 kDefaultRelTypes = PrerenderRelTypePrerender; |
| 88 |
86 } // namespace | 89 } // namespace |
87 | 90 |
88 class UnitTestPrerenderManager : public PrerenderManager { | 91 class UnitTestPrerenderManager : public PrerenderManager { |
89 public: | 92 public: |
90 using PrerenderManager::kMinTimeBetweenPrerendersMs; | 93 using PrerenderManager::kMinTimeBetweenPrerendersMs; |
91 using PrerenderManager::kNavigationRecordWindowMs; | 94 using PrerenderManager::kNavigationRecordWindowMs; |
92 | 95 |
93 explicit UnitTestPrerenderManager(Profile* profile, | 96 explicit UnitTestPrerenderManager(Profile* profile, |
94 PrerenderTracker* prerender_tracker) | 97 PrerenderTracker* prerender_tracker) |
95 : PrerenderManager(profile, prerender_tracker), | 98 : PrerenderManager(profile, prerender_tracker), |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 PrerenderLinkManager::LinkPrerender* prerender = | 332 PrerenderLinkManager::LinkPrerender* prerender = |
330 prerender_link_manager()->FindByLauncherChildIdAndPrerenderId( | 333 prerender_link_manager()->FindByLauncherChildIdAndPrerenderId( |
331 child_id, prerender_id); | 334 child_id, prerender_id); |
332 return prerender && prerender->handle; | 335 return prerender && prerender->handle; |
333 } | 336 } |
334 | 337 |
335 // Shorthand to add a simple prerender with a reasonable source. Returns | 338 // Shorthand to add a simple prerender with a reasonable source. Returns |
336 // true iff the prerender has been added to the PrerenderManager by the | 339 // true iff the prerender has been added to the PrerenderManager by the |
337 // PrerenderLinkManager and the PrerenderManager returned a handle. | 340 // PrerenderLinkManager and the PrerenderManager returned a handle. |
338 bool AddSimplePrerender(const GURL& url) { | 341 bool AddSimplePrerender(const GURL& url) { |
339 prerender_link_manager()->OnAddPrerender(kDefaultChildId, | 342 prerender_link_manager()->OnAddPrerender( |
340 GetNextPrerenderID(), | 343 kDefaultChildId, GetNextPrerenderID(), url, kDefaultRelTypes, |
341 url, content::Referrer(), | 344 content::Referrer(), kSize, kDefaultRenderViewRouteId); |
342 kSize, kDefaultRenderViewRouteId); | |
343 return LauncherHasRunningPrerender(kDefaultChildId, last_prerender_id()); | 345 return LauncherHasRunningPrerender(kDefaultChildId, last_prerender_id()); |
344 } | 346 } |
345 | 347 |
346 private: | 348 private: |
347 PrerenderTracker* prerender_tracker() { | 349 PrerenderTracker* prerender_tracker() { |
348 return g_browser_process->prerender_tracker(); | 350 return g_browser_process->prerender_tracker(); |
349 } | 351 } |
350 | 352 |
351 // Needed to pass PrerenderManager's DCHECKs. | 353 // Needed to pass PrerenderManager's DCHECKs. |
352 TestingProfile profile_; | 354 TestingProfile profile_; |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
587 if (concurrencies_to_test[i].max_link_concurrency > | 589 if (concurrencies_to_test[i].max_link_concurrency > |
588 effective_max_link_concurrency) { | 590 effective_max_link_concurrency) { |
589 // We should be able to launch more prerenders on this system, but not for | 591 // We should be able to launch more prerenders on this system, but not for |
590 // our current launcher. | 592 // our current launcher. |
591 int child_id; | 593 int child_id; |
592 int route_id; | 594 int route_id; |
593 ASSERT_TRUE(prerender_contentses.back()->GetChildId(&child_id)); | 595 ASSERT_TRUE(prerender_contentses.back()->GetChildId(&child_id)); |
594 ASSERT_TRUE(prerender_contentses.back()->GetRouteId(&route_id)); | 596 ASSERT_TRUE(prerender_contentses.back()->GetRouteId(&route_id)); |
595 | 597 |
596 GURL extra_url("http://google.com/extraurl"); | 598 GURL extra_url("http://google.com/extraurl"); |
597 prerender_link_manager()->OnAddPrerender(child_id, | 599 prerender_link_manager()->OnAddPrerender( |
598 GetNextPrerenderID(), | 600 child_id, GetNextPrerenderID(), extra_url, kDefaultRelTypes, |
599 extra_url, content::Referrer(), | 601 content::Referrer(), kSize, route_id); |
600 kSize, route_id); | |
601 const int prerender_id = last_prerender_id(); | 602 const int prerender_id = last_prerender_id(); |
602 EXPECT_TRUE(LauncherHasRunningPrerender(child_id, prerender_id)); | 603 EXPECT_TRUE(LauncherHasRunningPrerender(child_id, prerender_id)); |
603 prerender_link_manager()->OnCancelPrerender(child_id, prerender_id); | 604 prerender_link_manager()->OnCancelPrerender(child_id, prerender_id); |
604 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, prerender_id)); | 605 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, prerender_id)); |
605 } | 606 } |
606 | 607 |
607 DummyPrerenderContents* prerender_contents_to_delay = | 608 DummyPrerenderContents* prerender_contents_to_delay = |
608 prerender_manager()->CreateNextPrerenderContents(url_to_delay, | 609 prerender_manager()->CreateNextPrerenderContents(url_to_delay, |
609 FINAL_STATUS_USED); | 610 FINAL_STATUS_USED); |
610 EXPECT_FALSE(AddSimplePrerender(url_to_delay)); | 611 EXPECT_FALSE(AddSimplePrerender(url_to_delay)); |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 } | 778 } |
778 | 779 |
779 // Tests that prerendering is cancelled when the source render view does not | 780 // Tests that prerendering is cancelled when the source render view does not |
780 // exist. On failure, the DCHECK in CreatePrerenderContents() above should be | 781 // exist. On failure, the DCHECK in CreatePrerenderContents() above should be |
781 // triggered. | 782 // triggered. |
782 TEST_F(PrerenderTest, SourceRenderViewClosed) { | 783 TEST_F(PrerenderTest, SourceRenderViewClosed) { |
783 GURL url("http://www.google.com/"); | 784 GURL url("http://www.google.com/"); |
784 prerender_manager()->CreateNextPrerenderContents( | 785 prerender_manager()->CreateNextPrerenderContents( |
785 url, | 786 url, |
786 FINAL_STATUS_MANAGER_SHUTDOWN); | 787 FINAL_STATUS_MANAGER_SHUTDOWN); |
787 prerender_link_manager()->OnAddPrerender(100, GetNextPrerenderID(), url, | 788 prerender_link_manager()->OnAddPrerender( |
788 Referrer(), kSize, 200); | 789 100, GetNextPrerenderID(), url, kDefaultRelTypes, Referrer(), kSize, 200); |
789 EXPECT_FALSE(LauncherHasRunningPrerender(100, last_prerender_id())); | 790 EXPECT_FALSE(LauncherHasRunningPrerender(100, last_prerender_id())); |
790 } | 791 } |
791 | 792 |
| 793 // Tests that prerendering doesn't launch rel=next prerenders without the field |
| 794 // trial. |
| 795 TEST_F(PrerenderTest, NoRelNextByDefault) { |
| 796 GURL url("http://www.google.com/"); |
| 797 prerender_manager()->CreateNextPrerenderContents( |
| 798 url, FINAL_STATUS_MANAGER_SHUTDOWN); |
| 799 DummyPrerenderContents* null = NULL; |
| 800 |
| 801 prerender_link_manager()->OnAddPrerender( |
| 802 kDefaultChildId, GetNextPrerenderID(), url, PrerenderRelTypeNext, |
| 803 Referrer(), kSize, kDefaultRenderViewRouteId); |
| 804 EXPECT_EQ(null, prerender_manager()->FindEntry(url)); |
| 805 } |
| 806 |
| 807 // Tests that prerendering does launch rel=next prerenders with the field trial. |
| 808 TEST_F(PrerenderTest, RelNextByFieldTrial) { |
| 809 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("PrerenderRelNextTrial", |
| 810 "Yes")); |
| 811 GURL url("http://www.google.com/"); |
| 812 DummyPrerenderContents* prerender_contents = |
| 813 prerender_manager()->CreateNextPrerenderContents( |
| 814 url, FINAL_STATUS_MANAGER_SHUTDOWN); |
| 815 |
| 816 prerender_link_manager()->OnAddPrerender( |
| 817 kDefaultChildId, GetNextPrerenderID(), url, PrerenderRelTypeNext, |
| 818 Referrer(), kSize, kDefaultRenderViewRouteId); |
| 819 EXPECT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
| 820 } |
| 821 |
792 // Tests that prerendering is cancelled when we launch a second prerender of | 822 // Tests that prerendering is cancelled when we launch a second prerender of |
793 // the same target within a short time interval. | 823 // the same target within a short time interval. |
794 TEST_F(PrerenderTest, RecentlyVisited) { | 824 TEST_F(PrerenderTest, RecentlyVisited) { |
795 GURL url("http://www.google.com/"); | 825 GURL url("http://www.google.com/"); |
796 | 826 |
797 prerender_manager()->RecordNavigation(url); | 827 prerender_manager()->RecordNavigation(url); |
798 | 828 |
799 DummyPrerenderContents* prerender_contents = | 829 DummyPrerenderContents* prerender_contents = |
800 prerender_manager()->CreateNextPrerenderContents( | 830 prerender_manager()->CreateNextPrerenderContents( |
801 url, FINAL_STATUS_RECENTLY_VISITED); | 831 url, FINAL_STATUS_RECENTLY_VISITED); |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1337 first_url, FINAL_STATUS_TIMED_OUT); | 1367 first_url, FINAL_STATUS_TIMED_OUT); |
1338 EXPECT_TRUE(AddSimplePrerender(first_url)); | 1368 EXPECT_TRUE(AddSimplePrerender(first_url)); |
1339 const int first_prerender_id = last_prerender_id(); | 1369 const int first_prerender_id = last_prerender_id(); |
1340 | 1370 |
1341 int child_id; | 1371 int child_id; |
1342 int route_id; | 1372 int route_id; |
1343 ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); | 1373 ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); |
1344 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); | 1374 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); |
1345 | 1375 |
1346 GURL pending_url("http://www.neverlaunched.com"); | 1376 GURL pending_url("http://www.neverlaunched.com"); |
1347 prerender_link_manager()->OnAddPrerender(child_id, | 1377 prerender_link_manager()->OnAddPrerender( |
1348 GetNextPrerenderID(), | 1378 child_id, GetNextPrerenderID(), pending_url, kDefaultRelTypes, |
1349 pending_url, content::Referrer(), | 1379 content::Referrer(), kSize, route_id); |
1350 kSize, route_id); | |
1351 const int second_prerender_id = last_prerender_id(); | 1380 const int second_prerender_id = last_prerender_id(); |
1352 | 1381 |
1353 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); | 1382 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); |
1354 | 1383 |
1355 DummyPrerenderContents* null = NULL; | 1384 DummyPrerenderContents* null = NULL; |
1356 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url)); | 1385 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url)); |
1357 EXPECT_EQ(null, prerender_manager()->FindEntry(pending_url)); | 1386 EXPECT_EQ(null, prerender_manager()->FindEntry(pending_url)); |
1358 | 1387 |
1359 prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, | 1388 prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, |
1360 first_prerender_id); | 1389 first_prerender_id); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1477 CHECK(prerender_handle.get()); | 1506 CHECK(prerender_handle.get()); |
1478 EXPECT_TRUE(prerender_handle->IsPrerendering()); | 1507 EXPECT_TRUE(prerender_handle->IsPrerendering()); |
1479 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | 1508 EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
1480 EXPECT_EQ(prerender_contents, prerender_handle->contents()); | 1509 EXPECT_EQ(prerender_contents, prerender_handle->contents()); |
1481 EXPECT_EQ(ORIGIN_INSTANT, prerender_handle->contents()->origin()); | 1510 EXPECT_EQ(ORIGIN_INSTANT, prerender_handle->contents()->origin()); |
1482 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); | 1511 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
1483 EXPECT_FALSE(prerender_handle->IsPrerendering()); | 1512 EXPECT_FALSE(prerender_handle->IsPrerendering()); |
1484 } | 1513 } |
1485 | 1514 |
1486 } // namespace prerender | 1515 } // namespace prerender |
OLD | NEW |