| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/command_line.h" | 5 #include "base/command_line.h" |
| 6 #include "base/memory/scoped_vector.h" | 6 #include "base/memory/scoped_vector.h" |
| 7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 8 #include "base/time.h" | 8 #include "base/time.h" |
| 9 #include "chrome/browser/prerender/prerender_contents.h" | 9 #include "chrome/browser/prerender/prerender_contents.h" |
| 10 #include "chrome/browser/prerender/prerender_link_manager.h" | 10 #include "chrome/browser/prerender/prerender_link_manager.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 | 21 |
| 22 using content::BrowserThread; | 22 using content::BrowserThread; |
| 23 using content::Referrer; | 23 using content::Referrer; |
| 24 | 24 |
| 25 namespace prerender { | 25 namespace prerender { |
| 26 | 26 |
| 27 namespace { | 27 namespace { |
| 28 | 28 |
| 29 class DummyPrerenderContents : public PrerenderContents { | 29 class DummyPrerenderContents : public PrerenderContents { |
| 30 public: | 30 public: |
| 31 DummyPrerenderContents(PrerenderManager* prerender_manager, | 31 DummyPrerenderContents( |
| 32 PrerenderTracker* prerender_tracker, | 32 PrerenderManager* prerender_manager, |
| 33 const GURL& url, | 33 PrerenderRenderViewTracker* prerender_render_view_tracker, |
| 34 Origin origin, | 34 const GURL& url, Origin origin, FinalStatus expected_final_status) |
| 35 FinalStatus expected_final_status) | 35 : PrerenderContents(prerender_manager, prerender_render_view_tracker, |
| 36 : PrerenderContents(prerender_manager, prerender_tracker, | |
| 37 NULL, url, Referrer(), origin, | 36 NULL, url, Referrer(), origin, |
| 38 PrerenderManager::kNoExperiment), | 37 PrerenderManager::kNoExperiment), |
| 39 expected_final_status_(expected_final_status) { | 38 expected_final_status_(expected_final_status) { |
| 40 } | 39 } |
| 41 | 40 |
| 42 virtual ~DummyPrerenderContents() { | 41 virtual ~DummyPrerenderContents() { |
| 43 EXPECT_EQ(expected_final_status_, final_status()); | 42 EXPECT_EQ(expected_final_status_, final_status()); |
| 44 } | 43 } |
| 45 | 44 |
| 46 virtual void StartPrerendering( | 45 virtual void StartPrerendering( |
| (...skipping 19 matching lines...) Expand all Loading... |
| 66 bool prerendering_has_been_cancelled() const { | 65 bool prerendering_has_been_cancelled() const { |
| 67 return PrerenderContents::prerendering_has_been_cancelled(); | 66 return PrerenderContents::prerendering_has_been_cancelled(); |
| 68 } | 67 } |
| 69 | 68 |
| 70 private: | 69 private: |
| 71 FinalStatus expected_final_status_; | 70 FinalStatus expected_final_status_; |
| 72 }; | 71 }; |
| 73 | 72 |
| 74 class TestPrerenderManager : public PrerenderManager { | 73 class TestPrerenderManager : public PrerenderManager { |
| 75 public: | 74 public: |
| 76 explicit TestPrerenderManager(PrerenderTracker* prerender_tracker) | 75 explicit TestPrerenderManager( |
| 77 : PrerenderManager(&profile_, prerender_tracker), | 76 PrerenderRenderViewTracker* prerender_render_view_tracker) |
| 77 : PrerenderManager(&profile_, prerender_render_view_tracker), |
| 78 time_(base::Time::Now()), | 78 time_(base::Time::Now()), |
| 79 time_ticks_(base::TimeTicks::Now()), | 79 time_ticks_(base::TimeTicks::Now()), |
| 80 next_prerender_contents_(NULL), | 80 next_prerender_contents_(NULL), |
| 81 prerender_tracker_(prerender_tracker) { | 81 prerender_render_view_tracker_(prerender_render_view_tracker) { |
| 82 set_rate_limit_enabled(false); | 82 set_rate_limit_enabled(false); |
| 83 } | 83 } |
| 84 | 84 |
| 85 virtual ~TestPrerenderManager() { | 85 virtual ~TestPrerenderManager() { |
| 86 if (next_prerender_contents()) { | 86 if (next_prerender_contents()) { |
| 87 next_prerender_contents_.release()->Destroy( | 87 next_prerender_contents_.release()->Destroy( |
| 88 FINAL_STATUS_MANAGER_SHUTDOWN); | 88 FINAL_STATUS_MANAGER_SHUTDOWN); |
| 89 } | 89 } |
| 90 // Set the final status for all PrerenderContents with an expected final | 90 // Set the final status for all PrerenderContents with an expected final |
| 91 // status of FINAL_STATUS_USED. These values are normally set when the | 91 // status of FINAL_STATUS_USED. These values are normally set when the |
| (...skipping 12 matching lines...) Expand all Loading... |
| 104 } | 104 } |
| 105 | 105 |
| 106 void AdvanceTimeTicks(base::TimeDelta delta) { | 106 void AdvanceTimeTicks(base::TimeDelta delta) { |
| 107 time_ticks_ += delta; | 107 time_ticks_ += delta; |
| 108 } | 108 } |
| 109 | 109 |
| 110 DummyPrerenderContents* CreateNextPrerenderContents( | 110 DummyPrerenderContents* CreateNextPrerenderContents( |
| 111 const GURL& url, | 111 const GURL& url, |
| 112 FinalStatus expected_final_status) { | 112 FinalStatus expected_final_status) { |
| 113 DummyPrerenderContents* prerender_contents = | 113 DummyPrerenderContents* prerender_contents = |
| 114 new DummyPrerenderContents(this, prerender_tracker_, url, | 114 new DummyPrerenderContents(this, prerender_render_view_tracker_, url, |
| 115 ORIGIN_LINK_REL_PRERENDER, | 115 ORIGIN_LINK_REL_PRERENDER, |
| 116 expected_final_status); | 116 expected_final_status); |
| 117 SetNextPrerenderContents(prerender_contents); | 117 SetNextPrerenderContents(prerender_contents); |
| 118 return prerender_contents; | 118 return prerender_contents; |
| 119 } | 119 } |
| 120 | 120 |
| 121 DummyPrerenderContents* CreateNextPrerenderContents( | 121 DummyPrerenderContents* CreateNextPrerenderContents( |
| 122 const GURL& url, | 122 const GURL& url, |
| 123 Origin origin, | 123 Origin origin, |
| 124 FinalStatus expected_final_status) { | 124 FinalStatus expected_final_status) { |
| 125 DummyPrerenderContents* prerender_contents = | 125 DummyPrerenderContents* prerender_contents = |
| 126 new DummyPrerenderContents(this, prerender_tracker_, url, | 126 new DummyPrerenderContents(this, prerender_render_view_tracker_, url, |
| 127 origin, expected_final_status); | 127 origin, expected_final_status); |
| 128 SetNextPrerenderContents(prerender_contents); | 128 SetNextPrerenderContents(prerender_contents); |
| 129 return prerender_contents; | 129 return prerender_contents; |
| 130 } | 130 } |
| 131 | 131 |
| 132 DummyPrerenderContents* CreateNextPrerenderContents( | 132 DummyPrerenderContents* CreateNextPrerenderContents( |
| 133 const GURL& url, | 133 const GURL& url, |
| 134 const std::vector<GURL>& alias_urls, | 134 const std::vector<GURL>& alias_urls, |
| 135 FinalStatus expected_final_status) { | 135 FinalStatus expected_final_status) { |
| 136 DummyPrerenderContents* prerender_contents = | 136 DummyPrerenderContents* prerender_contents = |
| 137 new DummyPrerenderContents(this, prerender_tracker_, url, | 137 new DummyPrerenderContents(this, prerender_render_view_tracker_, url, |
| 138 ORIGIN_LINK_REL_PRERENDER, | 138 ORIGIN_LINK_REL_PRERENDER, |
| 139 expected_final_status); | 139 expected_final_status); |
| 140 for (std::vector<GURL>::const_iterator it = alias_urls.begin(); | 140 for (std::vector<GURL>::const_iterator it = alias_urls.begin(); |
| 141 it != alias_urls.end(); | 141 it != alias_urls.end(); |
| 142 ++it) { | 142 ++it) { |
| 143 EXPECT_TRUE(prerender_contents->AddAliasURL(*it)); | 143 EXPECT_TRUE(prerender_contents->AddAliasURL(*it)); |
| 144 } | 144 } |
| 145 SetNextPrerenderContents(prerender_contents); | 145 SetNextPrerenderContents(prerender_contents); |
| 146 return prerender_contents; | 146 return prerender_contents; |
| 147 } | 147 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 return next_prerender_contents_.release(); | 181 return next_prerender_contents_.release(); |
| 182 } | 182 } |
| 183 | 183 |
| 184 base::Time time_; | 184 base::Time time_; |
| 185 base::TimeTicks time_ticks_; | 185 base::TimeTicks time_ticks_; |
| 186 scoped_ptr<PrerenderContents> next_prerender_contents_; | 186 scoped_ptr<PrerenderContents> next_prerender_contents_; |
| 187 // PrerenderContents with an |expected_final_status| of FINAL_STATUS_USED, | 187 // PrerenderContents with an |expected_final_status| of FINAL_STATUS_USED, |
| 188 // tracked so they will be automatically deleted. | 188 // tracked so they will be automatically deleted. |
| 189 ScopedVector<PrerenderContents> used_prerender_contents_; | 189 ScopedVector<PrerenderContents> used_prerender_contents_; |
| 190 | 190 |
| 191 PrerenderTracker* prerender_tracker_; | 191 PrerenderRenderViewTracker* prerender_render_view_tracker_; |
| 192 | 192 |
| 193 TestingProfile profile_; | 193 TestingProfile profile_; |
| 194 }; | 194 }; |
| 195 | 195 |
| 196 class RestorePrerenderMode { | 196 class RestorePrerenderMode { |
| 197 public: | 197 public: |
| 198 RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { | 198 RestorePrerenderMode() : prev_mode_(PrerenderManager::GetMode()) { |
| 199 } | 199 } |
| 200 | 200 |
| 201 ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } | 201 ~RestorePrerenderMode() { PrerenderManager::SetMode(prev_mode_); } |
| 202 private: | 202 private: |
| 203 PrerenderManager::PrerenderManagerMode prev_mode_; | 203 PrerenderManager::PrerenderManagerMode prev_mode_; |
| 204 }; | 204 }; |
| 205 | 205 |
| 206 } // namespace | 206 } // namespace |
| 207 | 207 |
| 208 class PrerenderTest : public testing::Test { | 208 class PrerenderTest : public testing::Test { |
| 209 public: | 209 public: |
| 210 static const int kDefaultChildId = -1; | 210 static const int kDefaultChildId = -1; |
| 211 static const int kDefaultRenderViewRouteId = -1; | 211 static const int kDefaultRenderViewRouteId = -1; |
| 212 | 212 |
| 213 PrerenderTest() : ui_thread_(BrowserThread::UI, &message_loop_), | 213 PrerenderTest() |
| 214 prerender_manager_( | 214 : ui_thread_(BrowserThread::UI, &message_loop_), |
| 215 new TestPrerenderManager(prerender_tracker())), | 215 prerender_manager_( |
| 216 prerender_link_manager_( | 216 new TestPrerenderManager(prerender_render_view_tracker())), |
| 217 new PrerenderLinkManager(prerender_manager_.get())), | 217 prerender_link_manager_( |
| 218 last_prerender_id_(0) { | 218 new PrerenderLinkManager(prerender_manager_.get())), |
| 219 last_prerender_id_(0) { |
| 219 // Enable omnibox prerendering. | 220 // Enable omnibox prerendering. |
| 220 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 221 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 221 switches::kPrerenderFromOmnibox, | 222 switches::kPrerenderFromOmnibox, |
| 222 switches::kPrerenderFromOmniboxSwitchValueEnabled); | 223 switches::kPrerenderFromOmniboxSwitchValueEnabled); |
| 223 } | 224 } |
| 224 | 225 |
| 225 TestPrerenderManager* prerender_manager() { | 226 TestPrerenderManager* prerender_manager() { |
| 226 return prerender_manager_.get(); | 227 return prerender_manager_.get(); |
| 227 } | 228 } |
| 228 | 229 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 244 | 245 |
| 245 // Shorthand to add a simple preload with a reasonable source. | 246 // Shorthand to add a simple preload with a reasonable source. |
| 246 bool AddSimplePrerender(const GURL& url) { | 247 bool AddSimplePrerender(const GURL& url) { |
| 247 return prerender_link_manager()->OnAddPrerender( | 248 return prerender_link_manager()->OnAddPrerender( |
| 248 kDefaultChildId, GetNextPrerenderID(), | 249 kDefaultChildId, GetNextPrerenderID(), |
| 249 url, content::Referrer(), | 250 url, content::Referrer(), |
| 250 gfx::Size(), kDefaultRenderViewRouteId); | 251 gfx::Size(), kDefaultRenderViewRouteId); |
| 251 } | 252 } |
| 252 | 253 |
| 253 private: | 254 private: |
| 254 PrerenderTracker* prerender_tracker() { | 255 PrerenderRenderViewTracker* prerender_render_view_tracker() { |
| 255 return g_browser_process->prerender_tracker(); | 256 return g_browser_process->prerender_render_view_tracker(); |
| 256 } | 257 } |
| 257 | 258 |
| 258 // Needed to pass PrerenderManager's DCHECKs. | 259 // Needed to pass PrerenderManager's DCHECKs. |
| 259 MessageLoop message_loop_; | 260 MessageLoop message_loop_; |
| 260 content::TestBrowserThread ui_thread_; | 261 content::TestBrowserThread ui_thread_; |
| 261 scoped_ptr<TestPrerenderManager> prerender_manager_; | 262 scoped_ptr<TestPrerenderManager> prerender_manager_; |
| 262 scoped_ptr<PrerenderLinkManager> prerender_link_manager_; | 263 scoped_ptr<PrerenderLinkManager> prerender_link_manager_; |
| 263 int last_prerender_id_; | 264 int last_prerender_id_; |
| 264 }; | 265 }; |
| 265 | 266 |
| (...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 911 DummyPrerenderContents* second_prerender_contents = | 912 DummyPrerenderContents* second_prerender_contents = |
| 912 prerender_manager()->CreateNextPrerenderContents( | 913 prerender_manager()->CreateNextPrerenderContents( |
| 913 url, FINAL_STATUS_USED); | 914 url, FINAL_STATUS_USED); |
| 914 EXPECT_TRUE(AddSimplePrerender(url)); | 915 EXPECT_TRUE(AddSimplePrerender(url)); |
| 915 EXPECT_TRUE(second_prerender_contents->prerendering_has_started()); | 916 EXPECT_TRUE(second_prerender_contents->prerendering_has_started()); |
| 916 ASSERT_EQ(second_prerender_contents, prerender_manager()->GetEntry(url)); | 917 ASSERT_EQ(second_prerender_contents, prerender_manager()->GetEntry(url)); |
| 917 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); | 918 EXPECT_FALSE(IsEmptyPrerenderLinkManager()); |
| 918 } | 919 } |
| 919 | 920 |
| 920 } // namespace prerender | 921 } // namespace prerender |
| OLD | NEW |