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