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