| 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 } // namespace | 165 } // namespace |
| 129 | 166 |
| 130 class PrerenderManagerTest : public testing::Test { | 167 class PrerenderManagerTest : public testing::Test { |
| 131 public: | 168 public: |
| 132 PrerenderManagerTest() : prerender_manager_(new TestPrerenderManager()), | 169 PrerenderManagerTest() : prerender_manager_(new TestPrerenderManager()), |
| 133 ui_thread_(BrowserThread::UI, &message_loop_) { | 170 ui_thread_(BrowserThread::UI, &message_loop_) { |
| 134 } | 171 } |
| 135 | 172 |
| 136 protected: | 173 protected: |
| 137 scoped_refptr<TestPrerenderManager> prerender_manager_; | 174 scoped_refptr<TestPrerenderManager> prerender_manager_; |
| 138 | 175 |
| 139 private: | 176 private: |
| 140 // Needed to pass PrerenderManager's DCHECKs. | 177 // Needed to pass PrerenderManager's DCHECKs. |
| 141 MessageLoop message_loop_; | 178 MessageLoop message_loop_; |
| 142 BrowserThread ui_thread_; | 179 BrowserThread ui_thread_; |
| 143 }; | 180 }; |
| 144 | 181 |
| 145 TEST_F(PrerenderManagerTest, EmptyTest) { | 182 TEST_F(PrerenderManagerTest, EmptyTest) { |
| 146 GURL url("http://www.google.com/"); | 183 GURL url("http://www.google.com/"); |
| 147 EXPECT_FALSE(prerender_manager_->MaybeUsePreloadedPage(NULL, url)); | 184 EXPECT_FALSE(prerender_manager_->MaybeUsePreloadedPage(NULL, url)); |
| 148 } | 185 } |
| 149 | 186 |
| 150 TEST_F(PrerenderManagerTest, FoundTest) { | 187 TEST_F(PrerenderManagerTest, FoundTest) { |
| 151 GURL url("http://www.google.com/"); | 188 GURL url("http://www.google.com/"); |
| 152 DummyPrerenderContents* pc = | 189 DummyPrerenderContents* pc = |
| 153 new DummyPrerenderContents(prerender_manager_.get(), | 190 prerender_manager_->CreateNextPrerenderContents( |
| 154 url, | 191 url, |
| 155 FINAL_STATUS_USED); | 192 FINAL_STATUS_USED); |
| 156 prerender_manager_->SetNextPrerenderContents(pc); | |
| 157 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 193 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 158 EXPECT_TRUE(pc->has_started()); | 194 EXPECT_TRUE(pc->has_started()); |
| 159 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); | 195 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); |
| 160 pc->set_final_status(FINAL_STATUS_USED); | |
| 161 delete pc; | |
| 162 } | 196 } |
| 163 | 197 |
| 164 // Make sure that if queue a request, and a second prerender request for the | 198 // Make sure that if queue a request, and a second prerender request for the |
| 165 // same URL comes in, that we drop the second request and keep the first one. | 199 // same URL comes in, that we drop the second request and keep the first one. |
| 166 TEST_F(PrerenderManagerTest, DropSecondRequestTest) { | 200 TEST_F(PrerenderManagerTest, DropSecondRequestTest) { |
| 167 GURL url("http://www.google.com/"); | 201 GURL url("http://www.google.com/"); |
| 168 DummyPrerenderContents* pc = | 202 DummyPrerenderContents* pc = |
| 169 new DummyPrerenderContents(prerender_manager_.get(), url, | 203 prerender_manager_->CreateNextPrerenderContents( |
| 170 FINAL_STATUS_USED); | 204 url, |
| 205 FINAL_STATUS_USED); |
| 171 DummyPrerenderContents* null = NULL; | 206 DummyPrerenderContents* null = NULL; |
| 172 prerender_manager_->SetNextPrerenderContents(pc); | |
| 173 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 207 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 174 EXPECT_EQ(null, prerender_manager_->next_pc()); | 208 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 175 EXPECT_TRUE(pc->has_started()); | 209 EXPECT_TRUE(pc->has_started()); |
| 210 |
| 176 DummyPrerenderContents* pc1 = | 211 DummyPrerenderContents* pc1 = |
| 177 new DummyPrerenderContents( | 212 prerender_manager_->CreateNextPrerenderContents( |
| 178 prerender_manager_.get(), url, | 213 url, |
| 179 FINAL_STATUS_MANAGER_SHUTDOWN); | 214 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 180 prerender_manager_->SetNextPrerenderContents(pc1); | |
| 181 EXPECT_FALSE(prerender_manager_->AddSimplePreload(url)); | 215 EXPECT_FALSE(prerender_manager_->AddSimplePreload(url)); |
| 182 EXPECT_EQ(pc1, prerender_manager_->next_pc()); | 216 EXPECT_EQ(pc1, prerender_manager_->next_pc()); |
| 183 EXPECT_FALSE(pc1->has_started()); | 217 EXPECT_FALSE(pc1->has_started()); |
| 218 |
| 184 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); | 219 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); |
| 185 pc->set_final_status(FINAL_STATUS_USED); | |
| 186 delete pc; | |
| 187 } | 220 } |
| 188 | 221 |
| 189 // Ensure that we expire a prerendered page after the max. permitted time. | 222 // Ensure that we expire a prerendered page after the max. permitted time. |
| 190 TEST_F(PrerenderManagerTest, ExpireTest) { | 223 TEST_F(PrerenderManagerTest, ExpireTest) { |
| 191 GURL url("http://www.google.com/"); | 224 GURL url("http://www.google.com/"); |
| 192 DummyPrerenderContents* pc = | 225 DummyPrerenderContents* pc = |
| 193 new DummyPrerenderContents(prerender_manager_.get(), url, | 226 prerender_manager_->CreateNextPrerenderContents( |
| 194 FINAL_STATUS_TIMED_OUT); | 227 url, |
| 228 FINAL_STATUS_TIMED_OUT); |
| 195 DummyPrerenderContents* null = NULL; | 229 DummyPrerenderContents* null = NULL; |
| 196 prerender_manager_->SetNextPrerenderContents(pc); | |
| 197 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 230 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 198 EXPECT_EQ(null, prerender_manager_->next_pc()); | 231 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 199 EXPECT_TRUE(pc->has_started()); | 232 EXPECT_TRUE(pc->has_started()); |
| 200 prerender_manager_->AdvanceTime(prerender_manager_->max_prerender_age() | 233 prerender_manager_->AdvanceTime(prerender_manager_->max_prerender_age() |
| 201 + base::TimeDelta::FromSeconds(1)); | 234 + base::TimeDelta::FromSeconds(1)); |
| 202 ASSERT_EQ(null, prerender_manager_->GetEntry(url)); | 235 ASSERT_EQ(null, prerender_manager_->GetEntry(url)); |
| 203 } | 236 } |
| 204 | 237 |
| 205 // LRU Test. Make sure that if we prerender more than one request, that | 238 // LRU Test. Make sure that if we prerender more than one request, that |
| 206 // the oldest one will be dropped. | 239 // the oldest one will be dropped. |
| 207 TEST_F(PrerenderManagerTest, DropOldestRequestTest) { | 240 TEST_F(PrerenderManagerTest, DropOldestRequestTest) { |
| 208 GURL url("http://www.google.com/"); | 241 GURL url("http://www.google.com/"); |
| 209 DummyPrerenderContents* pc = | 242 DummyPrerenderContents* pc = |
| 210 new DummyPrerenderContents(prerender_manager_.get(), url, | 243 prerender_manager_->CreateNextPrerenderContents( |
| 211 FINAL_STATUS_EVICTED); | 244 url, |
| 245 FINAL_STATUS_EVICTED); |
| 212 DummyPrerenderContents* null = NULL; | 246 DummyPrerenderContents* null = NULL; |
| 213 prerender_manager_->SetNextPrerenderContents(pc); | |
| 214 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 247 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 215 EXPECT_EQ(null, prerender_manager_->next_pc()); | 248 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 216 EXPECT_TRUE(pc->has_started()); | 249 EXPECT_TRUE(pc->has_started()); |
| 250 |
| 217 GURL url1("http://news.google.com/"); | 251 GURL url1("http://news.google.com/"); |
| 218 DummyPrerenderContents* pc1 = | 252 DummyPrerenderContents* pc1 = |
| 219 new DummyPrerenderContents(prerender_manager_.get(), url1, | 253 prerender_manager_->CreateNextPrerenderContents( |
| 220 FINAL_STATUS_USED); | 254 url1, |
| 221 prerender_manager_->SetNextPrerenderContents(pc1); | 255 FINAL_STATUS_USED); |
| 222 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url1)); | 256 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url1)); |
| 223 EXPECT_EQ(null, prerender_manager_->next_pc()); | 257 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 224 EXPECT_TRUE(pc1->has_started()); | 258 EXPECT_TRUE(pc1->has_started()); |
| 259 |
| 225 ASSERT_EQ(null, prerender_manager_->GetEntry(url)); | 260 ASSERT_EQ(null, prerender_manager_->GetEntry(url)); |
| 226 ASSERT_EQ(pc1, prerender_manager_->GetEntry(url1)); | 261 ASSERT_EQ(pc1, prerender_manager_->GetEntry(url1)); |
| 227 pc1->set_final_status(FINAL_STATUS_USED); | |
| 228 delete pc1; | |
| 229 } | 262 } |
| 230 | 263 |
| 231 // Two element prerender test. Ensure that the LRU operates correctly if we | 264 // Two element prerender test. Ensure that the LRU operates correctly if we |
| 232 // permit 2 elements to be kept prerendered. | 265 // permit 2 elements to be kept prerendered. |
| 233 TEST_F(PrerenderManagerTest, TwoElementPrerenderTest) { | 266 TEST_F(PrerenderManagerTest, TwoElementPrerenderTest) { |
| 234 prerender_manager_->set_max_elements(2); | 267 prerender_manager_->set_max_elements(2); |
| 235 GURL url("http://www.google.com/"); | 268 GURL url("http://www.google.com/"); |
| 236 DummyPrerenderContents* pc = | 269 DummyPrerenderContents* pc = |
| 237 new DummyPrerenderContents(prerender_manager_.get(), url, | 270 prerender_manager_->CreateNextPrerenderContents( |
| 238 FINAL_STATUS_EVICTED); | 271 url, |
| 272 FINAL_STATUS_EVICTED); |
| 239 DummyPrerenderContents* null = NULL; | 273 DummyPrerenderContents* null = NULL; |
| 240 prerender_manager_->SetNextPrerenderContents(pc); | |
| 241 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 274 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 242 EXPECT_EQ(null, prerender_manager_->next_pc()); | 275 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 243 EXPECT_TRUE(pc->has_started()); | 276 EXPECT_TRUE(pc->has_started()); |
| 277 |
| 244 GURL url1("http://news.google.com/"); | 278 GURL url1("http://news.google.com/"); |
| 245 DummyPrerenderContents* pc1 = | 279 DummyPrerenderContents* pc1 = |
| 246 new DummyPrerenderContents(prerender_manager_.get(), url1, | 280 prerender_manager_->CreateNextPrerenderContents( |
| 247 FINAL_STATUS_USED); | 281 url1, |
| 248 prerender_manager_->SetNextPrerenderContents(pc1); | 282 FINAL_STATUS_USED); |
| 249 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url1)); | 283 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url1)); |
| 250 EXPECT_EQ(null, prerender_manager_->next_pc()); | 284 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 251 EXPECT_TRUE(pc1->has_started()); | 285 EXPECT_TRUE(pc1->has_started()); |
| 286 |
| 252 GURL url2("http://images.google.com/"); | 287 GURL url2("http://images.google.com/"); |
| 253 DummyPrerenderContents* pc2 = | 288 DummyPrerenderContents* pc2 = |
| 254 new DummyPrerenderContents(prerender_manager_.get(), url2, | 289 prerender_manager_->CreateNextPrerenderContents( |
| 255 FINAL_STATUS_USED); | 290 url2, |
| 256 prerender_manager_->SetNextPrerenderContents(pc2); | 291 FINAL_STATUS_USED); |
| 257 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url2)); | 292 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url2)); |
| 258 EXPECT_EQ(null, prerender_manager_->next_pc()); | 293 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 259 EXPECT_TRUE(pc2->has_started()); | 294 EXPECT_TRUE(pc2->has_started()); |
| 295 |
| 260 ASSERT_EQ(null, prerender_manager_->GetEntry(url)); | 296 ASSERT_EQ(null, prerender_manager_->GetEntry(url)); |
| 261 ASSERT_EQ(pc1, prerender_manager_->GetEntry(url1)); | 297 ASSERT_EQ(pc1, prerender_manager_->GetEntry(url1)); |
| 262 ASSERT_EQ(pc2, prerender_manager_->GetEntry(url2)); | 298 ASSERT_EQ(pc2, prerender_manager_->GetEntry(url2)); |
| 263 pc1->set_final_status(FINAL_STATUS_USED); | |
| 264 delete pc1; | |
| 265 pc2->set_final_status(FINAL_STATUS_USED); | |
| 266 delete pc2; | |
| 267 } | 299 } |
| 268 | 300 |
| 269 TEST_F(PrerenderManagerTest, AliasURLTest) { | 301 TEST_F(PrerenderManagerTest, AliasURLTest) { |
| 270 GURL url("http://www.google.com/"); | 302 GURL url("http://www.google.com/"); |
| 271 GURL alias_url1("http://www.google.com/index.html"); | 303 GURL alias_url1("http://www.google.com/index.html"); |
| 272 GURL alias_url2("http://google.com/"); | 304 GURL alias_url2("http://google.com/"); |
| 273 GURL not_an_alias_url("http://google.com/index.html"); | 305 GURL not_an_alias_url("http://google.com/index.html"); |
| 274 std::vector<GURL> alias_urls; | 306 std::vector<GURL> alias_urls; |
| 275 alias_urls.push_back(alias_url1); | 307 alias_urls.push_back(alias_url1); |
| 276 alias_urls.push_back(alias_url2); | 308 alias_urls.push_back(alias_url2); |
| 309 |
| 310 // Test that all of the aliases work, but nont_an_alias_url does not. |
| 277 DummyPrerenderContents* pc = | 311 DummyPrerenderContents* pc = |
| 278 new DummyPrerenderContents(prerender_manager_.get(), url, alias_urls, | 312 prerender_manager_->CreateNextPrerenderContents( |
| 279 FINAL_STATUS_USED); | 313 url, alias_urls, FINAL_STATUS_USED); |
| 280 // Test that all of the aliases work, but nont_an_alias_url does not. | 314 EXPECT_TRUE(prerender_manager_->AddSimplePreloadWithAliases(url, alias_urls)); |
| 281 prerender_manager_->SetNextPrerenderContents(pc); | |
| 282 EXPECT_TRUE(prerender_manager_->AddPreload(url, alias_urls, GURL())); | |
| 283 ASSERT_EQ(NULL, prerender_manager_->GetEntry(not_an_alias_url)); | 315 ASSERT_EQ(NULL, prerender_manager_->GetEntry(not_an_alias_url)); |
| 284 ASSERT_EQ(pc, prerender_manager_->GetEntry(alias_url1)); | 316 ASSERT_EQ(pc, prerender_manager_->GetEntry(alias_url1)); |
| 285 prerender_manager_->SetNextPrerenderContents(pc); | 317 pc = prerender_manager_->CreateNextPrerenderContents( |
| 286 EXPECT_TRUE(prerender_manager_->AddPreload(url, alias_urls, GURL())); | 318 url, alias_urls, FINAL_STATUS_USED); |
| 319 EXPECT_TRUE(prerender_manager_->AddSimplePreloadWithAliases(url, alias_urls)); |
| 287 ASSERT_EQ(pc, prerender_manager_->GetEntry(alias_url2)); | 320 ASSERT_EQ(pc, prerender_manager_->GetEntry(alias_url2)); |
| 288 prerender_manager_->SetNextPrerenderContents(pc); | 321 pc = prerender_manager_->CreateNextPrerenderContents( |
| 289 EXPECT_TRUE(prerender_manager_->AddPreload(url, alias_urls, GURL())); | 322 url, alias_urls, FINAL_STATUS_USED); |
| 323 EXPECT_TRUE(prerender_manager_->AddSimplePreloadWithAliases(url, alias_urls)); |
| 290 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); | 324 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); |
| 291 | 325 |
| 292 // Test that alias URLs can not be added. | 326 // Test that alias URLs can not be added. |
| 293 prerender_manager_->SetNextPrerenderContents(pc); | 327 pc = prerender_manager_->CreateNextPrerenderContents( |
| 294 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)); |
| 295 EXPECT_FALSE(prerender_manager_->AddSimplePreload(url)); | 330 EXPECT_FALSE(prerender_manager_->AddSimplePreload(url)); |
| 296 EXPECT_FALSE(prerender_manager_->AddSimplePreload(alias_url1)); | 331 EXPECT_FALSE(prerender_manager_->AddSimplePreload(alias_url1)); |
| 297 EXPECT_FALSE(prerender_manager_->AddSimplePreload(alias_url2)); | 332 EXPECT_FALSE(prerender_manager_->AddSimplePreload(alias_url2)); |
| 298 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); | 333 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); |
| 299 | |
| 300 pc->set_final_status(FINAL_STATUS_USED); | |
| 301 delete pc; | |
| 302 } | 334 } |
| 303 | 335 |
| 304 // Ensure that we ignore prerender requests within the rate limit. | 336 // Ensure that we ignore prerender requests within the rate limit. |
| 305 TEST_F(PrerenderManagerTest, RateLimitInWindowTest) { | 337 TEST_F(PrerenderManagerTest, RateLimitInWindowTest) { |
| 306 GURL url("http://www.google.com/"); | 338 GURL url("http://www.google.com/"); |
| 307 DummyPrerenderContents* pc = | 339 DummyPrerenderContents* pc = |
| 308 new DummyPrerenderContents(prerender_manager_.get(), url, | 340 prerender_manager_->CreateNextPrerenderContents( |
| 309 FINAL_STATUS_MANAGER_SHUTDOWN); | 341 url, |
| 342 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 310 DummyPrerenderContents* null = NULL; | 343 DummyPrerenderContents* null = NULL; |
| 311 prerender_manager_->SetNextPrerenderContents(pc); | |
| 312 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 344 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 313 EXPECT_EQ(null, prerender_manager_->next_pc()); | 345 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 314 EXPECT_TRUE(pc->has_started()); | 346 EXPECT_TRUE(pc->has_started()); |
| 315 | 347 |
| 316 prerender_manager_->set_rate_limit_enabled(true); | 348 prerender_manager_->set_rate_limit_enabled(true); |
| 317 prerender_manager_->AdvanceTimeTicks(base::TimeDelta::FromMilliseconds(1)); | 349 prerender_manager_->AdvanceTimeTicks(base::TimeDelta::FromMilliseconds(1)); |
| 318 | 350 |
| 319 GURL url1("http://news.google.com/"); | 351 GURL url1("http://news.google.com/"); |
| 320 DummyPrerenderContents* rate_limit_pc = | 352 prerender_manager_->CreateNextPrerenderContents( |
| 321 new DummyPrerenderContents(prerender_manager_.get(), url1, | 353 url, |
| 322 FINAL_STATUS_MANAGER_SHUTDOWN); | 354 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 323 prerender_manager_->SetNextPrerenderContents(rate_limit_pc); | |
| 324 EXPECT_FALSE(prerender_manager_->AddSimplePreload(url1)); | 355 EXPECT_FALSE(prerender_manager_->AddSimplePreload(url1)); |
| 325 prerender_manager_->set_rate_limit_enabled(false); | 356 prerender_manager_->set_rate_limit_enabled(false); |
| 326 } | 357 } |
| 327 | 358 |
| 328 // Ensure that we don't ignore prerender requests outside the rate limit. | 359 // Ensure that we don't ignore prerender requests outside the rate limit. |
| 329 TEST_F(PrerenderManagerTest, RateLimitOutsideWindowTest) { | 360 TEST_F(PrerenderManagerTest, RateLimitOutsideWindowTest) { |
| 330 GURL url("http://www.google.com/"); | 361 GURL url("http://www.google.com/"); |
| 331 DummyPrerenderContents* pc = | 362 DummyPrerenderContents* pc = |
| 332 new DummyPrerenderContents(prerender_manager_.get(), url, | 363 prerender_manager_->CreateNextPrerenderContents( |
| 333 FINAL_STATUS_EVICTED); | 364 url, |
| 365 FINAL_STATUS_EVICTED); |
| 334 DummyPrerenderContents* null = NULL; | 366 DummyPrerenderContents* null = NULL; |
| 335 prerender_manager_->SetNextPrerenderContents(pc); | |
| 336 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 367 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 337 EXPECT_EQ(null, prerender_manager_->next_pc()); | 368 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 338 EXPECT_TRUE(pc->has_started()); | 369 EXPECT_TRUE(pc->has_started()); |
| 339 | 370 |
| 340 prerender_manager_->set_rate_limit_enabled(true); | 371 prerender_manager_->set_rate_limit_enabled(true); |
| 341 prerender_manager_->AdvanceTimeTicks(base::TimeDelta::FromMilliseconds(2000)); | 372 prerender_manager_->AdvanceTimeTicks(base::TimeDelta::FromMilliseconds(2000)); |
| 342 | 373 |
| 343 GURL url1("http://news.google.com/"); | 374 GURL url1("http://news.google.com/"); |
| 344 DummyPrerenderContents* rate_limit_pc = | 375 DummyPrerenderContents* rate_limit_pc = |
| 345 new DummyPrerenderContents(prerender_manager_.get(), url1, | 376 prerender_manager_->CreateNextPrerenderContents( |
| 346 FINAL_STATUS_MANAGER_SHUTDOWN); | 377 url1, |
| 347 prerender_manager_->SetNextPrerenderContents(rate_limit_pc); | 378 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 348 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url1)); | 379 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url1)); |
| 349 EXPECT_EQ(null, prerender_manager_->next_pc()); | 380 EXPECT_EQ(null, prerender_manager_->next_pc()); |
| 350 EXPECT_TRUE(rate_limit_pc->has_started()); | 381 EXPECT_TRUE(rate_limit_pc->has_started()); |
| 351 prerender_manager_->set_rate_limit_enabled(false); | 382 prerender_manager_->set_rate_limit_enabled(false); |
| 352 } | 383 } |
| 353 | 384 |
| 354 TEST_F(PrerenderManagerTest, PendingPreloadTest) { | 385 TEST_F(PrerenderManagerTest, PendingPreloadTest) { |
| 355 GURL url("http://www.google.com/"); | 386 GURL url("http://www.google.com/"); |
| 356 DummyPrerenderContents* pc = | 387 DummyPrerenderContents* pc = |
| 357 new DummyPrerenderContents(prerender_manager_.get(), | 388 prerender_manager_->CreateNextPrerenderContents( |
| 358 url, | 389 url, |
| 359 FINAL_STATUS_USED); | 390 FINAL_STATUS_USED); |
| 360 prerender_manager_->SetNextPrerenderContents(pc); | |
| 361 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 391 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 362 | 392 |
| 363 int child_id; | 393 int child_id; |
| 364 int route_id; | 394 int route_id; |
| 365 ASSERT_TRUE(pc->GetChildId(&child_id)); | 395 ASSERT_TRUE(pc->GetChildId(&child_id)); |
| 366 ASSERT_TRUE(pc->GetRouteId(&route_id)); | 396 ASSERT_TRUE(pc->GetRouteId(&route_id)); |
| 367 | 397 |
| 368 GURL pending_url("http://news.google.com/"); | 398 GURL pending_url("http://news.google.com/"); |
| 369 | 399 |
| 370 prerender_manager_->AddPendingPreload(std::make_pair(child_id, route_id), | 400 prerender_manager_->AddPendingPreload(std::make_pair(child_id, route_id), |
| 371 pending_url, | 401 pending_url, |
| 372 std::vector<GURL>(), | 402 std::vector<GURL>(), |
| 373 url); | 403 url); |
| 374 | 404 |
| 375 EXPECT_TRUE(prerender_manager_->IsPendingEntry(pending_url)); | 405 EXPECT_TRUE(prerender_manager_->IsPendingEntry(pending_url)); |
| 376 EXPECT_TRUE(pc->has_started()); | 406 EXPECT_TRUE(pc->has_started()); |
| 377 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); | 407 ASSERT_EQ(pc, prerender_manager_->GetEntry(url)); |
| 378 pc->set_final_status(FINAL_STATUS_USED); | |
| 379 | |
| 380 delete pc; | |
| 381 } | 408 } |
| 382 | 409 |
| 383 TEST_F(PrerenderManagerTest, PendingPreloadSkippedTest) { | 410 TEST_F(PrerenderManagerTest, PendingPreloadSkippedTest) { |
| 384 GURL url("http://www.google.com/"); | 411 GURL url("http://www.google.com/"); |
| 385 DummyPrerenderContents* pc = | 412 DummyPrerenderContents* pc = |
| 386 new DummyPrerenderContents(prerender_manager_.get(), | 413 prerender_manager_->CreateNextPrerenderContents( |
| 387 url, | 414 url, |
| 388 FINAL_STATUS_TIMED_OUT); | 415 FINAL_STATUS_TIMED_OUT); |
| 389 prerender_manager_->SetNextPrerenderContents(pc); | |
| 390 | 416 |
| 391 int child_id; | 417 int child_id; |
| 392 int route_id; | 418 int route_id; |
| 393 ASSERT_TRUE(pc->GetChildId(&child_id)); | 419 ASSERT_TRUE(pc->GetChildId(&child_id)); |
| 394 ASSERT_TRUE(pc->GetRouteId(&route_id)); | 420 ASSERT_TRUE(pc->GetRouteId(&route_id)); |
| 395 | 421 |
| 396 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); | 422 EXPECT_TRUE(prerender_manager_->AddSimplePreload(url)); |
| 397 prerender_manager_->AdvanceTime(prerender_manager_->max_prerender_age() | 423 prerender_manager_->AdvanceTime(prerender_manager_->max_prerender_age() |
| 398 + base::TimeDelta::FromSeconds(1)); | 424 + base::TimeDelta::FromSeconds(1)); |
| 399 // GetEntry will cull old entries which should now include pc. | 425 // GetEntry will cull old entries which should now include pc. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 419 EXPECT_FALSE(PrerenderManager::MaybeGetQueryStringBasedAliasURL( | 445 EXPECT_FALSE(PrerenderManager::MaybeGetQueryStringBasedAliasURL( |
| 420 GURL("http://www.google.com/url?sadf=test&blah=blahblahblah"), &result)); | 446 GURL("http://www.google.com/url?sadf=test&blah=blahblahblah"), &result)); |
| 421 EXPECT_FALSE(PrerenderManager::MaybeGetQueryStringBasedAliasURL( | 447 EXPECT_FALSE(PrerenderManager::MaybeGetQueryStringBasedAliasURL( |
| 422 GURL("http://www.google.com/?url=INVALIDurlsAREsoMUCHfun.com"), &result)); | 448 GURL("http://www.google.com/?url=INVALIDurlsAREsoMUCHfun.com"), &result)); |
| 423 EXPECT_TRUE(PrerenderManager::MaybeGetQueryStringBasedAliasURL( | 449 EXPECT_TRUE(PrerenderManager::MaybeGetQueryStringBasedAliasURL( |
| 424 GURL("http://www.google.com/?url=http://validURLSareGREAT.com"), | 450 GURL("http://www.google.com/?url=http://validURLSareGREAT.com"), |
| 425 &result)); | 451 &result)); |
| 426 ASSERT_EQ(GURL("http://validURLSareGREAT.com").spec(), result.spec()); | 452 ASSERT_EQ(GURL("http://validURLSareGREAT.com").spec(), result.spec()); |
| 427 } | 453 } |
| 428 | 454 |
| 455 // Tests that prerendering is cancelled when the source render view does not |
| 456 // exist. On failure, the DCHECK in CreatePrerenderContents() above should be |
| 457 // triggered. |
| 458 TEST_F(PrerenderManagerTest, SourceRenderViewClosed) { |
| 459 GURL url("http://www.google.com/"); |
| 460 prerender_manager_->CreateNextPrerenderContents( |
| 461 url, |
| 462 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 463 EXPECT_FALSE(prerender_manager_->AddPreload( |
| 464 std::pair<int, int>(100, 100), url, std::vector<GURL>(), GURL())); |
| 465 } |
| 466 |
| 429 } // namespace prerender | 467 } // namespace prerender |
| OLD | NEW |