Chromium Code Reviews| Index: chrome/browser/task_manager/task_manager_browsertest.cc |
| diff --git a/chrome/browser/task_manager/task_manager_browsertest.cc b/chrome/browser/task_manager/task_manager_browsertest.cc |
| index b17132f14a1bdeff1d6c9b9d4153124a9a317f92..1e6c3675c5cc9b6b5d1475086c2369f4a4ed5587 100644 |
| --- a/chrome/browser/task_manager/task_manager_browsertest.cc |
| +++ b/chrome/browser/task_manager/task_manager_browsertest.cc |
| @@ -34,12 +34,15 @@ namespace { |
| const FilePath::CharType* kTitle1File = FILE_PATH_LITERAL("title1.html"); |
| -class ResourceChangeObserver : public TaskManagerModelObserver { |
| +class ResourceChangeObserver |
| + : public TaskManagerModelObserver, |
| + public base::RefCountedThreadSafe<ResourceChangeObserver> { |
| public: |
| ResourceChangeObserver(const TaskManagerModel* model, |
| int target_resource_count) |
| : model_(model), |
| - target_resource_count_(target_resource_count) { |
| + target_resource_count_(target_resource_count), |
| + check_pending_(false) { |
| } |
| virtual void OnModelChanged() { |
| @@ -59,13 +62,46 @@ class ResourceChangeObserver : public TaskManagerModelObserver { |
| } |
| private: |
| + friend class base::RefCountedThreadSafe<ResourceChangeObserver>; |
| void OnResourceChange() { |
| + // The task manager can churn resources (for example, when a |
| + // BackgroundContents navigates, we remove and re-add the resource to |
| + // allow the UI to update properly). So check the resource count via |
| + // a task to make sure we aren't triggered by a transient change. |
|
rafaelw
2011/01/14 01:04:46
I'm not familiar with the TaskManager or this test
|
| + if (check_pending_) |
| + return; |
| + check_pending_ = true; |
| + MessageLoopForUI::current()->PostTask( |
| + FROM_HERE, |
| + NewRunnableMethod(this, &ResourceChangeObserver::CheckResourceCount)); |
| + } |
| + |
| + void CheckResourceCount() { |
| if (model_->ResourceCount() == target_resource_count_) |
| MessageLoopForUI::current()->Quit(); |
| } |
| const TaskManagerModel* model_; |
| const int target_resource_count_; |
| + bool check_pending_; |
| +}; |
| + |
| +// Helper class used to wait for a BackgroundContents to finish loading. |
| +class BackgroundContentsListener : public NotificationObserver { |
| + public: |
| + explicit BackgroundContentsListener(Profile* profile) { |
| + registrar_.Add(this, NotificationType::BACKGROUND_CONTENTS_NAVIGATED, |
| + Source<Profile>(profile)); |
| + } |
| + virtual void Observe(NotificationType type, |
| + const NotificationSource& source, |
| + const NotificationDetails& details) { |
| + // Quit once the BackgroundContents has been loaded. |
| + if (type.value == NotificationType::BACKGROUND_CONTENTS_NAVIGATED) |
| + MessageLoopForUI::current()->Quit(); |
| + } |
| + private: |
| + NotificationRegistrar registrar_; |
| }; |
| } // namespace |
| @@ -79,10 +115,17 @@ class TaskManagerBrowserTest : public ExtensionBrowserTest { |
| void WaitForResourceChange(int target_count) { |
| if (model()->ResourceCount() == target_count) |
| return; |
| - ResourceChangeObserver observer(model(), target_count); |
| - model()->AddObserver(&observer); |
| + scoped_refptr<ResourceChangeObserver> observer( |
| + new ResourceChangeObserver(model(), target_count)); |
| + model()->AddObserver(observer.get()); |
| + ui_test_utils::RunMessageLoop(); |
| + model()->RemoveObserver(observer.get()); |
| + } |
| + |
| + // Wait for any pending BackgroundContents to finish starting up. |
| + void WaitForBackgroundContents() { |
| + BackgroundContentsListener listener(browser()->profile()); |
| ui_test_utils::RunMessageLoop(); |
| - model()->RemoveObserver(&observer); |
| } |
| }; |
| @@ -149,6 +192,45 @@ IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeBGContentsChanges) { |
| WaitForResourceChange(2); |
| } |
| +IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, KillBGContents) { |
| + EXPECT_EQ(0, model()->ResourceCount()); |
| + |
| + // Show the task manager. This populates the model, and helps with debugging |
| + // (you see the task manager). |
| + browser()->window()->ShowTaskManager(); |
| + |
| + // Browser and the New Tab Page. |
| + WaitForResourceChange(2); |
| + |
| + // Open a new background contents and make sure we notice that. |
| + GURL url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory), |
| + FilePath(kTitle1File))); |
| + |
| + BackgroundContentsService* service = |
| + browser()->profile()->GetBackgroundContentsService(); |
| + string16 application_id(ASCIIToUTF16("test_app_id")); |
| + service->LoadBackgroundContents(browser()->profile(), |
| + url, |
| + ASCIIToUTF16("background_page"), |
| + application_id); |
| + // Wait for the background contents process to finish loading. |
| + WaitForBackgroundContents(); |
| + EXPECT_EQ(3, model()->ResourceCount()); |
| + |
| + // Kill the background contents process and verify that it disappears from the |
| + // model. |
| + bool found = false; |
| + for (int i = 0; i < model()->ResourceCount(); ++i) { |
| + if (model()->IsBackgroundResource(i)) { |
| + TaskManager::GetInstance()->KillProcess(i); |
| + found = true; |
| + break; |
| + } |
| + } |
| + ASSERT_TRUE(found); |
| + WaitForResourceChange(2); |
| +} |
| + |
| IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeExtensionChanges) { |
| EXPECT_EQ(0, model()->ResourceCount()); |