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_service.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification_delegate.h"
10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/notifications/notification_ui_manager.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/result_codes.h"
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/common/url_constants.h"
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "extensions/browser/extension_host.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_registry.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/process_manager.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/process_map.h"
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/constants.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/message_center/message_center.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/message_center/notification_list.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using extensions::ExtensionRegistry;
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() {
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return extensions::ExtensionSystem::Get(browser()->profile())->
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        extension_service();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  extensions::ProcessManager* GetProcessManager() {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extensions::ExtensionSystem::Get(browser()->profile())->
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        process_manager();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExtensionRegistry* GetExtensionRegistry() {
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return ExtensionRegistry::Get(browser()->profile());
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t GetEnabledExtensionCount() {
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return GetExtensionRegistry()->enabled_extensions().size();
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t GetTerminatedExtensionCount() {
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return GetExtensionRegistry()->terminated_extensions().size();
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void CrashExtension(const std::string& extension_id) {
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const Extension* extension = GetExtensionRegistry()->GetExtensionById(
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        extension_id, ExtensionRegistry::ENABLED);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extensions::ExtensionHost* extension_host = GetProcessManager()->
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetBackgroundHostForExtension(extension_id);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension_host);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::KillProcess(extension_host->render_process_host()->GetHandle(),
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      content::RESULT_CODE_KILLED, false);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(WaitForExtensionCrash(extension_id));
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_FALSE(GetProcessManager()->
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GetBackgroundHostForExtension(extension_id));
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Wait for extension crash balloon to appear.
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void CheckExtensionConsistency(const std::string& extension_id) {
915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const Extension* extension = GetExtensionRegistry()->GetExtensionById(
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        extension_id, ExtensionRegistry::ENABLED);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extensions::ExtensionHost* extension_host = GetProcessManager()->
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetBackgroundHostForExtension(extension_id);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension_host);
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extensions::ProcessManager::ViewSet all_views =
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        GetProcessManager()->GetAllViews();
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extensions::ProcessManager::ViewSet::const_iterator it =
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        all_views.find(extension_host->host_contents()->GetRenderViewHost());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(it == all_views.end());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension_host->IsRenderViewLive());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::ProcessMap* process_map =
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        extensions::ProcessMap::Get(browser()->profile());
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(process_map->Contains(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extension_id,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extension_host->render_view_host()->GetProcess()->GetID()));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadTestExtension() {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionBrowserTest::SetUpInProcessBrowserTestFixture();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension = LoadExtension(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_data_dir_.AppendASCII("common").AppendASCII("background_page"));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_extension_id_ = extension->id();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadSecondExtension() {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension = LoadExtension(
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_data_dir_.AppendASCII("install").AppendASCII("install"));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_extension_id_ = extension->id();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(second_extension_id_);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string first_extension_id_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string second_extension_id_;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass MAYBE_ExtensionCrashRecoveryTest : public ExtensionCrashRecoveryTestBase {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AcceptNotification(size_t index) OVERRIDE {
134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    message_center::MessageCenter* message_center =
135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        message_center::MessageCenter::Get();
136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_GT(message_center->NotificationCount(), index);
137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    message_center::NotificationList::Notifications::reverse_iterator it =
138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        message_center->GetVisibleNotifications().rbegin();
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    for (size_t i = 0; i < index; ++i)
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ++it;
141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    std::string id = (*it)->id();
142a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    message_center->ClickOnNotification(id);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WaitForExtensionLoad();
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CancelNotification(size_t index) OVERRIDE {
147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    message_center::MessageCenter* message_center =
148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        message_center::MessageCenter::Get();
149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_GT(message_center->NotificationCount(), index);
150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    message_center::NotificationList::Notifications::reverse_iterator it =
151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        message_center->GetVisibleNotifications().rbegin();
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    for (size_t i = 0; i < index; ++i)
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ++it;
154a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_TRUE(g_browser_process->notification_ui_manager()->
155a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        CancelById((*it)->id()));
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual size_t CountBalloons() OVERRIDE {
159a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return message_center::MessageCenter::Get()->NotificationCount();
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky: http://crbug.com/242167.
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, DISABLED_Basic) {
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t crash_count_before = GetTerminatedExtensionCount();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before + 1, GetTerminatedExtensionCount());
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after clicking the balloon");
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before, GetTerminatedExtensionCount());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky, http://crbug.com/241191.
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_CloseAndReload) {
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t crash_count_before = GetTerminatedExtensionCount();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before + 1, GetTerminatedExtensionCount());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CancelNotification(0));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(first_extension_id_);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after reloading");
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before, GetTerminatedExtensionCount());
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Test is timing out on Windows http://crbug.com/174705.
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_WIN)
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAYBE_ReloadIndependently DISABLED_ReloadIndependently
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAYBE_ReloadIndependently ReloadIndependently
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // defined(OS_WIN)
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       MAYBE_ReloadIndependently) {
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(first_extension_id_);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after reloading");
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* current_tab =
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(current_tab);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The balloon should automatically hide after the extension is successfully
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reloaded.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, CountBalloons());
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Test is timing out on Windows http://crbug.com/174705.
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN)
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_ReloadIndependentlyChangeTabs DISABLED_ReloadIndependentlyChangeTabs
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_ReloadIndependentlyChangeTabs ReloadIndependentlyChangeTabs
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // defined(OS_WIN)
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       MAYBE_ReloadIndependentlyChangeTabs) {
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* original_tab =
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(original_tab);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a new tab, but the balloon will still be there.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NewTab(browser());
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* new_current_tab =
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_current_tab);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(new_current_tab, original_tab);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(first_extension_id_);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after reloading");
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The balloon should automatically hide after the extension is successfully
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reloaded.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, CountBalloons());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       DISABLED_ReloadIndependentlyNavigatePage) {
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* current_tab =
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(current_tab);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to another page.
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(FILE_PATH_LITERAL("title1.html"))));
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(first_extension_id_);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after reloading");
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The balloon should automatically hide after the extension is successfully
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reloaded.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, CountBalloons());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that when we don't do anything about the crashed extension
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and close the browser, it doesn't crash. The browser is closed implicitly
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at the end of each browser test.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84719
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ShutdownWhileCrashed DISABLED_ShutdownWhileCrashed
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ShutdownWhileCrashed ShutdownWhileCrashed
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_LINUX)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_ShutdownWhileCrashed) {
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky, http://crbug.com/241245.
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_TwoExtensionsCrashFirst) {
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after clicking the balloon");
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(second_extension_id_);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky: http://crbug.com/242196
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_TwoExtensionsCrashSecond) {
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after clicking the balloon");
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(second_extension_id_);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TwoExtensionsCrashBothAtOnce) {
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t crash_count_before = GetTerminatedExtensionCount();
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before + 1, GetTerminatedExtensionCount());
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before + 2, GetTerminatedExtensionCount());
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("first balloon");
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("second balloon");
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(second_extension_id_);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       TwoExtensionsOneByOne) {
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("first balloon");
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("second balloon");
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(second_extension_id_);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84719
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TwoExtensionsShutdownWhileCrashed \
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_TwoExtensionsShutdownWhileCrashed
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TwoExtensionsShutdownWhileCrashed \
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TwoExtensionsShutdownWhileCrashed
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_LINUX)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that when we don't do anything about the crashed extensions
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and close the browser, it doesn't crash. The browser is closed implicitly
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at the end of each browser test.
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MAYBE_TwoExtensionsShutdownWhileCrashed) {
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky, http://crbug.com/241573.
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_TwoExtensionsIgnoreFirst) {
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accept notification 1 before canceling notification 0.
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, on Linux and Windows, there is a race here, in which
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // canceled notifications do not immediately go away.
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AcceptNotification(1));
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CancelNotification(0));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("balloons done");
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(second_extension_id_);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky, http://crbug.com/241164.
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
43790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_TwoExtensionsReloadIndependently) {
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("first: reload");
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* current_tab =
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(current_tab);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // At the beginning we should have one balloon displayed for each extension.
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2U, CountBalloons());
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReloadExtension(first_extension_id_);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // One of the balloons should hide after the extension is reloaded.
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1U, CountBalloons());
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("second: balloon");
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(second_extension_id_);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// http://crbug.com/243648
46890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN)
46990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_CrashAndUninstall DISABLED_CrashAndUninstall
47090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else
47190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_CrashAndUninstall CrashAndUninstall
47290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
47390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
47490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       MAYBE_CrashAndUninstall) {
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t crash_count_before = GetTerminatedExtensionCount();
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before + 1, GetTerminatedExtensionCount());
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(first_extension_id_);
48590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after uninstalling");
4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before, GetTerminatedExtensionCount());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, CountBalloons());
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84719
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_CrashAndUnloadAll DISABLED_CrashAndUnloadAll
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_CrashAndUnloadAll CrashAndUnloadAll
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_LINUX)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_CrashAndUnloadAll) {
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t crash_count_before = GetTerminatedExtensionCount();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before + 1, GetTerminatedExtensionCount());
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetExtensionService()->UnloadAllExtensionsForTest();
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before, GetTerminatedExtensionCount());
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Fails a DCHECK on Aura and Linux: http://crbug.com/169622
51590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Failing on Windows: http://crbug.com/232340
516a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA)
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ReloadTabsWithBackgroundPage DISABLED_ReloadTabsWithBackgroundPage
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ReloadTabsWithBackgroundPage ReloadTabsWithBackgroundPage
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when an extension with a background page that has a tab open
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// crashes, the tab stays open, and reloading it reloads the extension.
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Regression test for issue 71629.
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_ReloadTabsWithBackgroundPage) {
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabStripModel* tab_strip = browser()->tab_strip_model();
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t crash_count_before = GetTerminatedExtensionCount();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a tab extension.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NewTab(browser());
53446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
53546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                               GURL(std::string(extensions::kExtensionScheme) +
53646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                   url::kStandardSchemeSeparator +
53746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                   first_extension_id_ + "/background.html"));
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int tabs_before = tab_strip->count();
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tab should still be open, and extension should be crashed.
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(tabs_before, tab_strip->count());
5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(count_before, GetEnabledExtensionCount());
5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(crash_count_before + 1, GetTerminatedExtensionCount());
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &browser()->tab_strip_model()->GetActiveWebContents()->
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetController()));
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::Reload(browser(), CURRENT_TAB);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension should now be loaded.
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after reloading the tab");
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, CountBalloons());
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
562