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