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