task_manager_browsertest.cc revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/devtools/devtools_window.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/confirm_infobar_delegate.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/desktop_notification_service.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification_test_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification_ui_manager.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/task_manager/resource_provider.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_manager/task_manager_browsertest_util.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/panel.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/panel_manager.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_applications/web_app.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_transition_types.h"
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/31663
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !(defined(OS_WIN) && defined(USE_AURA)) && !(defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On Linux this is crashing intermittently http://crbug/84719
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In some environments this test fails about 1/6 http://crbug/84850
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_KillExtension DISABLED_KillExtension
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_KillExtension KillExtension
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType* kTitle1File = FILE_PATH_LITERAL("title1.html");
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class TaskManagerNoShowBrowserTest : public ExtensionBrowserTest {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TaskManagerNoShowBrowserTest() {}
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~TaskManagerNoShowBrowserTest() {}
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerModel* model() const {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TaskManager::GetInstance()->model();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void ShowTaskManager() {
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(0, model()->ResourceCount());
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Show the task manager. This populates the model, and helps with debugging
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // (you see the task manager).
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    chrome::ShowTaskManager(browser());
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // New Tab Page.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Refresh() {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model()->Refresh();
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int GetUpdateTimeMs() {
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return TaskManagerModel::kUpdateTimeMs;
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionBrowserTest::SetUpCommandLine(command_line);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Do not prelaunch the GPU process and disable accelerated compositing
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // for these tests as the GPU process will show up in task manager but
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // whether it appears before or after the new tab renderer process is not
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // well defined.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kDisableGpuProcessPrelaunch);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kDisableAcceleratedCompositing);
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // Do not launch device discovery process.
107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    command_line->AppendSwitch(switches::kDisableDeviceDiscoveryNotifications);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TaskManagerNoShowBrowserTest);
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class TaskManagerBrowserTest : public TaskManagerNoShowBrowserTest {
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TaskManagerBrowserTest() {}
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~TaskManagerBrowserTest() {}
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    TaskManagerNoShowBrowserTest::SetUpOnMainThread();
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    TaskManagerNoShowBrowserTest::ShowTaskManager();
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TaskManagerBrowserTest);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_LINUX)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ShutdownWhileOpen DISABLED_ShutdownWhileOpen
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ShutdownWhileOpen ShutdownWhileOpen
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Regression test for http://crbug.com/13361
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, MAYBE_ShutdownWhileOpen) {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Showing task manager handled by SetUp.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeTabContentsChanges) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_count = TaskManager::GetInstance()->model()->ResourceCount();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a new tab and make sure we notice that.
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kTitle1File)));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabAtIndex(0, url, content::PAGE_TRANSITION_TYPED);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the last entry is a tab contents resource whose title starts
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // starts with "Tab:".
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(model()->GetResourceWebContents(resource_count) != NULL);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 prefix = l10n_util::GetStringFUTF16(
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_TASK_MANAGER_TAB_PREFIX, string16());
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count), prefix,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         true));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the tab and verify that we notice.
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->CloseWebContentsAt(0,
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   TabStripModel::CLOSE_NONE);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test fails on Ash because task manager treats view type
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Panels differently for Ash.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_NoticePanelChanges DISABLED_NoticePanelChanges
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_NoticePanelChanges NoticePanelChanges
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, MAYBE_NoticePanelChanges) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("good").AppendASCII("Extensions")
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    .AppendASCII("1.0.0.0")));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Browser, the New Tab Page and Extension background page.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a new panel to an extension url and make sure we notice that.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "chrome-extension://behllobkkfkfnphdnhnkndlbkcpglgmj/french_sentence.html");
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Panel* panel = PanelManager::GetInstance()->CreatePanel(
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_app::GenerateApplicationNameFromExtensionId(
1828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          last_loaded_extension_id()),
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->profile(),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Rect(300, 400),
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PanelManager::CREATE_AS_DOCKED);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(3);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the fourth entry is a resource with the panel's web contents
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and whose title starts with "Extension:".
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(panel->GetWebContents(), model()->GetResourceWebContents(3));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 prefix = l10n_util::GetStringFUTF16(
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_TASK_MANAGER_EXTENSION_PREFIX, string16());
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(3), prefix, true));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the panel and verify that we notice.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  panel->Close();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unload extension to avoid crash on Windows.
2018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  UnloadExtension(last_loaded_extension_id());
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH) || defined(OS_WIN)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test fails on Ash because task manager treats view type
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Panels differently for Ash.
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test also fails on Windows, win_rel trybot. http://crbug.com/166322
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_KillPanelExtension DISABLED_KillPanelExtension
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_KillPanelExtension KillPanelExtension
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, MAYBE_KillPanelExtension) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_count = TaskManager::GetInstance()->model()->ResourceCount();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("good").AppendASCII("Extensions")
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    .AppendASCII("1.0.0.0")));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Browser, the New Tab Page and Extension background page.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a new panel to an extension url and make sure we notice that.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "chrome-extension://behllobkkfkfnphdnhnkndlbkcpglgmj/french_sentence.html");
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PanelManager::GetInstance()->CreatePanel(
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_app::GenerateApplicationNameFromExtensionId(
2298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          last_loaded_extension_id()),
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->profile(),
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Rect(300, 400),
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PanelManager::CREATE_AS_DOCKED);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(3);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Kill the panel extension process and verify that it disappears from the
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // model along with its panel.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(model()->IsBackgroundResource(resource_count));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManager::GetInstance()->KillProcess(resource_count);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeExtensionTabs) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_count = TaskManager::GetInstance()->model()->ResourceCount();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("good").AppendASCII("Extensions")
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    .AppendASCII("1.0.0.0")));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Browser, Extension background page, and the New Tab Page.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a new tab to an extension URL and make sure we notice that.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("chrome-extension://behllobkkfkfnphdnhnkndlbkcpglgmj/page.html");
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabAtIndex(0, url, content::PAGE_TRANSITION_TYPED);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(3);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the third entry (background) is an extension resource whose
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // title starts with "Extension:".
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(task_manager::Resource::EXTENSION, model()->GetResourceType(
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_count));
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(model()->GetResourceWebContents(resource_count) == NULL);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(model()->GetResourceExtension(resource_count) != NULL);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 prefix = l10n_util::GetStringFUTF16(
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_TASK_MANAGER_EXTENSION_PREFIX, string16());
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count),
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         prefix, true));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the fourth entry (page.html) is of type extension and has both
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a tab contents and an extension. The title should start with "Extension:".
27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(task_manager::Resource::EXTENSION, model()->GetResourceType(
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_count + 1));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(model()->GetResourceWebContents(resource_count + 1) != NULL);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(model()->GetResourceExtension(resource_count + 1) != NULL);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count + 1),
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         prefix, true));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unload extension to avoid crash on Windows.
2798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  UnloadExtension(last_loaded_extension_id());
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeAppTabs) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_count = TaskManager::GetInstance()->model()->ResourceCount();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("packaged_app")));
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension =
2908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      service->GetExtensionById(last_loaded_extension_id(), false);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // New Tab Page.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a new tab to the app's launch URL and make sure we notice that.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(extension->GetResourceURL("main.html"));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabAtIndex(0, url, content::PAGE_TRANSITION_TYPED);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the third entry (main.html) is of type extension and has both
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a tab contents and an extension. The title should start with "App:".
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(task_manager::Resource::EXTENSION, model()->GetResourceType(
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_count));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(model()->GetResourceWebContents(resource_count) != NULL);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(model()->GetResourceExtension(resource_count) == extension);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 prefix = l10n_util::GetStringFUTF16(
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_TASK_MANAGER_APP_PREFIX, string16());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count),
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         prefix, true));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unload extension to avoid crash on Windows.
3128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  UnloadExtension(last_loaded_extension_id());
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeHostedAppTabs) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_count = TaskManager::GetInstance()->model()->ResourceCount();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The app under test acts on URLs whose host is "localhost",
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so the URLs we navigate to must have host "localhost".
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("*", "127.0.0.1");
322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL::Replacements replace_host;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host_str("localhost");  // must stay in scope with replace_host
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  replace_host.SetHostStr(host_str);
326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GURL base_url = embedded_test_server()->GetURL(
327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "/extensions/api_test/app_process/");
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_url = base_url.ReplaceComponents(replace_host);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a new tab to an app URL before the app is loaded.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(base_url.Resolve("path1/empty.html"));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabAtIndex(0, url, content::PAGE_TRANSITION_TYPED);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Force the TaskManager to query the title.
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Refresh();
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the third entry's title starts with "Tab:".
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 tab_prefix = l10n_util::GetStringFUTF16(
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_TASK_MANAGER_TAB_PREFIX, string16());
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count),
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         tab_prefix, true));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load the hosted app and make sure it still starts with "Tab:",
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since it hasn't changed to an app process yet.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("api_test").AppendASCII("app_process")));
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Force the TaskManager to query the title.
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Refresh();
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count),
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         tab_prefix, true));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now reload and check that the last entry's title now starts with "App:".
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Force the TaskManager to query the title.
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Refresh();
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 app_prefix = l10n_util::GetStringFUTF16(
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_TASK_MANAGER_APP_PREFIX, string16());
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count),
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         app_prefix, true));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable extension and reload page.
3668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DisableExtension(last_loaded_extension_id());
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Force the TaskManager to query the title.
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Refresh();
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The third entry's title should be back to a normal tab.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count),
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         tab_prefix, true));
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled, http://crbug.com/66957.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DISABLED_KillExtensionAndReload) {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("common").AppendASCII("background_page")));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait until we see the loaded extension in the task manager (the three
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // resources are: the browser process, New Tab Page, and the extension).
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(3);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(model()->GetResourceExtension(0) == NULL);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(model()->GetResourceExtension(1) == NULL);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(model()->GetResourceExtension(2) != NULL);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Kill the extension process and make sure we notice it.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManager::GetInstance()->KillProcess(2);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reload the extension using the "crashed extension" infobar while the task
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // manager is still visible. Make sure we don't crash and the extension
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gets reloaded and noticed in the task manager.
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InfoBarService* infobar_service = InfoBarService::FromWebContents(
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents());
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(1U, infobar_service->infobar_count());
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ConfirmInfoBarDelegate* delegate =
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      infobar_service->infobar_at(0)->AsConfirmInfoBarDelegate();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(delegate);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate->Accept();
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(3);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/93158.
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ReloadExtension DISABLED_ReloadExtension
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ReloadExtension ReloadExtension
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Regression test for http://crbug.com/18693.
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, MAYBE_ReloadExtension) {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_count = TaskManager::GetInstance()->model()->ResourceCount();
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(INFO) << "loading extension";
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("common").AppendASCII("background_page")));
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait until we see the loaded extension in the task manager (the three
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // resources are: the browser process, New Tab Page, and the extension).
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(INFO) << "waiting for resource change";
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(model()->GetResourceExtension(0) == NULL);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(model()->GetResourceExtension(1) == NULL);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(model()->GetResourceExtension(resource_count) != NULL);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension = model()->GetResourceExtension(
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_count);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension != NULL);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reload the extension a few times and make sure our resource count
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // doesn't increase.
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(INFO) << "First extension reload";
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(extension->id());
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = model()->GetResourceExtension(resource_count);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension != NULL);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(INFO) << "Second extension reload";
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(extension->id());
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = model()->GetResourceExtension(resource_count);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extension != NULL);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(INFO) << "Third extension reload";
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReloadExtension(extension->id());
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Crashy, http://crbug.com/42301.
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest,
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DISABLED_PopulateWebCacheFields) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_count = TaskManager::GetInstance()->model()->ResourceCount();
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a new tab and make sure we notice that.
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kTitle1File)));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabAtIndex(0, url, content::PAGE_TRANSITION_TYPED);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we get some value for the cache columns.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(model()->GetResourceWebCoreImageCacheSize(resource_count),
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT));
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(model()->GetResourceWebCoreScriptsCacheSize(resource_count),
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT));
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(model()->GetResourceWebCoreCSSCacheSize(resource_count),
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT));
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Checks that task manager counts a worker thread JS heap size.
4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// http://crbug.com/241066
4767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Flaky, http://crbug.com/259368
4777dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, DISABLED_WebWorkerJSHeapMemory) {
4787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kTitle1File)));
4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const int extra_timeout_ms = 500;
4827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t minimal_heap_size = 2 * 1024 * 1024 * sizeof(void*);
4837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string test_js = base::StringPrintf(
4847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "var blob = new Blob([\n"
4857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "    'mem = new Array(%lu);',\n"
4867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "    'for (var i = 0; i < mem.length; i += 16) mem[i] = i;',\n"
4877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "    'postMessage();']);\n"
4887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "blobURL = window.URL.createObjectURL(blob);\n"
4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "worker = new Worker(blobURL);\n"
4907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "// Give the task manager few seconds to poll for JS heap sizes.\n"
4917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "worker.onmessage = setTimeout.bind(\n"
4927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "    this,\n"
4937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "    function () { window.domAutomationController.send(true); },\n"
4947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "    %d);\n"
4957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      "worker.postMessage();\n",
4967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      static_cast<unsigned long>(minimal_heap_size),
4977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GetUpdateTimeMs() + extra_timeout_ms);
4987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool ok;
4997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
5007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), test_js, &ok));
5017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(ok);
5027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int resource_index = TaskManager::GetInstance()->model()->ResourceCount() - 1;
5047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t result;
5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(model()->GetV8Memory(resource_index, &result));
5077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  LOG(INFO) << "Got V8 Heap Size " << result << " bytes";
5087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_GE(result, minimal_heap_size);
5097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(model()->GetV8MemoryUsed(resource_index, &result));
5117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  LOG(INFO) << "Got V8 Used Heap Size " << result << " bytes";
5127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_GE(result, minimal_heap_size);
5137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
515424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeInTabDevToolsWindow) {
516424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DevToolsWindow* dev_tools = DevToolsWindow::ToggleDevToolsWindow(
517424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      model()->GetResourceWebContents(1)->GetRenderViewHost(),
518424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      true,
519424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      DEVTOOLS_TOGGLE_ACTION_INSPECT);
520424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Dock side bottom should be the default.
521424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(DEVTOOLS_DOCK_SIDE_BOTTOM, dev_tools->dock_side());
522424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
523424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
524424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
5254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// This test differs from TaskManagerBrowserTest.NoticeInTabDevToolsWindow in
5264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// the order in which the devtools window and task manager are created.
5274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(TaskManagerNoShowBrowserTest,
5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       NoticeInTabDevToolsWindow) {
5294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // First create the devtools window.
5304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DevToolsWindow* dev_tools = DevToolsWindow::ToggleDevToolsWindow(
5314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost(),
5324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      true,
5334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      DEVTOOLS_TOGGLE_ACTION_INSPECT);
5344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Dock side bottom should be the default.
5354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(DEVTOOLS_DOCK_SIDE_BOTTOM, dev_tools->dock_side());
5364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Make sure that the devtools window is loaded before starting the task
5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // manager.
5384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  content::RunAllPendingInMessageLoop();
5394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Now add showing the task manager to the queue, and watch for the right
5414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // number of reources to show up.
5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      FROM_HERE,
5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&TaskManagerNoShowBrowserTest::ShowTaskManager,
5454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 base::Unretained(this)));
5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
550