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 "chrome/browser/browser_process.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_host.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_process_manager.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/balloon.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/balloon_collection.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/balloon_host.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/notifications/balloon_notification_ui_manager.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification_delegate.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/result_codes.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/message_center/message_center.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/message_center/message_center_switches.h"
29a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "ui/message_center/message_center_util.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/message_center/notification_list.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests are timing out waiting for extension to crash.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/174705
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_LINUX)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ExtensionCrashRecoveryTest DISABLED_ExtensionCrashRecoveryTest
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ExtensionCrashRecoveryTest ExtensionCrashRecoveryTest
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // defined(OS_MACOSX) || defined(USE_AURA) || defined(OS_LINUX)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionCrashRecoveryTestBase : public ExtensionBrowserTest {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AcceptNotification(size_t index) = 0;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CancelNotification(size_t index) = 0;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual size_t CountBalloons() = 0;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionService* GetExtensionService() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return browser()->profile()->GetExtensionService();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionProcessManager* GetExtensionProcessManager() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extensions::ExtensionSystem::Get(browser()->profile())->
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        process_manager();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CrashExtension(std::string extension_id) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension =
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetExtensionService()->GetExtensionById(extension_id, false);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::ExtensionHost* extension_host = GetExtensionProcessManager()->
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetBackgroundHostForExtension(extension_id);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension_host);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::KillProcess(extension_host->render_process_host()->GetHandle(),
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      content::RESULT_CODE_KILLED, false);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(WaitForExtensionCrash(extension_id));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(GetExtensionProcessManager()->
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GetBackgroundHostForExtension(extension_id));
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Wait for extension crash balloon to appear.
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckExtensionConsistency(std::string extension_id) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension =
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetExtensionService()->extensions()->GetByID(extension_id);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::ExtensionHost* extension_host = GetExtensionProcessManager()->
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetBackgroundHostForExtension(extension_id);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension_host);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionProcessManager::ViewSet all_views =
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetExtensionProcessManager()->GetAllViews();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionProcessManager::ViewSet::const_iterator it =
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        all_views.find(extension_host->host_contents()->GetRenderViewHost());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(it == all_views.end());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension_host->IsRenderViewLive());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::ProcessMap* process_map =
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser()->profile()->GetExtensionService()->process_map();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(process_map->Contains(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extension_id,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extension_host->render_view_host()->GetProcess()->GetID()));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadTestExtension() {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionBrowserTest::SetUpInProcessBrowserTestFixture();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension = LoadExtension(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_data_dir_.AppendASCII("common").AppendASCII("background_page"));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_extension_id_ = extension->id();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadSecondExtension() {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension = LoadExtension(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_data_dir_.AppendASCII("install").AppendASCII("install"));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_extension_id_ = extension->id();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(second_extension_id_);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string first_extension_id_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string second_extension_id_;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class MAYBE_ExtensionCrashRecoveryTest
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public ExtensionCrashRecoveryTestBase {
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AcceptNotification(size_t index) OVERRIDE {
122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (message_center::IsRichNotificationEnabled()) {
123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      message_center::MessageCenter* message_center =
124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)          message_center::MessageCenter::Get();
125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      ASSERT_GT(message_center->NotificationCount(), index);
126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      message_center::NotificationList::Notifications::reverse_iterator it =
127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)          message_center->GetNotifications().rbegin();
128a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      for (size_t i=0; i < index; ++i)
129a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        it++;
130a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      std::string id = (*it)->id();
131a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      message_center->ClickOnNotification(id);
132a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    } else {
133a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Balloon* balloon = GetNotificationDelegate(index);
134a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      ASSERT_TRUE(balloon);
135a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      balloon->OnClick();
136a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WaitForExtensionLoad();
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CancelNotification(size_t index) OVERRIDE {
141a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (message_center::IsRichNotificationEnabled()) {
142a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      message_center::MessageCenter* message_center =
143a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)          message_center::MessageCenter::Get();
144a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      ASSERT_GT(message_center->NotificationCount(), index);
145a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      message_center::NotificationList::Notifications::reverse_iterator it =
146a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)          message_center->GetNotifications().rbegin();
147a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      for (size_t i=0; i < index; i++) { it++; }
148a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      ASSERT_TRUE(g_browser_process->notification_ui_manager()->
149a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)          CancelById((*it)->id()));
150a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    } else {
151a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Balloon* balloon = GetNotificationDelegate(index);
152a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      ASSERT_TRUE(balloon);
153a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      std::string id = balloon->notification().notification_id();
154a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      ASSERT_TRUE(g_browser_process->notification_ui_manager()->CancelById(id));
155a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual size_t CountBalloons() OVERRIDE {
159a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (message_center::IsRichNotificationEnabled())
160a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return message_center::MessageCenter::Get()->NotificationCount();
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return BalloonNotificationUIManager::GetInstanceForTesting()->
163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        balloon_collection()->GetActiveBalloons().size();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
166a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)private:
167a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)     Balloon* GetNotificationDelegate(size_t index) {
168a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       BalloonNotificationUIManager* manager =
169a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)           BalloonNotificationUIManager::GetInstanceForTesting();
170a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       BalloonCollection::Balloons balloons =
171a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)           manager->balloon_collection()->GetActiveBalloons();
172a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       return index < balloons.size() ? balloons.at(index) : NULL;
173a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)     }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky: http://crbug.com/242167.
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, DISABLED_Basic) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t crash_size_before =
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetExtensionService()->terminated_extensions()->size();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(crash_size_before + 1,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetExtensionService()->terminated_extensions()->size());
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after clicking the balloon");
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(crash_size_before,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetExtensionService()->terminated_extensions()->size());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky, http://crbug.com/241191.
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_CloseAndReload) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t crash_size_before =
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetExtensionService()->terminated_extensions()->size();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(crash_size_before + 1,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetExtensionService()->terminated_extensions()->size());
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CancelNotification(0));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(first_extension_id_);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after reloading");
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(crash_size_before,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetExtensionService()->terminated_extensions()->size());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Test is timing out on Windows http://crbug.com/174705.
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_WIN)
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAYBE_ReloadIndependently DISABLED_ReloadIndependently
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAYBE_ReloadIndependently ReloadIndependently
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // defined(OS_WIN)
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       MAYBE_ReloadIndependently) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(first_extension_id_);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after reloading");
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* current_tab =
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(current_tab);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The balloon should automatically hide after the extension is successfully
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reloaded.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, CountBalloons());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Test is timing out on Windows http://crbug.com/174705.
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN)
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_ReloadIndependentlyChangeTabs DISABLED_ReloadIndependentlyChangeTabs
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_ReloadIndependentlyChangeTabs ReloadIndependentlyChangeTabs
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // defined(OS_WIN)
24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       MAYBE_ReloadIndependentlyChangeTabs) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* original_tab =
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(original_tab);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a new tab, but the balloon will still be there.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NewTab(browser());
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* new_current_tab =
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_current_tab);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(new_current_tab, original_tab);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(first_extension_id_);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after reloading");
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The balloon should automatically hide after the extension is successfully
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reloaded.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, CountBalloons());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       DISABLED_ReloadIndependentlyNavigatePage) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* current_tab =
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(current_tab);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to another page.
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(FILE_PATH_LITERAL("title1.html"))));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(first_extension_id_);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after reloading");
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The balloon should automatically hide after the extension is successfully
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reloaded.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, CountBalloons());
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that when we don't do anything about the crashed extension
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and close the browser, it doesn't crash. The browser is closed implicitly
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at the end of each browser test.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84719
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ShutdownWhileCrashed DISABLED_ShutdownWhileCrashed
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ShutdownWhileCrashed ShutdownWhileCrashed
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_LINUX)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_ShutdownWhileCrashed) {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky, http://crbug.com/241245.
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_TwoExtensionsCrashFirst) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after clicking the balloon");
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(second_extension_id_);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky: http://crbug.com/242196
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_TwoExtensionsCrashSecond) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after clicking the balloon");
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(second_extension_id_);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TwoExtensionsCrashBothAtOnce) {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t crash_size_before =
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetExtensionService()->terminated_extensions()->size();
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(crash_size_before + 1,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetExtensionService()->terminated_extensions()->size());
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(crash_size_before + 2,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetExtensionService()->terminated_extensions()->size());
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("first balloon");
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("second balloon");
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(second_extension_id_);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       TwoExtensionsOneByOne) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("first balloon");
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("second balloon");
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(second_extension_id_);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84719
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TwoExtensionsShutdownWhileCrashed \
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_TwoExtensionsShutdownWhileCrashed
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TwoExtensionsShutdownWhileCrashed \
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TwoExtensionsShutdownWhileCrashed
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_LINUX)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that when we don't do anything about the crashed extensions
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and close the browser, it doesn't crash. The browser is closed implicitly
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at the end of each browser test.
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MAYBE_TwoExtensionsShutdownWhileCrashed) {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky, http://crbug.com/241573.
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
43790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_TwoExtensionsIgnoreFirst) {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accept notification 1 before canceling notification 0.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, on Linux and Windows, there is a race here, in which
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // canceled notifications do not immediately go away.
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AcceptNotification(1));
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CancelNotification(0));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("balloons done");
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(second_extension_id_);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky, http://crbug.com/241164.
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
45990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_TwoExtensionsReloadIndependently) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("first: reload");
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* current_tab =
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(current_tab);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // At the beginning we should have one balloon displayed for each extension.
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2U, CountBalloons());
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReloadExtension(first_extension_id_);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // One of the balloons should hide after the extension is reloaded.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1U, CountBalloons());
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("second: balloon");
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(second_extension_id_);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// http://crbug.com/243648
49090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN)
49190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_CrashAndUninstall DISABLED_CrashAndUninstall
49290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else
49390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_CrashAndUninstall CrashAndUninstall
49490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
49590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
49690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       MAYBE_CrashAndUninstall) {
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t crash_size_before =
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetExtensionService()->terminated_extensions()->size();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(crash_size_before + 1,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetExtensionService()->terminated_extensions()->size());
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(first_extension_id_);
50990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after uninstalling");
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(crash_size_before,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetExtensionService()->terminated_extensions()->size());
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, CountBalloons());
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84719
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_CrashAndUnloadAll DISABLED_CrashAndUnloadAll
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_CrashAndUnloadAll CrashAndUnloadAll
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_LINUX)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_CrashAndUnloadAll) {
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t size_before = GetExtensionService()->extensions()->size();
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t crash_size_before =
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetExtensionService()->terminated_extensions()->size();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(crash_size_before + 1,
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetExtensionService()->terminated_extensions()->size());
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetExtensionService()->UnloadAllExtensions();
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(crash_size_before,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetExtensionService()->terminated_extensions()->size());
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Fails a DCHECK on Aura and Linux: http://crbug.com/169622
54390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Failing on Windows: http://crbug.com/232340
54490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(USE_AURA) || defined(OS_WIN) || defined(OS_LINUX)
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ReloadTabsWithBackgroundPage DISABLED_ReloadTabsWithBackgroundPage
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ReloadTabsWithBackgroundPage ReloadTabsWithBackgroundPage
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
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