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 <set> | 5 #include <set> |
6 #include <utility> | |
6 | 7 |
7 #include "base/logging.h" | 8 #include "base/logging.h" |
8 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "chrome/browser/prerender/prerender_contents.h" | |
9 #include "chrome/browser/prerender/prerender_manager.h" | 11 #include "chrome/browser/prerender/prerender_manager.h" |
10 #include "chrome/browser/prerender/prerender_tracker.h" | 12 #include "chrome/browser/prerender/prerender_tracker.h" |
11 #include "chrome/test/base/testing_browser_process.h" | 13 #include "chrome/test/base/testing_browser_process.h" |
12 #include "content/public/test/test_browser_thread.h" | 14 #include "content/public/test/test_browser_thread.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
14 | 16 |
15 using content::BrowserThread; | 17 using content::BrowserThread; |
16 | 18 |
17 namespace prerender { | 19 namespace prerender { |
18 | 20 |
19 namespace { | 21 namespace { |
20 | 22 |
23 class TestPrerenderContents : public PrerenderContents { | |
24 public: | |
25 TestPrerenderContents(PrerenderManager* prerender_manager, | |
26 int child_id, int route_id) | |
27 : PrerenderContents(prerender_manager, static_cast<Profile*>(NULL), | |
28 GURL(), content::Referrer(), ORIGIN_NONE, | |
29 PrerenderManager::kNoExperiment), | |
30 child_id_(child_id), | |
31 route_id_(route_id) { | |
32 } | |
33 | |
34 ~TestPrerenderContents() { | |
35 if (final_status() == FINAL_STATUS_MAX) | |
36 set_final_status(FINAL_STATUS_USED); | |
37 } | |
38 | |
39 virtual bool GetChildId(int* child_id) const OVERRIDE { | |
40 *child_id = child_id_; | |
41 return true; | |
42 } | |
43 | |
44 virtual bool GetRouteId(int* route_id) const OVERRIDE { | |
45 *route_id = route_id_; | |
46 return true; | |
47 } | |
48 | |
49 void Start() { | |
50 prerender_manager()->prerender_tracker()->AddPrerenderContents(this); | |
51 prerendering_has_started_ = true; | |
52 NotifyPrerenderStart(); | |
53 } | |
54 | |
55 void Cancel() { | |
56 Destroy(FINAL_STATUS_CANCELLED); | |
57 } | |
58 | |
59 void Use() { | |
60 set_final_status(FINAL_STATUS_USED); | |
61 } | |
62 | |
63 private: | |
64 int child_id_; | |
65 int route_id_; | |
66 }; | |
67 | |
21 class TestPrerenderManager : public PrerenderManager { | 68 class TestPrerenderManager : public PrerenderManager { |
22 public: | 69 public: |
23 explicit TestPrerenderManager(PrerenderTracker* prerender_tracker) : | 70 explicit TestPrerenderManager(PrerenderTracker* prerender_tracker) : |
24 PrerenderManager(NULL, prerender_tracker) { | 71 PrerenderManager(NULL, prerender_tracker) { |
25 mutable_config().rate_limit_enabled = false; | 72 mutable_config().rate_limit_enabled = false; |
26 } | 73 } |
27 | 74 |
28 virtual void DestroyPrerenderForRenderView( | 75 virtual void DestroyPrerenderForRenderView( |
29 int process_id, int view_id, FinalStatus final_status) OVERRIDE { | 76 int process_id, int view_id, FinalStatus final_status) OVERRIDE { |
30 cancelled_id_pairs_.insert(std::make_pair(process_id, view_id)); | 77 cancelled_id_pairs_.insert(std::make_pair(process_id, view_id)); |
31 } | 78 } |
32 | 79 |
33 bool WasPrerenderCancelled(int child_id, int route_id) { | 80 bool WasPrerenderCancelled(int child_id, int route_id) { |
34 std::pair<int, int> child_route_id_pair(child_id, route_id); | 81 std::pair<int, int> child_route_id_pair(child_id, route_id); |
35 return cancelled_id_pairs_.count(child_route_id_pair) != 0; | 82 return cancelled_id_pairs_.count(child_route_id_pair) != 0; |
36 } | 83 } |
37 | 84 |
85 // We never allocate our PrerenderContents in PrerenderManager, so we don't | |
86 // ever want the default pending delete behaviour. | |
87 virtual void MoveEntryToPendingDelete(PrerenderContents* entry, | |
88 FinalStatus final_status) { | |
mmenke
2012/12/04 18:59:16
nit: OVERRIDE
mmenke
2012/12/04 18:59:16
This should appear adjacent to DestroyPrerenderFor
gavinp
2012/12/04 22:26:07
Done.
| |
89 } | |
90 | |
38 // Set of all the RenderViews that have been cancelled. | 91 // Set of all the RenderViews that have been cancelled. |
39 std::set<std::pair<int, int> > cancelled_id_pairs_; | 92 std::set<std::pair<int, int> > cancelled_id_pairs_; |
40 }; | 93 }; |
41 | 94 |
42 } // namespace | 95 } // namespace |
43 | 96 |
44 class PrerenderTrackerTest : public testing::Test { | 97 class PrerenderTrackerTest : public testing::Test { |
45 public: | 98 public: |
99 const int kDefaultChildId = 0; | |
100 const int kDefaultRouteId = 0; | |
101 | |
46 PrerenderTrackerTest() : | 102 PrerenderTrackerTest() : |
47 ui_thread_(BrowserThread::UI, &message_loop_), | 103 ui_thread_(BrowserThread::UI, &message_loop_), |
48 io_thread_(BrowserThread::IO, &message_loop_), | 104 io_thread_(BrowserThread::IO, &message_loop_), |
49 prerender_manager_(new TestPrerenderManager(prerender_tracker())) { | 105 prerender_manager_(prerender_tracker()), |
50 } | 106 test_contents_(&prerender_manager_, kDefaultChildId, kDefaultRouteId) { |
51 | |
52 TestPrerenderManager* prerender_manager() { | |
53 return prerender_manager_.get(); | |
54 } | 107 } |
55 | 108 |
56 PrerenderTracker* prerender_tracker() { | 109 PrerenderTracker* prerender_tracker() { |
57 return g_browser_process->prerender_tracker(); | 110 return g_browser_process->prerender_tracker(); |
58 } | 111 } |
59 | 112 |
113 TestPrerenderManager* prerender_manager() { | |
114 return &prerender_manager_; | |
115 } | |
116 | |
117 TestPrerenderContents* test_contents() { | |
118 return &test_contents_; | |
119 } | |
120 | |
60 int GetCurrentStatus(int child_id, int route_id) { | 121 int GetCurrentStatus(int child_id, int route_id) { |
61 FinalStatus final_status; | 122 FinalStatus final_status; |
62 if (!prerender_tracker()->GetFinalStatus(child_id, route_id, | 123 if (!prerender_tracker()->GetFinalStatus(child_id, route_id, |
63 &final_status)) { | 124 &final_status)) { |
64 return -1; | 125 return -1; |
65 } | 126 } |
66 return final_status; | 127 return final_status; |
67 } | 128 } |
68 | 129 |
69 // Runs any tasks queued on either thread. | 130 // Runs any tasks queued on either thread. |
70 void RunEvents() { | 131 void RunEvents() { |
71 message_loop_.RunUntilIdle(); | 132 message_loop_.RunUntilIdle(); |
72 } | 133 } |
73 | 134 |
74 private: | 135 private: |
75 MessageLoop message_loop_; | 136 MessageLoop message_loop_; |
76 content::TestBrowserThread ui_thread_; | 137 content::TestBrowserThread ui_thread_; |
77 content::TestBrowserThread io_thread_; | 138 content::TestBrowserThread io_thread_; |
78 | 139 |
79 scoped_ptr<TestPrerenderManager> prerender_manager_; | 140 TestPrerenderManager prerender_manager_; |
141 TestPrerenderContents test_contents_; | |
80 }; | 142 }; |
81 | 143 |
82 // Check that a non-existant RenderView is handled correctly. | 144 // Check that a non-existant RenderView is handled correctly. |
83 TEST_F(PrerenderTrackerTest, PrerenderTrackerNull) { | 145 TEST_F(PrerenderTrackerTest, PrerenderTrackerNull) { |
84 FinalStatus final_status; | 146 EXPECT_FALSE(prerender_tracker()->TryUse(kDefaultChildId, kDefaultRouteId)); |
85 EXPECT_FALSE(prerender_tracker()->TryUse(0, 0)); | 147 EXPECT_FALSE(prerender_tracker()->TryCancel( |
86 EXPECT_FALSE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); | 148 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED)); |
87 EXPECT_FALSE(prerender_tracker()->TryCancelOnIOThread( | 149 EXPECT_FALSE(prerender_tracker()->TryCancelOnIOThread( |
88 0, 0, FINAL_STATUS_HTTPS)); | 150 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED)); |
89 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); | 151 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread( |
90 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(0, 0, &final_status)); | 152 kDefaultChildId, kDefaultRouteId)); |
91 EXPECT_FALSE(prerender_manager()->WasPrerenderCancelled(0, 0)); | 153 FinalStatus final_status; |
154 EXPECT_FALSE(prerender_tracker()->GetFinalStatus( | |
155 kDefaultChildId, kDefaultRouteId, &final_status)); | |
156 EXPECT_FALSE(prerender_manager()->WasPrerenderCancelled( | |
157 kDefaultChildId, kDefaultRouteId)); | |
92 } | 158 } |
93 | 159 |
94 // Check that a page that is used is handled correctly. | 160 // Check that a page that is used is handled correctly. |
95 TEST_F(PrerenderTrackerTest, PrerenderTrackerUsed) { | 161 TEST_F(PrerenderTrackerTest, PrerenderTrackerUsed) { |
96 prerender_tracker()->OnPrerenderingStarted(0, 0, prerender_manager()); | 162 test_contents()->Start(); |
97 EXPECT_EQ(FINAL_STATUS_MAX, GetCurrentStatus(0, 0)); | 163 |
98 | 164 EXPECT_EQ(FINAL_STATUS_MAX, |
99 // This calls AddPrerenderOnIOThreadTask(). | 165 GetCurrentStatus(kDefaultChildId, kDefaultRouteId)); |
100 RunEvents(); | 166 |
101 | 167 // This calls AddPrerenderOnIOThreadTask(). |
102 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); | 168 RunEvents(); |
103 EXPECT_EQ(FINAL_STATUS_MAX, GetCurrentStatus(0, 0)); | 169 |
170 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread( | |
171 kDefaultChildId, kDefaultRouteId)); | |
172 EXPECT_EQ(FINAL_STATUS_MAX, | |
173 GetCurrentStatus(kDefaultChildId, kDefaultRouteId)); | |
104 | 174 |
105 // Display the prerendered RenderView. | 175 // Display the prerendered RenderView. |
106 EXPECT_TRUE(prerender_tracker()->TryUse(0, 0)); | 176 EXPECT_TRUE(prerender_tracker()->TryUse(kDefaultChildId, kDefaultRouteId)); |
107 | 177 |
108 // Make sure the page can't be destroyed or claim it was destroyed after | 178 // Make sure the page can't be destroyed or claim it was destroyed after |
109 // it's been used. | 179 // it's been used. |
110 EXPECT_FALSE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); | 180 EXPECT_FALSE(prerender_tracker()->TryCancel( |
181 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED)); | |
111 EXPECT_FALSE(prerender_tracker()->TryCancelOnIOThread( | 182 EXPECT_FALSE(prerender_tracker()->TryCancelOnIOThread( |
112 0, 0, FINAL_STATUS_TIMED_OUT)); | 183 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT)); |
113 EXPECT_EQ(FINAL_STATUS_USED, GetCurrentStatus(0, 0)); | 184 EXPECT_EQ(FINAL_STATUS_USED, |
185 GetCurrentStatus(kDefaultChildId, kDefaultRouteId)); | |
114 | 186 |
115 // This would call DestroyPrerenderForChildRouteIdPair(), if the prerender | 187 // This would call DestroyPrerenderForChildRouteIdPair(), if the prerender |
116 // were cancelled. | 188 // were cancelled. |
117 RunEvents(); | 189 RunEvents(); |
118 | 190 |
119 // These functions should all behave as before. | 191 // These functions should all behave as before. |
120 EXPECT_FALSE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); | 192 EXPECT_FALSE(prerender_tracker()->TryCancel( |
193 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED)); | |
121 EXPECT_FALSE(prerender_tracker()->TryCancelOnIOThread( | 194 EXPECT_FALSE(prerender_tracker()->TryCancelOnIOThread( |
122 0, 0, FINAL_STATUS_TIMED_OUT)); | 195 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT)); |
123 EXPECT_EQ(FINAL_STATUS_USED, GetCurrentStatus(0, 0)); | 196 EXPECT_EQ(FINAL_STATUS_USED, GetCurrentStatus( |
124 | 197 kDefaultChildId, kDefaultRouteId)); |
125 // This calls DestroyPrerenderForChildRouteIdPair(). | 198 |
126 prerender_tracker()->OnPrerenderingFinished(0, 0); | 199 // This calls DestroyPrerenderForChildRouteIdPair(). |
127 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); | 200 test_contents()->Use(); |
128 | 201 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread( |
129 // This calls RemovePrerenderOnIOThreadTask(). | 202 kDefaultChildId, kDefaultRouteId)); |
130 RunEvents(); | 203 |
131 | 204 // This calls RemovePrerenderOnIOThreadTask(). |
132 FinalStatus final_status; | 205 RunEvents(); |
133 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(0, 0, &final_status)); | 206 |
134 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); | 207 FinalStatus final_status; |
135 EXPECT_FALSE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); | 208 EXPECT_FALSE(prerender_tracker()->GetFinalStatus( |
136 EXPECT_FALSE(prerender_manager()->WasPrerenderCancelled(0, 0)); | 209 kDefaultChildId, kDefaultRouteId, &final_status)); |
210 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread( | |
211 kDefaultChildId, kDefaultRouteId)); | |
212 EXPECT_FALSE(prerender_tracker()->TryCancel( | |
213 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED)); | |
214 EXPECT_FALSE(prerender_manager()->WasPrerenderCancelled( | |
215 kDefaultChildId, kDefaultRouteId)); | |
137 } | 216 } |
138 | 217 |
139 // Check that a prerendered page cancelled by TryCancel() is handled correctly. | 218 // Check that a prerendered page cancelled by TryCancel() is handled correctly. |
140 TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelled) { | 219 TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelled) { |
141 prerender_tracker()->OnPrerenderingStarted(0, 0, prerender_manager()); | 220 test_contents()->Start(); |
142 EXPECT_EQ(FINAL_STATUS_MAX, GetCurrentStatus(0, 0)); | 221 EXPECT_EQ(FINAL_STATUS_MAX, |
222 GetCurrentStatus(kDefaultChildId, kDefaultRouteId)); | |
143 | 223 |
144 // This calls AddPrerenderOnIOThreadTask(). | 224 // This calls AddPrerenderOnIOThreadTask(). |
145 RunEvents(); | 225 RunEvents(); |
146 | 226 |
147 // Cancel the prerender. | 227 // Cancel the prerender. |
148 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); | 228 EXPECT_TRUE(prerender_tracker()->TryCancel( |
149 | 229 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED)); |
150 EXPECT_FALSE(prerender_tracker()->TryUse(0, 0)); | 230 |
151 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_TIMED_OUT)); | 231 EXPECT_FALSE(prerender_tracker()->TryUse(kDefaultChildId, kDefaultRouteId)); |
152 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( | 232 EXPECT_TRUE(prerender_tracker()->TryCancel( |
153 0, 0, FINAL_STATUS_TIMED_OUT)); | 233 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT)); |
154 EXPECT_EQ(FINAL_STATUS_HTTPS, GetCurrentStatus(0, 0)); | 234 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( |
155 | 235 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT)); |
156 // This calls DestroyPrerenderForChildRouteIdPair(). | 236 EXPECT_EQ(FINAL_STATUS_CANCELLED, |
157 RunEvents(); | 237 GetCurrentStatus(kDefaultChildId, kDefaultRouteId)); |
158 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(0, 0)); | 238 |
239 // This calls DestroyPrerenderForChildRouteIdPair(). | |
240 RunEvents(); | |
241 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled( | |
242 kDefaultChildId, kDefaultRouteId)); | |
159 | 243 |
160 // These should all work until the prerendering RenderViewHost is destroyed. | 244 // These should all work until the prerendering RenderViewHost is destroyed. |
161 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_TIMED_OUT)); | 245 EXPECT_TRUE(prerender_tracker()->TryCancel( |
162 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( | 246 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT)); |
163 0, 0, FINAL_STATUS_TIMED_OUT)); | 247 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( |
164 EXPECT_EQ(FINAL_STATUS_HTTPS, GetCurrentStatus(0, 0)); | 248 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT)); |
165 | 249 EXPECT_EQ(FINAL_STATUS_CANCELLED, |
166 prerender_tracker()->OnPrerenderingFinished(0, 0); | 250 GetCurrentStatus(kDefaultChildId, kDefaultRouteId)); |
167 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); | 251 |
168 | 252 test_contents()->Cancel(); |
169 // This calls RemovePrerenderOnIOThreadTask(). | 253 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread( |
170 RunEvents(); | 254 kDefaultChildId, kDefaultRouteId)); |
171 | 255 |
172 FinalStatus final_status; | 256 // This calls RemovePrerenderOnIOThreadTask(). |
173 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(0, 0, &final_status)); | 257 RunEvents(); |
174 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); | 258 |
259 FinalStatus final_status; | |
260 EXPECT_FALSE(prerender_tracker()->GetFinalStatus( | |
261 kDefaultChildId, kDefaultRouteId, &final_status)); | |
262 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread( | |
263 kDefaultChildId, kDefaultRouteId)); | |
175 } | 264 } |
176 | 265 |
177 // Check that a prerendered page cancelled on the IO thread by | 266 // Check that a prerendered page cancelled on the IO thread by |
178 // TryCancelOnIOThread() is handled correctly. | 267 // TryCancelOnIOThread() is handled correctly. |
179 TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelledOnIO) { | 268 TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelledOnIO) { |
180 prerender_tracker()->OnPrerenderingStarted(0, 0, prerender_manager()); | 269 test_contents()->Start(); |
181 EXPECT_EQ(FINAL_STATUS_MAX, GetCurrentStatus(0, 0)); | 270 EXPECT_EQ(FINAL_STATUS_MAX, |
271 GetCurrentStatus(kDefaultChildId, kDefaultRouteId)); | |
182 | 272 |
183 // This calls AddPrerenderOnIOThreadTask(). | 273 // This calls AddPrerenderOnIOThreadTask(). |
184 RunEvents(); | 274 RunEvents(); |
185 | 275 |
186 // Cancel the prerender. | 276 // Cancel the prerender. |
187 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( | 277 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( |
188 0, 0, FINAL_STATUS_TIMED_OUT)); | 278 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT)); |
189 | 279 |
190 EXPECT_FALSE(prerender_tracker()->TryUse(0, 0)); | 280 EXPECT_FALSE(prerender_tracker()->TryUse(kDefaultChildId, kDefaultRouteId)); |
191 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); | 281 EXPECT_TRUE(prerender_tracker()->TryCancel(kDefaultChildId, kDefaultRouteId, |
192 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( | 282 FINAL_STATUS_CANCELLED)); |
193 0, 0, FINAL_STATUS_HTTPS)); | 283 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( |
194 EXPECT_EQ(FINAL_STATUS_TIMED_OUT, GetCurrentStatus(0, 0)); | 284 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED)); |
195 | 285 EXPECT_EQ(FINAL_STATUS_TIMED_OUT, |
196 // This calls DestroyPrerenderForChildRouteIdPair(). | 286 GetCurrentStatus(kDefaultChildId, kDefaultRouteId)); |
197 RunEvents(); | 287 |
198 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(0, 0)); | 288 // This calls DestroyPrerenderForChildRouteIdPair(). |
289 RunEvents(); | |
290 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled( | |
291 kDefaultChildId, kDefaultRouteId)); | |
199 | 292 |
200 // These should all work until the prerendering RenderViewHost is destroyed. | 293 // These should all work until the prerendering RenderViewHost is destroyed. |
201 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); | 294 EXPECT_TRUE(prerender_tracker()->TryCancel( |
202 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( | 295 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED)); |
203 0, 0, FINAL_STATUS_HTTPS)); | 296 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( |
204 EXPECT_EQ(FINAL_STATUS_TIMED_OUT, GetCurrentStatus(0, 0)); | 297 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED)); |
205 | 298 EXPECT_EQ(FINAL_STATUS_TIMED_OUT, |
206 prerender_tracker()->OnPrerenderingFinished(0, 0); | 299 GetCurrentStatus(kDefaultChildId, kDefaultRouteId)); |
207 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); | 300 |
208 | 301 test_contents()->Cancel(); |
209 // This calls RemovePrerenderOnIOThreadTask(). | 302 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread( |
210 RunEvents(); | 303 kDefaultChildId, kDefaultRouteId)); |
211 | 304 |
212 FinalStatus final_status; | 305 // This calls RemovePrerenderOnIOThreadTask(). |
213 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(0, 0, &final_status)); | 306 RunEvents(); |
214 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); | 307 |
308 FinalStatus final_status; | |
309 EXPECT_FALSE(prerender_tracker()->GetFinalStatus( | |
310 kDefaultChildId, kDefaultRouteId, &final_status)); | |
311 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread( | |
312 kDefaultChildId, kDefaultRouteId)); | |
215 } | 313 } |
216 | 314 |
217 // Check that a prerendered page cancelled before it reaches the IO thread is | 315 // Check that a prerendered page cancelled before it reaches the IO thread is |
218 // handled correctly. | 316 // handled correctly. |
219 TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelledFast) { | 317 TEST_F(PrerenderTrackerTest, PrerenderTrackerCancelledFast) { |
220 prerender_tracker()->OnPrerenderingStarted(0, 0, prerender_manager()); | 318 test_contents()->Start(); |
319 | |
221 // Cancel the prerender. | 320 // Cancel the prerender. |
222 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); | 321 EXPECT_TRUE(prerender_tracker()->TryCancel( |
223 | 322 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED)); |
224 EXPECT_FALSE(prerender_tracker()->TryUse(0, 0)); | 323 |
225 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_TIMED_OUT)); | 324 EXPECT_FALSE(prerender_tracker()->TryUse(kDefaultChildId, kDefaultRouteId)); |
325 EXPECT_TRUE(prerender_tracker()->TryCancel( | |
326 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT)); | |
226 | 327 |
227 // This calls AddPrerenderOnIOThreadTask() and | 328 // This calls AddPrerenderOnIOThreadTask() and |
228 // DestroyPrerenderForChildRouteIdPair(). | 329 // DestroyPrerenderForChildRouteIdPair(). |
229 RunEvents(); | 330 RunEvents(); |
230 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(0, 0)); | 331 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled( |
231 | 332 kDefaultChildId, kDefaultRouteId)); |
232 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( | 333 |
233 0, 0, FINAL_STATUS_TIMED_OUT)); | 334 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( |
234 EXPECT_TRUE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_TIMED_OUT)); | 335 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT)); |
235 EXPECT_EQ(FINAL_STATUS_HTTPS, GetCurrentStatus(0, 0)); | 336 EXPECT_TRUE(prerender_tracker()->TryCancel( |
236 | 337 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_TIMED_OUT)); |
237 prerender_tracker()->OnPrerenderingFinished(0, 0); | 338 EXPECT_EQ(FINAL_STATUS_CANCELLED, GetCurrentStatus( |
238 | 339 kDefaultChildId, kDefaultRouteId)); |
239 // This calls RemovePrerenderOnIOThreadTask(). | 340 |
240 RunEvents(); | 341 test_contents()->Cancel(); |
241 | 342 |
242 FinalStatus final_status; | 343 // This calls RemovePrerenderOnIOThreadTask(). |
243 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(0, 0, &final_status)); | 344 RunEvents(); |
244 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); | 345 |
346 FinalStatus final_status; | |
347 EXPECT_FALSE(prerender_tracker()->GetFinalStatus( | |
348 kDefaultChildId, kDefaultRouteId, &final_status)); | |
349 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread( | |
350 kDefaultChildId, kDefaultRouteId)); | |
245 } | 351 } |
246 | 352 |
247 // Check that handling two pages at once works. | 353 // Check that handling two pages at once works. |
248 TEST_F(PrerenderTrackerTest, PrerenderTrackerMultiple) { | 354 TEST_F(PrerenderTrackerTest, PrerenderTrackerMultiple) { |
249 prerender_tracker()->OnPrerenderingStarted(0, 0, prerender_manager()); | 355 test_contents()->Start(); |
250 | 356 |
251 // This calls AddPrerenderOnIOThreadTask(). | 357 // This calls AddPrerenderOnIOThreadTask(). |
252 RunEvents(); | 358 RunEvents(); |
253 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); | 359 EXPECT_TRUE(prerender_tracker()->IsPrerenderingOnIOThread( |
360 kDefaultChildId, kDefaultRouteId)); | |
254 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(1, 2)); | 361 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(1, 2)); |
255 EXPECT_FALSE(prerender_tracker()->TryUse(1, 2)); | 362 EXPECT_FALSE(prerender_tracker()->TryUse(1, 2)); |
mmenke
2012/12/04 18:59:16
Should use kDefaultChildId + 1, etc. here.
gavinp
2012/12/04 22:26:07
Done.
| |
256 EXPECT_FALSE(prerender_tracker()->TryCancel(1, 2, FINAL_STATUS_HTTPS)); | 363 EXPECT_FALSE(prerender_tracker()->TryCancel(1, 2, FINAL_STATUS_CANCELLED)); |
257 | 364 |
258 // Start second prerender. | 365 // Start second prerender. |
259 prerender_tracker()->OnPrerenderingStarted(1, 2, prerender_manager()); | 366 TestPrerenderContents second_test_contents(prerender_manager(), |
260 // This calls AddPrerenderOnIOThreadTask(). | 367 kDefaultChildId + 1, |
261 RunEvents(); | 368 kDefaultRouteId + 1); |
mmenke
2012/12/04 18:59:16
Suggest making one of these different (Or, alterna
gavinp
2012/12/04 22:26:07
Done.
| |
262 | 369 |
263 // Use (0, 0). | 370 second_test_contents.Start(); |
264 EXPECT_TRUE(prerender_tracker()->TryUse(0, 0)); | 371 // This calls AddPrerenderOnIOThreadTask(). |
265 EXPECT_EQ(FINAL_STATUS_USED, GetCurrentStatus(0, 0)); | 372 RunEvents(); |
266 EXPECT_EQ(FINAL_STATUS_MAX, GetCurrentStatus(1, 2)); | 373 |
267 | 374 // Use (kDefaultChildId, kDefaultRouteId). |
268 // Cancel (1, 2). | 375 EXPECT_TRUE(prerender_tracker()->TryUse(kDefaultChildId, kDefaultRouteId)); |
269 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( | 376 EXPECT_EQ(FINAL_STATUS_USED, GetCurrentStatus( |
270 1, 2, FINAL_STATUS_HTTPS)); | 377 kDefaultChildId, kDefaultRouteId)); |
271 | 378 EXPECT_EQ(FINAL_STATUS_MAX, |
272 EXPECT_FALSE(prerender_tracker()->TryCancel(0, 0, FINAL_STATUS_HTTPS)); | 379 GetCurrentStatus(kDefaultChildId + 1, kDefaultRouteId + 1)); |
273 EXPECT_EQ(FINAL_STATUS_USED, GetCurrentStatus(0, 0)); | 380 |
274 | 381 // Cancel (kDefaultChildId + 1, kDefaultRouteId + 1). |
275 EXPECT_FALSE(prerender_tracker()->TryUse(1, 2)); | 382 EXPECT_TRUE(prerender_tracker()->TryCancelOnIOThread( |
276 EXPECT_TRUE(prerender_tracker()->TryCancel(1, 2, FINAL_STATUS_HTTPS)); | 383 kDefaultChildId + 1, kDefaultRouteId + 1, FINAL_STATUS_CANCELLED)); |
277 EXPECT_EQ(FINAL_STATUS_HTTPS, GetCurrentStatus(1, 2)); | 384 |
278 | 385 EXPECT_FALSE(prerender_tracker()->TryCancel( |
279 // This calls DestroyPrerenderForChildRouteIdPair(). | 386 kDefaultChildId, kDefaultRouteId, FINAL_STATUS_CANCELLED)); |
280 RunEvents(); | 387 EXPECT_EQ(FINAL_STATUS_USED, |
281 EXPECT_FALSE(prerender_manager()->WasPrerenderCancelled(0, 0)); | 388 GetCurrentStatus(kDefaultChildId, kDefaultRouteId)); |
282 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(1, 2)); | 389 |
283 | 390 EXPECT_FALSE(prerender_tracker()->TryUse( |
284 prerender_tracker()->OnPrerenderingFinished(0, 0); | 391 kDefaultChildId + 1, kDefaultRouteId + 1)); |
285 prerender_tracker()->OnPrerenderingFinished(1, 2); | 392 EXPECT_TRUE(prerender_tracker()->TryCancel( |
286 | 393 kDefaultChildId + 1, kDefaultRouteId + 1, FINAL_STATUS_CANCELLED)); |
287 // This calls RemovePrerenderOnIOThreadTask(). | 394 EXPECT_EQ(FINAL_STATUS_CANCELLED, |
288 RunEvents(); | 395 GetCurrentStatus(kDefaultChildId + 1, kDefaultRouteId + 1)); |
289 | 396 |
290 FinalStatus final_status; | 397 // This calls DestroyPrerenderForChildRouteIdPair(). |
291 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(0, 0, &final_status)); | 398 RunEvents(); |
292 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(0, 0)); | 399 EXPECT_FALSE(prerender_manager()->WasPrerenderCancelled(kDefaultChildId, |
293 | 400 kDefaultRouteId)); |
294 EXPECT_FALSE(prerender_tracker()->GetFinalStatus(1, 2, &final_status)); | 401 EXPECT_TRUE(prerender_manager()->WasPrerenderCancelled(kDefaultChildId + 1, |
295 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread(1, 2)); | 402 kDefaultRouteId + 1)); |
403 | |
404 test_contents()->Cancel(); | |
405 second_test_contents.Cancel(); | |
406 | |
407 // This calls RemovePrerenderOnIOThreadTask(). | |
408 RunEvents(); | |
409 | |
410 FinalStatus final_status; | |
411 EXPECT_FALSE(prerender_tracker()->GetFinalStatus( | |
412 kDefaultChildId, kDefaultRouteId, &final_status)); | |
413 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread( | |
414 kDefaultChildId, kDefaultRouteId)); | |
415 | |
416 EXPECT_FALSE(prerender_tracker()->GetFinalStatus( | |
417 kDefaultChildId + 1, kDefaultRouteId + 1, &final_status)); | |
418 EXPECT_FALSE(prerender_tracker()->IsPrerenderingOnIOThread( | |
419 kDefaultChildId + 1, kDefaultRouteId + 1)); | |
296 } | 420 } |
297 | 421 |
298 } // namespace prerender | 422 } // namespace prerender |
OLD | NEW |