172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/process_util.h"
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/browser_process.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_browsertest.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_host.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_process_manager.h"
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/notifications/balloon_host.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/notifications/notification.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/notifications/notification_delegate.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/notifications/notification_ui_manager.h"
1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/tabs/tab_strip_model.h"
174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h"
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_process_host.h"
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/result_codes.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionCrashRecoveryTest : public ExtensionBrowserTest {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ExtensionService* GetExtensionService() {
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return browser()->profile()->GetExtensionService();
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionProcessManager* GetExtensionProcessManager() {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return browser()->profile()->GetExtensionProcessManager();
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Balloon* GetNotificationDelegate(size_t index) {
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotificationUIManager* manager =
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        g_browser_process->notification_ui_manager();
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    BalloonCollection::Balloons balloons =
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        manager->balloon_collection()->GetActiveBalloons();
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return balloons.at(index);
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void AcceptNotification(size_t index) {
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Balloon* balloon = GetNotificationDelegate(index);
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(balloon);
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    balloon->OnClick();
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WaitForExtensionLoad();
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void CancelNotification(size_t index) {
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Balloon* balloon = GetNotificationDelegate(index);
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotificationUIManager* manager =
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        g_browser_process->notification_ui_manager();
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    manager->CancelById(balloon->notification().notification_id());
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  size_t CountBalloons() {
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotificationUIManager* manager =
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        g_browser_process->notification_ui_manager();
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    BalloonCollection::Balloons balloons =
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        manager->balloon_collection()->GetActiveBalloons();
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return balloons.size();
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CrashExtension(size_t index) {
6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    ASSERT_LT(index, GetExtensionService()->extensions()->size());
66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const Extension* extension =
6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        GetExtensionService()->extensions()->at(index);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(extension);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string extension_id(extension->id());
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ExtensionHost* extension_host =
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        GetExtensionProcessManager()->GetBackgroundHostForExtension(extension);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(extension_host);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RenderProcessHost* extension_rph =
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        extension_host->render_view_host()->process();
7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    base::KillProcess(extension_rph->GetHandle(), ResultCodes::KILLED, false);
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(WaitForExtensionCrash(extension_id));
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_FALSE(
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        GetExtensionProcessManager()->GetBackgroundHostForExtension(extension));
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CheckExtensionConsistency(size_t index) {
8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    ASSERT_LT(index, GetExtensionService()->extensions()->size());
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const Extension* extension =
8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        GetExtensionService()->extensions()->at(index);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(extension);
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ExtensionHost* extension_host =
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        GetExtensionProcessManager()->GetBackgroundHostForExtension(extension);
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(extension_host);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(GetExtensionProcessManager()->HasExtensionHost(extension_host));
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(extension_host->IsRenderViewLive());
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(extension_host->render_view_host()->process(),
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        GetExtensionProcessManager()->GetExtensionProcess(extension->id()));
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void LoadTestExtension() {
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ExtensionBrowserTest::SetUpInProcessBrowserTestFixture();
9821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const size_t size_before = GetExtensionService()->extensions()->size();
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(LoadExtension(
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        test_data_dir_.AppendASCII("common").AppendASCII("background_page")));
10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const Extension* extension = GetExtensionService()->extensions()->back();
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(extension);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    first_extension_id_ = extension->id();
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CheckExtensionConsistency(size_before);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void LoadSecondExtension() {
10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    int offset = GetExtensionService()->extensions()->size();
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(LoadExtension(
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        test_data_dir_.AppendASCII("install").AppendASCII("install")));
111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const Extension* extension =
11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        GetExtensionService()->extensions()->at(offset);
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(extension);
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    second_extension_id_ = extension->id();
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CheckExtensionConsistency(offset);
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string first_extension_id_;
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string second_extension_id_;
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, Basic) {
12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const size_t crash_size_before =
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      GetExtensionService()->terminated_extensions()->size();
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadTestExtension();
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(crash_size_before + 1,
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            GetExtensionService()->terminated_extensions()->size());
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AcceptNotification(0);
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SCOPED_TRACE("after clicking the balloon");
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckExtensionConsistency(size_before);
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(crash_size_before,
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            GetExtensionService()->terminated_extensions()->size());
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, CloseAndReload) {
14021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const size_t crash_size_before =
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      GetExtensionService()->terminated_extensions()->size();
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadTestExtension();
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
14621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(crash_size_before + 1,
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            GetExtensionService()->terminated_extensions()->size());
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CancelNotification(0);
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ReloadExtension(first_extension_id_);
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SCOPED_TRACE("after reloading");
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckExtensionConsistency(size_before);
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(crash_size_before,
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            GetExtensionService()->terminated_extensions()->size());
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, ReloadIndependently) {
16021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadTestExtension();
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
16321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ReloadExtension(first_extension_id_);
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SCOPED_TRACE("after reloading");
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckExtensionConsistency(size_before);
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* current_tab = browser()->GetSelectedTabContents();
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(current_tab);
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The balloon should automatically hide after the extension is successfully
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // reloaded.
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(0U, CountBalloons());
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest,
17921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                       ReloadIndependentlyChangeTabs) {
18021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
18121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  LoadTestExtension();
18221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CrashExtension(size_before);
18321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  TabContents* original_tab = browser()->GetSelectedTabContents();
18621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(original_tab);
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(1U, CountBalloons());
18821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Open a new tab, but the balloon will still be there.
19021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  browser()->NewTab();
19121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  TabContents* new_current_tab = browser()->GetSelectedTabContents();
19221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(new_current_tab);
19321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_NE(new_current_tab, original_tab);
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(1U, CountBalloons());
19521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
19621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ReloadExtension(first_extension_id_);
19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
19821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  SCOPED_TRACE("after reloading");
19921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CheckExtensionConsistency(size_before);
20021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The balloon should automatically hide after the extension is successfully
20221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // reloaded.
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(0U, CountBalloons());
20421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
20521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
20621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest,
20721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                       ReloadIndependentlyNavigatePage) {
20821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
20921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  LoadTestExtension();
21021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CrashExtension(size_before);
21121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
21221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
21321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  TabContents* current_tab = browser()->GetSelectedTabContents();
21421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(current_tab);
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(1U, CountBalloons());
21621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
21721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Navigate to another page.
21821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ui_test_utils::NavigateToURL(browser(),
21921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
22021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                FilePath(FILE_PATH_LITERAL("title1.html"))));
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(1U, CountBalloons());
22221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
22321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ReloadExtension(first_extension_id_);
22421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
22521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  SCOPED_TRACE("after reloading");
22621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CheckExtensionConsistency(size_before);
22721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
22821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // The infobar should automatically hide after the extension is successfully
22921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // reloaded.
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(0U, CountBalloons());
23121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
23221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
23321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest,
23421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                       ReloadIndependentlyTwoInfoBars) {
23521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
23621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  LoadTestExtension();
23721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
23821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Open a new window so that there will be an info bar in each.
23921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  Browser* browser2 = CreateBrowser(browser()->profile());
24021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
24121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CrashExtension(size_before);
24221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
24321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
24421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  TabContents* current_tab = browser()->GetSelectedTabContents();
24521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(current_tab);
246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(1U, CountBalloons());
24721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
24821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  TabContents* current_tab2 = browser2->GetSelectedTabContents();
24921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(current_tab2);
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(1U, CountBalloons());
25121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
25221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ReloadExtension(first_extension_id_);
25321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
25421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  SCOPED_TRACE("after reloading");
25521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CheckExtensionConsistency(size_before);
25621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
25721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Both infobars should automatically hide after the extension is successfully
25821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // reloaded.
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(0U, CountBalloons());
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(0U, CountBalloons());
26121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
26221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
26321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest,
26421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                       ReloadIndependentlyTwoInfoBarsSameBrowser) {
26521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
26621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  LoadTestExtension();
26721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
26821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Open a new window so that there will be an info bar in each.
26921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  Browser* browser2 = CreateBrowser(browser()->profile());
27021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
27121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CrashExtension(size_before);
27221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
27321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
27421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  TabContents* current_tab = browser()->GetSelectedTabContents();
27521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(current_tab);
276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(1U, CountBalloons());
27721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
27821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  TabContents* current_tab2 = browser2->GetSelectedTabContents();
27921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(current_tab2);
280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(1U, CountBalloons());
28121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
28221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Move second window into first browser so there will be multiple tabs
28321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // with the info bar for the same extension in one browser.
28421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  TabContentsWrapper* contents =
28521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      browser2->tabstrip_model()->DetachTabContentsAt(0);
28621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  browser()->tabstrip_model()->AppendTabContents(contents, true);
28721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  current_tab2 = browser()->GetSelectedTabContents();
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(1U, CountBalloons());
28921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_NE(current_tab2, current_tab);
29021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
29121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ReloadExtension(first_extension_id_);
29221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
29321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  SCOPED_TRACE("after reloading");
29421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CheckExtensionConsistency(size_before);
29521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
29621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Both infobars should automatically hide after the extension is successfully
29721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // reloaded.
298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(0U, CountBalloons());
29921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  browser()->SelectPreviousTab();
30021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(current_tab, browser()->GetSelectedTabContents());
301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(0U, CountBalloons());
30221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
30321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Make sure that when we don't do anything about the crashed extension
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and close the browser, it doesn't crash. The browser is closed implicitly
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// at the end of each browser test.
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, ShutdownWhileCrashed) {
30821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadTestExtension();
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
31121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsCrashFirst) {
31521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadTestExtension();
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadSecondExtension();
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
31921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AcceptNotification(0);
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SCOPED_TRACE("after clicking the balloon");
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckExtensionConsistency(size_before);
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckExtensionConsistency(size_before + 1);
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsCrashSecond) {
32821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadTestExtension();
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadSecondExtension();
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before + 1);
33221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AcceptNotification(0);
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SCOPED_TRACE("after clicking the balloon");
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckExtensionConsistency(size_before);
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckExtensionConsistency(size_before + 1);
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest,
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       TwoExtensionsCrashBothAtOnce) {
34221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
34372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const size_t crash_size_before =
34472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      GetExtensionService()->terminated_extensions()->size();
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadTestExtension();
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadSecondExtension();
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
34821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
34972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(crash_size_before + 1,
35072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            GetExtensionService()->terminated_extensions()->size());
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
35221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
35372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(crash_size_before + 2,
35472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            GetExtensionService()->terminated_extensions()->size());
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SCOPED_TRACE("first balloon");
358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AcceptNotification(0);
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CheckExtensionConsistency(size_before);
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SCOPED_TRACE("second balloon");
364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AcceptNotification(0);
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CheckExtensionConsistency(size_before);
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CheckExtensionConsistency(size_before + 1);
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsOneByOne) {
37121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadTestExtension();
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
37421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadSecondExtension();
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
37721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SCOPED_TRACE("first balloon");
381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AcceptNotification(0);
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CheckExtensionConsistency(size_before);
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SCOPED_TRACE("second balloon");
387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AcceptNotification(0);
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CheckExtensionConsistency(size_before);
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CheckExtensionConsistency(size_before + 1);
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Make sure that when we don't do anything about the crashed extensions
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and close the browser, it doesn't crash. The browser is closed implicitly
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// at the end of each browser test.
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest,
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       TwoExtensionsShutdownWhileCrashed) {
39821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadTestExtension();
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
40121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadSecondExtension();
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
40421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, TwoExtensionsIgnoreFirst) {
40821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadTestExtension();
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadSecondExtension();
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
41221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
41421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CancelNotification(0);
417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Cancelling the balloon at 0 will close the balloon, and the balloon in
418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // index 1 will move into index 0.
419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AcceptNotification(0);
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SCOPED_TRACE("balloons done");
42221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CheckExtensionConsistency(size_before);
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest,
427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       TwoExtensionsReloadIndependently) {
42821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadTestExtension();
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoadSecondExtension();
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
43221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CrashExtension(size_before);
43421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(size_before, GetExtensionService()->extensions()->size());
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SCOPED_TRACE("first: reload");
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TabContents* current_tab = browser()->GetSelectedTabContents();
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(current_tab);
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // At the beginning we should have one infobar displayed for each extension.
441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_EQ(2U, CountBalloons());
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ReloadExtension(first_extension_id_);
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // One of the infobars should hide after the extension is reloaded.
444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_EQ(1U, CountBalloons());
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CheckExtensionConsistency(size_before);
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SCOPED_TRACE("second: balloon");
450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AcceptNotification(0);
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CheckExtensionConsistency(size_before);
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CheckExtensionConsistency(size_before + 1);
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
45572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
456dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, CrashAndUninstall) {
457dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
458dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const size_t crash_size_before =
459dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      GetExtensionService()->terminated_extensions()->size();
460dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  LoadTestExtension();
461dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  LoadSecondExtension();
462dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CrashExtension(size_before);
463dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
464dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ASSERT_EQ(crash_size_before + 1,
465dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            GetExtensionService()->terminated_extensions()->size());
466dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(1U, CountBalloons());
468dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  UninstallExtension(first_extension_id_);
469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MessageLoop::current()->RunAllPending();
470dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
471dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SCOPED_TRACE("after uninstalling");
472dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
473dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ASSERT_EQ(crash_size_before,
474dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            GetExtensionService()->terminated_extensions()->size());
475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(0U, CountBalloons());
476dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
477dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
47872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(ExtensionCrashRecoveryTest, CrashAndUnloadAll) {
47972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const size_t size_before = GetExtensionService()->extensions()->size();
48072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const size_t crash_size_before =
48172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      GetExtensionService()->terminated_extensions()->size();
48272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  LoadTestExtension();
48372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  LoadSecondExtension();
48472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  CrashExtension(size_before);
48572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(size_before + 1, GetExtensionService()->extensions()->size());
48672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(crash_size_before + 1,
48772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            GetExtensionService()->terminated_extensions()->size());
48872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
48972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GetExtensionService()->UnloadAllExtensions();
49072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(crash_size_before,
49172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            GetExtensionService()->terminated_extensions()->size());
49272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
493