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 <map> | 5 #include <map> |
6 #include <utility> | 6 #include <utility> |
7 | 7 |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
10 #include "base/memory/scoped_vector.h" | 10 #include "base/memory/scoped_vector.h" |
11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
12 #include "base/metrics/field_trial.h" | 12 #include "base/metrics/field_trial.h" |
13 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
14 #include "base/time/time.h" | 14 #include "base/time/time.h" |
15 #include "chrome/browser/prerender/prerender_contents.h" | 15 #include "chrome/browser/prerender/prerender_contents.h" |
16 #include "chrome/browser/prerender/prerender_handle.h" | 16 #include "chrome/browser/prerender/prerender_handle.h" |
17 #include "chrome/browser/prerender/prerender_link_manager.h" | 17 #include "chrome/browser/prerender/prerender_link_manager.h" |
18 #include "chrome/browser/prerender/prerender_manager.h" | 18 #include "chrome/browser/prerender/prerender_manager.h" |
19 #include "chrome/browser/prerender/prerender_origin.h" | 19 #include "chrome/browser/prerender/prerender_origin.h" |
20 #include "chrome/common/chrome_switches.h" | 20 #include "chrome/common/chrome_switches.h" |
21 #include "chrome/common/prerender_types.h" | |
22 #include "chrome/test/base/testing_browser_process.h" | 21 #include "chrome/test/base/testing_browser_process.h" |
23 #include "chrome/test/base/testing_profile.h" | 22 #include "chrome/test/base/testing_profile.h" |
24 #include "content/public/browser/render_view_host.h" | 23 #include "content/public/browser/render_view_host.h" |
25 #include "content/public/test/test_browser_thread.h" | 24 #include "content/public/test/test_browser_thread.h" |
26 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
27 #include "ui/gfx/size.h" | 26 #include "ui/gfx/size.h" |
28 #include "url/gurl.h" | 27 #include "url/gurl.h" |
29 | 28 |
30 using base::Time; | 29 using base::Time; |
31 using base::TimeDelta; | 30 using base::TimeDelta; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 int route_id_; | 77 int route_id_; |
79 | 78 |
80 UnitTestPrerenderManager* test_prerender_manager_; | 79 UnitTestPrerenderManager* test_prerender_manager_; |
81 FinalStatus expected_final_status_; | 80 FinalStatus expected_final_status_; |
82 }; | 81 }; |
83 | 82 |
84 int DummyPrerenderContents::g_next_route_id_ = 0; | 83 int DummyPrerenderContents::g_next_route_id_ = 0; |
85 | 84 |
86 const gfx::Size kSize(640, 480); | 85 const gfx::Size kSize(640, 480); |
87 | 86 |
88 const uint32 kDefaultRelTypes = PrerenderRelTypePrerender; | |
89 | |
90 } // namespace | 87 } // namespace |
91 | 88 |
92 class UnitTestPrerenderManager : public PrerenderManager { | 89 class UnitTestPrerenderManager : public PrerenderManager { |
93 public: | 90 public: |
94 using PrerenderManager::kMinTimeBetweenPrerendersMs; | 91 using PrerenderManager::kMinTimeBetweenPrerendersMs; |
95 using PrerenderManager::kNavigationRecordWindowMs; | 92 using PrerenderManager::kNavigationRecordWindowMs; |
96 | 93 |
97 explicit UnitTestPrerenderManager(Profile* profile, | 94 explicit UnitTestPrerenderManager(Profile* profile, |
98 PrerenderTracker* prerender_tracker) | 95 PrerenderTracker* prerender_tracker) |
99 : PrerenderManager(profile, prerender_tracker), | 96 : PrerenderManager(profile, prerender_tracker), |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 PrerenderLinkManager::LinkPrerender* prerender = | 369 PrerenderLinkManager::LinkPrerender* prerender = |
373 prerender_link_manager()->FindByLauncherChildIdAndPrerenderId( | 370 prerender_link_manager()->FindByLauncherChildIdAndPrerenderId( |
374 child_id, prerender_id); | 371 child_id, prerender_id); |
375 return prerender != NULL; | 372 return prerender != NULL; |
376 } | 373 } |
377 | 374 |
378 // Shorthand to add a simple prerender with a reasonable source. Returns | 375 // Shorthand to add a simple prerender with a reasonable source. Returns |
379 // true iff the prerender has been added to the PrerenderManager by the | 376 // true iff the prerender has been added to the PrerenderManager by the |
380 // PrerenderLinkManager and the PrerenderManager returned a handle. | 377 // PrerenderLinkManager and the PrerenderManager returned a handle. |
381 bool AddSimplePrerender(const GURL& url) { | 378 bool AddSimplePrerender(const GURL& url) { |
382 prerender_link_manager()->OnAddPrerender( | 379 prerender_link_manager()->OnAddPrerender(kDefaultChildId, |
383 kDefaultChildId, GetNextPrerenderID(), url, kDefaultRelTypes, | 380 GetNextPrerenderID(), |
384 content::Referrer(), kSize, kDefaultRenderViewRouteId); | 381 url, content::Referrer(), |
| 382 kSize, kDefaultRenderViewRouteId); |
385 return LauncherHasRunningPrerender(kDefaultChildId, last_prerender_id()); | 383 return LauncherHasRunningPrerender(kDefaultChildId, last_prerender_id()); |
386 } | 384 } |
387 | 385 |
388 private: | 386 private: |
389 PrerenderTracker* prerender_tracker() { | 387 PrerenderTracker* prerender_tracker() { |
390 return g_browser_process->prerender_tracker(); | 388 return g_browser_process->prerender_tracker(); |
391 } | 389 } |
392 | 390 |
393 // Needed to pass PrerenderManager's DCHECKs. | 391 // Needed to pass PrerenderManager's DCHECKs. |
394 TestingProfile profile_; | 392 TestingProfile profile_; |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 | 712 |
715 GURL pending_url("http://news.google.com/"); | 713 GURL pending_url("http://news.google.com/"); |
716 | 714 |
717 // Schedule a pending prerender launched from the prerender. | 715 // Schedule a pending prerender launched from the prerender. |
718 DummyPrerenderContents* pending_prerender_contents = | 716 DummyPrerenderContents* pending_prerender_contents = |
719 prerender_manager()->CreateNextPrerenderContents( | 717 prerender_manager()->CreateNextPrerenderContents( |
720 pending_url, | 718 pending_url, |
721 ORIGIN_GWS_PRERENDER, | 719 ORIGIN_GWS_PRERENDER, |
722 FINAL_STATUS_USED); | 720 FINAL_STATUS_USED); |
723 prerender_link_manager()->OnAddPrerender( | 721 prerender_link_manager()->OnAddPrerender( |
724 child_id, GetNextPrerenderID(), pending_url, kDefaultRelTypes, | 722 child_id, GetNextPrerenderID(), pending_url, |
725 Referrer(url, blink::WebReferrerPolicyDefault), | 723 Referrer(url, blink::WebReferrerPolicyDefault), |
726 kSize, route_id); | 724 kSize, route_id); |
727 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); | 725 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
728 EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); | 726 EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); |
729 | 727 |
730 // Use the referring prerender. | 728 // Use the referring prerender. |
731 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | 729 EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
732 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); | 730 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
733 | 731 |
734 // The pending prerender should start now. | 732 // The pending prerender should start now. |
(...skipping 20 matching lines...) Expand all Loading... |
755 // to start. | 753 // to start. |
756 GURL pending_url("ftp://news.google.com/"); | 754 GURL pending_url("ftp://news.google.com/"); |
757 | 755 |
758 // Schedule a pending prerender launched from the prerender. | 756 // Schedule a pending prerender launched from the prerender. |
759 DummyPrerenderContents* pending_prerender_contents = | 757 DummyPrerenderContents* pending_prerender_contents = |
760 prerender_manager()->CreateNextPrerenderContents( | 758 prerender_manager()->CreateNextPrerenderContents( |
761 pending_url, | 759 pending_url, |
762 ORIGIN_GWS_PRERENDER, | 760 ORIGIN_GWS_PRERENDER, |
763 FINAL_STATUS_UNSUPPORTED_SCHEME); | 761 FINAL_STATUS_UNSUPPORTED_SCHEME); |
764 prerender_link_manager()->OnAddPrerender( | 762 prerender_link_manager()->OnAddPrerender( |
765 child_id, GetNextPrerenderID(), pending_url, kDefaultRelTypes, | 763 child_id, GetNextPrerenderID(), pending_url, |
766 Referrer(url, blink::WebReferrerPolicyDefault), | 764 Referrer(url, blink::WebReferrerPolicyDefault), |
767 kSize, route_id); | 765 kSize, route_id); |
768 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); | 766 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
769 EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); | 767 EXPECT_FALSE(pending_prerender_contents->prerendering_has_started()); |
770 | 768 |
771 // Use the referring prerender. | 769 // Use the referring prerender. |
772 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | 770 EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
773 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); | 771 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
774 | 772 |
775 // The pending prerender still doesn't start. | 773 // The pending prerender still doesn't start. |
(...skipping 11 matching lines...) Expand all Loading... |
787 | 785 |
788 int child_id; | 786 int child_id; |
789 int route_id; | 787 int route_id; |
790 ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); | 788 ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); |
791 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); | 789 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); |
792 | 790 |
793 GURL pending_url("http://news.google.com/"); | 791 GURL pending_url("http://news.google.com/"); |
794 | 792 |
795 // Schedule a pending prerender launched from the prerender. | 793 // Schedule a pending prerender launched from the prerender. |
796 prerender_link_manager()->OnAddPrerender( | 794 prerender_link_manager()->OnAddPrerender( |
797 child_id, GetNextPrerenderID(), pending_url, kDefaultRelTypes, | 795 child_id, GetNextPrerenderID(), pending_url, |
798 Referrer(url, blink::WebReferrerPolicyDefault), | 796 Referrer(url, blink::WebReferrerPolicyDefault), |
799 kSize, route_id); | 797 kSize, route_id); |
800 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); | 798 EXPECT_FALSE(LauncherHasRunningPrerender(child_id, last_prerender_id())); |
801 | 799 |
802 // Cancel the pending prerender. | 800 // Cancel the pending prerender. |
803 prerender_link_manager()->OnCancelPrerender(child_id, last_prerender_id()); | 801 prerender_link_manager()->OnCancelPrerender(child_id, last_prerender_id()); |
804 | 802 |
805 // Use the referring prerender. | 803 // Use the referring prerender. |
806 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | 804 EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
807 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); | 805 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
(...skipping 18 matching lines...) Expand all Loading... |
826 } | 824 } |
827 | 825 |
828 // Tests that prerendering is cancelled when the source render view does not | 826 // Tests that prerendering is cancelled when the source render view does not |
829 // exist. On failure, the DCHECK in CreatePrerenderContents() above should be | 827 // exist. On failure, the DCHECK in CreatePrerenderContents() above should be |
830 // triggered. | 828 // triggered. |
831 TEST_F(PrerenderTest, SourceRenderViewClosed) { | 829 TEST_F(PrerenderTest, SourceRenderViewClosed) { |
832 GURL url("http://www.google.com/"); | 830 GURL url("http://www.google.com/"); |
833 prerender_manager()->CreateNextPrerenderContents( | 831 prerender_manager()->CreateNextPrerenderContents( |
834 url, | 832 url, |
835 FINAL_STATUS_MANAGER_SHUTDOWN); | 833 FINAL_STATUS_MANAGER_SHUTDOWN); |
836 prerender_link_manager()->OnAddPrerender( | 834 prerender_link_manager()->OnAddPrerender(100, GetNextPrerenderID(), url, |
837 100, GetNextPrerenderID(), url, kDefaultRelTypes, Referrer(), kSize, 200); | 835 Referrer(), kSize, 200); |
838 EXPECT_FALSE(LauncherHasRunningPrerender(100, last_prerender_id())); | 836 EXPECT_FALSE(LauncherHasRunningPrerender(100, last_prerender_id())); |
839 } | 837 } |
840 | 838 |
841 // Tests that prerendering doesn't launch rel=next prerenders without the field | |
842 // trial. | |
843 TEST_F(PrerenderTest, NoRelNextByDefault) { | |
844 GURL url("http://www.google.com/"); | |
845 prerender_manager()->CreateNextPrerenderContents( | |
846 url, FINAL_STATUS_MANAGER_SHUTDOWN); | |
847 DummyPrerenderContents* null = NULL; | |
848 | |
849 prerender_link_manager()->OnAddPrerender( | |
850 kDefaultChildId, GetNextPrerenderID(), url, PrerenderRelTypeNext, | |
851 Referrer(), kSize, kDefaultRenderViewRouteId); | |
852 EXPECT_EQ(null, prerender_manager()->FindEntry(url)); | |
853 } | |
854 | |
855 // Tests that prerendering does launch rel=next prerenders with the field trial. | |
856 TEST_F(PrerenderTest, RelNextByFieldTrial) { | |
857 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial("PrerenderRelNextTrial", | |
858 "Yes")); | |
859 GURL url("http://www.google.com/"); | |
860 DummyPrerenderContents* prerender_contents = | |
861 prerender_manager()->CreateNextPrerenderContents( | |
862 url, FINAL_STATUS_MANAGER_SHUTDOWN); | |
863 | |
864 prerender_link_manager()->OnAddPrerender( | |
865 kDefaultChildId, GetNextPrerenderID(), url, PrerenderRelTypeNext, | |
866 Referrer(), kSize, kDefaultRenderViewRouteId); | |
867 EXPECT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); | |
868 } | |
869 | |
870 // Tests that prerendering is cancelled when we launch a second prerender of | 839 // Tests that prerendering is cancelled when we launch a second prerender of |
871 // the same target within a short time interval. | 840 // the same target within a short time interval. |
872 TEST_F(PrerenderTest, RecentlyVisited) { | 841 TEST_F(PrerenderTest, RecentlyVisited) { |
873 GURL url("http://www.google.com/"); | 842 GURL url("http://www.google.com/"); |
874 | 843 |
875 prerender_manager()->RecordNavigation(url); | 844 prerender_manager()->RecordNavigation(url); |
876 | 845 |
877 DummyPrerenderContents* prerender_contents = | 846 DummyPrerenderContents* prerender_contents = |
878 prerender_manager()->CreateNextPrerenderContents( | 847 prerender_manager()->CreateNextPrerenderContents( |
879 url, FINAL_STATUS_RECENTLY_VISITED); | 848 url, FINAL_STATUS_RECENTLY_VISITED); |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1415 first_url, FINAL_STATUS_TIMED_OUT); | 1384 first_url, FINAL_STATUS_TIMED_OUT); |
1416 EXPECT_TRUE(AddSimplePrerender(first_url)); | 1385 EXPECT_TRUE(AddSimplePrerender(first_url)); |
1417 const int first_prerender_id = last_prerender_id(); | 1386 const int first_prerender_id = last_prerender_id(); |
1418 | 1387 |
1419 int child_id; | 1388 int child_id; |
1420 int route_id; | 1389 int route_id; |
1421 ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); | 1390 ASSERT_TRUE(prerender_contents->GetChildId(&child_id)); |
1422 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); | 1391 ASSERT_TRUE(prerender_contents->GetRouteId(&route_id)); |
1423 | 1392 |
1424 GURL pending_url("http://www.neverlaunched.com"); | 1393 GURL pending_url("http://www.neverlaunched.com"); |
1425 prerender_link_manager()->OnAddPrerender( | 1394 prerender_link_manager()->OnAddPrerender(child_id, |
1426 child_id, GetNextPrerenderID(), pending_url, kDefaultRelTypes, | 1395 GetNextPrerenderID(), |
1427 content::Referrer(), kSize, route_id); | 1396 pending_url, content::Referrer(), |
| 1397 kSize, route_id); |
1428 const int second_prerender_id = last_prerender_id(); | 1398 const int second_prerender_id = last_prerender_id(); |
1429 | 1399 |
1430 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); | 1400 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); |
1431 | 1401 |
1432 DummyPrerenderContents* null = NULL; | 1402 DummyPrerenderContents* null = NULL; |
1433 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url)); | 1403 EXPECT_EQ(prerender_contents, prerender_manager()->FindEntry(first_url)); |
1434 EXPECT_EQ(null, prerender_manager()->FindEntry(pending_url)); | 1404 EXPECT_EQ(null, prerender_manager()->FindEntry(pending_url)); |
1435 | 1405 |
1436 prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, | 1406 prerender_link_manager()->OnAbandonPrerender(kDefaultChildId, |
1437 first_prerender_id); | 1407 first_prerender_id); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1554 CHECK(prerender_handle.get()); | 1524 CHECK(prerender_handle.get()); |
1555 EXPECT_TRUE(prerender_handle->IsPrerendering()); | 1525 EXPECT_TRUE(prerender_handle->IsPrerendering()); |
1556 EXPECT_TRUE(prerender_contents->prerendering_has_started()); | 1526 EXPECT_TRUE(prerender_contents->prerendering_has_started()); |
1557 EXPECT_EQ(prerender_contents, prerender_handle->contents()); | 1527 EXPECT_EQ(prerender_contents, prerender_handle->contents()); |
1558 EXPECT_EQ(ORIGIN_INSTANT, prerender_handle->contents()->origin()); | 1528 EXPECT_EQ(ORIGIN_INSTANT, prerender_handle->contents()->origin()); |
1559 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); | 1529 ASSERT_EQ(prerender_contents, prerender_manager()->FindAndUseEntry(url)); |
1560 EXPECT_FALSE(prerender_handle->IsPrerendering()); | 1530 EXPECT_FALSE(prerender_handle->IsPrerendering()); |
1561 } | 1531 } |
1562 | 1532 |
1563 } // namespace prerender | 1533 } // namespace prerender |
OLD | NEW |