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/process_util.h" | 5 #include "base/process_util.h" |
6 #include "chrome/browser/browser_process.h" | 6 #include "chrome/browser/browser_process.h" |
7 #include "chrome/browser/extensions/extension_browsertest.h" | 7 #include "chrome/browser/extensions/extension_browsertest.h" |
8 #include "chrome/browser/extensions/extension_host.h" | 8 #include "chrome/browser/extensions/extension_host.h" |
9 #include "chrome/browser/extensions/extension_process_manager.h" | 9 #include "chrome/browser/extensions/extension_process_manager.h" |
10 #include "chrome/browser/extensions/extension_service.h" | 10 #include "chrome/browser/extensions/extension_service.h" |
(...skipping 28 matching lines...) Expand all Loading... |
39 protected: | 39 protected: |
40 ExtensionService* GetExtensionService() { | 40 ExtensionService* GetExtensionService() { |
41 return browser()->profile()->GetExtensionService(); | 41 return browser()->profile()->GetExtensionService(); |
42 } | 42 } |
43 | 43 |
44 ExtensionProcessManager* GetExtensionProcessManager() { | 44 ExtensionProcessManager* GetExtensionProcessManager() { |
45 return extensions::ExtensionSystem::Get(browser()->profile())-> | 45 return extensions::ExtensionSystem::Get(browser()->profile())-> |
46 process_manager(); | 46 process_manager(); |
47 } | 47 } |
48 | 48 |
49 Balloon* GetNotificationDelegate(size_t index) { | |
50 NotificationUIManager* manager = | |
51 g_browser_process->notification_ui_manager(); | |
52 BalloonCollection::Balloons balloons = | |
53 manager->balloon_collection()->GetActiveBalloons(); | |
54 return balloons.at(index); | |
55 } | |
56 | |
57 void AcceptNotification(size_t index) { | 49 void AcceptNotification(size_t index) { |
58 Balloon* balloon = GetNotificationDelegate(index); | 50 Balloon* balloon = GetNotificationDelegate(index); |
59 ASSERT_TRUE(balloon); | 51 ASSERT_TRUE(balloon); |
60 balloon->OnClick(); | 52 balloon->OnClick(); |
61 WaitForExtensionLoad(); | 53 WaitForExtensionLoad(); |
62 } | 54 } |
63 | 55 |
64 void CancelNotification(size_t index) { | 56 void CancelNotification(size_t index) { |
65 Balloon* balloon = GetNotificationDelegate(index); | 57 Balloon* balloon = GetNotificationDelegate(index); |
| 58 ASSERT_TRUE(balloon); |
66 NotificationUIManager* manager = | 59 NotificationUIManager* manager = |
67 g_browser_process->notification_ui_manager(); | 60 g_browser_process->notification_ui_manager(); |
68 ASSERT_TRUE(manager->CancelById(balloon->notification().notification_id())); | 61 ASSERT_TRUE(manager->CancelById(balloon->notification().notification_id())); |
69 } | 62 } |
70 | 63 |
71 size_t CountBalloons() { | 64 size_t CountBalloons() { |
72 NotificationUIManager* manager = | 65 NotificationUIManager* manager = |
73 g_browser_process->notification_ui_manager(); | 66 g_browser_process->notification_ui_manager(); |
74 BalloonCollection::Balloons balloons = | 67 BalloonCollection::Balloons balloons = |
75 manager->balloon_collection()->GetActiveBalloons(); | 68 manager->balloon_collection()->GetActiveBalloons(); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 void LoadSecondExtension() { | 116 void LoadSecondExtension() { |
124 const Extension* extension = LoadExtension( | 117 const Extension* extension = LoadExtension( |
125 test_data_dir_.AppendASCII("install").AppendASCII("install")); | 118 test_data_dir_.AppendASCII("install").AppendASCII("install")); |
126 ASSERT_TRUE(extension); | 119 ASSERT_TRUE(extension); |
127 second_extension_id_ = extension->id(); | 120 second_extension_id_ = extension->id(); |
128 CheckExtensionConsistency(second_extension_id_); | 121 CheckExtensionConsistency(second_extension_id_); |
129 } | 122 } |
130 | 123 |
131 std::string first_extension_id_; | 124 std::string first_extension_id_; |
132 std::string second_extension_id_; | 125 std::string second_extension_id_; |
| 126 |
| 127 private: |
| 128 Balloon* GetNotificationDelegate(size_t index) { |
| 129 NotificationUIManager* manager = |
| 130 g_browser_process->notification_ui_manager(); |
| 131 BalloonCollection::Balloons balloons = |
| 132 manager->balloon_collection()->GetActiveBalloons(); |
| 133 return index < balloons.size() ? balloons.at(index) : NULL; |
| 134 } |
133 }; | 135 }; |
134 | 136 |
135 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, Basic) { | 137 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, Basic) { |
136 const size_t size_before = GetExtensionService()->extensions()->size(); | 138 const size_t size_before = GetExtensionService()->extensions()->size(); |
137 const size_t crash_size_before = | 139 const size_t crash_size_before = |
138 GetExtensionService()->terminated_extensions()->size(); | 140 GetExtensionService()->terminated_extensions()->size(); |
139 LoadTestExtension(); | 141 LoadTestExtension(); |
140 CrashExtension(first_extension_id_); | 142 CrashExtension(first_extension_id_); |
141 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 143 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
142 ASSERT_EQ(crash_size_before + 1, | 144 ASSERT_EQ(crash_size_before + 1, |
143 GetExtensionService()->terminated_extensions()->size()); | 145 GetExtensionService()->terminated_extensions()->size()); |
144 AcceptNotification(0); | 146 ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); |
145 | 147 |
146 SCOPED_TRACE("after clicking the balloon"); | 148 SCOPED_TRACE("after clicking the balloon"); |
147 CheckExtensionConsistency(first_extension_id_); | 149 CheckExtensionConsistency(first_extension_id_); |
148 ASSERT_EQ(crash_size_before, | 150 ASSERT_EQ(crash_size_before, |
149 GetExtensionService()->terminated_extensions()->size()); | 151 GetExtensionService()->terminated_extensions()->size()); |
150 } | 152 } |
151 | 153 |
152 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, CloseAndReload) { | 154 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, CloseAndReload) { |
153 const size_t size_before = GetExtensionService()->extensions()->size(); | 155 const size_t size_before = GetExtensionService()->extensions()->size(); |
154 const size_t crash_size_before = | 156 const size_t crash_size_before = |
155 GetExtensionService()->terminated_extensions()->size(); | 157 GetExtensionService()->terminated_extensions()->size(); |
156 LoadTestExtension(); | 158 LoadTestExtension(); |
157 CrashExtension(first_extension_id_); | 159 CrashExtension(first_extension_id_); |
158 | 160 |
159 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 161 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
160 ASSERT_EQ(crash_size_before + 1, | 162 ASSERT_EQ(crash_size_before + 1, |
161 GetExtensionService()->terminated_extensions()->size()); | 163 GetExtensionService()->terminated_extensions()->size()); |
162 | 164 |
163 CancelNotification(0); | 165 ASSERT_NO_FATAL_FAILURE(CancelNotification(0)); |
164 ReloadExtension(first_extension_id_); | 166 ReloadExtension(first_extension_id_); |
165 | 167 |
166 SCOPED_TRACE("after reloading"); | 168 SCOPED_TRACE("after reloading"); |
167 CheckExtensionConsistency(first_extension_id_); | 169 CheckExtensionConsistency(first_extension_id_); |
168 ASSERT_EQ(crash_size_before, | 170 ASSERT_EQ(crash_size_before, |
169 GetExtensionService()->terminated_extensions()->size()); | 171 GetExtensionService()->terminated_extensions()->size()); |
170 } | 172 } |
171 | 173 |
172 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, ReloadIndependently) { | 174 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, ReloadIndependently) { |
173 const size_t size_before = GetExtensionService()->extensions()->size(); | 175 const size_t size_before = GetExtensionService()->extensions()->size(); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 CrashExtension(first_extension_id_); | 262 CrashExtension(first_extension_id_); |
261 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 263 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
262 } | 264 } |
263 | 265 |
264 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsCrashFirst) { | 266 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsCrashFirst) { |
265 const size_t size_before = GetExtensionService()->extensions()->size(); | 267 const size_t size_before = GetExtensionService()->extensions()->size(); |
266 LoadTestExtension(); | 268 LoadTestExtension(); |
267 LoadSecondExtension(); | 269 LoadSecondExtension(); |
268 CrashExtension(first_extension_id_); | 270 CrashExtension(first_extension_id_); |
269 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 271 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
270 AcceptNotification(0); | 272 ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); |
271 | 273 |
272 SCOPED_TRACE("after clicking the balloon"); | 274 SCOPED_TRACE("after clicking the balloon"); |
273 CheckExtensionConsistency(first_extension_id_); | 275 CheckExtensionConsistency(first_extension_id_); |
274 CheckExtensionConsistency(second_extension_id_); | 276 CheckExtensionConsistency(second_extension_id_); |
275 } | 277 } |
276 | 278 |
277 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsCrashSecond) { | 279 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsCrashSecond) { |
278 const size_t size_before = GetExtensionService()->extensions()->size(); | 280 const size_t size_before = GetExtensionService()->extensions()->size(); |
279 LoadTestExtension(); | 281 LoadTestExtension(); |
280 LoadSecondExtension(); | 282 LoadSecondExtension(); |
281 CrashExtension(second_extension_id_); | 283 CrashExtension(second_extension_id_); |
282 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 284 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
283 AcceptNotification(0); | 285 ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); |
284 | 286 |
285 SCOPED_TRACE("after clicking the balloon"); | 287 SCOPED_TRACE("after clicking the balloon"); |
286 CheckExtensionConsistency(first_extension_id_); | 288 CheckExtensionConsistency(first_extension_id_); |
287 CheckExtensionConsistency(second_extension_id_); | 289 CheckExtensionConsistency(second_extension_id_); |
288 } | 290 } |
289 | 291 |
290 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, | 292 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, |
291 TwoExtensionsCrashBothAtOnce) { | 293 TwoExtensionsCrashBothAtOnce) { |
292 const size_t size_before = GetExtensionService()->extensions()->size(); | 294 const size_t size_before = GetExtensionService()->extensions()->size(); |
293 const size_t crash_size_before = | 295 const size_t crash_size_before = |
294 GetExtensionService()->terminated_extensions()->size(); | 296 GetExtensionService()->terminated_extensions()->size(); |
295 LoadTestExtension(); | 297 LoadTestExtension(); |
296 LoadSecondExtension(); | 298 LoadSecondExtension(); |
297 CrashExtension(first_extension_id_); | 299 CrashExtension(first_extension_id_); |
298 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 300 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
299 ASSERT_EQ(crash_size_before + 1, | 301 ASSERT_EQ(crash_size_before + 1, |
300 GetExtensionService()->terminated_extensions()->size()); | 302 GetExtensionService()->terminated_extensions()->size()); |
301 CrashExtension(second_extension_id_); | 303 CrashExtension(second_extension_id_); |
302 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 304 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
303 ASSERT_EQ(crash_size_before + 2, | 305 ASSERT_EQ(crash_size_before + 2, |
304 GetExtensionService()->terminated_extensions()->size()); | 306 GetExtensionService()->terminated_extensions()->size()); |
305 | 307 |
306 { | 308 { |
307 SCOPED_TRACE("first balloon"); | 309 SCOPED_TRACE("first balloon"); |
308 AcceptNotification(0); | 310 ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); |
309 CheckExtensionConsistency(first_extension_id_); | 311 CheckExtensionConsistency(first_extension_id_); |
310 } | 312 } |
311 | 313 |
312 { | 314 { |
313 SCOPED_TRACE("second balloon"); | 315 SCOPED_TRACE("second balloon"); |
314 AcceptNotification(0); | 316 ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); |
315 CheckExtensionConsistency(first_extension_id_); | 317 CheckExtensionConsistency(first_extension_id_); |
316 CheckExtensionConsistency(second_extension_id_); | 318 CheckExtensionConsistency(second_extension_id_); |
317 } | 319 } |
318 } | 320 } |
319 | 321 |
320 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsOneByOne) { | 322 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsOneByOne) { |
321 const size_t size_before = GetExtensionService()->extensions()->size(); | 323 const size_t size_before = GetExtensionService()->extensions()->size(); |
322 LoadTestExtension(); | 324 LoadTestExtension(); |
323 CrashExtension(first_extension_id_); | 325 CrashExtension(first_extension_id_); |
324 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 326 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
325 LoadSecondExtension(); | 327 LoadSecondExtension(); |
326 CrashExtension(second_extension_id_); | 328 CrashExtension(second_extension_id_); |
327 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 329 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
328 | 330 |
329 { | 331 { |
330 SCOPED_TRACE("first balloon"); | 332 SCOPED_TRACE("first balloon"); |
331 AcceptNotification(0); | 333 ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); |
332 CheckExtensionConsistency(first_extension_id_); | 334 CheckExtensionConsistency(first_extension_id_); |
333 } | 335 } |
334 | 336 |
335 { | 337 { |
336 SCOPED_TRACE("second balloon"); | 338 SCOPED_TRACE("second balloon"); |
337 AcceptNotification(0); | 339 ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); |
338 CheckExtensionConsistency(first_extension_id_); | 340 CheckExtensionConsistency(first_extension_id_); |
339 CheckExtensionConsistency(second_extension_id_); | 341 CheckExtensionConsistency(second_extension_id_); |
340 } | 342 } |
341 } | 343 } |
342 | 344 |
343 // http://crbug.com/84719 | 345 // http://crbug.com/84719 |
344 #if defined(OS_LINUX) | 346 #if defined(OS_LINUX) |
345 #define MAYBE_TwoExtensionsShutdownWhileCrashed \ | 347 #define MAYBE_TwoExtensionsShutdownWhileCrashed \ |
346 DISABLED_TwoExtensionsShutdownWhileCrashed | 348 DISABLED_TwoExtensionsShutdownWhileCrashed |
347 #else | 349 #else |
(...skipping 21 matching lines...) Expand all Loading... |
369 LoadTestExtension(); | 371 LoadTestExtension(); |
370 LoadSecondExtension(); | 372 LoadSecondExtension(); |
371 CrashExtension(first_extension_id_); | 373 CrashExtension(first_extension_id_); |
372 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 374 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
373 CrashExtension(second_extension_id_); | 375 CrashExtension(second_extension_id_); |
374 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 376 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
375 | 377 |
376 // Accept notification 1 before canceling notification 0. | 378 // Accept notification 1 before canceling notification 0. |
377 // Otherwise, on Linux and Windows, there is a race here, in which | 379 // Otherwise, on Linux and Windows, there is a race here, in which |
378 // canceled notifications do not immediately go away. | 380 // canceled notifications do not immediately go away. |
379 AcceptNotification(1); | 381 ASSERT_NO_FATAL_FAILURE(AcceptNotification(1)); |
380 CancelNotification(0); | 382 ASSERT_NO_FATAL_FAILURE(CancelNotification(0)); |
381 | 383 |
382 SCOPED_TRACE("balloons done"); | 384 SCOPED_TRACE("balloons done"); |
383 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 385 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
384 CheckExtensionConsistency(second_extension_id_); | 386 CheckExtensionConsistency(second_extension_id_); |
385 } | 387 } |
386 | 388 |
387 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, | 389 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, |
388 TwoExtensionsReloadIndependently) { | 390 TwoExtensionsReloadIndependently) { |
389 const size_t size_before = GetExtensionService()->extensions()->size(); | 391 const size_t size_before = GetExtensionService()->extensions()->size(); |
390 LoadTestExtension(); | 392 LoadTestExtension(); |
(...skipping 10 matching lines...) Expand all Loading... |
401 // At the beginning we should have one balloon displayed for each extension. | 403 // At the beginning we should have one balloon displayed for each extension. |
402 ASSERT_EQ(2U, CountBalloons()); | 404 ASSERT_EQ(2U, CountBalloons()); |
403 ReloadExtension(first_extension_id_); | 405 ReloadExtension(first_extension_id_); |
404 // One of the balloons should hide after the extension is reloaded. | 406 // One of the balloons should hide after the extension is reloaded. |
405 ASSERT_EQ(1U, CountBalloons()); | 407 ASSERT_EQ(1U, CountBalloons()); |
406 CheckExtensionConsistency(first_extension_id_); | 408 CheckExtensionConsistency(first_extension_id_); |
407 } | 409 } |
408 | 410 |
409 { | 411 { |
410 SCOPED_TRACE("second: balloon"); | 412 SCOPED_TRACE("second: balloon"); |
411 AcceptNotification(0); | 413 ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); |
412 CheckExtensionConsistency(first_extension_id_); | 414 CheckExtensionConsistency(first_extension_id_); |
413 CheckExtensionConsistency(second_extension_id_); | 415 CheckExtensionConsistency(second_extension_id_); |
414 } | 416 } |
415 } | 417 } |
416 | 418 |
417 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, CrashAndUninstall) { | 419 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, CrashAndUninstall) { |
418 const size_t size_before = GetExtensionService()->extensions()->size(); | 420 const size_t size_before = GetExtensionService()->extensions()->size(); |
419 const size_t crash_size_before = | 421 const size_t crash_size_before = |
420 GetExtensionService()->terminated_extensions()->size(); | 422 GetExtensionService()->terminated_extensions()->size(); |
421 LoadTestExtension(); | 423 LoadTestExtension(); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
494 observer.Wait(); | 496 observer.Wait(); |
495 } | 497 } |
496 // Extension should now be loaded. | 498 // Extension should now be loaded. |
497 SCOPED_TRACE("after reloading the tab"); | 499 SCOPED_TRACE("after reloading the tab"); |
498 CheckExtensionConsistency(first_extension_id_); | 500 CheckExtensionConsistency(first_extension_id_); |
499 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 501 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
500 ASSERT_EQ(0U, CountBalloons()); | 502 ASSERT_EQ(0U, CountBalloons()); |
501 } | 503 } |
502 | 504 |
503 #endif | 505 #endif |
OLD | NEW |