Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(359)

Side by Side Diff: chrome/browser/prerender/prerender_manager_unittest.cc

Issue 9226037: Cancel prerenders from Omnibox if we navigate to a different URL than predicted (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Reorg prerender_manager.cc to match header. Add tests for cancellation. Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698