task_manager_browsertest_util.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/message_loop.h"
6#include "base/stringprintf.h"
7#include "base/utf_string_conversions.h"
8#include "chrome/browser/browser_process.h"
9#include "chrome/browser/profiles/profile.h"
10#include "chrome/browser/task_manager/task_manager.h"
11#include "chrome/browser/task_manager/task_manager_browsertest_util.h"
12#include "chrome/browser/ui/browser.h"
13#include "chrome/browser/ui/browser_window.h"
14#include "chrome/common/chrome_notification_types.h"
15#include "chrome/test/base/ui_test_utils.h"
16#include "content/public/browser/notification_source.h"
17#include "content/public/browser/web_contents.h"
18
19namespace {
20
21int GetWebResourceCount(const TaskManagerModel* model) {
22  int count = 0;
23  for (int i = 0; i < model->ResourceCount(); i++) {
24    TaskManager::Resource::Type type = model->GetResourceType(i);
25    // Skip system infrastructure resources.
26    if (type == TaskManager::Resource::BROWSER ||
27        type == TaskManager::Resource::NACL ||
28        type == TaskManager::Resource::GPU ||
29        type == TaskManager::Resource::UTILITY ||
30        type == TaskManager::Resource::PROFILE_IMPORT ||
31        type == TaskManager::Resource::ZYGOTE ||
32        type == TaskManager::Resource::SANDBOX_HELPER) {
33      continue;
34    }
35
36    count++;
37  }
38  return count;
39}
40
41class ResourceChangeObserver : public TaskManagerModelObserver {
42 public:
43  ResourceChangeObserver(const TaskManagerModel* model,
44                         int target_resource_count)
45      : model_(model),
46        target_resource_count_(target_resource_count) {
47  }
48
49  virtual void OnModelChanged() OVERRIDE {
50    OnResourceChange();
51  }
52
53  virtual void OnItemsChanged(int start, int length) OVERRIDE {
54    OnResourceChange();
55  }
56
57  virtual void OnItemsAdded(int start, int length) OVERRIDE {
58    OnResourceChange();
59  }
60
61  virtual void OnItemsRemoved(int start, int length) OVERRIDE {
62    OnResourceChange();
63  }
64
65 private:
66  void OnResourceChange() {
67    if (GetWebResourceCount(model_) == target_resource_count_)
68      MessageLoopForUI::current()->Quit();
69  }
70
71  const TaskManagerModel* model_;
72  const int target_resource_count_;
73};
74
75}  // namespace
76
77// static
78void TaskManagerBrowserTestUtil::WaitForWebResourceChange(int target_count) {
79  TaskManagerModel* model = TaskManager::GetInstance()->model();
80
81  ResourceChangeObserver observer(model, target_count);
82  model->AddObserver(&observer);
83
84  // Checks that the condition has not been satisfied yet.
85  // This check has to be placed after the installation of the observer,
86  // because resources may change before that.
87  if (GetWebResourceCount(model) == target_count) {
88    model->RemoveObserver(&observer);
89    return;
90  }
91
92  content::RunMessageLoop();
93  model->RemoveObserver(&observer);
94}
95
96// static
97void TaskManagerBrowserTestUtil::ShowTaskManagerAndWaitForReady(
98    Browser* browser) {
99#if defined(USE_AURA)
100  content::WindowedNotificationObserver observer(
101      chrome::NOTIFICATION_TASK_MANAGER_WINDOW_READY,
102      content::Source<TaskManagerModel>(TaskManager::GetInstance()->model()));
103  browser->window()->ShowTaskManager();
104  observer.Wait();
105#else
106  browser->window()->ShowTaskManager();
107#endif  // defined(USE_AURA)
108}
109
110