extension_crash_recovery_browsertest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/process_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_host.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_process_manager.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/balloon.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/balloon_collection.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/balloon_host.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/notifications/balloon_notification_ui_manager.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification_delegate.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/result_codes.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_MESSAGE_CENTER) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/message_center/message_center.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/message_center/message_center_switches.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/message_center/notification_list.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests are timing out waiting for extension to crash. 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/174705 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) || defined(USE_AURA) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ExtensionCrashRecoveryTest DISABLED_ExtensionCrashRecoveryTest 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ExtensionCrashRecoveryTest ExtensionCrashRecoveryTest 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(OS_MACOSX) || defined(USE_AURA) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionCrashRecoveryTestBase : public ExtensionBrowserTest { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AcceptNotification(size_t index) = 0; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CancelNotification(size_t index) = 0; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual size_t CountBalloons() = 0; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* GetExtensionService() { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser()->profile()->GetExtensionService(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* GetExtensionProcessManager() { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extensions::ExtensionSystem::Get(browser()->profile())-> 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_manager(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CrashExtension(std::string extension_id) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->GetExtensionById(extension_id, false); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionHost* extension_host = GetExtensionProcessManager()-> 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBackgroundHostForExtension(extension_id); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension_host); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::KillProcess(extension_host->render_process_host()->GetHandle(), 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RESULT_CODE_KILLED, false); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(WaitForExtensionCrash(extension_id)); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(GetExtensionProcessManager()-> 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBackgroundHostForExtension(extension_id)); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckExtensionConsistency(std::string extension_id) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->extensions()->GetByID(extension_id); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionHost* extension_host = GetExtensionProcessManager()-> 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetBackgroundHostForExtension(extension_id); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension_host); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager::ViewSet all_views = 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionProcessManager()->GetAllViews(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager::ViewSet::const_iterator it = 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_views.find(extension_host->host_contents()->GetRenderViewHost()); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(it == all_views.end()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension_host->IsRenderViewLive()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ProcessMap* process_map = 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile()->GetExtensionService()->process_map(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(process_map->Contains( 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_id, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_host->render_view_host()->GetProcess()->GetID())); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadTestExtension() { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionBrowserTest::SetUpInProcessBrowserTestFixture(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension( 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir_.AppendASCII("common").AppendASCII("background_page")); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_extension_id_ = extension->id(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadSecondExtension() { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension( 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir_.AppendASCII("install").AppendASCII("install")); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_extension_id_ = extension->id(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(second_extension_id_); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string first_extension_id_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string second_extension_id_; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(rsesek): Implement and enable these tests. http://crbug.com/179904 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_MESSAGE_CENTER) && !defined(OS_MACOSX) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MessageCenterExtensionCrashRecoveryTest 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public ExtensionCrashRecoveryTestBase { 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) { 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionCrashRecoveryTestBase::SetUpCommandLine(command_line); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitch( 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center::switches::kEnableRichNotifications); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AcceptNotification(size_t index) OVERRIDE { 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center::MessageCenter* message_center = 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center::MessageCenter::Get(); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_GT(message_center->NotificationCount(), index); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center::NotificationList::Notifications::reverse_iterator it = 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center->notification_list()->GetNotifications().rbegin(); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i=0; i < index; ++i) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it++; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string id = (*it)->id(); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center->OnClicked(id); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WaitForExtensionLoad(); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CancelNotification(size_t index) OVERRIDE { 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center::MessageCenter* message_center = 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center::MessageCenter::Get(); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_GT(message_center->NotificationCount(), index); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center::NotificationList::Notifications::reverse_iterator it = 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center->notification_list()->GetNotifications().rbegin(); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i=0; i < index; i++) { it++; } 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE( 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_browser_process->notification_ui_manager()->CancelById((*it)->id())); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual size_t CountBalloons() OVERRIDE { 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center::MessageCenter* message_center = 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center::MessageCenter::Get(); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return message_center->NotificationCount(); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef MessageCenterExtensionCrashRecoveryTest 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MAYBE_ExtensionCrashRecoveryTest; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else // defined(ENABLED_MESSAGE_CENTER) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BalloonExtensionCrashRecoveryTest 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public ExtensionCrashRecoveryTestBase { 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AcceptNotification(size_t index) OVERRIDE { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Balloon* balloon = GetNotificationDelegate(index); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(balloon); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) balloon->OnClick(); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WaitForExtensionLoad(); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CancelNotification(size_t index) OVERRIDE { 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Balloon* balloon = GetNotificationDelegate(index); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(balloon); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string id = balloon->notification().notification_id(); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(g_browser_process->notification_ui_manager()->CancelById(id)); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual size_t CountBalloons() OVERRIDE { 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BalloonNotificationUIManager* manager = 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BalloonNotificationUIManager::GetInstanceForTesting(); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BalloonCollection::Balloons balloons = 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager->balloon_collection()->GetActiveBalloons(); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return balloons.size(); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Balloon* GetNotificationDelegate(size_t index) { 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BalloonNotificationUIManager* manager = 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BalloonNotificationUIManager::GetInstanceForTesting(); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BalloonCollection::Balloons balloons = 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager->balloon_collection()->GetActiveBalloons(); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return index < balloons.size() ? balloons.at(index) : NULL; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef BalloonExtensionCrashRecoveryTest MAYBE_ExtensionCrashRecoveryTest; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(ENABLE_MESSAGE_CENTER) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, Basic) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t crash_size_before = 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size(); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(crash_size_before + 1, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size()); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("after clicking the balloon"); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(crash_size_before, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, CloseAndReload) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t crash_size_before = 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(crash_size_before + 1, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size()); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(CancelNotification(0)); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReloadExtension(first_extension_id_); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("after reloading"); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(crash_size_before, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size()); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, ReloadIndependently) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReloadExtension(first_extension_id_); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("after reloading"); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* current_tab = 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(current_tab); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The balloon should automatically hide after the extension is successfully 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reloaded. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, CountBalloons()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReloadIndependentlyChangeTabs) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* original_tab = 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(original_tab); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, CountBalloons()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a new tab, but the balloon will still be there. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NewTab(browser()); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* new_current_tab = 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(new_current_tab); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(new_current_tab, original_tab); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, CountBalloons()); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReloadExtension(first_extension_id_); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("after reloading"); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The balloon should automatically hide after the extension is successfully 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reloaded. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, CountBalloons()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISABLED_ReloadIndependentlyNavigatePage) { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* current_tab = 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(current_tab); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, CountBalloons()); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to another page. 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURL( 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser(), ui_test_utils::GetTestUrl( 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(base::FilePath::kCurrentDirectory), 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("title1.html")))); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, CountBalloons()); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReloadExtension(first_extension_id_); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("after reloading"); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The balloon should automatically hide after the extension is successfully 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reloaded. 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, CountBalloons()); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that when we don't do anything about the crashed extension 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and close the browser, it doesn't crash. The browser is closed implicitly 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at the end of each browser test. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84719 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ShutdownWhileCrashed DISABLED_ShutdownWhileCrashed 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ShutdownWhileCrashed ShutdownWhileCrashed 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_LINUX) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MAYBE_ShutdownWhileCrashed) { 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TwoExtensionsCrashFirst) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadSecondExtension(); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("after clicking the balloon"); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(second_extension_id_); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TwoExtensionsCrashSecond) { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadSecondExtension(); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(second_extension_id_); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("after clicking the balloon"); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(second_extension_id_); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TwoExtensionsCrashBothAtOnce) { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t crash_size_before = 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size(); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadSecondExtension(); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(crash_size_before + 1, 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(second_extension_id_); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(crash_size_before + 2, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size()); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("first balloon"); 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("second balloon"); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(second_extension_id_); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TwoExtensionsOneByOne) { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadSecondExtension(); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(second_extension_id_); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("first balloon"); 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("second balloon"); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(second_extension_id_); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84719 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TwoExtensionsShutdownWhileCrashed \ 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_TwoExtensionsShutdownWhileCrashed 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TwoExtensionsShutdownWhileCrashed \ 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TwoExtensionsShutdownWhileCrashed 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_LINUX) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that when we don't do anything about the crashed extensions 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and close the browser, it doesn't crash. The browser is closed implicitly 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at the end of each browser test. 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAYBE_TwoExtensionsShutdownWhileCrashed) { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadSecondExtension(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(second_extension_id_); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TwoExtensionsIgnoreFirst) { 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadSecondExtension(); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(second_extension_id_); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accept notification 1 before canceling notification 0. 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, on Linux and Windows, there is a race here, in which 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // canceled notifications do not immediately go away. 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(AcceptNotification(1)); 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(CancelNotification(0)); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("balloons done"); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(second_extension_id_); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TwoExtensionsReloadIndependently) { 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadSecondExtension(); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(second_extension_id_); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before, GetExtensionService()->extensions()->size()); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("first: reload"); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* current_tab = 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(current_tab); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // At the beginning we should have one balloon displayed for each extension. 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, CountBalloons()); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReloadExtension(first_extension_id_); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One of the balloons should hide after the extension is reloaded. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, CountBalloons()); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("second: balloon"); 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(AcceptNotification(0)); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(second_extension_id_); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, CrashAndUninstall) { 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t crash_size_before = 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size(); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadSecondExtension(); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(crash_size_before + 1, 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size()); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, CountBalloons()); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UninstallExtension(first_extension_id_); 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MessageLoop::current()->RunUntilIdle(); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("after uninstalling"); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(crash_size_before, 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size()); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, CountBalloons()); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84719 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_CrashAndUnloadAll DISABLED_CrashAndUnloadAll 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_CrashAndUnloadAll CrashAndUnloadAll 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_LINUX) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MAYBE_CrashAndUnloadAll) { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t crash_size_before = 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size(); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadSecondExtension(); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(crash_size_before + 1, 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size()); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->UnloadAllExtensions(); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(crash_size_before, 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size()); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled on aura as flakey: http://crbug.com/169622 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ReloadTabsWithBackgroundPage DISABLED_ReloadTabsWithBackgroundPage 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ReloadTabsWithBackgroundPage ReloadTabsWithBackgroundPage 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(OS_LINUX) 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when an extension with a background page that has a tab open 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// crashes, the tab stays open, and reloading it reloads the extension. 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Regression test for issue 71629. 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MAYBE_ReloadTabsWithBackgroundPage) { 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModel* tab_strip = browser()->tab_strip_model(); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size_before = GetExtensionService()->extensions()->size(); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t crash_size_before = 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size(); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadTestExtension(); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a tab extension. 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NewTab(browser()); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser(), 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("chrome-extension://" + first_extension_id_ + "/background.html")); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int tabs_before = tab_strip->count(); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashExtension(first_extension_id_); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tab should still be open, and extension should be crashed. 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tabs_before, tab_strip->count()); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size_before, GetExtensionService()->extensions()->size()); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(crash_size_before + 1, 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExtensionService()->terminated_extensions()->size()); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &browser()->tab_strip_model()->GetActiveWebContents()-> 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController())); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::Reload(browser(), CURRENT_TAB); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extension should now be loaded. 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE("after reloading the tab"); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckExtensionConsistency(first_extension_id_); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size()); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, CountBalloons()); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 591