OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/memory/scoped_vector.h" | 6 #include "base/memory/scoped_vector.h" |
6 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
7 #include "base/time.h" | 8 #include "base/time.h" |
8 #include "chrome/browser/prerender/prerender_contents.h" | 9 #include "chrome/browser/prerender/prerender_contents.h" |
9 #include "chrome/browser/prerender/prerender_manager.h" | 10 #include "chrome/browser/prerender/prerender_manager.h" |
10 #include "chrome/browser/prerender/prerender_origin.h" | 11 #include "chrome/browser/prerender/prerender_origin.h" |
| 12 #include "chrome/common/chrome_switches.h" |
11 #include "chrome/test/base/testing_browser_process.h" | 13 #include "chrome/test/base/testing_browser_process.h" |
| 14 #include "chrome/test/base/testing_profile.h" |
12 #include "content/browser/renderer_host/render_view_host.h" | 15 #include "content/browser/renderer_host/render_view_host.h" |
13 #include "content/test/test_browser_thread.h" | 16 #include "content/test/test_browser_thread.h" |
14 #include "googleurl/src/gurl.h" | 17 #include "googleurl/src/gurl.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
16 | 19 |
17 using content::BrowserThread; | 20 using content::BrowserThread; |
18 | 21 |
19 namespace prerender { | 22 namespace prerender { |
20 | 23 |
21 namespace { | 24 namespace { |
22 | 25 |
23 class DummyPrerenderContents : public PrerenderContents { | 26 class DummyPrerenderContents : public PrerenderContents { |
24 public: | 27 public: |
25 DummyPrerenderContents(PrerenderManager* prerender_manager, | 28 DummyPrerenderContents(PrerenderManager* prerender_manager, |
26 PrerenderTracker* prerender_tracker, | 29 PrerenderTracker* prerender_tracker, |
27 const GURL& url, | 30 const GURL& url, |
| 31 Origin origin, |
28 FinalStatus expected_final_status) | 32 FinalStatus expected_final_status) |
29 : PrerenderContents(prerender_manager, prerender_tracker, | 33 : PrerenderContents(prerender_manager, prerender_tracker, |
30 NULL, url, content::Referrer(), | 34 NULL, url, content::Referrer(), |
31 ORIGIN_LINK_REL_PRERENDER, | 35 origin, PrerenderManager::kNoExperiment), |
32 PrerenderManager::kNoExperiment), | |
33 has_started_(false), | 36 has_started_(false), |
34 expected_final_status_(expected_final_status) { | 37 expected_final_status_(expected_final_status) { |
35 } | 38 } |
36 | 39 |
37 virtual ~DummyPrerenderContents() { | 40 virtual ~DummyPrerenderContents() { |
38 EXPECT_EQ(expected_final_status_, final_status()); | 41 EXPECT_EQ(expected_final_status_, final_status()); |
39 } | 42 } |
40 | 43 |
41 virtual void StartPrerendering( | 44 virtual void StartPrerendering( |
42 const RenderViewHost* source_render_view_host, | 45 const RenderViewHost* source_render_view_host, |
(...skipping 16 matching lines...) Expand all Loading... |
59 FinalStatus expected_final_status() const { return expected_final_status_; } | 62 FinalStatus expected_final_status() const { return expected_final_status_; } |
60 | 63 |
61 private: | 64 private: |
62 bool has_started_; | 65 bool has_started_; |
63 FinalStatus expected_final_status_; | 66 FinalStatus expected_final_status_; |
64 }; | 67 }; |
65 | 68 |
66 class TestPrerenderManager : public PrerenderManager { | 69 class TestPrerenderManager : public PrerenderManager { |
67 public: | 70 public: |
68 explicit TestPrerenderManager(PrerenderTracker* prerender_tracker) | 71 explicit TestPrerenderManager(PrerenderTracker* prerender_tracker) |
69 : PrerenderManager(NULL, prerender_tracker), | 72 : PrerenderManager(&profile_, prerender_tracker), |
70 time_(base::Time::Now()), | 73 time_(base::Time::Now()), |
71 time_ticks_(base::TimeTicks::Now()), | 74 time_ticks_(base::TimeTicks::Now()), |
72 next_prerender_contents_(NULL), | 75 next_prerender_contents_(NULL), |
73 prerender_tracker_(prerender_tracker) { | 76 prerender_tracker_(prerender_tracker) { |
74 set_rate_limit_enabled(false); | 77 set_rate_limit_enabled(false); |
75 } | 78 } |
76 | 79 |
77 virtual ~TestPrerenderManager() { | 80 virtual ~TestPrerenderManager() { |
78 if (next_prerender_contents()) { | 81 if (next_prerender_contents()) { |
79 next_prerender_contents_.release()->Destroy( | 82 next_prerender_contents_.release()->Destroy( |
(...skipping 17 matching lines...) Expand all Loading... |
97 | 100 |
98 void AdvanceTimeTicks(base::TimeDelta delta) { | 101 void AdvanceTimeTicks(base::TimeDelta delta) { |
99 time_ticks_ += delta; | 102 time_ticks_ += delta; |
100 } | 103 } |
101 | 104 |
102 DummyPrerenderContents* CreateNextPrerenderContents( | 105 DummyPrerenderContents* CreateNextPrerenderContents( |
103 const GURL& url, | 106 const GURL& url, |
104 FinalStatus expected_final_status) { | 107 FinalStatus expected_final_status) { |
105 DummyPrerenderContents* prerender_contents = | 108 DummyPrerenderContents* prerender_contents = |
106 new DummyPrerenderContents(this, prerender_tracker_, url, | 109 new DummyPrerenderContents(this, prerender_tracker_, url, |
| 110 ORIGIN_LINK_REL_PRERENDER, |
107 expected_final_status); | 111 expected_final_status); |
108 SetNextPrerenderContents(prerender_contents); | 112 SetNextPrerenderContents(prerender_contents); |
109 return prerender_contents; | 113 return prerender_contents; |
110 } | 114 } |
111 | 115 |
112 DummyPrerenderContents* CreateNextPrerenderContents( | 116 DummyPrerenderContents* CreateNextPrerenderContents( |
113 const GURL& url, | 117 const GURL& url, |
| 118 Origin origin, |
| 119 FinalStatus expected_final_status) { |
| 120 DummyPrerenderContents* prerender_contents = |
| 121 new DummyPrerenderContents(this, prerender_tracker_, url, |
| 122 origin, expected_final_status); |
| 123 SetNextPrerenderContents(prerender_contents); |
| 124 return prerender_contents; |
| 125 } |
| 126 |
| 127 DummyPrerenderContents* CreateNextPrerenderContents( |
| 128 const GURL& url, |
114 const std::vector<GURL>& alias_urls, | 129 const std::vector<GURL>& alias_urls, |
115 FinalStatus expected_final_status) { | 130 FinalStatus expected_final_status) { |
116 DummyPrerenderContents* prerender_contents = | 131 DummyPrerenderContents* prerender_contents = |
117 new DummyPrerenderContents(this, prerender_tracker_, url, | 132 new DummyPrerenderContents(this, prerender_tracker_, url, |
| 133 ORIGIN_LINK_REL_PRERENDER, |
118 expected_final_status); | 134 expected_final_status); |
119 for (std::vector<GURL>::const_iterator it = alias_urls.begin(); | 135 for (std::vector<GURL>::const_iterator it = alias_urls.begin(); |
120 it != alias_urls.end(); | 136 it != alias_urls.end(); |
121 ++it) { | 137 ++it) { |
122 EXPECT_TRUE(prerender_contents->AddAliasURL(*it)); | 138 EXPECT_TRUE(prerender_contents->AddAliasURL(*it)); |
123 } | 139 } |
124 SetNextPrerenderContents(prerender_contents); | 140 SetNextPrerenderContents(prerender_contents); |
125 return prerender_contents; | 141 return prerender_contents; |
126 } | 142 } |
127 | 143 |
(...skipping 27 matching lines...) Expand all Loading... |
155 virtual base::TimeTicks GetCurrentTimeTicks() const OVERRIDE { | 171 virtual base::TimeTicks GetCurrentTimeTicks() const OVERRIDE { |
156 return time_ticks_; | 172 return time_ticks_; |
157 } | 173 } |
158 | 174 |
159 virtual PrerenderContents* CreatePrerenderContents( | 175 virtual PrerenderContents* CreatePrerenderContents( |
160 const GURL& url, | 176 const GURL& url, |
161 const content::Referrer& referrer, | 177 const content::Referrer& referrer, |
162 Origin origin, | 178 Origin origin, |
163 uint8 experiment_id) OVERRIDE { | 179 uint8 experiment_id) OVERRIDE { |
164 DCHECK(next_prerender_contents_.get()); | 180 DCHECK(next_prerender_contents_.get()); |
| 181 DCHECK_EQ(next_prerender_contents_->prerender_url(), url); |
| 182 DCHECK_EQ(next_prerender_contents_->origin(), origin); |
165 return next_prerender_contents_.release(); | 183 return next_prerender_contents_.release(); |
166 } | 184 } |
167 | 185 |
168 base::Time time_; | 186 base::Time time_; |
169 base::TimeTicks time_ticks_; | 187 base::TimeTicks time_ticks_; |
170 scoped_ptr<PrerenderContents> next_prerender_contents_; | 188 scoped_ptr<PrerenderContents> next_prerender_contents_; |
171 // PrerenderContents with an |expected_final_status| of FINAL_STATUS_USED, | 189 // PrerenderContents with an |expected_final_status| of FINAL_STATUS_USED, |
172 // tracked so they will be automatically deleted. | 190 // tracked so they will be automatically deleted. |
173 ScopedVector<PrerenderContents> used_prerender_contents_; | 191 ScopedVector<PrerenderContents> used_prerender_contents_; |
174 | 192 |
175 PrerenderTracker* prerender_tracker_; | 193 PrerenderTracker* prerender_tracker_; |
| 194 |
| 195 TestingProfile profile_; |
176 }; | 196 }; |
177 | 197 |
178 class RestorePrerenderMode { | 198 class RestorePrerenderMode { |
179 public: | 199 public: |
180 RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { | 200 RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { |
181 } | 201 } |
182 | 202 |
183 ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } | 203 ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } |
184 private: | 204 private: |
185 PrerenderManager::PrerenderManagerMode prev_mode_; | 205 PrerenderManager::PrerenderManagerMode prev_mode_; |
186 }; | 206 }; |
187 | 207 |
188 } // namespace | 208 } // namespace |
189 | 209 |
190 class PrerenderManagerTest : public testing::Test { | 210 class PrerenderManagerTest : public testing::Test { |
191 public: | 211 public: |
192 PrerenderManagerTest() : ui_thread_(BrowserThread::UI, &message_loop_), | 212 PrerenderManagerTest() : ui_thread_(BrowserThread::UI, &message_loop_), |
193 prerender_manager_( | 213 prerender_manager_( |
194 new TestPrerenderManager(prerender_tracker())) { | 214 new TestPrerenderManager(prerender_tracker())) { |
| 215 // Enable omnibox prerendering. |
| 216 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 217 switches::kPrerenderFromOmnibox, |
| 218 switches::kPrerenderFromOmniboxSwitchValueEnabled); |
195 } | 219 } |
196 | 220 |
197 TestPrerenderManager* prerender_manager() { | 221 TestPrerenderManager* prerender_manager() { |
198 return prerender_manager_.get(); | 222 return prerender_manager_.get(); |
199 } | 223 } |
200 | 224 |
201 private: | 225 private: |
202 PrerenderTracker* prerender_tracker() { | 226 PrerenderTracker* prerender_tracker() { |
203 return g_browser_process->prerender_tracker(); | 227 return g_browser_process->prerender_tracker(); |
204 } | 228 } |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 prerender_manager()->CreateNextPrerenderContents( | 546 prerender_manager()->CreateNextPrerenderContents( |
523 url, | 547 url, |
524 FINAL_STATUS_CACHE_OR_HISTORY_CLEARED); | 548 FINAL_STATUS_CACHE_OR_HISTORY_CLEARED); |
525 EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url)); | 549 EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url)); |
526 EXPECT_TRUE(prerender_contents->has_started()); | 550 EXPECT_TRUE(prerender_contents->has_started()); |
527 prerender_manager()->ClearData(PrerenderManager::CLEAR_PRERENDER_CONTENTS); | 551 prerender_manager()->ClearData(PrerenderManager::CLEAR_PRERENDER_CONTENTS); |
528 DummyPrerenderContents* null = NULL; | 552 DummyPrerenderContents* null = NULL; |
529 EXPECT_EQ(null, prerender_manager()->GetEntry(url)); | 553 EXPECT_EQ(null, prerender_manager()->GetEntry(url)); |
530 } | 554 } |
531 | 555 |
| 556 // Make sure canceling works as expected. |
| 557 TEST_F(PrerenderManagerTest, CancelAllTest) { |
| 558 const DummyPrerenderContents* null = NULL; |
| 559 GURL url("http://www.google.com/"); |
| 560 DummyPrerenderContents* prerender_contents = |
| 561 prerender_manager()->CreateNextPrerenderContents( |
| 562 url, FINAL_STATUS_CANCELLED); |
| 563 EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url)); |
| 564 EXPECT_TRUE(prerender_contents->has_started()); |
| 565 prerender_manager()->CancelAllPrerenders(); |
| 566 EXPECT_EQ(null, prerender_manager()->GetEntry(url)); |
| 567 } |
| 568 |
| 569 // Make sure canceling for omnibox works as expected. |
| 570 TEST_F(PrerenderManagerTest, CancelOmniboxTest) { |
| 571 const DummyPrerenderContents* null = NULL; |
| 572 // Check canceling removes the Omnibox url. |
| 573 { |
| 574 GURL url("http://www.google.com/"); |
| 575 DummyPrerenderContents* prerender_contents = |
| 576 prerender_manager()->CreateNextPrerenderContents( |
| 577 url, ORIGIN_OMNIBOX, FINAL_STATUS_CANCELLED); |
| 578 EXPECT_TRUE(prerender_manager()->AddPrerenderFromOmnibox(url, NULL)); |
| 579 EXPECT_TRUE(prerender_contents->has_started()); |
| 580 prerender_manager()->CancelOmniboxPrerenders(); |
| 581 EXPECT_EQ(null, prerender_manager()->GetEntry(url)); |
| 582 } |
| 583 |
| 584 // Check canceling does not remove a Link url. |
| 585 { |
| 586 GURL url("http://www.google.com/"); |
| 587 DummyPrerenderContents* prerender_contents = |
| 588 prerender_manager()->CreateNextPrerenderContents( |
| 589 url, ORIGIN_LINK_REL_PRERENDER, FINAL_STATUS_CANCELLED); |
| 590 EXPECT_TRUE(prerender_manager()->AddSimplePrerender(url)); |
| 591 EXPECT_TRUE(prerender_contents->has_started()); |
| 592 prerender_manager()->CancelOmniboxPrerenders(); |
| 593 EXPECT_NE(null, prerender_manager()->GetEntry(url)); |
| 594 } |
| 595 |
| 596 } |
| 597 |
532 } // namespace prerender | 598 } // namespace prerender |
OLD | NEW |