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() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return browser()->profile()->GetExtensionService();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  extensions::ProcessManager* GetProcessManager() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extensions::ExtensionSystem::Get(browser()->profile())->
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        process_manager();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExtensionRegistry* GetExtensionRegistry() {
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return ExtensionRegistry::Get(browser()->profile());
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t GetEnabledExtensionCount() {
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return GetExtensionRegistry()->enabled_extensions().size();
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t GetTerminatedExtensionCount() {
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return GetExtensionRegistry()->terminated_extensions().size();
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void CrashExtension(const std::string& extension_id) {
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const Extension* extension = GetExtensionRegistry()->GetExtensionById(
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        extension_id, ExtensionRegistry::ENABLED);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extensions::ExtensionHost* extension_host = GetProcessManager()->
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetBackgroundHostForExtension(extension_id);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension_host);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::KillProcess(extension_host->render_process_host()->GetHandle(),
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      content::RESULT_CODE_KILLED, false);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(WaitForExtensionCrash(extension_id));
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_FALSE(GetProcessManager()->
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GetBackgroundHostForExtension(extension_id));
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Wait for extension crash balloon to appear.
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void CheckExtensionConsistency(const std::string& extension_id) {
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    const Extension* extension = GetExtensionRegistry()->GetExtensionById(
915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        extension_id, ExtensionRegistry::ENABLED);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extensions::ExtensionHost* extension_host = GetProcessManager()->
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetBackgroundHostForExtension(extension_id);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension_host);
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extensions::ProcessManager::ViewSet all_views =
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        GetProcessManager()->GetAllViews();
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extensions::ProcessManager::ViewSet::const_iterator it =
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        all_views.find(extension_host->host_contents()->GetRenderViewHost());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(it == all_views.end());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension_host->IsRenderViewLive());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::ProcessMap* process_map =
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        extensions::ProcessMap::Get(browser()->profile());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(process_map->Contains(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extension_id,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extension_host->render_view_host()->GetProcess()->GetID()));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadTestExtension() {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionBrowserTest::SetUpInProcessBrowserTestFixture();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension = LoadExtension(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_data_dir_.AppendASCII("common").AppendASCII("background_page"));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_extension_id_ = extension->id();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadSecondExtension() {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension = LoadExtension(
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_data_dir_.AppendASCII("install").AppendASCII("install"));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(extension);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    second_extension_id_ = extension->id();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(second_extension_id_);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string first_extension_id_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string second_extension_id_;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
130a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class MAYBE_ExtensionCrashRecoveryTest
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : 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();
139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    for (size_t i=0; i < index; ++i)
140a02191e04bc25c4935f804f2c080ae28663d096dBen 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();
152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    for (size_t i=0; i < index; i++) { it++; }
153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_TRUE(g_browser_process->notification_ui_manager()->
154a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        CancelById((*it)->id()));
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual size_t CountBalloons() OVERRIDE {
158a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return message_center::MessageCenter::Get()->NotificationCount();
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky: http://crbug.com/242167.
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest, DISABLED_Basic) {
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t crash_count_before = GetTerminatedExtensionCount();
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before + 1, GetTerminatedExtensionCount());
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after clicking the balloon");
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before, GetTerminatedExtensionCount());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky, http://crbug.com/241191.
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_CloseAndReload) {
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t crash_count_before = GetTerminatedExtensionCount();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before + 1, GetTerminatedExtensionCount());
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CancelNotification(0));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(first_extension_id_);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after reloading");
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before, GetTerminatedExtensionCount());
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Test is timing out on Windows http://crbug.com/174705.
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_WIN)
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAYBE_ReloadIndependently DISABLED_ReloadIndependently
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAYBE_ReloadIndependently ReloadIndependently
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // defined(OS_WIN)
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       MAYBE_ReloadIndependently) {
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(first_extension_id_);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after reloading");
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* current_tab =
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(current_tab);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The balloon should automatically hide after the extension is successfully
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reloaded.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, CountBalloons());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Test is timing out on Windows http://crbug.com/174705.
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN)
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_ReloadIndependentlyChangeTabs DISABLED_ReloadIndependentlyChangeTabs
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_ReloadIndependentlyChangeTabs ReloadIndependentlyChangeTabs
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // defined(OS_WIN)
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       MAYBE_ReloadIndependentlyChangeTabs) {
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* original_tab =
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(original_tab);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a new tab, but the balloon will still be there.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NewTab(browser());
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* new_current_tab =
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_current_tab);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(new_current_tab, original_tab);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(first_extension_id_);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after reloading");
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The balloon should automatically hide after the extension is successfully
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reloaded.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, CountBalloons());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       DISABLED_ReloadIndependentlyNavigatePage) {
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* current_tab =
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(current_tab);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to another page.
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(FILE_PATH_LITERAL("title1.html"))));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(first_extension_id_);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after reloading");
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The balloon should automatically hide after the extension is successfully
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reloaded.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, CountBalloons());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that when we don't do anything about the crashed extension
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and close the browser, it doesn't crash. The browser is closed implicitly
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at the end of each browser test.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84719
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ShutdownWhileCrashed DISABLED_ShutdownWhileCrashed
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ShutdownWhileCrashed ShutdownWhileCrashed
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_LINUX)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_ShutdownWhileCrashed) {
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky, http://crbug.com/241245.
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_TwoExtensionsCrashFirst) {
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after clicking the balloon");
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(second_extension_id_);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky: http://crbug.com/242196
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_TwoExtensionsCrashSecond) {
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after clicking the balloon");
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(second_extension_id_);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TwoExtensionsCrashBothAtOnce) {
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t crash_count_before = GetTerminatedExtensionCount();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before + 1, GetTerminatedExtensionCount());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before + 2, GetTerminatedExtensionCount());
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("first balloon");
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("second balloon");
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(second_extension_id_);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       TwoExtensionsOneByOne) {
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("first balloon");
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("second balloon");
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(second_extension_id_);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84719
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TwoExtensionsShutdownWhileCrashed \
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_TwoExtensionsShutdownWhileCrashed
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TwoExtensionsShutdownWhileCrashed \
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TwoExtensionsShutdownWhileCrashed
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_LINUX)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that when we don't do anything about the crashed extensions
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and close the browser, it doesn't crash. The browser is closed implicitly
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at the end of each browser test.
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MAYBE_TwoExtensionsShutdownWhileCrashed) {
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky, http://crbug.com/241573.
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_TwoExtensionsIgnoreFirst) {
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accept notification 1 before canceling notification 0.
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, on Linux and Windows, there is a race here, in which
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // canceled notifications do not immediately go away.
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(AcceptNotification(1));
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(CancelNotification(0));
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("balloons done");
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(second_extension_id_);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Flaky, http://crbug.com/241164.
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
43690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       DISABLED_TwoExtensionsReloadIndependently) {
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(second_extension_id_);
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before, GetEnabledExtensionCount());
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("first: reload");
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* current_tab =
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->tab_strip_model()->GetActiveWebContents();
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(current_tab);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // At the beginning we should have one balloon displayed for each extension.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2U, CountBalloons());
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReloadExtension(first_extension_id_);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // One of the balloons should hide after the extension is reloaded.
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1U, CountBalloons());
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("second: balloon");
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AcceptNotification(0));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(first_extension_id_);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckExtensionConsistency(second_extension_id_);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// http://crbug.com/243648
46790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_WIN)
46890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_CrashAndUninstall DISABLED_CrashAndUninstall
46990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#else
47090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define MAYBE_CrashAndUninstall CrashAndUninstall
47190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
47290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
47390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       MAYBE_CrashAndUninstall) {
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t crash_count_before = GetTerminatedExtensionCount();
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before + 1, GetTerminatedExtensionCount());
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, CountBalloons());
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UninstallExtension(first_extension_id_);
48490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after uninstalling");
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before, GetTerminatedExtensionCount());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, CountBalloons());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/84719
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_CrashAndUnloadAll DISABLED_CrashAndUnloadAll
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_CrashAndUnloadAll CrashAndUnloadAll
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_LINUX)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_CrashAndUnloadAll) {
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t crash_count_before = GetTerminatedExtensionCount();
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadSecondExtension();
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before + 1, GetTerminatedExtensionCount());
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetExtensionService()->UnloadAllExtensionsForTest();
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(crash_count_before, GetTerminatedExtensionCount());
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Fails a DCHECK on Aura and Linux: http://crbug.com/169622
51490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Failing on Windows: http://crbug.com/232340
515a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(USE_AURA)
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ReloadTabsWithBackgroundPage DISABLED_ReloadTabsWithBackgroundPage
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ReloadTabsWithBackgroundPage ReloadTabsWithBackgroundPage
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when an extension with a background page that has a tab open
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// crashes, the tab stays open, and reloading it reloads the extension.
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Regression test for issue 71629.
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MAYBE_ExtensionCrashRecoveryTest,
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_ReloadTabsWithBackgroundPage) {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabStripModel* tab_strip = browser()->tab_strip_model();
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t count_before = GetEnabledExtensionCount();
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const size_t crash_count_before = GetTerminatedExtensionCount();
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadTestExtension();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a tab extension.
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NewTab(browser());
53346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
53446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                               GURL(std::string(extensions::kExtensionScheme) +
53546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                   url::kStandardSchemeSeparator +
53646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                   first_extension_id_ + "/background.html"));
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int tabs_before = tab_strip->count();
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrashExtension(first_extension_id_);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tab should still be open, and extension should be crashed.
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(tabs_before, tab_strip->count());
5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(count_before, GetEnabledExtensionCount());
5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(crash_count_before + 1, GetTerminatedExtensionCount());
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<NavigationController>(
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &browser()->tab_strip_model()->GetActiveWebContents()->
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetController()));
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::Reload(browser(), CURRENT_TAB);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension should now be loaded.
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE("after reloading the tab");
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckExtensionConsistency(first_extension_id_);
5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(count_before + 1, GetEnabledExtensionCount());
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, CountBalloons());
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
561