| 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 |