172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/task_manager/task_manager.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/file_path.h"
8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/utf_string_conversions.h"
94a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/background_contents_service.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/background_contents_service_factory.h"
11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/browser_process.h"
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/extensions/extension_browsertest.h"
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h"
14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/notifications/desktop_notification_service.h"
15201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/notifications/notification.h"
16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/notifications/notification_test_util.h"
17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/notifications/notification_ui_manager.h"
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/tabs/tab_strip_model.h"
214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_navigator.h"
234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_window.h"
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/extensions/extension.h"
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/test/in_process_browser_test.h"
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/test/ui_test_utils.h"
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/page_transition_types.h"
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h"
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "testing/gtest/include/gtest/gtest.h"
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace {
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst FilePath::CharType* kTitle1File = FILE_PATH_LITERAL("title1.html");
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass ResourceChangeObserver : public TaskManagerModelObserver {
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ResourceChangeObserver(const TaskManagerModel* model,
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                         int target_resource_count)
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      : model_(model),
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        target_resource_count_(target_resource_count) {
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnModelChanged() {
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    OnResourceChange();
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnItemsChanged(int start, int length) {
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    OnResourceChange();
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnItemsAdded(int start, int length) {
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    OnResourceChange();
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnItemsRemoved(int start, int length) {
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    OnResourceChange();
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void OnResourceChange() {
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (model_->ResourceCount() == target_resource_count_)
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      MessageLoopForUI::current()->Quit();
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const TaskManagerModel* model_;
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const int target_resource_count_;
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Helper class used to wait for a BackgroundContents to finish loading.
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass BackgroundContentsListener : public NotificationObserver {
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  explicit BackgroundContentsListener(Profile* profile) {
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    registrar_.Add(this, NotificationType::BACKGROUND_CONTENTS_NAVIGATED,
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                   Source<Profile>(profile));
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Observe(NotificationType type,
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationSource& source,
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationDetails& details) {
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Quit once the BackgroundContents has been loaded.
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (type.value == NotificationType::BACKGROUND_CONTENTS_NAVIGATED)
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      MessageLoopForUI::current()->Quit();
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NotificationRegistrar registrar_;
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TaskManagerBrowserTest : public ExtensionBrowserTest {
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManagerModel* model() const {
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return TaskManager::GetInstance()->model();
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void WaitForResourceChange(int target_count) {
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    if (model()->ResourceCount() == target_count)
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return;
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ResourceChangeObserver observer(model(), target_count);
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    model()->AddObserver(&observer);
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    ui_test_utils::RunMessageLoop();
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    model()->RemoveObserver(&observer);
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Wait for any pending BackgroundContents to finish starting up.
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void WaitForBackgroundContents() {
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    BackgroundContentsListener listener(browser()->profile());
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui_test_utils::RunMessageLoop();
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Regression test for http://crbug.com/13361
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenIN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, ShutdownWhileOpen) {
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  browser()->window()->ShowTaskManager();
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenIN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeTabContentsChanges) {
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_EQ(0, model()->ResourceCount());
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Show the task manager. This populates the model, and helps with debugging
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // (you see the task manager).
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  browser()->window()->ShowTaskManager();
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Browser and the New Tab Page.
12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  WaitForResourceChange(2);
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Open a new tab and make sure we notice that.
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GURL url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                     FilePath(kTitle1File)));
131513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddTabAtIndex(0, url, PageTransition::TYPED);
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  WaitForResourceChange(3);
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
13421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Check that the third entry is a tab contents resource whose title starts
13521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // starts with "Tab:".
13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(model()->GetResourceTabContents(2) != NULL);
1373f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  string16 prefix = l10n_util::GetStringFUTF16(
1383f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      IDS_TASK_MANAGER_TAB_PREFIX, string16());
13921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(2), prefix, true));
14021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Close the tab and verify that we notice.
142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* first_tab = browser()->GetTabContentsAt(0);
143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ASSERT_TRUE(first_tab);
144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  browser()->CloseTabContents(first_tab);
145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  WaitForResourceChange(2);
146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochIN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeBGContentsChanges) {
1494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_EQ(0, model()->ResourceCount());
1504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Show the task manager. This populates the model, and helps with debugging
1524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // (you see the task manager).
1534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  browser()->window()->ShowTaskManager();
1544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Browser and the New Tab Page.
15621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  WaitForResourceChange(2);
1574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Open a new background contents and make sure we notice that.
1594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  GURL url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
1604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                     FilePath(kTitle1File)));
1614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  BackgroundContentsService* service =
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      BackgroundContentsServiceFactory::GetForProfile(browser()->profile());
1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  string16 application_id(ASCIIToUTF16("test_app_id"));
1654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  service->LoadBackgroundContents(browser()->profile(),
1664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                  url,
1674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                  ASCIIToUTF16("background_page"),
1684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                  application_id);
1694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  WaitForResourceChange(3);
1704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Close the background contents and verify that we notice.
1724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  service->ShutdownAssociatedBackgroundContents(application_id);
1734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  WaitForResourceChange(2);
1744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, KillBGContents) {
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0, model()->ResourceCount());
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Show the task manager. This populates the model, and helps with debugging
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // (you see the task manager).
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  browser()->window()->ShowTaskManager();
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Browser and the New Tab Page.
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  WaitForResourceChange(2);
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Open a new background contents and make sure we notice that.
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GURL url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                     FilePath(kTitle1File)));
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  BackgroundContentsService* service =
191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      BackgroundContentsServiceFactory::GetForProfile(browser()->profile());
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 application_id(ASCIIToUTF16("test_app_id"));
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  service->LoadBackgroundContents(browser()->profile(),
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  url,
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  ASCIIToUTF16("background_page"),
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  application_id);
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Wait for the background contents process to finish loading.
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  WaitForBackgroundContents();
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(3, model()->ResourceCount());
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Kill the background contents process and verify that it disappears from the
20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // model.
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool found = false;
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (int i = 0; i < model()->ResourceCount(); ++i) {
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (model()->IsBackgroundResource(i)) {
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      TaskManager::GetInstance()->KillProcess(i);
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      found = true;
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(found);
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  WaitForResourceChange(2);
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenIN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeExtensionChanges) {
216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_EQ(0, model()->ResourceCount());
217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Show the task manager. This populates the model, and helps with debugging
219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // (you see the task manager).
220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  browser()->window()->ShowTaskManager();
221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Browser and the New Tab Page.
22321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  WaitForResourceChange(2);
224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Loading an extension with a background page should result in a new
226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // resource being created for it.
227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ASSERT_TRUE(LoadExtension(
228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      test_data_dir_.AppendASCII("common").AppendASCII("background_page")));
229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  WaitForResourceChange(3);
23021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
23121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Unload extension to avoid crash on Windows (see http://crbug.com/31663).
23221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  UnloadExtension(last_loaded_extension_id_);
23321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  WaitForResourceChange(2);
23421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
23521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
23621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenIN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeExtensionTabs) {
23721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Show the task manager. This populates the model, and helps with debugging
23821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // (you see the task manager).
23921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  browser()->window()->ShowTaskManager();
24021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
24121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(LoadExtension(
24221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      test_data_dir_.AppendASCII("good").AppendASCII("Extensions")
24321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                    .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
24421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                    .AppendASCII("1.0.0.0")));
24521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
24621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Browser, Extension background page, and the New Tab Page.
24721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  WaitForResourceChange(3);
24821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
24921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Open a new tab to an extension URL and make sure we notice that.
25021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  GURL url("chrome-extension://behllobkkfkfnphdnhnkndlbkcpglgmj/page.html");
25121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  AddTabAtIndex(0, url, PageTransition::TYPED);
25221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  WaitForResourceChange(4);
25321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
25421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Check that the third entry (background) is an extension resource whose
25521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // title starts with "Extension:".
25621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(TaskManager::Resource::EXTENSION, model()->GetResourceType(2));
25721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(model()->GetResourceTabContents(2) == NULL);
25821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(model()->GetResourceExtension(2) != NULL);
2593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  string16 prefix = l10n_util::GetStringFUTF16(
2603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      IDS_TASK_MANAGER_EXTENSION_PREFIX, string16());
26121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(2), prefix, true));
26221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
26321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Check that the fourth entry (page.html) is of type extension and has both
26421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // a tab contents and an extension. The title should start with "Extension:".
26521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(TaskManager::Resource::EXTENSION, model()->GetResourceType(3));
26621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(model()->GetResourceTabContents(3) != NULL);
26721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(model()->GetResourceExtension(3) != NULL);
26821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(3), prefix, true));
26921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
27021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Unload extension to avoid crash on Windows.
27121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  UnloadExtension(last_loaded_extension_id_);
27221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  WaitForResourceChange(2);
27321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
27421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
27521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenIN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeAppTabs) {
27621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Show the task manager. This populates the model, and helps with debugging
27721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // (you see the task manager).
27821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  browser()->window()->ShowTaskManager();
27921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
28021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(LoadExtension(
28121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      test_data_dir_.AppendASCII("packaged_app")));
28221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ExtensionService* service = browser()->profile()->GetExtensionService();
28321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  const Extension* extension =
28421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      service->GetExtensionById(last_loaded_extension_id_, false);
28521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
28621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Browser and the New Tab Page.
28721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  WaitForResourceChange(2);
28821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
28921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Open a new tab to the app's launch URL and make sure we notice that.
29021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  GURL url(extension->GetResourceURL("main.html"));
29121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  AddTabAtIndex(0, url, PageTransition::TYPED);
29221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  WaitForResourceChange(3);
29321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
29421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Check that the third entry (main.html) is of type extension and has both
29521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // a tab contents and an extension. The title should start with "App:".
29621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_EQ(TaskManager::Resource::EXTENSION, model()->GetResourceType(2));
29721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(model()->GetResourceTabContents(2) != NULL);
29821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(model()->GetResourceExtension(2) != NULL);
2993f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  string16 prefix = l10n_util::GetStringFUTF16(
3003f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      IDS_TASK_MANAGER_APP_PREFIX, string16());
30121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(2), prefix, true));
30221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
30321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Unload extension to avoid crash on Windows.
30421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  UnloadExtension(last_loaded_extension_id_);
30521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  WaitForResourceChange(2);
306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
308513209b27ff55e2841eac0e4120199c23acce758Ben MurdochIN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeNotificationChanges) {
309513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(0, model()->ResourceCount());
310513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
311513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Show the task manager.
312513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  browser()->window()->ShowTaskManager();
313513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Expect to see the browser and the New Tab Page renderer.
31421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  WaitForResourceChange(2);
315513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
316513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Show a notification.
317513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  NotificationUIManager* notifications =
318513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      g_browser_process->notification_ui_manager();
319513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
320513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  string16 content = DesktopNotificationService::CreateDataUrl(
321513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      GURL(), ASCIIToUTF16("Hello World!"), string16(),
322513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      WebKit::WebTextDirectionDefault);
323513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
324513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<NotificationDelegate> del1(new MockNotificationDelegate("n1"));
325513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Notification n1(
326513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      GURL(), GURL(content), ASCIIToUTF16("Test 1"), string16(), del1.get());
327513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<NotificationDelegate> del2(new MockNotificationDelegate("n2"));
328513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Notification n2(
329513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      GURL(), GURL(content), ASCIIToUTF16("Test 2"), string16(), del2.get());
330513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
331513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  notifications->Add(n1, browser()->profile());
332513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  WaitForResourceChange(3);
333513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  notifications->Add(n2, browser()->profile());
334513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  WaitForResourceChange(4);
335201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  notifications->CancelById(n1.notification_id());
336513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  WaitForResourceChange(3);
337201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  notifications->CancelById(n2.notification_id());
338513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  WaitForResourceChange(2);
339513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
340513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenIN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, KillExtension) {
342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Show the task manager. This populates the model, and helps with debugging
343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // (you see the task manager).
344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  browser()->window()->ShowTaskManager();
345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ASSERT_TRUE(LoadExtension(
347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      test_data_dir_.AppendASCII("common").AppendASCII("background_page")));
348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Wait until we see the loaded extension in the task manager (the three
350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // resources are: the browser process, New Tab Page, and the extension).
351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  WaitForResourceChange(3);
352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_TRUE(model()->GetResourceExtension(0) == NULL);
354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_TRUE(model()->GetResourceExtension(1) == NULL);
355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ASSERT_TRUE(model()->GetResourceExtension(2) != NULL);
356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Kill the extension process and make sure we notice it.
358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManager::GetInstance()->KillProcess(2);
359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  WaitForResourceChange(2);
360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
36221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Disabled, http://crbug.com/66957.
36321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenIN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest,
36421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                       DISABLED_KillExtensionAndReload) {
365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Show the task manager. This populates the model, and helps with debugging
366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // (you see the task manager).
367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  browser()->window()->ShowTaskManager();
368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
369bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ASSERT_TRUE(LoadExtension(
370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      test_data_dir_.AppendASCII("common").AppendASCII("background_page")));
371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
372bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Wait until we see the loaded extension in the task manager (the three
373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // resources are: the browser process, New Tab Page, and the extension).
374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  WaitForResourceChange(3);
375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_TRUE(model()->GetResourceExtension(0) == NULL);
377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_TRUE(model()->GetResourceExtension(1) == NULL);
378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ASSERT_TRUE(model()->GetResourceExtension(2) != NULL);
379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
380bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Kill the extension process and make sure we notice it.
381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManager::GetInstance()->KillProcess(2);
382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  WaitForResourceChange(2);
383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Reload the extension using the "crashed extension" infobar while the task
385bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // manager is still visible. Make sure we don't crash and the extension
386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // gets reloaded and noticed in the task manager.
387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* current_tab = browser()->GetSelectedTabContents();
38872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(1U, current_tab->infobar_count());
38972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ConfirmInfoBarDelegate* delegate =
39072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      current_tab->GetInfoBarDelegateAt(0)->AsConfirmInfoBarDelegate();
39172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(delegate);
39272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delegate->Accept();
393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  WaitForResourceChange(3);
394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Regression test for http://crbug.com/18693.
3973f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen//
3983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// This test is crashy. See http://crbug.com/42315.
399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenIN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, DISABLED_ReloadExtension) {
400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Show the task manager. This populates the model, and helps with debugging
401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // (you see the task manager).
402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  browser()->window()->ShowTaskManager();
403bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4043f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  LOG(INFO) << "loading extension";
405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ASSERT_TRUE(LoadExtension(
406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      test_data_dir_.AppendASCII("common").AppendASCII("background_page")));
407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
408bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Wait until we see the loaded extension in the task manager (the three
409bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // resources are: the browser process, New Tab Page, and the extension).
4103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  LOG(INFO) << "waiting for resource change";
411bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  WaitForResourceChange(3);
412bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_TRUE(model()->GetResourceExtension(0) == NULL);
414bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_TRUE(model()->GetResourceExtension(1) == NULL);
415bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ASSERT_TRUE(model()->GetResourceExtension(2) != NULL);
416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const Extension* extension = model()->GetResourceExtension(2);
4183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(extension != NULL);
419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
420bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Reload the extension a few times and make sure our resource count
421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // doesn't increase.
4223f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  LOG(INFO) << "First extension reload";
423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ReloadExtension(extension->id());
424bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  WaitForResourceChange(3);
425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  extension = model()->GetResourceExtension(2);
4263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(extension != NULL);
427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  LOG(INFO) << "Second extension reload";
429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ReloadExtension(extension->id());
430bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  WaitForResourceChange(3);
431bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  extension = model()->GetResourceExtension(2);
4323f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(extension != NULL);
433bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4343f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  LOG(INFO) << "Third extension reload";
435bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ReloadExtension(extension->id());
436bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  WaitForResourceChange(3);
437bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
438bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
439bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Crashy, http://crbug.com/42301.
440bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenIN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest,
441bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                       DISABLED_PopulateWebCacheFields) {
442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  EXPECT_EQ(0, model()->ResourceCount());
443bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
444bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Show the task manager. This populates the model, and helps with debugging
445bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // (you see the task manager).
446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  browser()->window()->ShowTaskManager();
447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Browser and the New Tab Page.
44921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  WaitForResourceChange(2);
450bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
451bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Open a new tab and make sure we notice that.
452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GURL url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
453bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                     FilePath(kTitle1File)));
454513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddTabAtIndex(0, url, PageTransition::TYPED);
455bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  WaitForResourceChange(3);
456bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
457bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Check that we get some value for the cache columns.
458bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK_NE(model()->GetResourceWebCoreImageCacheSize(2),
459bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen            l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT));
460bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK_NE(model()->GetResourceWebCoreScriptsCacheSize(2),
461bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen            l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT));
462bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK_NE(model()->GetResourceWebCoreCSSCacheSize(2),
463bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen            l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT));
464bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
465