| 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 |