Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(157)

Side by Side Diff: chrome/browser/debugger/devtools_sanity_browsertest.cc

Issue 11630004: DevTools: rename debugger/ to devtools/, move DevTools files into content/renderer/devtools. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: For landing Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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/bind.h"
6 #include "base/cancelable_callback.h"
7 #include "base/command_line.h"
8 #include "base/compiler_specific.h"
9 #include "base/memory/ref_counted.h"
10 #include "base/path_service.h"
11 #include "base/stringprintf.h"
12 #include "base/test/test_timeouts.h"
13 #include "base/utf_string_conversions.h"
14 #include "chrome/browser/debugger/devtools_window.h"
15 #include "chrome/browser/extensions/extension_service.h"
16 #include "chrome/browser/extensions/extension_system.h"
17 #include "chrome/browser/extensions/unpacked_installer.h"
18 #include "chrome/browser/profiles/profile.h"
19 #include "chrome/browser/ui/browser.h"
20 #include "chrome/browser/ui/browser_commands.h"
21 #include "chrome/browser/ui/browser_tabstrip.h"
22 #include "chrome/browser/ui/tabs/tab_strip_model.h"
23 #include "chrome/common/chrome_notification_types.h"
24 #include "chrome/common/chrome_paths.h"
25 #include "chrome/common/chrome_switches.h"
26 #include "chrome/test/base/in_process_browser_test.h"
27 #include "chrome/test/base/ui_test_utils.h"
28 #include "content/public/browser/child_process_data.h"
29 #include "content/public/browser/content_browser_client.h"
30 #include "content/public/browser/devtools_agent_host_registry.h"
31 #include "content/public/browser/devtools_client_host.h"
32 #include "content/public/browser/devtools_manager.h"
33 #include "content/public/browser/notification_registrar.h"
34 #include "content/public/browser/notification_service.h"
35 #include "content/public/browser/render_view_host.h"
36 #include "content/public/browser/web_contents.h"
37 #include "content/public/browser/worker_service.h"
38 #include "content/public/browser/worker_service_observer.h"
39 #include "content/public/test/browser_test_utils.h"
40 #include "net/test/test_server.h"
41
42 using content::BrowserThread;
43 using content::DevToolsManager;
44 using content::DevToolsAgentHost;
45 using content::DevToolsAgentHostRegistry;
46 using content::NavigationController;
47 using content::RenderViewHost;
48 using content::WebContents;
49 using content::WorkerService;
50 using content::WorkerServiceObserver;
51
52 namespace {
53
54 // Used to block until a dev tools client window's browser is closed.
55 class BrowserClosedObserver : public content::NotificationObserver {
56 public:
57 explicit BrowserClosedObserver(Browser* browser) {
58 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_CLOSED,
59 content::Source<Browser>(browser));
60 content::RunMessageLoop();
61 }
62
63 virtual void Observe(int type,
64 const content::NotificationSource& source,
65 const content::NotificationDetails& details) {
66 MessageLoopForUI::current()->Quit();
67 }
68
69 private:
70 content::NotificationRegistrar registrar_;
71 DISALLOW_COPY_AND_ASSIGN(BrowserClosedObserver);
72 };
73
74 // The delay waited in some cases where we don't have a notifications for an
75 // action we take.
76 const int kActionDelayMs = 500;
77
78 const char kDebuggerTestPage[] = "files/devtools/debugger_test_page.html";
79 const char kPauseWhenLoadingDevTools[] =
80 "files/devtools/pause_when_loading_devtools.html";
81 const char kPauseWhenScriptIsRunning[] =
82 "files/devtools/pause_when_script_is_running.html";
83 const char kPageWithContentScript[] =
84 "files/devtools/page_with_content_script.html";
85 const char kNavigateBackTestPage[] =
86 "files/devtools/navigate_back.html";
87 const char kChunkedTestPage[] = "chunked";
88 const char kSlowTestPage[] =
89 "chunked?waitBeforeHeaders=100&waitBetweenChunks=100&chunksNumber=2";
90 const char kSharedWorkerTestPage[] =
91 "files/workers/workers_ui_shared_worker.html";
92 const char kReloadSharedWorkerTestPage[] =
93 "files/workers/debug_shared_worker_initialization.html";
94
95 void RunTestFunction(DevToolsWindow* window, const char* test_name) {
96 std::string result;
97
98 // At first check that JavaScript part of the front-end is loaded by
99 // checking that global variable uiTests exists(it's created after all js
100 // files have been loaded) and has runTest method.
101 ASSERT_TRUE(
102 content::ExecuteJavaScriptAndExtractString(
103 window->GetRenderViewHost(),
104 L"",
105 L"window.domAutomationController.send("
106 L"'' + (window.uiTests && (typeof uiTests.runTest)));",
107 &result));
108
109 if (result == "function") {
110 ASSERT_TRUE(
111 content::ExecuteJavaScriptAndExtractString(
112 window->GetRenderViewHost(),
113 L"",
114 UTF8ToWide(base::StringPrintf("uiTests.runTest('%s')",
115 test_name)),
116 &result));
117 EXPECT_EQ("[OK]", result);
118 } else {
119 FAIL() << "DevTools front-end is broken.";
120 }
121 }
122
123 class DevToolsSanityTest : public InProcessBrowserTest {
124 public:
125 DevToolsSanityTest()
126 : window_(NULL),
127 inspected_rvh_(NULL) {}
128
129 protected:
130 void RunTest(const std::string& test_name, const std::string& test_page) {
131 OpenDevToolsWindow(test_page);
132 RunTestFunction(window_, test_name.c_str());
133 CloseDevToolsWindow();
134 }
135
136 void OpenDevToolsWindow(const std::string& test_page) {
137 ASSERT_TRUE(test_server()->Start());
138 GURL url = test_server()->GetURL(test_page);
139 ui_test_utils::NavigateToURL(browser(), url);
140
141 content::WindowedNotificationObserver observer(
142 content::NOTIFICATION_LOAD_STOP,
143 content::NotificationService::AllSources());
144 inspected_rvh_ = GetInspectedTab()->GetRenderViewHost();
145 window_ = DevToolsWindow::OpenDevToolsWindow(inspected_rvh_);
146 observer.Wait();
147 }
148
149 WebContents* GetInspectedTab() {
150 return chrome::GetWebContentsAt(browser(), 0);
151 }
152
153 void CloseDevToolsWindow() {
154 DevToolsManager* devtools_manager = DevToolsManager::GetInstance();
155 // UnregisterDevToolsClientHostFor may destroy window_ so store the browser
156 // first.
157 Browser* browser = window_->browser();
158 DevToolsAgentHost* agent = DevToolsAgentHostRegistry::GetDevToolsAgentHost(
159 inspected_rvh_);
160 devtools_manager->UnregisterDevToolsClientHostFor(agent);
161
162 // Wait only when DevToolsWindow has a browser. For docked DevTools, this
163 // is NULL and we skip the wait.
164 if (browser)
165 BrowserClosedObserver close_observer(browser);
166 }
167
168 DevToolsWindow* window_;
169 RenderViewHost* inspected_rvh_;
170 };
171
172 void TimeoutCallback(const std::string& timeout_message) {
173 FAIL() << timeout_message;
174 MessageLoop::current()->Quit();
175 }
176
177 // Base class for DevTools tests that test devtools functionality for
178 // extensions and content scripts.
179 class DevToolsExtensionTest : public DevToolsSanityTest,
180 public content::NotificationObserver {
181 public:
182 DevToolsExtensionTest() : DevToolsSanityTest() {
183 PathService::Get(chrome::DIR_TEST_DATA, &test_extensions_dir_);
184 test_extensions_dir_ = test_extensions_dir_.AppendASCII("devtools");
185 test_extensions_dir_ = test_extensions_dir_.AppendASCII("extensions");
186 }
187
188 protected:
189 // Load an extension from test\data\devtools\extensions\<extension_name>
190 void LoadExtension(const char* extension_name) {
191 FilePath path = test_extensions_dir_.AppendASCII(extension_name);
192 ASSERT_TRUE(LoadExtensionFromPath(path)) << "Failed to load extension.";
193 }
194
195 private:
196 bool LoadExtensionFromPath(const FilePath& path) {
197 ExtensionService* service = extensions::ExtensionSystem::Get(
198 browser()->profile())->extension_service();
199 size_t num_before = service->extensions()->size();
200 {
201 content::NotificationRegistrar registrar;
202 registrar.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
203 content::NotificationService::AllSources());
204 base::CancelableClosure timeout(
205 base::Bind(&TimeoutCallback, "Extension load timed out."));
206 MessageLoop::current()->PostDelayedTask(
207 FROM_HERE, timeout.callback(), base::TimeDelta::FromSeconds(4));
208 extensions::UnpackedInstaller::Create(service)->Load(path);
209 content::RunMessageLoop();
210 timeout.Cancel();
211 }
212 size_t num_after = service->extensions()->size();
213 if (num_after != (num_before + 1))
214 return false;
215
216 return WaitForExtensionViewsToLoad();
217 }
218
219 bool WaitForExtensionViewsToLoad() {
220 // Wait for all the extension render views that exist to finish loading.
221 // NOTE: This assumes that the extension views list is not changing while
222 // this method is running.
223
224 content::NotificationRegistrar registrar;
225 registrar.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING,
226 content::NotificationService::AllSources());
227 base::CancelableClosure timeout(
228 base::Bind(&TimeoutCallback, "Extension host load timed out."));
229 MessageLoop::current()->PostDelayedTask(
230 FROM_HERE, timeout.callback(), base::TimeDelta::FromSeconds(4));
231
232 ExtensionProcessManager* manager =
233 extensions::ExtensionSystem::Get(browser()->profile())->
234 process_manager();
235 ExtensionProcessManager::ViewSet all_views = manager->GetAllViews();
236 for (ExtensionProcessManager::ViewSet::const_iterator iter =
237 all_views.begin();
238 iter != all_views.end();) {
239 if (!(*iter)->IsLoading())
240 ++iter;
241 else
242 content::RunMessageLoop();
243 }
244
245 timeout.Cancel();
246 return true;
247 }
248
249 void Observe(int type,
250 const content::NotificationSource& source,
251 const content::NotificationDetails& details) {
252 switch (type) {
253 case chrome::NOTIFICATION_EXTENSION_LOADED:
254 case chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING:
255 MessageLoopForUI::current()->Quit();
256 break;
257 default:
258 NOTREACHED();
259 break;
260 }
261 }
262
263 FilePath test_extensions_dir_;
264 };
265
266 class DevToolsExperimentalExtensionTest : public DevToolsExtensionTest {
267 public:
268 void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
269 command_line->AppendSwitch(switches::kEnableExperimentalExtensionApis);
270 }
271 };
272
273 class WorkerDevToolsSanityTest : public InProcessBrowserTest {
274 public:
275 WorkerDevToolsSanityTest() : window_(NULL) {}
276
277 protected:
278 class WorkerData : public base::RefCountedThreadSafe<WorkerData> {
279 public:
280 WorkerData() : worker_process_id(0), worker_route_id(0) {}
281 int worker_process_id;
282 int worker_route_id;
283
284 private:
285 friend class base::RefCountedThreadSafe<WorkerData>;
286 ~WorkerData() {}
287 };
288
289 class WorkerCreationObserver : public WorkerServiceObserver {
290 public:
291 explicit WorkerCreationObserver(WorkerData* worker_data)
292 : worker_data_(worker_data) {
293 }
294
295 private:
296 virtual ~WorkerCreationObserver() {}
297
298 virtual void WorkerCreated (
299 const GURL& url,
300 const string16& name,
301 int process_id,
302 int route_id) OVERRIDE {
303 worker_data_->worker_process_id = process_id;
304 worker_data_->worker_route_id = route_id;
305 WorkerService::GetInstance()->RemoveObserver(this);
306 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
307 MessageLoop::QuitClosure());
308 delete this;
309 }
310 scoped_refptr<WorkerData> worker_data_;
311 };
312
313 class WorkerTerminationObserver : public WorkerServiceObserver {
314 public:
315 explicit WorkerTerminationObserver(WorkerData* worker_data)
316 : worker_data_(worker_data) {
317 }
318
319 private:
320 virtual ~WorkerTerminationObserver() {}
321
322 virtual void WorkerDestroyed(int process_id, int route_id) OVERRIDE {
323 ASSERT_EQ(worker_data_->worker_process_id, process_id);
324 ASSERT_EQ(worker_data_->worker_route_id, route_id);
325 WorkerService::GetInstance()->RemoveObserver(this);
326 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
327 MessageLoop::QuitClosure());
328 delete this;
329 }
330 scoped_refptr<WorkerData> worker_data_;
331 };
332
333 void RunTest(const char* test_name, const char* test_page) {
334 ASSERT_TRUE(test_server()->Start());
335 GURL url = test_server()->GetURL(test_page);
336 ui_test_utils::NavigateToURL(browser(), url);
337
338 scoped_refptr<WorkerData> worker_data = WaitForFirstSharedWorker();
339 OpenDevToolsWindowForSharedWorker(worker_data.get());
340 RunTestFunction(window_, test_name);
341 CloseDevToolsWindow();
342 }
343
344 static void TerminateWorkerOnIOThread(scoped_refptr<WorkerData> worker_data) {
345 if (WorkerService::GetInstance()->TerminateWorker(
346 worker_data->worker_process_id, worker_data->worker_route_id)) {
347 WorkerService::GetInstance()->AddObserver(
348 new WorkerTerminationObserver(worker_data));
349 return;
350 }
351 FAIL() << "Failed to terminate worker.\n";
352 }
353
354 static void TerminateWorker(scoped_refptr<WorkerData> worker_data) {
355 BrowserThread::PostTask(
356 BrowserThread::IO, FROM_HERE,
357 base::Bind(&TerminateWorkerOnIOThread, worker_data));
358 content::RunMessageLoop();
359 }
360
361 static void WaitForFirstSharedWorkerOnIOThread(
362 scoped_refptr<WorkerData> worker_data) {
363 std::vector<WorkerService::WorkerInfo> worker_info =
364 WorkerService::GetInstance()->GetWorkers();
365 if (!worker_info.empty()) {
366 worker_data->worker_process_id = worker_info[0].process_id;
367 worker_data->worker_route_id = worker_info[0].route_id;
368 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
369 MessageLoop::QuitClosure());
370 return;
371 }
372
373 WorkerService::GetInstance()->AddObserver(
374 new WorkerCreationObserver(worker_data.get()));
375 }
376
377 static scoped_refptr<WorkerData> WaitForFirstSharedWorker() {
378 scoped_refptr<WorkerData> worker_data(new WorkerData());
379 BrowserThread::PostTask(
380 BrowserThread::IO, FROM_HERE,
381 base::Bind(&WaitForFirstSharedWorkerOnIOThread, worker_data));
382 content::RunMessageLoop();
383 return worker_data;
384 }
385
386 void OpenDevToolsWindowForSharedWorker(WorkerData* worker_data) {
387 Profile* profile = browser()->profile();
388 window_ = DevToolsWindow::CreateDevToolsWindowForWorker(profile);
389 window_->Show(DEVTOOLS_TOGGLE_ACTION_SHOW);
390 DevToolsAgentHost* agent_host =
391 DevToolsAgentHostRegistry::GetDevToolsAgentHostForWorker(
392 worker_data->worker_process_id,
393 worker_data->worker_route_id);
394 DevToolsManager::GetInstance()->RegisterDevToolsClientHostFor(
395 agent_host,
396 window_->devtools_client_host());
397 RenderViewHost* client_rvh = window_->GetRenderViewHost();
398 WebContents* client_contents = WebContents::FromRenderViewHost(client_rvh);
399 if (client_contents->IsLoading()) {
400 content::WindowedNotificationObserver observer(
401 content::NOTIFICATION_LOAD_STOP,
402 content::Source<NavigationController>(
403 &client_contents->GetController()));
404 observer.Wait();
405 }
406 }
407
408 void CloseDevToolsWindow() {
409 Browser* browser = window_->browser();
410 browser->tab_strip_model()->CloseAllTabs();
411 BrowserClosedObserver close_observer(browser);
412 }
413
414 DevToolsWindow* window_;
415 };
416
417
418 // Tests scripts panel showing.
419 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestShowScriptsTab) {
420 RunTest("testShowScriptsTab", kDebuggerTestPage);
421 }
422
423 // Tests that scripts tab is populated with inspected scripts even if it
424 // hadn't been shown by the moment inspected paged refreshed.
425 // @see http://crbug.com/26312
426 IN_PROC_BROWSER_TEST_F(
427 DevToolsSanityTest,
428 TestScriptsTabIsPopulatedOnInspectedPageRefresh) {
429 // Clear inspector settings to ensure that Elements will be
430 // current panel when DevTools window is open.
431 content::GetContentClient()->browser()->ClearInspectorSettings(
432 GetInspectedTab()->GetRenderViewHost());
433 RunTest("testScriptsTabIsPopulatedOnInspectedPageRefresh",
434 kDebuggerTestPage);
435 }
436
437 // Tests that chrome.devtools extension is correctly exposed.
438 IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
439 TestDevToolsExtensionAPI) {
440 LoadExtension("devtools_extension");
441 RunTest("waitForTestResultsInConsole", "");
442 }
443
444 // Tests that chrome.devtools extension can communicate with background page
445 // using extension messaging.
446 IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
447 TestDevToolsExtensionMessaging) {
448 LoadExtension("devtools_messaging");
449 RunTest("waitForTestResultsInConsole", "");
450 }
451
452 // Tests that chrome.experimental.devtools extension is correctly exposed
453 // when the extension has experimental permission.
454 IN_PROC_BROWSER_TEST_F(DevToolsExperimentalExtensionTest,
455 TestDevToolsExperimentalExtensionAPI) {
456 LoadExtension("devtools_experimental");
457 RunTest("waitForTestResultsInConsole", "");
458 }
459
460 // Tests that a content script is in the scripts list.
461 // http://crbug.com/114104
462 IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
463 TestContentScriptIsPresent) {
464 LoadExtension("simple_content_script");
465 RunTest("testContentScriptIsPresent", kPageWithContentScript);
466 }
467
468 // Tests that scripts are not duplicated after Scripts Panel switch.
469 // Disabled - see http://crbug.com/124300
470 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
471 TestNoScriptDuplicatesOnPanelSwitch) {
472 RunTest("testNoScriptDuplicatesOnPanelSwitch", kDebuggerTestPage);
473 }
474
475 // Tests that debugger works correctly if pause event occurs when DevTools
476 // frontend is being loaded.
477 // http://crbug.com/106114
478 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
479 TestPauseWhenLoadingDevTools) {
480 RunTest("testPauseWhenLoadingDevTools", kPauseWhenLoadingDevTools);
481 }
482
483 // Tests that pressing 'Pause' will pause script execution if the script
484 // is already running.
485 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestPauseWhenScriptIsRunning) {
486 RunTest("testPauseWhenScriptIsRunning", kPauseWhenScriptIsRunning);
487 }
488
489 // Tests network timing.
490 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkTiming) {
491 RunTest("testNetworkTiming", kSlowTestPage);
492 }
493
494 // Tests network size.
495 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkSize) {
496 RunTest("testNetworkSize", kChunkedTestPage);
497 }
498
499 // Tests raw headers text.
500 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkSyncSize) {
501 RunTest("testNetworkSyncSize", kChunkedTestPage);
502 }
503
504 // Tests raw headers text.
505 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkRawHeadersText) {
506 RunTest("testNetworkRawHeadersText", kChunkedTestPage);
507 }
508
509 // Tests that console messages are not duplicated on navigation back.
510 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestConsoleOnNavigateBack) {
511 RunTest("testConsoleOnNavigateBack", kNavigateBackTestPage);
512 }
513
514 // Tests that inspector will reattach to inspected page when it is reloaded
515 // after a crash. See http://crbug.com/101952
516 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestReattachAfterCrash) {
517 OpenDevToolsWindow(kDebuggerTestPage);
518
519 content::CrashTab(GetInspectedTab());
520 content::WindowedNotificationObserver observer(
521 content::NOTIFICATION_LOAD_STOP,
522 content::Source<NavigationController>(
523 &chrome::GetActiveWebContents(browser())->GetController()));
524 chrome::Reload(browser(), CURRENT_TAB);
525 observer.Wait();
526
527 RunTestFunction(window_, "testReattachAfterCrash");
528 CloseDevToolsWindow();
529 }
530
531 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestPageWithNoJavaScript) {
532 OpenDevToolsWindow("about:blank");
533 std::string result;
534 ASSERT_TRUE(
535 content::ExecuteJavaScriptAndExtractString(
536 window_->GetRenderViewHost(),
537 L"",
538 L"window.domAutomationController.send("
539 L"'' + (window.uiTests && (typeof uiTests.runTest)));",
540 &result));
541 ASSERT_EQ("function", result) << "DevTools front-end is broken.";
542 CloseDevToolsWindow();
543 }
544
545 #if defined(OS_MACOSX)
546 #define MAYBE_InspectSharedWorker DISABLED_InspectSharedWorker
547 #else
548 #define MAYBE_InspectSharedWorker InspectSharedWorker
549 #endif
550 // Flakily fails with 25s timeout: http://crbug.com/89845
551 IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest, MAYBE_InspectSharedWorker) {
552 RunTest("testSharedWorker", kSharedWorkerTestPage);
553 }
554
555 // http://crbug.com/100538
556 #if defined(OS_MACOSX) || defined(OS_WIN)
557 #define MAYBE_PauseInSharedWorkerInitialization DISABLED_PauseInSharedWorkerInit ialization
558 #else
559 #define MAYBE_PauseInSharedWorkerInitialization PauseInSharedWorkerInitializatio n
560 #endif
561
562 // http://crbug.com/106114 is masking
563 // MAYBE_PauseInSharedWorkerInitialization into
564 // DISABLED_PauseInSharedWorkerInitialization
565 IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest,
566 MAYBE_PauseInSharedWorkerInitialization) {
567 ASSERT_TRUE(test_server()->Start());
568 GURL url = test_server()->GetURL(kReloadSharedWorkerTestPage);
569 ui_test_utils::NavigateToURL(browser(), url);
570
571 scoped_refptr<WorkerData> worker_data = WaitForFirstSharedWorker();
572 OpenDevToolsWindowForSharedWorker(worker_data.get());
573
574 TerminateWorker(worker_data);
575
576 // Reload page to restart the worker.
577 ui_test_utils::NavigateToURL(browser(), url);
578
579 // Wait until worker script is paused on the debugger statement.
580 RunTestFunction(window_, "testPauseInSharedWorkerInitialization");
581 CloseDevToolsWindow();
582 }
583
584 // Tests DevToolsAgentHost::AddMessageToConsole.
585 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestAddMessageToConsole) {
586 OpenDevToolsWindow("about:blank");
587 DevToolsManager* devtools_manager = DevToolsManager::GetInstance();
588 DevToolsAgentHost* agent_host =
589 DevToolsAgentHostRegistry::GetDevToolsAgentHost(inspected_rvh_);
590 devtools_manager->AddMessageToConsole(agent_host,
591 content::CONSOLE_MESSAGE_LEVEL_LOG,
592 "log");
593 devtools_manager->AddMessageToConsole(agent_host,
594 content::CONSOLE_MESSAGE_LEVEL_ERROR,
595 "error");
596 RunTestFunction(window_, "checkLogAndErrorMessages");
597 CloseDevToolsWindow();
598 }
599
600 } // namespace
OLDNEW
« no previous file with comments | « chrome/browser/debugger/devtools_file_helper.cc ('k') | chrome/browser/debugger/devtools_toggle_action.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698