| 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 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 NotifyPrerenderStart(); | 275 NotifyPrerenderStart(); |
| 273 } | 276 } |
| 274 } | 277 } |
| 275 | 278 |
| 276 class PrerenderTest : public testing::Test { | 279 class PrerenderTest : public testing::Test { |
| 277 public: | 280 public: |
| 278 static const int kDefaultChildId = -1; | 281 static const int kDefaultChildId = -1; |
| 279 static const int kDefaultRenderViewRouteId = -1; | 282 static const int kDefaultRenderViewRouteId = -1; |
| 280 | 283 |
| 281 PrerenderTest() : ui_thread_(BrowserThread::UI, &message_loop_), | 284 PrerenderTest() : ui_thread_(BrowserThread::UI, &message_loop_), |
| 282 prerender_manager_(new UnitTestPrerenderManager( | |
| 283 &profile_, prerender_tracker())), | |
| 284 prerender_link_manager_( | |
| 285 new PrerenderLinkManager(prerender_manager_.get())), | |
| 286 last_prerender_id_(0), | 285 last_prerender_id_(0), |
| 287 field_trial_list_(NULL) { | 286 field_trial_list_(NULL) { |
| 288 // Enable omnibox prerendering. | 287 // Enable omnibox prerendering. |
| 289 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 288 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 290 switches::kPrerenderFromOmnibox, | 289 switches::kPrerenderFromOmnibox, |
| 291 switches::kPrerenderFromOmniboxSwitchValueEnabled); | 290 switches::kPrerenderFromOmniboxSwitchValueEnabled); |
| 292 } | 291 } |
| 293 | 292 |
| 294 virtual ~PrerenderTest() { | 293 virtual ~PrerenderTest() { |
| 295 prerender_link_manager_->OnChannelClosing(kDefaultChildId); | 294 prerender_link_manager()->OnChannelClosing(kDefaultChildId); |
| 296 prerender_link_manager_->Shutdown(); | 295 prerender_link_manager()->Shutdown(); |
| 297 prerender_manager_->Shutdown(); | 296 prerender_manager()->Shutdown(); |
| 298 } | 297 } |
| 299 | 298 |
| 300 UnitTestPrerenderManager* prerender_manager() { | 299 UnitTestPrerenderManager* prerender_manager() { |
| 300 if (!prerender_manager_) { |
| 301 prerender_manager_.reset( |
| 302 new UnitTestPrerenderManager(&profile_, prerender_tracker())); |
| 303 } |
| 301 return prerender_manager_.get(); | 304 return prerender_manager_.get(); |
| 302 } | 305 } |
| 303 | 306 |
| 304 PrerenderLinkManager* prerender_link_manager() { | 307 PrerenderLinkManager* prerender_link_manager() { |
| 308 if (!prerender_link_manager_) { |
| 309 prerender_link_manager_.reset( |
| 310 new PrerenderLinkManager(prerender_manager())); |
| 311 } |
| 305 return prerender_link_manager_.get(); | 312 return prerender_link_manager_.get(); |
| 306 } | 313 } |
| 307 | 314 |
| 308 void SetConcurrency(size_t concurrency) { | 315 void SetConcurrency(size_t concurrency) { |
| 309 prerender_manager()->mutable_config().max_link_concurrency_per_launcher = | 316 prerender_manager()->mutable_config().max_link_concurrency_per_launcher = |
| 310 concurrency; | 317 concurrency; |
| 311 prerender_manager()->mutable_config().max_link_concurrency = | 318 prerender_manager()->mutable_config().max_link_concurrency = |
| 312 std::max(prerender_manager()->mutable_config().max_link_concurrency, | 319 std::max(prerender_manager()->mutable_config().max_link_concurrency, |
| 313 concurrency); | 320 concurrency); |
| 314 } | 321 } |
| 315 | 322 |
| 316 bool IsEmptyPrerenderLinkManager() const { | 323 bool IsEmptyPrerenderLinkManager() { |
| 317 return prerender_link_manager_->IsEmpty(); | 324 return prerender_link_manager()->IsEmpty(); |
| 318 } | 325 } |
| 319 | 326 |
| 320 int last_prerender_id() const { | 327 int last_prerender_id() const { |
| 321 return last_prerender_id_; | 328 return last_prerender_id_; |
| 322 } | 329 } |
| 323 | 330 |
| 324 int GetNextPrerenderID() { | 331 int GetNextPrerenderID() { |
| 325 return ++last_prerender_id_; | 332 return ++last_prerender_id_; |
| 326 } | 333 } |
| 327 | 334 |
| 328 bool LauncherHasRunningPrerender(int child_id, int prerender_id) { | 335 bool LauncherHasRunningPrerender(int child_id, int prerender_id) { |
| 329 PrerenderLinkManager::LinkPrerender* prerender = | 336 PrerenderLinkManager::LinkPrerender* prerender = |
| 330 prerender_link_manager()->FindByLauncherChildIdAndPrerenderId( | 337 prerender_link_manager()->FindByLauncherChildIdAndPrerenderId( |
| 331 child_id, prerender_id); | 338 child_id, prerender_id); |
| 332 return prerender && prerender->handle; | 339 return prerender && prerender->handle; |
| 333 } | 340 } |
| 334 | 341 |
| 335 // Shorthand to add a simple prerender with a reasonable source. Returns | 342 // Shorthand to add a simple prerender with a reasonable source. Returns |
| 336 // true iff the prerender has been added to the PrerenderManager by the | 343 // true iff the prerender has been added to the PrerenderManager by the |
| 337 // PrerenderLinkManager and the PrerenderManager returned a handle. | 344 // PrerenderLinkManager and the PrerenderManager returned a handle. |
| 338 bool AddSimplePrerender(const GURL& url) { | 345 bool AddSimplePrerender(const GURL& url) { |
| 339 prerender_link_manager()->OnAddPrerender(kDefaultChildId, | 346 prerender_link_manager()->OnAddPrerender( |
| 340 GetNextPrerenderID(), | 347 kDefaultChildId, GetNextPrerenderID(), url, kDefaultRelTypes, |
| 341 url, content::Referrer(), | 348 content::Referrer(), kSize, kDefaultRenderViewRouteId); |
| 342 kSize, kDefaultRenderViewRouteId); | |
| 343 return LauncherHasRunningPrerender(kDefaultChildId, last_prerender_id()); | 349 return LauncherHasRunningPrerender(kDefaultChildId, last_prerender_id()); |
| 344 } | 350 } |
| 345 | 351 |
| 346 private: | 352 private: |
| 347 PrerenderTracker* prerender_tracker() { | 353 PrerenderTracker* prerender_tracker() { |
| 348 return g_browser_process->prerender_tracker(); | 354 return g_browser_process->prerender_tracker(); |
| 349 } | 355 } |
| 350 | 356 |
| 351 // Needed to pass PrerenderManager's DCHECKs. | 357 // Needed to pass PrerenderManager's DCHECKs. |
| 352 TestingProfile profile_; | 358 TestingProfile profile_; |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 if (concurrencies_to_test[i].max_link_concurrency > | 593 if (concurrencies_to_test[i].max_link_concurrency > |
| 588 effective_max_link_concurrency) { | 594 effective_max_link_concurrency) { |
| 589 // We should be able to launch more prerenders on this system, but not for | 595 // We should be able to launch more prerenders on this system, but not for |
| 590 // our current launcher. | 596 // our current launcher. |
| 591 int child_id; | 597 int child_id; |
| 592 int route_id; | 598 int route_id; |
| 593 ASSERT_TRUE(prerender_contentses.back()->GetChildId(&child_id)); | 599 ASSERT_TRUE(prerender_contentses.back()->GetChildId(&child_id)); |
| 594 ASSERT_TRUE(prerender_contentses.back()->GetRouteId(&route_id)); | 600 ASSERT_TRUE(prerender_contentses.back()->GetRouteId(&route_id)); |
| 595 | 601 |
| 596 GURL extra_url("http://google.com/extraurl"); | 602 GURL extra_url("http://google.com/extraurl"); |
| 597 prerender_link_manager()->OnAddPrerender(child_id, | 603 prerender_link_manager()->OnAddPrerender( |
| 598 GetNextPrerenderID(), | 604 child_id, GetNextPrerenderID(), extra_url, kDefaultRelTypes, |
| 599 extra_url, content::Referrer(), | 605 content::Referrer(), kSize, route_id); |
| 600 kSize, route_id); | |
| 601 const int prerender_id = last_prerender_id(); | 606 const int prerender_id = last_prerender_id(); |
| 602 EXPECT_TRUE(LauncherHasRunningPrerender(child_id, prerender_id)); | 607 EXPECT_TRUE(LauncherHasRunningPrerender(child_id, prerender_id)); |
| 603 prerender_link_manager()->OnCancelPrerender(child_id, prerender_id); | 608 prerender_link_manager()->OnCancelPrerender(child_id, prerender_id); |
| 604 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, prerender_id)); | 609 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, prerender_id)); |
| 605 } | 610 } |
| 606 | 611 |
| 607 DummyPrerenderContents* prerender_contents_to_delay = | 612 DummyPrerenderContents* prerender_contents_to_delay = |
| 608 prerender_manager()->CreateNextPrerenderContents(url_to_delay, | 613 prerender_manager()->CreateNextPrerenderContents(url_to_delay, |
| 609 FINAL_STATUS_USED); | 614 FINAL_STATUS_USED); |
| 610 EXPECT_FALSE(AddSimplePrerender(url_to_delay)); | 615 EXPECT_FALSE(AddSimplePrerender(url_to_delay)); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 777 } | 782 } |
| 778 | 783 |
| 779 // Tests that prerendering is cancelled when the source render view does not | 784 // Tests that prerendering is cancelled when the source render view does not |
| 780 // exist. On failure, the DCHECK in CreatePrerenderContents() above should be | 785 // exist. On failure, the DCHECK in CreatePrerenderContents() above should be |
| 781 // triggered. | 786 // triggered. |
| 782 TEST_F(PrerenderTest, SourceRenderViewClosed) { | 787 TEST_F(PrerenderTest, SourceRenderViewClosed) { |
| 783 GURL url("http://www.google.com/"); | 788 GURL url("http://www.google.com/"); |
| 784 prerender_manager()->CreateNextPrerenderContents( | 789 prerender_manager()->CreateNextPrerenderContents( |
| 785 url, | 790 url, |
| 786 FINAL_STATUS_MANAGER_SHUTDOWN); | 791 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 787 prerender_link_manager()->OnAddPrerender(100, GetNextPrerenderID(), url, | 792 prerender_link_manager()->OnAddPrerender( |
| 788 Referrer(), kSize, 200); | 793 100, GetNextPrerenderID(), url, kDefaultRelTypes, Referrer(), kSize, 200); |
| 789 EXPECT_FALSE(LauncherHasRunningPrerender(100, last_prerender_id())); | 794 EXPECT_FALSE(LauncherHasRunningPrerender(100, last_prerender_id())); |
| 790 } | 795 } |
| 791 | 796 |
| 797 // Tests that prerendering doesn't launch rel=next prerenders without the field |
| 798 // trial. |
| 799 TEST_F(PrerenderTest, NoRelNextByDefault) { |
| 800 GURL url("http://www.google.com/"); |
| 801 prerender_manager()->CreateNextPrerenderContents( |
| 802 url, FINAL_STATUS_MANAGER_SHUTDOWN); |
| 803 DummyPrerenderContents* null = NULL; |
| 804 |
| 805 prerender_link_manager()->OnAddPrerender( |
| 806 kDefaultChildId, GetNextPrerenderID(), url, PrerenderRelTypeNext, |
| 807 Referrer(), kSize, kDefaultRenderViewRouteId); |
| 808 EXPECT_EQ(null, prerender_manager()->FindEntry(url)); |
| 809 } |
| 810 |
| 811 // Tests that prerendering does launch rel=next prerenders with the field trial. |
| 812 TEST_F(PrerenderTest, RelNextByFieldTrial) { |
| 813 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("PrerenderRelNextTrial", |
| 814 "Yes")); |
| 815 GURL url("http://www.google.com/"); |
| 816 DummyPrerenderContents* prerender_contents = |
| 817 prerender_manager()->CreateNextPrerenderContents( |
| 818 url, FINAL_STATUS_MANAGER_SHUTDOWN); |
| 819 |
| 820 prerender_link_manager()->OnAddPrerender( |
| 821 kDefaultChildId, GetNextPrerenderID(), url, PrerenderRelTypeNext, |
| 822 Referrer(), kSize, kDefaultRenderViewRouteId); |
| 823 EXPECT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
| 824 } |
| 825 |
| 792 // Tests that prerendering is cancelled when we launch a second prerender of | 826 // Tests that prerendering is cancelled when we launch a second prerender of |
| 793 // the same target within a short time interval. | 827 // the same target within a short time interval. |
| 794 TEST_F(PrerenderTest, RecentlyVisited) { | 828 TEST_F(PrerenderTest, RecentlyVisited) { |
| 795 GURL url("http://www.google.com/"); | 829 GURL url("http://www.google.com/"); |
| 796 | 830 |
| 797 prerender_manager()->RecordNavigation(url); | 831 prerender_manager()->RecordNavigation(url); |
| 798 | 832 |
| 799 DummyPrerenderContents* prerender_contents = | 833 DummyPrerenderContents* prerender_contents = |
| 800 prerender_manager()->CreateNextPrerenderContents( | 834 prerender_manager()->CreateNextPrerenderContents( |
| 801 url, FINAL_STATUS_RECENTLY_VISITED); | 835 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); | 1371 first_url, FINAL_STATUS_TIMED_OUT); |
| 1338 EXPECT_TRUE(AddSimplePrerender(first_url)); | 1372 EXPECT_TRUE(AddSimplePrerender(first_url)); |
| 1339 const int first_prerender_id = last_prerender_id(); | 1373 const int first_prerender_id = last_prerender_id(); |
| 1340 | 1374 |
| 1341 int child_id; | 1375 int child_id; |
| 1342 int route_id; | 1376 int route_id; |
| 1343 ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); | 1377 ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); |
| 1344 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); | 1378 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); |
| 1345 | 1379 |
| 1346 GURL pending_url("http://www.neverlaunched.com"); | 1380 GURL pending_url("http://www.neverlaunched.com"); |
| 1347 prerender_link_manager()->OnAddPrerender(child_id, | 1381 prerender_link_manager()->OnAddPrerender( |
| 1348 GetNextPrerenderID(), | 1382 child_id, GetNextPrerenderID(), pending_url, kDefaultRelTypes, |
| 1349 pending_url, content::Referrer(), | 1383 content::Referrer(), kSize, route_id); |
| 1350 kSize, route_id); | |
| 1351 const int second_prerender_id = last_prerender_id(); | 1384 const int second_prerender_id = last_prerender_id(); |
| 1352 | 1385 |
| 1353 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); | 1386 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); |
| 1354 | 1387 |
| 1355 DummyPrerenderContents* null = NULL; | 1388 DummyPrerenderContents* null = NULL; |
| 1356 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url)); | 1389 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url)); |
| 1357 EXPECT_EQ(null, prerender_manager()->FindEntry(pending_url)); | 1390 EXPECT_EQ(null, prerender_manager()->FindEntry(pending_url)); |
| 1358 | 1391 |
| 1359 prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, | 1392 prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, |
| 1360 first_prerender_id); | 1393 first_prerender_id); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1477 CHECK(prerender_handle.get()); | 1510 CHECK(prerender_handle.get()); |
| 1478 EXPECT_TRUE(prerender_handle->IsPrerendering()); | 1511 EXPECT_TRUE(prerender_handle->IsPrerendering()); |
| 1479 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | 1512 EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
| 1480 EXPECT_EQ(prerender_contents, prerender_handle->contents()); | 1513 EXPECT_EQ(prerender_contents, prerender_handle->contents()); |
| 1481 EXPECT_EQ(ORIGIN_INSTANT, prerender_handle->contents()->origin()); | 1514 EXPECT_EQ(ORIGIN_INSTANT, prerender_handle->contents()->origin()); |
| 1482 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); | 1515 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
| 1483 EXPECT_FALSE(prerender_handle->IsPrerendering()); | 1516 EXPECT_FALSE(prerender_handle->IsPrerendering()); |
| 1484 } | 1517 } |
| 1485 | 1518 |
| 1486 } // namespace prerender | 1519 } // namespace prerender |
| OLD | NEW |