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 |