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 CancelInfoBar(0); |
140 ReloadExtension(first_extension_id_); | 136 ReloadExtension(first_extension_id_); |
141 | 137 |
142 SCOPED_TRACE("after reloading"); | 138 SCOPED_TRACE("after reloading"); |
143 CheckExtensionConsistency(size_before); | 139 CheckExtensionConsistency(size_before); |
144 ASSERT_EQ(crash_size_before, | 140 ASSERT_EQ(crash_size_before, |
145 GetExtensionService()->terminated_extensions()->size()); | 141 GetExtensionService()->terminated_extensions()->size()); |
146 } | 142 } |
147 | 143 |
148 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, ReloadIndependently) { | 144 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, ReloadIndependently) { |
149 const size_t size_before = GetExtensionService()->extensions()->size(); | 145 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); | 295 CrashExtension(size_before); |
300 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 296 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
301 } | 297 } |
302 | 298 |
303 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsCrashFirst) { | 299 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsCrashFirst) { |
304 const size_t size_before = GetExtensionService()->extensions()->size(); | 300 const size_t size_before = GetExtensionService()->extensions()->size(); |
305 LoadTestExtension(); | 301 LoadTestExtension(); |
306 LoadSecondExtension(); | 302 LoadSecondExtension(); |
307 CrashExtension(size_before); | 303 CrashExtension(size_before); |
308 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 304 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
309 AcceptCrashedExtensionInfobar(0); | 305 AcceptInfoBar(0); |
310 | 306 |
311 SCOPED_TRACE("after clicking the infobar"); | 307 SCOPED_TRACE("after clicking the infobar"); |
312 CheckExtensionConsistency(size_before); | 308 CheckExtensionConsistency(size_before); |
313 CheckExtensionConsistency(size_before + 1); | 309 CheckExtensionConsistency(size_before + 1); |
314 } | 310 } |
315 | 311 |
316 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsCrashSecond) { | 312 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsCrashSecond) { |
317 const size_t size_before = GetExtensionService()->extensions()->size(); | 313 const size_t size_before = GetExtensionService()->extensions()->size(); |
318 LoadTestExtension(); | 314 LoadTestExtension(); |
319 LoadSecondExtension(); | 315 LoadSecondExtension(); |
320 CrashExtension(size_before + 1); | 316 CrashExtension(size_before + 1); |
321 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 317 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
322 AcceptCrashedExtensionInfobar(0); | 318 AcceptInfoBar(0); |
323 | 319 |
324 SCOPED_TRACE("after clicking the infobar"); | 320 SCOPED_TRACE("after clicking the infobar"); |
325 CheckExtensionConsistency(size_before); | 321 CheckExtensionConsistency(size_before); |
326 CheckExtensionConsistency(size_before + 1); | 322 CheckExtensionConsistency(size_before + 1); |
327 } | 323 } |
328 | 324 |
329 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, | 325 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, |
330 TwoExtensionsCrashBothAtOnce) { | 326 TwoExtensionsCrashBothAtOnce) { |
331 const size_t size_before = GetExtensionService()->extensions()->size(); | 327 const size_t size_before = GetExtensionService()->extensions()->size(); |
332 const size_t crash_size_before = | 328 const size_t crash_size_before = |
333 GetExtensionService()->terminated_extensions()->size(); | 329 GetExtensionService()->terminated_extensions()->size(); |
334 LoadTestExtension(); | 330 LoadTestExtension(); |
335 LoadSecondExtension(); | 331 LoadSecondExtension(); |
336 CrashExtension(size_before); | 332 CrashExtension(size_before); |
337 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 333 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
338 ASSERT_EQ(crash_size_before + 1, | 334 ASSERT_EQ(crash_size_before + 1, |
339 GetExtensionService()->terminated_extensions()->size()); | 335 GetExtensionService()->terminated_extensions()->size()); |
340 CrashExtension(size_before); | 336 CrashExtension(size_before); |
341 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 337 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
342 ASSERT_EQ(crash_size_before + 2, | 338 ASSERT_EQ(crash_size_before + 2, |
343 GetExtensionService()->terminated_extensions()->size()); | 339 GetExtensionService()->terminated_extensions()->size()); |
344 | 340 |
345 { | 341 { |
346 SCOPED_TRACE("first infobar"); | 342 SCOPED_TRACE("first infobar"); |
347 AcceptCrashedExtensionInfobar(0); | 343 AcceptInfoBar(0); |
348 CheckExtensionConsistency(size_before); | 344 CheckExtensionConsistency(size_before); |
349 } | 345 } |
350 | 346 |
351 { | 347 { |
352 SCOPED_TRACE("second infobar"); | 348 SCOPED_TRACE("second infobar"); |
353 AcceptCrashedExtensionInfobar(0); | 349 AcceptInfoBar(0); |
354 CheckExtensionConsistency(size_before); | 350 CheckExtensionConsistency(size_before); |
355 CheckExtensionConsistency(size_before + 1); | 351 CheckExtensionConsistency(size_before + 1); |
356 } | 352 } |
357 } | 353 } |
358 | 354 |
359 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsOneByOne) { | 355 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsOneByOne) { |
360 const size_t size_before = GetExtensionService()->extensions()->size(); | 356 const size_t size_before = GetExtensionService()->extensions()->size(); |
361 LoadTestExtension(); | 357 LoadTestExtension(); |
362 CrashExtension(size_before); | 358 CrashExtension(size_before); |
363 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 359 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
364 LoadSecondExtension(); | 360 LoadSecondExtension(); |
365 CrashExtension(size_before); | 361 CrashExtension(size_before); |
366 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 362 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
367 | 363 |
368 { | 364 { |
369 SCOPED_TRACE("first infobar"); | 365 SCOPED_TRACE("first infobar"); |
370 AcceptCrashedExtensionInfobar(0); | 366 AcceptInfoBar(0); |
371 CheckExtensionConsistency(size_before); | 367 CheckExtensionConsistency(size_before); |
372 } | 368 } |
373 | 369 |
374 { | 370 { |
375 SCOPED_TRACE("second infobar"); | 371 SCOPED_TRACE("second infobar"); |
376 AcceptCrashedExtensionInfobar(0); | 372 AcceptInfoBar(0); |
377 CheckExtensionConsistency(size_before); | 373 CheckExtensionConsistency(size_before); |
378 CheckExtensionConsistency(size_before + 1); | 374 CheckExtensionConsistency(size_before + 1); |
379 } | 375 } |
380 } | 376 } |
381 | 377 |
382 // Make sure that when we don't do anything about the crashed extensions | 378 // 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 | 379 // and close the browser, it doesn't crash. The browser is closed implicitly |
384 // at the end of each browser test. | 380 // at the end of each browser test. |
385 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, | 381 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, |
386 TwoExtensionsShutdownWhileCrashed) { | 382 TwoExtensionsShutdownWhileCrashed) { |
387 const size_t size_before = GetExtensionService()->extensions()->size(); | 383 const size_t size_before = GetExtensionService()->extensions()->size(); |
388 LoadTestExtension(); | 384 LoadTestExtension(); |
389 CrashExtension(size_before); | 385 CrashExtension(size_before); |
390 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 386 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
391 LoadSecondExtension(); | 387 LoadSecondExtension(); |
392 CrashExtension(size_before); | 388 CrashExtension(size_before); |
393 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 389 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
394 } | 390 } |
395 | 391 |
396 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, | 392 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, |
397 TwoExtensionsIgnoreFirst) { | 393 TwoExtensionsIgnoreFirst) { |
398 const size_t size_before = GetExtensionService()->extensions()->size(); | 394 const size_t size_before = GetExtensionService()->extensions()->size(); |
399 LoadTestExtension(); | 395 LoadTestExtension(); |
400 LoadSecondExtension(); | 396 LoadSecondExtension(); |
401 CrashExtension(size_before); | 397 CrashExtension(size_before); |
402 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 398 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
403 CrashExtension(size_before); | 399 CrashExtension(size_before); |
404 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); | 400 ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); |
405 | 401 |
406 CancelCrashedExtensionInfobar(0); | 402 CancelInfoBar(0); |
407 AcceptCrashedExtensionInfobar(1); | 403 AcceptInfoBar(1); |
408 | 404 |
409 SCOPED_TRACE("infobars done"); | 405 SCOPED_TRACE("infobars done"); |
410 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 406 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
411 CheckExtensionConsistency(size_before); | 407 CheckExtensionConsistency(size_before); |
412 } | 408 } |
413 | 409 |
414 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, | 410 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, |
415 TwoExtensionsReloadIndependently) { | 411 TwoExtensionsReloadIndependently) { |
416 const size_t size_before = GetExtensionService()->extensions()->size(); | 412 const size_t size_before = GetExtensionService()->extensions()->size(); |
417 LoadTestExtension(); | 413 LoadTestExtension(); |
(...skipping 10 matching lines...) Expand all Loading... |
428 // At the beginning we should have one infobar displayed for each extension. | 424 // At the beginning we should have one infobar displayed for each extension. |
429 ASSERT_EQ(2, current_tab->infobar_delegate_count()); | 425 ASSERT_EQ(2, current_tab->infobar_delegate_count()); |
430 ReloadExtension(first_extension_id_); | 426 ReloadExtension(first_extension_id_); |
431 // One of the infobars should hide after the extension is reloaded. | 427 // One of the infobars should hide after the extension is reloaded. |
432 ASSERT_EQ(1, current_tab->infobar_delegate_count()); | 428 ASSERT_EQ(1, current_tab->infobar_delegate_count()); |
433 CheckExtensionConsistency(size_before); | 429 CheckExtensionConsistency(size_before); |
434 } | 430 } |
435 | 431 |
436 { | 432 { |
437 SCOPED_TRACE("second: infobar"); | 433 SCOPED_TRACE("second: infobar"); |
438 AcceptCrashedExtensionInfobar(0); | 434 AcceptInfoBar(0); |
439 CheckExtensionConsistency(size_before); | 435 CheckExtensionConsistency(size_before); |
440 CheckExtensionConsistency(size_before + 1); | 436 CheckExtensionConsistency(size_before + 1); |
441 } | 437 } |
442 } | 438 } |
443 | 439 |
444 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, CrashAndUnloadAll) { | 440 IN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, CrashAndUnloadAll) { |
445 const size_t size_before = GetExtensionService()->extensions()->size(); | 441 const size_t size_before = GetExtensionService()->extensions()->size(); |
446 const size_t crash_size_before = | 442 const size_t crash_size_before = |
447 GetExtensionService()->terminated_extensions()->size(); | 443 GetExtensionService()->terminated_extensions()->size(); |
448 LoadTestExtension(); | 444 LoadTestExtension(); |
449 LoadSecondExtension(); | 445 LoadSecondExtension(); |
450 CrashExtension(size_before); | 446 CrashExtension(size_before); |
451 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); | 447 ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); |
452 ASSERT_EQ(crash_size_before + 1, | 448 ASSERT_EQ(crash_size_before + 1, |
453 GetExtensionService()->terminated_extensions()->size()); | 449 GetExtensionService()->terminated_extensions()->size()); |
454 | 450 |
455 GetExtensionService()->UnloadAllExtensions(); | 451 GetExtensionService()->UnloadAllExtensions(); |
456 ASSERT_EQ(crash_size_before, | 452 ASSERT_EQ(crash_size_before, |
457 GetExtensionService()->terminated_extensions()->size()); | 453 GetExtensionService()->terminated_extensions()->size()); |
458 } | 454 } |
OLD | NEW |