| OLD | NEW |
| (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 | |
| OLD | NEW |