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