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

Side by Side Diff: chrome/browser/prerender/prerender_unittest.cc

Issue 113803003: Add <link rel=next> support to prerender. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: whitespace Created 7 years 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 | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698