task_manager_browsertest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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 "chrome/browser/task_manager/task_manager.h"
6
7#include "base/files/file_path.h"
8#include "base/strings/stringprintf.h"
9#include "base/strings/utf_string_conversions.h"
10#include "chrome/browser/browser_process.h"
11#include "chrome/browser/chrome_notification_types.h"
12#include "chrome/browser/devtools/devtools_window.h"
13#include "chrome/browser/extensions/extension_browsertest.h"
14#include "chrome/browser/extensions/extension_service.h"
15#include "chrome/browser/infobars/confirm_infobar_delegate.h"
16#include "chrome/browser/infobars/infobar.h"
17#include "chrome/browser/infobars/infobar_service.h"
18#include "chrome/browser/notifications/desktop_notification_service.h"
19#include "chrome/browser/notifications/notification.h"
20#include "chrome/browser/notifications/notification_test_util.h"
21#include "chrome/browser/notifications/notification_ui_manager.h"
22#include "chrome/browser/profiles/profile.h"
23#include "chrome/browser/task_manager/resource_provider.h"
24#include "chrome/browser/task_manager/task_manager_browsertest_util.h"
25#include "chrome/browser/ui/browser.h"
26#include "chrome/browser/ui/browser_dialogs.h"
27#include "chrome/browser/ui/browser_navigator.h"
28#include "chrome/browser/ui/browser_window.h"
29#include "chrome/browser/ui/panels/panel.h"
30#include "chrome/browser/ui/panels/panel_manager.h"
31#include "chrome/browser/ui/tabs/tab_strip_model.h"
32#include "chrome/browser/web_applications/web_app.h"
33#include "chrome/common/chrome_switches.h"
34#include "chrome/test/base/in_process_browser_test.h"
35#include "chrome/test/base/ui_test_utils.h"
36#include "content/public/browser/notification_service.h"
37#include "content/public/common/content_switches.h"
38#include "content/public/common/page_transition_types.h"
39#include "content/public/test/browser_test_utils.h"
40#include "extensions/browser/extension_system.h"
41#include "extensions/common/extension.h"
42#include "grit/generated_resources.h"
43#include "net/dns/mock_host_resolver.h"
44#include "net/test/embedded_test_server/embedded_test_server.h"
45#include "testing/gtest/include/gtest/gtest.h"
46#include "ui/base/l10n/l10n_util.h"
47
48using content::WebContents;
49
50// On Linux this is crashing intermittently http://crbug/84719
51// In some environments this test fails about 1/6 http://crbug/84850
52#if defined(OS_LINUX)
53#define MAYBE_KillExtension DISABLED_KillExtension
54#else
55#define MAYBE_KillExtension KillExtension
56#endif
57
58namespace {
59
60const base::FilePath::CharType* kTitle1File = FILE_PATH_LITERAL("title1.html");
61
62}  // namespace
63
64class TaskManagerNoShowBrowserTest : public ExtensionBrowserTest {
65 public:
66  TaskManagerNoShowBrowserTest() {}
67  virtual ~TaskManagerNoShowBrowserTest() {}
68
69  TaskManagerModel* model() const {
70    return TaskManager::GetInstance()->model();
71  }
72
73  void ShowTaskManager() {
74    EXPECT_EQ(0, model()->ResourceCount());
75
76    // Show the task manager. This populates the model, and helps with debugging
77    // (you see the task manager).
78    chrome::ShowTaskManager(browser());
79
80    // New Tab Page.
81    TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
82  }
83
84  void Refresh() {
85    model()->Refresh();
86  }
87
88  int GetUpdateTimeMs() {
89    return TaskManagerModel::kUpdateTimeMs;
90  }
91
92 protected:
93  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
94    ExtensionBrowserTest::SetUpCommandLine(command_line);
95
96    // Do not launch the GPU process as the GPU process will show up in task
97    // manager but whether it appears before or after the new tab renderer
98    // process is not well defined.
99    command_line->AppendSwitch(switches::kDisableGpu);
100
101    // Do not launch device discovery process.
102    command_line->AppendSwitch(switches::kDisableDeviceDiscoveryNotifications);
103  }
104
105 private:
106  DISALLOW_COPY_AND_ASSIGN(TaskManagerNoShowBrowserTest);
107};
108
109class TaskManagerBrowserTest : public TaskManagerNoShowBrowserTest {
110 public:
111  TaskManagerBrowserTest() {}
112  virtual ~TaskManagerBrowserTest() {}
113
114  virtual void SetUpOnMainThread() OVERRIDE {
115    TaskManagerNoShowBrowserTest::SetUpOnMainThread();
116    TaskManagerNoShowBrowserTest::ShowTaskManager();
117  }
118
119 private:
120  DISALLOW_COPY_AND_ASSIGN(TaskManagerBrowserTest);
121};
122
123#if defined(OS_MACOSX) || defined(OS_LINUX)
124#define MAYBE_ShutdownWhileOpen DISABLED_ShutdownWhileOpen
125#else
126#define MAYBE_ShutdownWhileOpen ShutdownWhileOpen
127#endif
128
129// Regression test for http://crbug.com/13361
130IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, MAYBE_ShutdownWhileOpen) {
131  // Showing task manager handled by SetUp.
132}
133
134IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeTabContentsChanges) {
135  int resource_count = TaskManager::GetInstance()->model()->ResourceCount();
136  // Open a new tab and make sure we notice that.
137  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
138      base::FilePath::kCurrentDirectory), base::FilePath(kTitle1File)));
139  AddTabAtIndex(0, url, content::PAGE_TRANSITION_TYPED);
140  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
141
142  // Check that the last entry is a tab contents resource whose title starts
143  // starts with "Tab:".
144  ASSERT_TRUE(model()->GetResourceWebContents(resource_count) != NULL);
145  base::string16 prefix = l10n_util::GetStringFUTF16(
146      IDS_TASK_MANAGER_TAB_PREFIX, base::string16());
147  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count), prefix,
148                         true));
149
150  // Close the tab and verify that we notice.
151  browser()->tab_strip_model()->CloseWebContentsAt(0,
152                                                   TabStripModel::CLOSE_NONE);
153  TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
154}
155
156#if defined(USE_ASH)
157// This test fails on Ash because task manager treats view type
158// Panels differently for Ash.
159#define MAYBE_NoticePanelChanges DISABLED_NoticePanelChanges
160#else
161#define MAYBE_NoticePanelChanges NoticePanelChanges
162#endif
163IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, MAYBE_NoticePanelChanges) {
164  ASSERT_TRUE(LoadExtension(
165      test_data_dir_.AppendASCII("good").AppendASCII("Extensions")
166                    .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
167                    .AppendASCII("1.0.0.0")));
168
169  // Browser, the New Tab Page and Extension background page.
170  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
171
172  // Open a new panel to an extension url and make sure we notice that.
173  GURL url(
174    "chrome-extension://behllobkkfkfnphdnhnkndlbkcpglgmj/french_sentence.html");
175  Panel* panel = PanelManager::GetInstance()->CreatePanel(
176      web_app::GenerateApplicationNameFromExtensionId(
177          last_loaded_extension_id()),
178      browser()->profile(),
179      url,
180      gfx::Rect(300, 400),
181      PanelManager::CREATE_AS_DOCKED);
182  TaskManagerBrowserTestUtil::WaitForWebResourceChange(3);
183
184  // Check that the fourth entry is a resource with the panel's web contents
185  // and whose title starts with "Extension:".
186  ASSERT_EQ(panel->GetWebContents(), model()->GetResourceWebContents(3));
187  base::string16 prefix = l10n_util::GetStringFUTF16(
188      IDS_TASK_MANAGER_EXTENSION_PREFIX, base::string16());
189  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(3), prefix, true));
190
191  // Close the panel and verify that we notice.
192  panel->Close();
193  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
194
195  // Unload extension to avoid crash on Windows.
196  UnloadExtension(last_loaded_extension_id());
197  TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
198}
199
200#if defined(USE_ASH) || defined(OS_WIN)
201// This test fails on Ash because task manager treats view type
202// Panels differently for Ash.
203// This test also fails on Windows, win_rel trybot. http://crbug.com/166322
204#define MAYBE_KillPanelExtension DISABLED_KillPanelExtension
205#else
206#define MAYBE_KillPanelExtension KillPanelExtension
207#endif
208IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, MAYBE_KillPanelExtension) {
209  int resource_count = TaskManager::GetInstance()->model()->ResourceCount();
210
211  ASSERT_TRUE(LoadExtension(
212      test_data_dir_.AppendASCII("good").AppendASCII("Extensions")
213                    .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
214                    .AppendASCII("1.0.0.0")));
215
216  // Browser, the New Tab Page and Extension background page.
217  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
218
219  // Open a new panel to an extension url and make sure we notice that.
220  GURL url(
221    "chrome-extension://behllobkkfkfnphdnhnkndlbkcpglgmj/french_sentence.html");
222  PanelManager::GetInstance()->CreatePanel(
223      web_app::GenerateApplicationNameFromExtensionId(
224          last_loaded_extension_id()),
225      browser()->profile(),
226      url,
227      gfx::Rect(300, 400),
228      PanelManager::CREATE_AS_DOCKED);
229  TaskManagerBrowserTestUtil::WaitForWebResourceChange(3);
230
231  // Kill the panel extension process and verify that it disappears from the
232  // model along with its panel.
233  ASSERT_TRUE(model()->IsBackgroundResource(resource_count));
234  TaskManager::GetInstance()->KillProcess(resource_count);
235  TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
236}
237
238IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeExtensionTabs) {
239  int resource_count = TaskManager::GetInstance()->model()->ResourceCount();
240  ASSERT_TRUE(LoadExtension(
241      test_data_dir_.AppendASCII("good").AppendASCII("Extensions")
242                    .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
243                    .AppendASCII("1.0.0.0")));
244
245  // Browser, Extension background page, and the New Tab Page.
246  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
247
248  // Open a new tab to an extension URL and make sure we notice that.
249  GURL url("chrome-extension://behllobkkfkfnphdnhnkndlbkcpglgmj/page.html");
250  AddTabAtIndex(0, url, content::PAGE_TRANSITION_TYPED);
251  TaskManagerBrowserTestUtil::WaitForWebResourceChange(3);
252
253  // Check that the third entry (background) is an extension resource whose
254  // title starts with "Extension:".
255  ASSERT_EQ(task_manager::Resource::EXTENSION, model()->GetResourceType(
256      resource_count));
257  ASSERT_TRUE(model()->GetResourceWebContents(resource_count) == NULL);
258  ASSERT_TRUE(model()->GetResourceExtension(resource_count) != NULL);
259  base::string16 prefix = l10n_util::GetStringFUTF16(
260      IDS_TASK_MANAGER_EXTENSION_PREFIX, base::string16());
261  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count),
262                         prefix, true));
263
264  // Check that the fourth entry (page.html) is of type extension and has both
265  // a tab contents and an extension. The title should start with "Extension:".
266  ASSERT_EQ(task_manager::Resource::EXTENSION, model()->GetResourceType(
267      resource_count + 1));
268  ASSERT_TRUE(model()->GetResourceWebContents(resource_count + 1) != NULL);
269  ASSERT_TRUE(model()->GetResourceExtension(resource_count + 1) != NULL);
270  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count + 1),
271                         prefix, true));
272
273  // Unload extension to avoid crash on Windows.
274  UnloadExtension(last_loaded_extension_id());
275  TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
276}
277
278IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeAppTabs) {
279  int resource_count = TaskManager::GetInstance()->model()->ResourceCount();
280  ASSERT_TRUE(LoadExtension(
281      test_data_dir_.AppendASCII("packaged_app")));
282  ExtensionService* service = extensions::ExtensionSystem::Get(
283      browser()->profile())->extension_service();
284  const extensions::Extension* extension =
285      service->GetExtensionById(last_loaded_extension_id(), false);
286
287  // New Tab Page.
288  TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
289
290  // Open a new tab to the app's launch URL and make sure we notice that.
291  GURL url(extension->GetResourceURL("main.html"));
292  AddTabAtIndex(0, url, content::PAGE_TRANSITION_TYPED);
293  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
294
295  // Check that the third entry (main.html) is of type extension and has both
296  // a tab contents and an extension. The title should start with "App:".
297  ASSERT_EQ(task_manager::Resource::EXTENSION, model()->GetResourceType(
298      resource_count));
299  ASSERT_TRUE(model()->GetResourceWebContents(resource_count) != NULL);
300  ASSERT_TRUE(model()->GetResourceExtension(resource_count) == extension);
301  base::string16 prefix = l10n_util::GetStringFUTF16(
302      IDS_TASK_MANAGER_APP_PREFIX, base::string16());
303  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count),
304                         prefix, true));
305
306  // Unload extension to avoid crash on Windows.
307  UnloadExtension(last_loaded_extension_id());
308  TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
309}
310
311IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeHostedAppTabs) {
312  int resource_count = TaskManager::GetInstance()->model()->ResourceCount();
313
314  // The app under test acts on URLs whose host is "localhost",
315  // so the URLs we navigate to must have host "localhost".
316  host_resolver()->AddRule("*", "127.0.0.1");
317  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
318  GURL::Replacements replace_host;
319  std::string host_str("localhost");  // must stay in scope with replace_host
320  replace_host.SetHostStr(host_str);
321  GURL base_url = embedded_test_server()->GetURL(
322      "/extensions/api_test/app_process/");
323  base_url = base_url.ReplaceComponents(replace_host);
324
325  // Open a new tab to an app URL before the app is loaded.
326  GURL url(base_url.Resolve("path1/empty.html"));
327  content::WindowedNotificationObserver observer(
328      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
329      content::NotificationService::AllSources());
330  AddTabAtIndex(0, url, content::PAGE_TRANSITION_TYPED);
331  observer.Wait();
332
333  // Force the TaskManager to query the title.
334  Refresh();
335
336  // Check that the third entry's title starts with "Tab:".
337  base::string16 tab_prefix = l10n_util::GetStringFUTF16(
338      IDS_TASK_MANAGER_TAB_PREFIX, base::string16());
339  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count),
340                         tab_prefix, true));
341
342  // Load the hosted app and make sure it still starts with "Tab:",
343  // since it hasn't changed to an app process yet.
344  ASSERT_TRUE(LoadExtension(
345      test_data_dir_.AppendASCII("api_test").AppendASCII("app_process")));
346  // Force the TaskManager to query the title.
347  Refresh();
348  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count),
349                         tab_prefix, true));
350
351  // Now reload and check that the last entry's title now starts with "App:".
352  ui_test_utils::NavigateToURL(browser(), url);
353  // Force the TaskManager to query the title.
354  Refresh();
355  base::string16 app_prefix = l10n_util::GetStringFUTF16(
356      IDS_TASK_MANAGER_APP_PREFIX, base::string16());
357  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count),
358                         app_prefix, true));
359
360  // Disable extension and reload page.
361  DisableExtension(last_loaded_extension_id());
362  ui_test_utils::NavigateToURL(browser(), url);
363
364  // Force the TaskManager to query the title.
365  Refresh();
366
367  // The third entry's title should be back to a normal tab.
368  ASSERT_TRUE(StartsWith(model()->GetResourceTitle(resource_count),
369                         tab_prefix, true));
370}
371
372// Disabled, http://crbug.com/66957.
373IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest,
374                       DISABLED_KillExtensionAndReload) {
375  ASSERT_TRUE(LoadExtension(
376      test_data_dir_.AppendASCII("common").AppendASCII("background_page")));
377
378  // Wait until we see the loaded extension in the task manager (the three
379  // resources are: the browser process, New Tab Page, and the extension).
380  TaskManagerBrowserTestUtil::WaitForWebResourceChange(3);
381
382  EXPECT_TRUE(model()->GetResourceExtension(0) == NULL);
383  EXPECT_TRUE(model()->GetResourceExtension(1) == NULL);
384  ASSERT_TRUE(model()->GetResourceExtension(2) != NULL);
385
386  // Kill the extension process and make sure we notice it.
387  TaskManager::GetInstance()->KillProcess(2);
388  TaskManagerBrowserTestUtil::WaitForWebResourceChange(1);
389
390  // Reload the extension using the "crashed extension" infobar while the task
391  // manager is still visible. Make sure we don't crash and the extension
392  // gets reloaded and noticed in the task manager.
393  InfoBarService* infobar_service = InfoBarService::FromWebContents(
394      browser()->tab_strip_model()->GetActiveWebContents());
395  ASSERT_EQ(1U, infobar_service->infobar_count());
396  ConfirmInfoBarDelegate* delegate =
397      infobar_service->infobar_at(0)->delegate()->AsConfirmInfoBarDelegate();
398  ASSERT_TRUE(delegate);
399  delegate->Accept();
400  TaskManagerBrowserTestUtil::WaitForWebResourceChange(3);
401}
402
403#if defined(OS_WIN)
404// http://crbug.com/93158.
405#define MAYBE_ReloadExtension DISABLED_ReloadExtension
406#else
407#define MAYBE_ReloadExtension ReloadExtension
408#endif
409
410// Regression test for http://crbug.com/18693.
411IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, MAYBE_ReloadExtension) {
412  int resource_count = TaskManager::GetInstance()->model()->ResourceCount();
413  LOG(INFO) << "loading extension";
414  ASSERT_TRUE(LoadExtension(
415      test_data_dir_.AppendASCII("common").AppendASCII("background_page")));
416
417  // Wait until we see the loaded extension in the task manager (the three
418  // resources are: the browser process, New Tab Page, and the extension).
419  LOG(INFO) << "waiting for resource change";
420  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
421
422  EXPECT_TRUE(model()->GetResourceExtension(0) == NULL);
423  EXPECT_TRUE(model()->GetResourceExtension(1) == NULL);
424  ASSERT_TRUE(model()->GetResourceExtension(resource_count) != NULL);
425
426  const extensions::Extension* extension = model()->GetResourceExtension(
427      resource_count);
428  ASSERT_TRUE(extension != NULL);
429
430  // Reload the extension a few times and make sure our resource count
431  // doesn't increase.
432  LOG(INFO) << "First extension reload";
433  ReloadExtension(extension->id());
434  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
435  extension = model()->GetResourceExtension(resource_count);
436  ASSERT_TRUE(extension != NULL);
437
438  LOG(INFO) << "Second extension reload";
439  ReloadExtension(extension->id());
440  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
441  extension = model()->GetResourceExtension(resource_count);
442  ASSERT_TRUE(extension != NULL);
443
444  LOG(INFO) << "Third extension reload";
445  ReloadExtension(extension->id());
446  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
447}
448
449// Crashy, http://crbug.com/42301.
450IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest,
451                       DISABLED_PopulateWebCacheFields) {
452  int resource_count = TaskManager::GetInstance()->model()->ResourceCount();
453
454  // Open a new tab and make sure we notice that.
455  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
456      base::FilePath::kCurrentDirectory), base::FilePath(kTitle1File)));
457  AddTabAtIndex(0, url, content::PAGE_TRANSITION_TYPED);
458  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
459
460  // Check that we get some value for the cache columns.
461  DCHECK_NE(model()->GetResourceWebCoreImageCacheSize(resource_count),
462            l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT));
463  DCHECK_NE(model()->GetResourceWebCoreScriptsCacheSize(resource_count),
464            l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT));
465  DCHECK_NE(model()->GetResourceWebCoreCSSCacheSize(resource_count),
466            l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT));
467}
468
469// Checks that task manager counts a worker thread JS heap size.
470// http://crbug.com/241066
471// Flaky, http://crbug.com/259368
472IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, DISABLED_WebWorkerJSHeapMemory) {
473  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
474      base::FilePath::kCurrentDirectory), base::FilePath(kTitle1File)));
475  ui_test_utils::NavigateToURL(browser(), url);
476  const int extra_timeout_ms = 500;
477  size_t minimal_heap_size = 2 * 1024 * 1024 * sizeof(void*);
478  std::string test_js = base::StringPrintf(
479      "var blob = new Blob([\n"
480      "    'mem = new Array(%lu);',\n"
481      "    'for (var i = 0; i < mem.length; i += 16) mem[i] = i;',\n"
482      "    'postMessage();']);\n"
483      "blobURL = window.URL.createObjectURL(blob);\n"
484      "worker = new Worker(blobURL);\n"
485      "// Give the task manager few seconds to poll for JS heap sizes.\n"
486      "worker.onmessage = setTimeout.bind(\n"
487      "    this,\n"
488      "    function () { window.domAutomationController.send(true); },\n"
489      "    %d);\n"
490      "worker.postMessage();\n",
491      static_cast<unsigned long>(minimal_heap_size),
492      GetUpdateTimeMs() + extra_timeout_ms);
493  bool ok;
494  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
495      browser()->tab_strip_model()->GetActiveWebContents(), test_js, &ok));
496  ASSERT_TRUE(ok);
497
498  int resource_index = TaskManager::GetInstance()->model()->ResourceCount() - 1;
499  size_t result;
500
501  ASSERT_TRUE(model()->GetV8Memory(resource_index, &result));
502  LOG(INFO) << "Got V8 Heap Size " << result << " bytes";
503  EXPECT_GE(result, minimal_heap_size);
504
505  ASSERT_TRUE(model()->GetV8MemoryUsed(resource_index, &result));
506  LOG(INFO) << "Got V8 Used Heap Size " << result << " bytes";
507  EXPECT_GE(result, minimal_heap_size);
508}
509
510IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeInTabDevToolsWindow) {
511  DevToolsWindow::OpenDevToolsWindowForTest(
512      model()->GetResourceWebContents(1)->GetRenderViewHost(), true);
513  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
514}
515
516// This test differs from TaskManagerBrowserTest.NoticeInTabDevToolsWindow in
517// the order in which the devtools window and task manager are created.
518IN_PROC_BROWSER_TEST_F(TaskManagerNoShowBrowserTest,
519                       NoticeInTabDevToolsWindow) {
520  // First create the devtools window.
521  DevToolsWindow::OpenDevToolsWindowForTest(
522      browser()->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost(),
523      true);
524  // Make sure that the devtools window is loaded before starting the task
525  // manager.
526  content::RunAllPendingInMessageLoop();
527
528  // Now add showing the task manager to the queue, and watch for the right
529  // number of reources to show up.
530  base::MessageLoop::current()->PostTask(
531      FROM_HERE,
532      base::Bind(&TaskManagerNoShowBrowserTest::ShowTaskManager,
533                 base::Unretained(this)));
534  TaskManagerBrowserTestUtil::WaitForWebResourceChange(2);
535}
536