| 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/memory/scoped_vector.h" |
| 5 #include "base/time.h" | 6 #include "base/time.h" |
| 6 #include "chrome/browser/prerender/prerender_contents.h" | 7 #include "chrome/browser/prerender/prerender_contents.h" |
| 7 #include "chrome/browser/prerender/prerender_manager.h" | 8 #include "chrome/browser/prerender/prerender_manager.h" |
| 8 #include "content/browser/browser_thread.h" | 9 #include "content/browser/browser_thread.h" |
| 9 #include "content/browser/renderer_host/render_view_host.h" | 10 #include "content/browser/renderer_host/render_view_host.h" |
| 10 #include "content/browser/renderer_host/render_process_host.h" | 11 #include "content/browser/renderer_host/render_process_host.h" |
| 11 #include "googleurl/src/gurl.h" | 12 #include "googleurl/src/gurl.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 14 |
| 14 namespace prerender { | 15 namespace prerender { |
| 15 | 16 |
| 16 namespace { | 17 namespace { |
| 17 | 18 |
| 18 class DummyPrerenderContents : public PrerenderContents { | 19 class DummyPrerenderContents : public PrerenderContents { |
| 19 public: | 20 public: |
| 20 DummyPrerenderContents(PrerenderManager* prerender_manager, | 21 DummyPrerenderContents(PrerenderManager* prerender_manager, |
| 21 const GURL& url, | 22 const GURL& url, |
| 22 FinalStatus expected_final_status) | |
| 23 : PrerenderContents(prerender_manager, NULL, url, | |
| 24 std::vector<GURL>(), GURL()), | |
| 25 has_started_(false), | |
| 26 expected_final_status_(expected_final_status) { | |
| 27 } | |
| 28 | |
| 29 DummyPrerenderContents(PrerenderManager* prerender_manager, | |
| 30 const GURL& url, | |
| 31 const std::vector<GURL> alias_urls, | 23 const std::vector<GURL> alias_urls, |
| 32 FinalStatus expected_final_status) | 24 FinalStatus expected_final_status) |
| 33 : PrerenderContents(prerender_manager, NULL, url, alias_urls, GURL()), | 25 : PrerenderContents(prerender_manager, NULL, url, alias_urls, GURL()), |
| 34 has_started_(false), | 26 has_started_(false), |
| 35 expected_final_status_(expected_final_status) { | 27 expected_final_status_(expected_final_status) { |
| 36 } | 28 } |
| 37 | 29 |
| 38 virtual ~DummyPrerenderContents() { | 30 virtual ~DummyPrerenderContents() { |
| 39 EXPECT_EQ(expected_final_status_, final_status()); | 31 EXPECT_EQ(expected_final_status_, final_status()); |
| 40 } | 32 } |
| 41 | 33 |
| 42 virtual void StartPrerendering() OVERRIDE { | 34 virtual void StartPrerendering( |
| 35 const RenderViewHost* source_render_view_host) OVERRIDE { |
| 43 has_started_ = true; | 36 has_started_ = true; |
| 44 } | 37 } |
| 45 | 38 |
| 46 virtual bool GetChildId(int* child_id) const OVERRIDE { | 39 virtual bool GetChildId(int* child_id) const OVERRIDE { |
| 47 *child_id = 0; | 40 *child_id = 0; |
| 48 return true; | 41 return true; |
| 49 } | 42 } |
| 50 | 43 |
| 51 virtual bool GetRouteId(int* route_id) const OVERRIDE { | 44 virtual bool GetRouteId(int* route_id) const OVERRIDE { |
| 52 *route_id = 0; | 45 *route_id = 0; |
| 53 return true; | 46 return true; |
| 54 } | 47 } |
| 55 | 48 |
| 56 bool has_started() const { return has_started_; } | 49 bool has_started() const { return has_started_; } |
| 57 | 50 |
| 51 FinalStatus expected_final_status() const { return expected_final_status_; } |
| 52 |
| 58 private: | 53 private: |
| 59 bool has_started_; | 54 bool has_started_; |
| 60 FinalStatus expected_final_status_; | 55 FinalStatus expected_final_status_; |
| 61 }; | 56 }; |
| 62 | 57 |
| 63 class TestPrerenderManager : public PrerenderManager { | 58 class TestPrerenderManager : public PrerenderManager { |
| 64 public: | 59 public: |
| 65 TestPrerenderManager() | 60 TestPrerenderManager() |
| 66 : PrerenderManager(NULL), | 61 : PrerenderManager(NULL), |
| 67 time_(base::Time::Now()), | 62 time_(base::Time::Now()), |
| 68 time_ticks_(base::TimeTicks::Now()), | 63 time_ticks_(base::TimeTicks::Now()), |
| 69 next_pc_(NULL) { | 64 next_pc_(NULL) { |
| 70 rate_limit_enabled_ = false; | 65 rate_limit_enabled_ = false; |
| 71 } | 66 } |
| 72 | 67 |
| 73 void AdvanceTime(base::TimeDelta delta) { | 68 void AdvanceTime(base::TimeDelta delta) { |
| 74 time_ += delta; | 69 time_ += delta; |
| 75 } | 70 } |
| 76 | 71 |
| 77 void AdvanceTimeTicks(base::TimeDelta delta) { | 72 void AdvanceTimeTicks(base::TimeDelta delta) { |
| 78 time_ticks_ += delta; | 73 time_ticks_ += delta; |
| 79 } | 74 } |
| 80 | 75 |
| 81 void SetNextPrerenderContents(PrerenderContents* pc) { | 76 DummyPrerenderContents* CreateNextPrerenderContents( |
| 82 next_pc_.reset(pc); | 77 const GURL& url, |
| 78 FinalStatus expected_final_status) { |
| 79 DummyPrerenderContents* pc = |
| 80 new DummyPrerenderContents(this, url, std::vector<GURL>(), |
| 81 expected_final_status); |
| 82 SetNextPrerenderContents(pc); |
| 83 return pc; |
| 84 } |
| 85 |
| 86 DummyPrerenderContents* CreateNextPrerenderContents( |
| 87 const GURL& url, |
| 88 const std::vector<GURL> alias_urls, |
| 89 FinalStatus expected_final_status) { |
| 90 DummyPrerenderContents* pc = |
| 91 new DummyPrerenderContents(this, url, alias_urls, |
| 92 expected_final_status); |
| 93 SetNextPrerenderContents(pc); |
| 94 return pc; |
| 83 } | 95 } |
| 84 | 96 |
| 85 // Shorthand to add a simple preload with no aliases. | 97 // Shorthand to add a simple preload with no aliases. |
| 86 bool AddSimplePreload(const GURL& url) { | 98 bool AddSimplePreload(const GURL& url) { |
| 87 return AddPreload(url, std::vector<GURL>(), GURL()); | 99 return AddPreload(std::pair<int, int>(-1, -1), url, std::vector<GURL>(), |
| 100 GURL()); |
| 88 } | 101 } |
| 89 | 102 |
| 90 bool IsPendingEntry(const GURL& url) { | 103 bool IsPendingEntry(const GURL& url) { |
| 91 return (PrerenderManager::FindPendingEntry(url) != NULL); | 104 return (PrerenderManager::FindPendingEntry(url) != NULL); |
| 92 } | 105 } |
| 93 | 106 |
| 94 void set_rate_limit_enabled(bool enabled) { rate_limit_enabled_ = true; } | 107 void set_rate_limit_enabled(bool enabled) { rate_limit_enabled_ = true; } |
| 95 | 108 |
| 109 // Shorthand to add a simple preload with aliases. |
| 110 bool AddSimplePreloadWithAliases(const GURL& url, |
| 111 const std::vector<GURL>& alias_urls) { |
| 112 return AddPreload(std::pair<int, int>(-1, -1), url, alias_urls, GURL()); |
| 113 } |
| 114 |
| 96 PrerenderContents* next_pc() { return next_pc_.get(); } | 115 PrerenderContents* next_pc() { return next_pc_.get(); } |
| 97 | 116 |
| 98 protected: | 117 protected: |
| 99 virtual ~TestPrerenderManager() { | 118 virtual ~TestPrerenderManager() { |
| 100 if (next_pc()) { | 119 if (next_pc()) { |
| 101 next_pc()->set_final_status( | 120 next_pc()->set_final_status( |
| 102 FINAL_STATUS_MANAGER_SHUTDOWN); | 121 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 103 } | 122 } |
| 123 // Set the final status for all PrerenderContents with an expected final |
| 124 // status of FINAL_STATUS_USED. These values are normally set when the |
| 125 // prerendered RVH is swapped into a tab, which doesn't happen in these |
| 126 // unit tests. |
| 127 for (ScopedVector<PrerenderContents>::iterator it = used_pcs_.begin(); |
| 128 it != used_pcs_.end(); ++it) { |
| 129 (*it)->set_final_status(FINAL_STATUS_USED); |
| 130 } |
| 104 } | 131 } |
| 105 | 132 |
| 106 private: | 133 private: |
| 134 void SetNextPrerenderContents(DummyPrerenderContents* pc) { |
| 135 DCHECK(!next_pc_.get()); |
| 136 next_pc_.reset(pc); |
| 137 if (pc->expected_final_status() == FINAL_STATUS_USED) |
| 138 used_pcs_.push_back(pc); |
| 139 } |
| 140 |
| 107 virtual base::Time GetCurrentTime() const OVERRIDE { | 141 virtual base::Time GetCurrentTime() const OVERRIDE { |
| 108 return time_; | 142 return time_; |
| 109 } | 143 } |
| 110 | 144 |
| 111 virtual base::TimeTicks GetCurrentTimeTicks() const OVERRIDE { | 145 virtual base::TimeTicks GetCurrentTimeTicks() const OVERRIDE { |
| 112 return time_ticks_; | 146 return time_ticks_; |
| 113 } | 147 } |
| 114 | 148 |
| 115 virtual PrerenderContents* CreatePrerenderContents( | 149 virtual PrerenderContents* CreatePrerenderContents( |
| 116 const GURL& url, | 150 const GURL& url, |
| 117 const std::vector<GURL>& alias_urls, | 151 const std::vector<GURL>& alias_urls, |
| 118 const GURL& referrer) OVERRIDE { | 152 const GURL& referrer) OVERRIDE { |
| 119 DCHECK(next_pc_.get()); | 153 DCHECK(next_pc_.get()); |
| 120 return next_pc_.release(); | 154 return next_pc_.release(); |
| 121 } | 155 } |
| 122 | 156 |
| 123 base::Time time_; | 157 base::Time time_; |
| 124 base::TimeTicks time_ticks_; | 158 base::TimeTicks time_ticks_; |
| 125 scoped_ptr<PrerenderContents> next_pc_; | 159 scoped_ptr<PrerenderContents> next_pc_; |
| 160 // PrerenderContents with an |expected_final_status| of FINAL_STATUS_USED, |
| 161 // tracked so they will be automatically deleted. |
| 162 ScopedVector<PrerenderContents> used_pcs_; |
| 126 }; | 163 }; |
| 127 | 164 |
| 128 class RestorePrerenderMode { | 165 class RestorePrerenderMode { |
| 129 public: | 166 public: |
| 130 RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { | 167 RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { |
| 131 } | 168 } |
| 132 | 169 |
| 133 ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } | 170 ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } |
| 134 private: | 171 private: |
| 135 PrerenderManager::PrerenderManagerMode prev_mode_; | 172 PrerenderManager::PrerenderManagerMode prev_mode_; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 153 }; | 190 }; |
| 154 | 191 |
| 155 TEST_F(PrerenderManagerTest, EmptyTest) { | 192 TEST_F(PrerenderManagerTest, EmptyTest) { |
| 156 GURL url("http://www.google.com/"); | 193 GURL url("http://www.google.com/"); |
| 157 EXPECT_FALSE(prerender_manager_->MaybeUsePreloadedPage(NULL, url)); | 194 EXPECT_FALSE(prerender_manager_->MaybeUsePreloadedPage(NULL, url)); |
| 158 } | 195 } |
| 159 | 196 |
| 160 TEST_F(PrerenderManagerTest, FoundTest) { | 197 TEST_F(PrerenderManagerTest, FoundTest) { |
| 161 GURL url("http://www.google.com/"); | 198 GURL url("http://www.google.com/"); |
| 162 DummyPrerenderContents* pc = | 199 DummyPrerenderContents* pc = |
| 163 new DummyPrerenderContents(prerender_manager_.get(), | 200 prerender_manager_->CreateNextPrerenderContents( |
| 164 url, | 201 url, |
| 165 FINAL_STATUS_USED); | 202 FINAL_STATUS_USED); |
| 166 prerender_manager_->SetNextPrerenderContents(pc); | |
| 167 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 203 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 168 EXPECT_TRUE(pc->has_started()); | 204 EXPECT_TRUE(pc->has_started()); |
| 169 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); | 205 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); |
| 170 pc->set_final_status(FINAL_STATUS_USED); | |
| 171 delete pc; | |
| 172 } | 206 } |
| 173 | 207 |
| 174 // Make sure that if queue a request, and a second prerender request for the | 208 // Make sure that if queue a request, and a second prerender request for the |
| 175 // same URL comes in, that we drop the second request and keep the first one. | 209 // same URL comes in, that we drop the second request and keep the first one. |
| 176 TEST_F(PrerenderManagerTest, DropSecondRequestTest) { | 210 TEST_F(PrerenderManagerTest, DropSecondRequestTest) { |
| 177 GURL url("http://www.google.com/"); | 211 GURL url("http://www.google.com/"); |
| 178 DummyPrerenderContents* pc = | 212 DummyPrerenderContents* pc = |
| 179 new DummyPrerenderContents(prerender_manager_.get(), url, | 213 prerender_manager_->CreateNextPrerenderContents( |
| 180 FINAL_STATUS_USED); | 214 url, |
| 215 FINAL_STATUS_USED); |
| 181 DummyPrerenderContents* null = NULL; | 216 DummyPrerenderContents* null = NULL; |
| 182 prerender_manager_->SetNextPrerenderContents(pc); | |
| 183 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 217 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 184 EXPECT_EQ(null, prerender_manager_->next_pc()); | 218 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 185 EXPECT_TRUE(pc->has_started()); | 219 EXPECT_TRUE(pc->has_started()); |
| 220 |
| 186 DummyPrerenderContents* pc1 = | 221 DummyPrerenderContents* pc1 = |
| 187 new DummyPrerenderContents( | 222 prerender_manager_->CreateNextPrerenderContents( |
| 188 prerender_manager_.get(), url, | 223 url, |
| 189 FINAL_STATUS_MANAGER_SHUTDOWN); | 224 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 190 prerender_manager_->SetNextPrerenderContents(pc1); | |
| 191 EXPECT_FALSE(prerender_manager_->AddSimplePreload(url)); | 225 EXPECT_FALSE(prerender_manager_->AddSimplePreload(url)); |
| 192 EXPECT_EQ(pc1, prerender_manager_->next_pc()); | 226 EXPECT_EQ(pc1, prerender_manager_->next_pc()); |
| 193 EXPECT_FALSE(pc1->has_started()); | 227 EXPECT_FALSE(pc1->has_started()); |
| 228 |
| 194 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); | 229 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); |
| 195 pc->set_final_status(FINAL_STATUS_USED); | |
| 196 delete pc; | |
| 197 } | 230 } |
| 198 | 231 |
| 199 // Ensure that we expire a prerendered page after the max. permitted time. | 232 // Ensure that we expire a prerendered page after the max. permitted time. |
| 200 TEST_F(PrerenderManagerTest, ExpireTest) { | 233 TEST_F(PrerenderManagerTest, ExpireTest) { |
| 201 GURL url("http://www.google.com/"); | 234 GURL url("http://www.google.com/"); |
| 202 DummyPrerenderContents* pc = | 235 DummyPrerenderContents* pc = |
| 203 new DummyPrerenderContents(prerender_manager_.get(), url, | 236 prerender_manager_->CreateNextPrerenderContents( |
| 204 FINAL_STATUS_TIMED_OUT); | 237 url, |
| 238 FINAL_STATUS_TIMED_OUT); |
| 205 DummyPrerenderContents* null = NULL; | 239 DummyPrerenderContents* null = NULL; |
| 206 prerender_manager_->SetNextPrerenderContents(pc); | |
| 207 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 240 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 208 EXPECT_EQ(null, prerender_manager_->next_pc()); | 241 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 209 EXPECT_TRUE(pc->has_started()); | 242 EXPECT_TRUE(pc->has_started()); |
| 210 prerender_manager_->AdvanceTime(prerender_manager_->max_prerender_age() | 243 prerender_manager_->AdvanceTime(prerender_manager_->max_prerender_age() |
| 211 + base::TimeDelta::FromSeconds(1)); | 244 + base::TimeDelta::FromSeconds(1)); |
| 212 ASSERT_EQ(null, prerender_manager_->GetEntry(url)); | 245 ASSERT_EQ(null, prerender_manager_->GetEntry(url)); |
| 213 } | 246 } |
| 214 | 247 |
| 215 // LRU Test. Make sure that if we prerender more than one request, that | 248 // LRU Test. Make sure that if we prerender more than one request, that |
| 216 // the oldest one will be dropped. | 249 // the oldest one will be dropped. |
| 217 TEST_F(PrerenderManagerTest, DropOldestRequestTest) { | 250 TEST_F(PrerenderManagerTest, DropOldestRequestTest) { |
| 218 GURL url("http://www.google.com/"); | 251 GURL url("http://www.google.com/"); |
| 219 DummyPrerenderContents* pc = | 252 DummyPrerenderContents* pc = |
| 220 new DummyPrerenderContents(prerender_manager_.get(), url, | 253 prerender_manager_->CreateNextPrerenderContents( |
| 221 FINAL_STATUS_EVICTED); | 254 url, |
| 255 FINAL_STATUS_EVICTED); |
| 222 DummyPrerenderContents* null = NULL; | 256 DummyPrerenderContents* null = NULL; |
| 223 prerender_manager_->SetNextPrerenderContents(pc); | |
| 224 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 257 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 225 EXPECT_EQ(null, prerender_manager_->next_pc()); | 258 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 226 EXPECT_TRUE(pc->has_started()); | 259 EXPECT_TRUE(pc->has_started()); |
| 260 |
| 227 GURL url1("http://news.google.com/"); | 261 GURL url1("http://news.google.com/"); |
| 228 DummyPrerenderContents* pc1 = | 262 DummyPrerenderContents* pc1 = |
| 229 new DummyPrerenderContents(prerender_manager_.get(), url1, | 263 prerender_manager_->CreateNextPrerenderContents( |
| 230 FINAL_STATUS_USED); | 264 url1, |
| 231 prerender_manager_->SetNextPrerenderContents(pc1); | 265 FINAL_STATUS_USED); |
| 232 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url1)); | 266 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url1)); |
| 233 EXPECT_EQ(null, prerender_manager_->next_pc()); | 267 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 234 EXPECT_TRUE(pc1->has_started()); | 268 EXPECT_TRUE(pc1->has_started()); |
| 269 |
| 235 ASSERT_EQ(null, prerender_manager_->GetEntry(url)); | 270 ASSERT_EQ(null, prerender_manager_->GetEntry(url)); |
| 236 ASSERT_EQ(pc1, prerender_manager_->GetEntry(url1)); | 271 ASSERT_EQ(pc1, prerender_manager_->GetEntry(url1)); |
| 237 pc1->set_final_status(FINAL_STATUS_USED); | |
| 238 delete pc1; | |
| 239 } | 272 } |
| 240 | 273 |
| 241 // Two element prerender test. Ensure that the LRU operates correctly if we | 274 // Two element prerender test. Ensure that the LRU operates correctly if we |
| 242 // permit 2 elements to be kept prerendered. | 275 // permit 2 elements to be kept prerendered. |
| 243 TEST_F(PrerenderManagerTest, TwoElementPrerenderTest) { | 276 TEST_F(PrerenderManagerTest, TwoElementPrerenderTest) { |
| 244 prerender_manager_->set_max_elements(2); | 277 prerender_manager_->set_max_elements(2); |
| 245 GURL url("http://www.google.com/"); | 278 GURL url("http://www.google.com/"); |
| 246 DummyPrerenderContents* pc = | 279 DummyPrerenderContents* pc = |
| 247 new DummyPrerenderContents(prerender_manager_.get(), url, | 280 prerender_manager_->CreateNextPrerenderContents( |
| 248 FINAL_STATUS_EVICTED); | 281 url, |
| 282 FINAL_STATUS_EVICTED); |
| 249 DummyPrerenderContents* null = NULL; | 283 DummyPrerenderContents* null = NULL; |
| 250 prerender_manager_->SetNextPrerenderContents(pc); | |
| 251 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 284 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 252 EXPECT_EQ(null, prerender_manager_->next_pc()); | 285 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 253 EXPECT_TRUE(pc->has_started()); | 286 EXPECT_TRUE(pc->has_started()); |
| 287 |
| 254 GURL url1("http://news.google.com/"); | 288 GURL url1("http://news.google.com/"); |
| 255 DummyPrerenderContents* pc1 = | 289 DummyPrerenderContents* pc1 = |
| 256 new DummyPrerenderContents(prerender_manager_.get(), url1, | 290 prerender_manager_->CreateNextPrerenderContents( |
| 257 FINAL_STATUS_USED); | 291 url1, |
| 258 prerender_manager_->SetNextPrerenderContents(pc1); | 292 FINAL_STATUS_USED); |
| 259 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url1)); | 293 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url1)); |
| 260 EXPECT_EQ(null, prerender_manager_->next_pc()); | 294 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 261 EXPECT_TRUE(pc1->has_started()); | 295 EXPECT_TRUE(pc1->has_started()); |
| 296 |
| 262 GURL url2("http://images.google.com/"); | 297 GURL url2("http://images.google.com/"); |
| 263 DummyPrerenderContents* pc2 = | 298 DummyPrerenderContents* pc2 = |
| 264 new DummyPrerenderContents(prerender_manager_.get(), url2, | 299 prerender_manager_->CreateNextPrerenderContents( |
| 265 FINAL_STATUS_USED); | 300 url2, |
| 266 prerender_manager_->SetNextPrerenderContents(pc2); | 301 FINAL_STATUS_USED); |
| 267 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url2)); | 302 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url2)); |
| 268 EXPECT_EQ(null, prerender_manager_->next_pc()); | 303 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 269 EXPECT_TRUE(pc2->has_started()); | 304 EXPECT_TRUE(pc2->has_started()); |
| 305 |
| 270 ASSERT_EQ(null, prerender_manager_->GetEntry(url)); | 306 ASSERT_EQ(null, prerender_manager_->GetEntry(url)); |
| 271 ASSERT_EQ(pc1, prerender_manager_->GetEntry(url1)); | 307 ASSERT_EQ(pc1, prerender_manager_->GetEntry(url1)); |
| 272 ASSERT_EQ(pc2, prerender_manager_->GetEntry(url2)); | 308 ASSERT_EQ(pc2, prerender_manager_->GetEntry(url2)); |
| 273 pc1->set_final_status(FINAL_STATUS_USED); | |
| 274 delete pc1; | |
| 275 pc2->set_final_status(FINAL_STATUS_USED); | |
| 276 delete pc2; | |
| 277 } | 309 } |
| 278 | 310 |
| 279 TEST_F(PrerenderManagerTest, AliasURLTest) { | 311 TEST_F(PrerenderManagerTest, AliasURLTest) { |
| 280 GURL url("http://www.google.com/"); | 312 GURL url("http://www.google.com/"); |
| 281 GURL alias_url1("http://www.google.com/index.html"); | 313 GURL alias_url1("http://www.google.com/index.html"); |
| 282 GURL alias_url2("http://google.com/"); | 314 GURL alias_url2("http://google.com/"); |
| 283 GURL not_an_alias_url("http://google.com/index.html"); | 315 GURL not_an_alias_url("http://google.com/index.html"); |
| 284 std::vector<GURL> alias_urls; | 316 std::vector<GURL> alias_urls; |
| 285 alias_urls.push_back(alias_url1); | 317 alias_urls.push_back(alias_url1); |
| 286 alias_urls.push_back(alias_url2); | 318 alias_urls.push_back(alias_url2); |
| 319 |
| 320 // Test that all of the aliases work, but nont_an_alias_url does not. |
| 287 DummyPrerenderContents* pc = | 321 DummyPrerenderContents* pc = |
| 288 new DummyPrerenderContents(prerender_manager_.get(), url, alias_urls, | 322 prerender_manager_->CreateNextPrerenderContents( |
| 289 FINAL_STATUS_USED); | 323 url, alias_urls, FINAL_STATUS_USED); |
| 290 // Test that all of the aliases work, but nont_an_alias_url does not. | 324 EXPECT_TRUE(prerender_manager_->AddSimplePreloadWithAliases(url, alias_urls)); |
| 291 prerender_manager_->SetNextPrerenderContents(pc); | |
| 292 EXPECT_TRUE(prerender_manager_->AddPreload(url, alias_urls, GURL())); | |
| 293 ASSERT_EQ(NULL, prerender_manager_->GetEntry(not_an_alias_url)); | 325 ASSERT_EQ(NULL, prerender_manager_->GetEntry(not_an_alias_url)); |
| 294 ASSERT_EQ(pc, prerender_manager_->GetEntry(alias_url1)); | 326 ASSERT_EQ(pc, prerender_manager_->GetEntry(alias_url1)); |
| 295 prerender_manager_->SetNextPrerenderContents(pc); | 327 pc = prerender_manager_->CreateNextPrerenderContents( |
| 296 EXPECT_TRUE(prerender_manager_->AddPreload(url, alias_urls, GURL())); | 328 url, alias_urls, FINAL_STATUS_USED); |
| 329 EXPECT_TRUE(prerender_manager_->AddSimplePreloadWithAliases(url, alias_urls)); |
| 297 ASSERT_EQ(pc, prerender_manager_->GetEntry(alias_url2)); | 330 ASSERT_EQ(pc, prerender_manager_->GetEntry(alias_url2)); |
| 298 prerender_manager_->SetNextPrerenderContents(pc); | 331 pc = prerender_manager_->CreateNextPrerenderContents( |
| 299 EXPECT_TRUE(prerender_manager_->AddPreload(url, alias_urls, GURL())); | 332 url, alias_urls, FINAL_STATUS_USED); |
| 333 EXPECT_TRUE(prerender_manager_->AddSimplePreloadWithAliases(url, alias_urls)); |
| 300 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); | 334 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); |
| 301 | 335 |
| 302 // Test that alias URLs can not be added. | 336 // Test that alias URLs can not be added. |
| 303 prerender_manager_->SetNextPrerenderContents(pc); | 337 pc = prerender_manager_->CreateNextPrerenderContents( |
| 304 EXPECT_TRUE(prerender_manager_->AddPreload(url, alias_urls, GURL())); | 338 url, alias_urls, FINAL_STATUS_USED); |
| 339 EXPECT_TRUE(prerender_manager_->AddSimplePreloadWithAliases(url, alias_urls)); |
| 305 EXPECT_FALSE(prerender_manager_->AddSimplePreload(url)); | 340 EXPECT_FALSE(prerender_manager_->AddSimplePreload(url)); |
| 306 EXPECT_FALSE(prerender_manager_->AddSimplePreload(alias_url1)); | 341 EXPECT_FALSE(prerender_manager_->AddSimplePreload(alias_url1)); |
| 307 EXPECT_FALSE(prerender_manager_->AddSimplePreload(alias_url2)); | 342 EXPECT_FALSE(prerender_manager_->AddSimplePreload(alias_url2)); |
| 308 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); | 343 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); |
| 309 | |
| 310 pc->set_final_status(FINAL_STATUS_USED); | |
| 311 delete pc; | |
| 312 } | 344 } |
| 313 | 345 |
| 314 // Ensure that we ignore prerender requests within the rate limit. | 346 // Ensure that we ignore prerender requests within the rate limit. |
| 315 TEST_F(PrerenderManagerTest, RateLimitInWindowTest) { | 347 TEST_F(PrerenderManagerTest, RateLimitInWindowTest) { |
| 316 GURL url("http://www.google.com/"); | 348 GURL url("http://www.google.com/"); |
| 317 DummyPrerenderContents* pc = | 349 DummyPrerenderContents* pc = |
| 318 new DummyPrerenderContents(prerender_manager_.get(), url, | 350 prerender_manager_->CreateNextPrerenderContents( |
| 319 FINAL_STATUS_MANAGER_SHUTDOWN); | 351 url, |
| 352 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 320 DummyPrerenderContents* null = NULL; | 353 DummyPrerenderContents* null = NULL; |
| 321 prerender_manager_->SetNextPrerenderContents(pc); | |
| 322 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 354 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 323 EXPECT_EQ(null, prerender_manager_->next_pc()); | 355 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 324 EXPECT_TRUE(pc->has_started()); | 356 EXPECT_TRUE(pc->has_started()); |
| 325 | 357 |
| 326 prerender_manager_->set_rate_limit_enabled(true); | 358 prerender_manager_->set_rate_limit_enabled(true); |
| 327 prerender_manager_->AdvanceTimeTicks(base::TimeDelta::FromMilliseconds(1)); | 359 prerender_manager_->AdvanceTimeTicks(base::TimeDelta::FromMilliseconds(1)); |
| 328 | 360 |
| 329 GURL url1("http://news.google.com/"); | 361 GURL url1("http://news.google.com/"); |
| 330 DummyPrerenderContents* rate_limit_pc = | 362 prerender_manager_->CreateNextPrerenderContents( |
| 331 new DummyPrerenderContents(prerender_manager_.get(), url1, | 363 url, |
| 332 FINAL_STATUS_MANAGER_SHUTDOWN); | 364 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 333 prerender_manager_->SetNextPrerenderContents(rate_limit_pc); | |
| 334 EXPECT_FALSE(prerender_manager_->AddSimplePreload(url1)); | 365 EXPECT_FALSE(prerender_manager_->AddSimplePreload(url1)); |
| 335 prerender_manager_->set_rate_limit_enabled(false); | 366 prerender_manager_->set_rate_limit_enabled(false); |
| 336 } | 367 } |
| 337 | 368 |
| 338 // Ensure that we don't ignore prerender requests outside the rate limit. | 369 // Ensure that we don't ignore prerender requests outside the rate limit. |
| 339 TEST_F(PrerenderManagerTest, RateLimitOutsideWindowTest) { | 370 TEST_F(PrerenderManagerTest, RateLimitOutsideWindowTest) { |
| 340 GURL url("http://www.google.com/"); | 371 GURL url("http://www.google.com/"); |
| 341 DummyPrerenderContents* pc = | 372 DummyPrerenderContents* pc = |
| 342 new DummyPrerenderContents(prerender_manager_.get(), url, | 373 prerender_manager_->CreateNextPrerenderContents( |
| 343 FINAL_STATUS_EVICTED); | 374 url, |
| 375 FINAL_STATUS_EVICTED); |
| 344 DummyPrerenderContents* null = NULL; | 376 DummyPrerenderContents* null = NULL; |
| 345 prerender_manager_->SetNextPrerenderContents(pc); | |
| 346 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 377 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 347 EXPECT_EQ(null, prerender_manager_->next_pc()); | 378 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 348 EXPECT_TRUE(pc->has_started()); | 379 EXPECT_TRUE(pc->has_started()); |
| 349 | 380 |
| 350 prerender_manager_->set_rate_limit_enabled(true); | 381 prerender_manager_->set_rate_limit_enabled(true); |
| 351 prerender_manager_->AdvanceTimeTicks(base::TimeDelta::FromMilliseconds(2000)); | 382 prerender_manager_->AdvanceTimeTicks(base::TimeDelta::FromMilliseconds(2000)); |
| 352 | 383 |
| 353 GURL url1("http://news.google.com/"); | 384 GURL url1("http://news.google.com/"); |
| 354 DummyPrerenderContents* rate_limit_pc = | 385 DummyPrerenderContents* rate_limit_pc = |
| 355 new DummyPrerenderContents(prerender_manager_.get(), url1, | 386 prerender_manager_->CreateNextPrerenderContents( |
| 356 FINAL_STATUS_MANAGER_SHUTDOWN); | 387 url1, |
| 357 prerender_manager_->SetNextPrerenderContents(rate_limit_pc); | 388 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 358 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url1)); | 389 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url1)); |
| 359 EXPECT_EQ(null, prerender_manager_->next_pc()); | 390 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 360 EXPECT_TRUE(rate_limit_pc->has_started()); | 391 EXPECT_TRUE(rate_limit_pc->has_started()); |
| 361 prerender_manager_->set_rate_limit_enabled(false); | 392 prerender_manager_->set_rate_limit_enabled(false); |
| 362 } | 393 } |
| 363 | 394 |
| 364 TEST_F(PrerenderManagerTest, PendingPreloadTest) { | 395 TEST_F(PrerenderManagerTest, PendingPreloadTest) { |
| 365 GURL url("http://www.google.com/"); | 396 GURL url("http://www.google.com/"); |
| 366 DummyPrerenderContents* pc = | 397 DummyPrerenderContents* pc = |
| 367 new DummyPrerenderContents(prerender_manager_.get(), | 398 prerender_manager_->CreateNextPrerenderContents( |
| 368 url, | 399 url, |
| 369 FINAL_STATUS_USED); | 400 FINAL_STATUS_USED); |
| 370 prerender_manager_->SetNextPrerenderContents(pc); | |
| 371 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 401 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 372 | 402 |
| 373 int child_id; | 403 int child_id; |
| 374 int route_id; | 404 int route_id; |
| 375 ASSERT_TRUE(pc->GetChildId(&child_id)); | 405 ASSERT_TRUE(pc->GetChildId(&child_id)); |
| 376 ASSERT_TRUE(pc->GetRouteId(&route_id)); | 406 ASSERT_TRUE(pc->GetRouteId(&route_id)); |
| 377 | 407 |
| 378 GURL pending_url("http://news.google.com/"); | 408 GURL pending_url("http://news.google.com/"); |
| 379 | 409 |
| 380 prerender_manager_->AddPendingPreload(std::make_pair(child_id, route_id), | 410 prerender_manager_->AddPendingPreload(std::make_pair(child_id, route_id), |
| 381 pending_url, | 411 pending_url, |
| 382 std::vector<GURL>(), | 412 std::vector<GURL>(), |
| 383 url); | 413 url); |
| 384 | 414 |
| 385 EXPECT_TRUE(prerender_manager_->IsPendingEntry(pending_url)); | 415 EXPECT_TRUE(prerender_manager_->IsPendingEntry(pending_url)); |
| 386 EXPECT_TRUE(pc->has_started()); | 416 EXPECT_TRUE(pc->has_started()); |
| 387 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); | 417 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); |
| 388 pc->set_final_status(FINAL_STATUS_USED); | |
| 389 | |
| 390 delete pc; | |
| 391 } | 418 } |
| 392 | 419 |
| 393 TEST_F(PrerenderManagerTest, PendingPreloadSkippedTest) { | 420 TEST_F(PrerenderManagerTest, PendingPreloadSkippedTest) { |
| 394 GURL url("http://www.google.com/"); | 421 GURL url("http://www.google.com/"); |
| 395 DummyPrerenderContents* pc = | 422 DummyPrerenderContents* pc = |
| 396 new DummyPrerenderContents(prerender_manager_.get(), | 423 prerender_manager_->CreateNextPrerenderContents( |
| 397 url, | 424 url, |
| 398 FINAL_STATUS_TIMED_OUT); | 425 FINAL_STATUS_TIMED_OUT); |
| 399 prerender_manager_->SetNextPrerenderContents(pc); | |
| 400 | 426 |
| 401 int child_id; | 427 int child_id; |
| 402 int route_id; | 428 int route_id; |
| 403 ASSERT_TRUE(pc->GetChildId(&child_id)); | 429 ASSERT_TRUE(pc->GetChildId(&child_id)); |
| 404 ASSERT_TRUE(pc->GetRouteId(&route_id)); | 430 ASSERT_TRUE(pc->GetRouteId(&route_id)); |
| 405 | 431 |
| 406 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 432 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 407 prerender_manager_->AdvanceTime(prerender_manager_->max_prerender_age() | 433 prerender_manager_->AdvanceTime(prerender_manager_->max_prerender_age() |
| 408 + base::TimeDelta::FromSeconds(1)); | 434 + base::TimeDelta::FromSeconds(1)); |
| 409 // GetEntry will cull old entries which should now include pc. | 435 // GetEntry will cull old entries which should now include pc. |
| (...skipping 27 matching lines...) Expand all Loading... |
| 437 } | 463 } |
| 438 | 464 |
| 439 // Tests that a PrerenderManager created for a browser session in the control | 465 // Tests that a PrerenderManager created for a browser session in the control |
| 440 // group will not be able to override FINAL_STATUS_CONTROL_GROUP. | 466 // group will not be able to override FINAL_STATUS_CONTROL_GROUP. |
| 441 TEST_F(PrerenderManagerTest, ControlGroup) { | 467 TEST_F(PrerenderManagerTest, ControlGroup) { |
| 442 RestorePrerenderMode restore_prerender_mode; | 468 RestorePrerenderMode restore_prerender_mode; |
| 443 PrerenderManager::SetMode( | 469 PrerenderManager::SetMode( |
| 444 PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); | 470 PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); |
| 445 GURL url("http://www.google.com/"); | 471 GURL url("http://www.google.com/"); |
| 446 DummyPrerenderContents* pc = | 472 DummyPrerenderContents* pc = |
| 447 new DummyPrerenderContents(prerender_manager_.get(), | 473 prerender_manager_->CreateNextPrerenderContents( |
| 448 url, | 474 url, |
| 449 FINAL_STATUS_CONTROL_GROUP); | 475 FINAL_STATUS_CONTROL_GROUP); |
| 450 prerender_manager_->SetNextPrerenderContents(pc); | |
| 451 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 476 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 452 EXPECT_FALSE(pc->has_started()); | 477 EXPECT_FALSE(pc->has_started()); |
| 453 } | 478 } |
| 454 | 479 |
| 480 // Tests that prerendering is cancelled when the source render view does not |
| 481 // exist. On failure, the DCHECK in CreatePrerenderContents() above should be |
| 482 // triggered. |
| 483 TEST_F(PrerenderManagerTest, SourceRenderViewClosed) { |
| 484 GURL url("http://www.google.com/"); |
| 485 prerender_manager_->CreateNextPrerenderContents( |
| 486 url, |
| 487 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 488 EXPECT_FALSE(prerender_manager_->AddPreload( |
| 489 std::pair<int, int>(100, 100), url, std::vector<GURL>(), GURL())); |
| 490 } |
| 491 |
| 455 } // namespace prerender | 492 } // namespace prerender |
| OLD | NEW |