| 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 |