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