OLD | NEW |
1 // Copyright (c) 2010 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/process_util.h" | 5 #include "base/process_util.h" |
6 #include "chrome/browser/extensions/crashed_extension_infobar.h" | 6 #include "chrome/browser/extensions/crashed_extension_infobar.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" |
11 #include "chrome/browser/profiles/profile.h" | 11 #include "chrome/browser/profiles/profile.h" |
12 #include "chrome/browser/renderer_host/render_process_host.h" | 12 #include "chrome/browser/renderer_host/render_process_host.h" |
13 #include "chrome/browser/renderer_host/render_view_host.h" | 13 #include "chrome/browser/renderer_host/render_view_host.h" |
14 #include "chrome/browser/tab_contents/infobar_delegate.h" | 14 #include "chrome/browser/tab_contents/infobar_delegate.h" |
15 #include "chrome/browser/tab_contents/tab_contents.h" | 15 #include "chrome/browser/tab_contents/tab_contents.h" |
16 #include "chrome/browser/tabs/tab_strip_model.h" | 16 #include "chrome/browser/tabs/tab_strip_model.h" |
17 #include "chrome/browser/ui/browser.h" | 17 #include "chrome/browser/ui/browser.h" |
18 #include "chrome/common/result_codes.h" | 18 #include "chrome/common/result_codes.h" |
19 #include "chrome/test/ui_test_utils.h" | 19 #include "chrome/test/ui_test_utils.h" |
20 | 20 |
21 class ExtensionCrashRecoveryTest : public ExtensionBrowserTest { | 21 class ExtensionCrashRecoveryTest : public ExtensionBrowserTest { |
22 protected: | 22 protected: |
23 ExtensionService* GetExtensionService() { | 23 ExtensionService* GetExtensionService() { |
24 return browser()->profile()->GetExtensionService(); | 24 return browser()->profile()->GetExtensionService(); |
25 } | 25 } |
26 | 26 |
27 ExtensionProcessManager* GetExtensionProcessManager() { | 27 ExtensionProcessManager* GetExtensionProcessManager() { |
28 return browser()->profile()->GetExtensionProcessManager(); | 28 return browser()->profile()->GetExtensionProcessManager(); |
29 } | 29 } |
30 | 30 |
31 CrashedExtensionInfoBarDelegate* GetCrashedExtensionInfoBarDelegate( | 31 ConfirmInfoBarDelegate* GetInfoBarDelegate(int index) { |
32 int index) { | |
33 TabContents* current_tab = browser()->GetSelectedTabContents(); | 32 TabContents* current_tab = browser()->GetSelectedTabContents(); |
34 EXPECT_LT(index, current_tab->infobar_delegate_count()); | 33 EXPECT_LT(index, current_tab->infobar_delegate_count()); |
35 InfoBarDelegate* delegate = current_tab->GetInfoBarDelegateAt(index); | 34 return current_tab->GetInfoBarDelegateAt(index)->AsConfirmInfoBarDelegate(); |
36 return delegate->AsCrashedExtensionInfoBarDelegate(); | |
37 } | 35 } |
38 | 36 |
39 void AcceptCrashedExtensionInfobar(int index) { | 37 void AcceptInfoBar(int index) { |
40 CrashedExtensionInfoBarDelegate* infobar = | 38 ConfirmInfoBarDelegate* infobar = GetInfoBarDelegate(index); |
41 GetCrashedExtensionInfoBarDelegate(index); | |
42 ASSERT_TRUE(infobar); | 39 ASSERT_TRUE(infobar); |
43 infobar->Accept(); | 40 infobar->Accept(); |
44 WaitForExtensionLoad(); | 41 WaitForExtensionLoad(); |
45 } | 42 } |
46 | 43 |
47 void CancelCrashedExtensionInfobar(int index) { | 44 void CancelInfoBar(int index) { |
48 CrashedExtensionInfoBarDelegate* infobar = | 45 ConfirmInfoBarDelegate* infobar = GetInfoBarDelegate(index); |
49 GetCrashedExtensionInfoBarDelegate(index); | |
50 ASSERT_TRUE(infobar); | 46 ASSERT_TRUE(infobar); |
51 infobar->Cancel(); | 47 infobar->Cancel(); |
52 } | 48 } |
53 | 49 |
54 void CrashExtension(size_t index) { | 50 void CrashExtension(size_t index) { |
55 ASSERT_LT(index, GetExtensionService()->extensions()->size()); | 51 ASSERT_LT(index, GetExtensionService()->extensions()->size()); |
56 const Extension* extension = | 52 const Extension* extension = |
57 GetExtensionService()->extensions()->at(index); | 53 GetExtensionService()->extensions()->at(index); |
58 ASSERT_TRUE(extension); | 54 ASSERT_TRUE(extension); |
59 std::string extension_id(extension->id()); | 55 std::string extension_id(extension->id()); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 | 107 |
112 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, Basic) { | 108 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, Basic) { |
113 const size_t size_before = GetExtensionService()->extensions()->size(); | 109 const size_t size_before = GetExtensionService()->extensions()->size(); |
114 const size_t crash_size_before = | 110 const size_t crash_size_before = |
115 GetExtensionService()->terminated_extensions()->size(); | 111 GetExtensionService()->terminated_extensions()->size(); |
116 LoadTestExtension(); | 112 LoadTestExtension(); |
117 CrashExtension(size_before); | 113 CrashExtension(size_before); |
118 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 114 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
119 ASSERT_EQ(crash_size_before + 1, | 115 ASSERT_EQ(crash_size_before + 1, |
120 GetExtensionService()->terminated_extensions()->size()); | 116 GetExtensionService()->terminated_extensions()->size()); |
121 AcceptCrashedExtensionInfobar(0); | 117 AcceptInfoBar(0); |
122 | 118 |
123 SCOPED_TRACE("after clicking the infobar"); | 119 SCOPED_TRACE("after clicking the infobar"); |
124 CheckExtensionConsistency(size_before); | 120 CheckExtensionConsistency(size_before); |
125 ASSERT_EQ(crash_size_before, | 121 ASSERT_EQ(crash_size_before, |
126 GetExtensionService()->terminated_extensions()->size()); | 122 GetExtensionService()->terminated_extensions()->size()); |
127 } | 123 } |
128 | 124 |
129 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, CloseAndReload) { | 125 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, CloseAndReload) { |
130 const size_t size_before = GetExtensionService()->extensions()->size(); | 126 const size_t size_before = GetExtensionService()->extensions()->size(); |
131 const size_t crash_size_before = | 127 const size_t crash_size_before = |
132 GetExtensionService()->terminated_extensions()->size(); | 128 GetExtensionService()->terminated_extensions()->size(); |
133 LoadTestExtension(); | 129 LoadTestExtension(); |
134 CrashExtension(size_before); | 130 CrashExtension(size_before); |
135 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 131 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
136 ASSERT_EQ(crash_size_before + 1, | 132 ASSERT_EQ(crash_size_before + 1, |
137 GetExtensionService()->terminated_extensions()->size()); | 133 GetExtensionService()->terminated_extensions()->size()); |
138 | 134 |
139 CancelCrashedExtensionInfobar(0); | 135 CancelCrashedExtensionInfobar(0); |
| 136 CancelInfoBar(0); |
140 ReloadExtension(first_extension_id_); | 137 ReloadExtension(first_extension_id_); |
141 | 138 |
142 SCOPED_TRACE("after reloading"); | 139 SCOPED_TRACE("after reloading"); |
143 CheckExtensionConsistency(size_before); | 140 CheckExtensionConsistency(size_before); |
144 ASSERT_EQ(crash_size_before, | 141 ASSERT_EQ(crash_size_before, |
145 GetExtensionService()->terminated_extensions()->size()); | 142 GetExtensionService()->terminated_extensions()->size()); |
146 } | 143 } |
147 | 144 |
148 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, ReloadIndependently) { | 145 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, ReloadIndependently) { |
149 const size_t size_before = GetExtensionService()->extensions()->size(); | 146 const size_t size_before = GetExtensionService()->extensions()->size(); |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 CrashExtension(size_before); | 296 CrashExtension(size_before); |
300 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 297 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
301 } | 298 } |
302 | 299 |
303 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsCrashFirst) { | 300 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsCrashFirst) { |
304 const size_t size_before = GetExtensionService()->extensions()->size(); | 301 const size_t size_before = GetExtensionService()->extensions()->size(); |
305 LoadTestExtension(); | 302 LoadTestExtension(); |
306 LoadSecondExtension(); | 303 LoadSecondExtension(); |
307 CrashExtension(size_before); | 304 CrashExtension(size_before); |
308 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 305 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
309 AcceptCrashedExtensionInfobar(0); | 306 AcceptInfoBar(0); |
310 | 307 |
311 SCOPED_TRACE("after clicking the infobar"); | 308 SCOPED_TRACE("after clicking the infobar"); |
312 CheckExtensionConsistency(size_before); | 309 CheckExtensionConsistency(size_before); |
313 CheckExtensionConsistency(size_before + 1); | 310 CheckExtensionConsistency(size_before + 1); |
314 } | 311 } |
315 | 312 |
316 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsCrashSecond) { | 313 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsCrashSecond) { |
317 const size_t size_before = GetExtensionService()->extensions()->size(); | 314 const size_t size_before = GetExtensionService()->extensions()->size(); |
318 LoadTestExtension(); | 315 LoadTestExtension(); |
319 LoadSecondExtension(); | 316 LoadSecondExtension(); |
320 CrashExtension(size_before + 1); | 317 CrashExtension(size_before + 1); |
321 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 318 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
322 AcceptCrashedExtensionInfobar(0); | 319 AcceptInfoBar(0); |
323 | 320 |
324 SCOPED_TRACE("after clicking the infobar"); | 321 SCOPED_TRACE("after clicking the infobar"); |
325 CheckExtensionConsistency(size_before); | 322 CheckExtensionConsistency(size_before); |
326 CheckExtensionConsistency(size_before + 1); | 323 CheckExtensionConsistency(size_before + 1); |
327 } | 324 } |
328 | 325 |
329 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, | 326 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, |
330 TwoExtensionsCrashBothAtOnce) { | 327 TwoExtensionsCrashBothAtOnce) { |
331 const size_t size_before = GetExtensionService()->extensions()->size(); | 328 const size_t size_before = GetExtensionService()->extensions()->size(); |
332 const size_t crash_size_before = | 329 const size_t crash_size_before = |
333 GetExtensionService()->terminated_extensions()->size(); | 330 GetExtensionService()->terminated_extensions()->size(); |
334 LoadTestExtension(); | 331 LoadTestExtension(); |
335 LoadSecondExtension(); | 332 LoadSecondExtension(); |
336 CrashExtension(size_before); | 333 CrashExtension(size_before); |
337 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 334 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
338 ASSERT_EQ(crash_size_before + 1, | 335 ASSERT_EQ(crash_size_before + 1, |
339 GetExtensionService()->terminated_extensions()->size()); | 336 GetExtensionService()->terminated_extensions()->size()); |
340 CrashExtension(size_before); | 337 CrashExtension(size_before); |
341 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 338 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
342 ASSERT_EQ(crash_size_before + 2, | 339 ASSERT_EQ(crash_size_before + 2, |
343 GetExtensionService()->terminated_extensions()->size()); | 340 GetExtensionService()->terminated_extensions()->size()); |
344 | 341 |
345 { | 342 { |
346 SCOPED_TRACE("first infobar"); | 343 SCOPED_TRACE("first infobar"); |
347 AcceptCrashedExtensionInfobar(0); | 344 AcceptInfoBar(0); |
348 CheckExtensionConsistency(size_before); | 345 CheckExtensionConsistency(size_before); |
349 } | 346 } |
350 | 347 |
351 { | 348 { |
352 SCOPED_TRACE("second infobar"); | 349 SCOPED_TRACE("second infobar"); |
353 AcceptCrashedExtensionInfobar(0); | 350 AcceptInfoBar(0); |
354 CheckExtensionConsistency(size_before); | 351 CheckExtensionConsistency(size_before); |
355 CheckExtensionConsistency(size_before + 1); | 352 CheckExtensionConsistency(size_before + 1); |
356 } | 353 } |
357 } | 354 } |
358 | 355 |
359 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsOneByOne) { | 356 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsOneByOne) { |
360 const size_t size_before = GetExtensionService()->extensions()->size(); | 357 const size_t size_before = GetExtensionService()->extensions()->size(); |
361 LoadTestExtension(); | 358 LoadTestExtension(); |
362 CrashExtension(size_before); | 359 CrashExtension(size_before); |
363 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 360 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
364 LoadSecondExtension(); | 361 LoadSecondExtension(); |
365 CrashExtension(size_before); | 362 CrashExtension(size_before); |
366 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 363 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
367 | 364 |
368 { | 365 { |
369 SCOPED_TRACE("first infobar"); | 366 SCOPED_TRACE("first infobar"); |
370 AcceptCrashedExtensionInfobar(0); | 367 AcceptInfoBar(0); |
371 CheckExtensionConsistency(size_before); | 368 CheckExtensionConsistency(size_before); |
372 } | 369 } |
373 | 370 |
374 { | 371 { |
375 SCOPED_TRACE("second infobar"); | 372 SCOPED_TRACE("second infobar"); |
376 AcceptCrashedExtensionInfobar(0); | 373 AcceptInfoBar(0); |
377 CheckExtensionConsistency(size_before); | 374 CheckExtensionConsistency(size_before); |
378 CheckExtensionConsistency(size_before + 1); | 375 CheckExtensionConsistency(size_before + 1); |
379 } | 376 } |
380 } | 377 } |
381 | 378 |
382 // Make sure that when we don't do anything about the crashed extensions | 379 // Make sure that when we don't do anything about the crashed extensions |
383 // and close the browser, it doesn't crash. The browser is closed implicitly | 380 // and close the browser, it doesn't crash. The browser is closed implicitly |
384 // at the end of each browser test. | 381 // at the end of each browser test. |
385 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, | 382 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, |
386 TwoExtensionsShutdownWhileCrashed) { | 383 TwoExtensionsShutdownWhileCrashed) { |
387 const size_t size_before = GetExtensionService()->extensions()->size(); | 384 const size_t size_before = GetExtensionService()->extensions()->size(); |
388 LoadTestExtension(); | 385 LoadTestExtension(); |
389 CrashExtension(size_before); | 386 CrashExtension(size_before); |
390 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 387 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
391 LoadSecondExtension(); | 388 LoadSecondExtension(); |
392 CrashExtension(size_before); | 389 CrashExtension(size_before); |
393 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 390 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
394 } | 391 } |
395 | 392 |
396 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, | 393 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, |
397 TwoExtensionsIgnoreFirst) { | 394 TwoExtensionsIgnoreFirst) { |
398 const size_t size_before = GetExtensionService()->extensions()->size(); | 395 const size_t size_before = GetExtensionService()->extensions()->size(); |
399 LoadTestExtension(); | 396 LoadTestExtension(); |
400 LoadSecondExtension(); | 397 LoadSecondExtension(); |
401 CrashExtension(size_before); | 398 CrashExtension(size_before); |
402 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 399 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
403 CrashExtension(size_before); | 400 CrashExtension(size_before); |
404 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 401 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
405 | 402 |
406 CancelCrashedExtensionInfobar(0); | 403 CancelInfoBar(0); |
407 AcceptCrashedExtensionInfobar(1); | 404 AcceptInfoBar(1); |
408 | 405 |
409 SCOPED_TRACE("infobars done"); | 406 SCOPED_TRACE("infobars done"); |
410 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 407 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
411 CheckExtensionConsistency(size_before); | 408 CheckExtensionConsistency(size_before); |
412 } | 409 } |
413 | 410 |
414 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, | 411 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, |
415 TwoExtensionsReloadIndependently) { | 412 TwoExtensionsReloadIndependently) { |
416 const size_t size_before = GetExtensionService()->extensions()->size(); | 413 const size_t size_before = GetExtensionService()->extensions()->size(); |
417 LoadTestExtension(); | 414 LoadTestExtension(); |
(...skipping 10 matching lines...) Expand all Loading... |
428 // At the beginning we should have one infobar displayed for each extension. | 425 // At the beginning we should have one infobar displayed for each extension. |
429 ASSERT_EQ(2, current_tab->infobar_delegate_count()); | 426 ASSERT_EQ(2, current_tab->infobar_delegate_count()); |
430 ReloadExtension(first_extension_id_); | 427 ReloadExtension(first_extension_id_); |
431 // One of the infobars should hide after the extension is reloaded. | 428 // One of the infobars should hide after the extension is reloaded. |
432 ASSERT_EQ(1, current_tab->infobar_delegate_count()); | 429 ASSERT_EQ(1, current_tab->infobar_delegate_count()); |
433 CheckExtensionConsistency(size_before); | 430 CheckExtensionConsistency(size_before); |
434 } | 431 } |
435 | 432 |
436 { | 433 { |
437 SCOPED_TRACE("second: infobar"); | 434 SCOPED_TRACE("second: infobar"); |
438 AcceptCrashedExtensionInfobar(0); | 435 AcceptInfoBar(0); |
439 CheckExtensionConsistency(size_before); | 436 CheckExtensionConsistency(size_before); |
440 CheckExtensionConsistency(size_before + 1); | 437 CheckExtensionConsistency(size_before + 1); |
441 } | 438 } |
442 } | 439 } |
443 | 440 |
444 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, CrashAndUnloadAll) { | 441 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, CrashAndUnloadAll) { |
445 const size_t size_before = GetExtensionService()->extensions()->size(); | 442 const size_t size_before = GetExtensionService()->extensions()->size(); |
446 const size_t crash_size_before = | 443 const size_t crash_size_before = |
447 GetExtensionService()->terminated_extensions()->size(); | 444 GetExtensionService()->terminated_extensions()->size(); |
448 LoadTestExtension(); | 445 LoadTestExtension(); |
449 LoadSecondExtension(); | 446 LoadSecondExtension(); |
450 CrashExtension(size_before); | 447 CrashExtension(size_before); |
451 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 448 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
452 ASSERT_EQ(crash_size_before + 1, | 449 ASSERT_EQ(crash_size_before + 1, |
453 GetExtensionService()->terminated_extensions()->size()); | 450 GetExtensionService()->terminated_extensions()->size()); |
454 | 451 |
455 GetExtensionService()->UnloadAllExtensions(); | 452 GetExtensionService()->UnloadAllExtensions(); |
456 ASSERT_EQ(crash_size_before, | 453 ASSERT_EQ(crash_size_before, |
457 GetExtensionService()->terminated_extensions()->size()); | 454 GetExtensionService()->terminated_extensions()->size()); |
458 } | 455 } |
OLD | NEW |