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 "base/bind.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/cancelable_callback.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/prefs/pref_service.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h" 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/devtools/browser_list_tabcontents_provider.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/devtools/devtools_window.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/unpacked_installer.h" 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.h" 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/pref_names.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/child_process_data.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_client_host.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_http_handler.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/devtools_manager.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/worker_service.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/worker_service_observer.h" 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/content_switches.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "extensions/common/switches.h" 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/socket/tcp_listen_socket.h" 54b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsManager; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsAgentHost; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WorkerService; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WorkerServiceObserver; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDebuggerTestPage[] = "files/devtools/debugger_test_page.html"; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPauseWhenLoadingDevTools[] = 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/devtools/pause_when_loading_devtools.html"; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPauseWhenScriptIsRunning[] = 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/devtools/pause_when_script_is_running.html"; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPageWithContentScript[] = 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/devtools/page_with_content_script.html"; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNavigateBackTestPage[] = 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/devtools/navigate_back.html"; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kChunkedTestPage[] = "chunked"; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSlowTestPage[] = 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chunked?waitBeforeHeaders=100&waitBetweenChunks=100&chunksNumber=2"; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSharedWorkerTestPage[] = 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/workers/workers_ui_shared_worker.html"; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kReloadSharedWorkerTestPage[] = 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/workers/debug_shared_worker_initialization.html"; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunTestFunction(DevToolsWindow* window, const char* test_name) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // At first check that JavaScript part of the front-end is loaded by 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // checking that global variable uiTests exists(it's created after all js 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // files have been loaded) and has runTest method. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE( 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ExecuteScriptAndExtractString( 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->GetRenderViewHost(), 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(" 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " '' + (window.uiTests && (typeof uiTests.runTest)));", 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result)); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result == "function") { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE( 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ExecuteScriptAndExtractString( 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->GetRenderViewHost(), 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("uiTests.runTest('%s')", test_name), 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("[OK]", result); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAIL() << "DevTools front-end is broken."; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DevToolsSanityTest : public InProcessBrowserTest { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsSanityTest() 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : window_(NULL), 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inspected_rvh_(NULL) {} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunTest(const std::string& test_name, const std::string& test_page) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDevToolsWindow(test_page); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTestFunction(window_, test_name.c_str()); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseDevToolsWindow(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void LoadTestPage(const std::string& test_page) { 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver load_observer( 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL(test_page); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) load_observer.Wait(); 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void OpenDevToolsWindow(const std::string& test_page) { 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LoadTestPage(test_page); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inspected_rvh_ = GetInspectedTab()->GetRenderViewHost(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_ = DevToolsWindow::OpenDevToolsWindow(inspected_rvh_); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* GetInspectedTab() { 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return browser()->tab_strip_model()->GetWebContentsAt(0); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void ToggleDevToolsWindow() { 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::WindowedNotificationObserver close_observer( 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::NOTIFICATION_WEB_CONTENTS_DESTROYED, 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::Source<content::WebContents>(window_->web_contents())); 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DevToolsWindow::ToggleDevToolsWindow(inspected_rvh_, false, 1520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DevToolsToggleAction::Toggle()); 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) close_observer.Wait(); 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseDevToolsWindow() { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsManager* devtools_manager = DevToolsManager::GetInstance(); 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::WindowedNotificationObserver close_observer( 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::NOTIFICATION_WEB_CONTENTS_DESTROYED, 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::Source<content::WebContents>(window_->web_contents())); 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) devtools_manager->CloseAllClientHosts(); 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) close_observer.Wait(); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsWindow* window_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* inspected_rvh_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Used to block until a dev tools window gets beforeunload event. 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class DevToolsWindowBeforeUnloadObserver 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public content::WebContentsObserver { 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) explicit DevToolsWindowBeforeUnloadObserver(DevToolsWindow*); 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Wait(); 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Invoked when the beforeunload handler fires. 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void BeforeUnloadFired(const base::TimeTicks& proceed_time) OVERRIDE; 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool m_fired; 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<content::MessageLoopRunner> message_loop_runner_; 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DevToolsWindowBeforeUnloadObserver); 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)DevToolsWindowBeforeUnloadObserver::DevToolsWindowBeforeUnloadObserver( 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DevToolsWindow* devtools_window) 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : WebContentsObserver(devtools_window->web_contents()), 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) m_fired(false) { 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void DevToolsWindowBeforeUnloadObserver::Wait() { 191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (m_fired) 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) message_loop_runner_ = new content::MessageLoopRunner; 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) message_loop_runner_->Run(); 1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void DevToolsWindowBeforeUnloadObserver::BeforeUnloadFired( 1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::TimeTicks& proceed_time) { 1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) m_fired = true; 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (message_loop_runner_.get()) 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) message_loop_runner_->Quit(); 2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class DevToolsBeforeUnloadTest: public DevToolsSanityTest { 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) command_line->AppendSwitch( 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switches::kDisableHangMonitor); 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void CloseInspectedTab() { 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser()->tab_strip_model()->CloseWebContentsAt(0, 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TabStripModel::CLOSE_NONE); 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void CloseDockedDevTools() { 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DevToolsWindow::ToggleDevToolsWindow(inspected_rvh_, false, 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DevToolsToggleAction::Toggle()); 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void CloseUndockedDevTools() { 222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::CloseWindow(window_->browser()); 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void CloseInspectedBrowser() { 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::CloseWindow(browser()); 227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void InjectBeforeUnloadListener(content::WebContents* web_contents) { 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScript(web_contents->GetRenderViewHost(), 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "window.addEventListener('beforeunload'," 232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "function(event) { event.returnValue = 'Foo'; });")); 233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void RunBeforeUnloadSanityTest(DevToolsDockSide dock_side, 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Callback<void(void)> close_method, 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool wait_for_browser_close = true) { 238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OpenDevToolsWindow(kDebuggerTestPage); 239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_->SetDockSideForTest(dock_side); 240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver devtools_close_observer( 241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NOTIFICATION_WEB_CONTENTS_DESTROYED, 242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::Source<content::WebContents>(window_->web_contents())); 243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InjectBeforeUnloadListener(window_->web_contents()); 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DevToolsWindowBeforeUnloadObserver before_unload_observer(window_); 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) close_method.Run(); 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CancelModalDialog(); 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) before_unload_observer.Wait(); 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver close_observer( 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSED, 253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::Source<Browser>(browser())); 254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) close_method.Run(); 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AcceptModalDialog(); 256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (wait_for_browser_close) 257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) close_observer.Wait(); 258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) devtools_close_observer.Wait(); 260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DevToolsWindow* OpenDevToolWindowOnWebContents( 263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WebContents* contents) { 264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver observer( 265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DevToolsWindow* window = DevToolsWindow::OpenDevToolsWindow( 268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) contents->GetRenderViewHost()); 269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return window; 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OpenDevToolsPopupWindow(DevToolsWindow* devtools_window) { 274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::WindowedNotificationObserver observer( 275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::NotificationService::AllSources()); 277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(content::ExecuteScript( 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) devtools_window->web_contents()->GetRenderViewHost(), 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "window.open(\"\", \"\", \"location=0\");")); 280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) observer.Wait(); 281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void CloseDevToolsPopupWindow(DevToolsWindow* devtools_window) { 284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Browser* popup_browser = NULL; 285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (chrome::BrowserIterator it; !it.done(); it.Next()) { 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (it->is_devtools()) { 287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::WebContents* contents = 288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) it->tab_strip_model()->GetWebContentsAt(0); 289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (devtools_window->web_contents() != contents) { 290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) popup_browser = *it; 291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_FALSE(popup_browser == NULL); 296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::WindowedNotificationObserver close_observer( 297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSED, 298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::Source<Browser>(popup_browser)); 299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) chrome::CloseWindow(popup_browser); 300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) close_observer.Wait(); 301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void AcceptModalDialog() { 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NativeAppModalDialog* native_dialog = GetDialog(); 305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) native_dialog->AcceptAppModalDialog(); 306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void CancelModalDialog() { 309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NativeAppModalDialog* native_dialog = GetDialog(); 310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) native_dialog->CancelAppModalDialog(); 311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NativeAppModalDialog* GetDialog() { 314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AppModalDialog* dialog = ui_test_utils::WaitForAppModalDialog(); 315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(dialog->IsJavaScriptModalDialog()); 316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) JavaScriptAppModalDialog* js_dialog = 317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<JavaScriptAppModalDialog*>(dialog); 318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NativeAppModalDialog* native_dialog = js_dialog->native_dialog(); 319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(native_dialog); 320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return native_dialog; 321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class DevToolsUnresponsiveBeforeUnloadTest: public DevToolsBeforeUnloadTest { 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {} 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TimeoutCallback(const std::string& timeout_message) { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAIL() << timeout_message; 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for DevTools tests that test devtools functionality for 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions and content scripts. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DevToolsExtensionTest : public DevToolsSanityTest, 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::NotificationObserver { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsExtensionTest() : DevToolsSanityTest() { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &test_extensions_dir_); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_extensions_dir_ = test_extensions_dir_.AppendASCII("devtools"); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_extensions_dir_ = test_extensions_dir_.AppendASCII("extensions"); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load an extension from test\data\devtools\extensions\<extension_name> 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadExtension(const char* extension_name) { 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path = test_extensions_dir_.AppendASCII(extension_name); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtensionFromPath(path)) << "Failed to load extension."; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool LoadExtensionFromPath(const base::FilePath& path) { 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* service = extensions::ExtensionSystem::Get( 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->profile())->extension_service(); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t num_before = service->extensions()->size(); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::CancelableClosure timeout( 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TimeoutCallback, "Extension load timed out.")); 36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 364868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FROM_HERE, timeout.callback(), TestTimeouts::action_timeout()); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::UnpackedInstaller::Create(service)->Load(path); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timeout.Cancel(); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t num_after = service->extensions()->size(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_after != (num_before + 1)) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WaitForExtensionViewsToLoad(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WaitForExtensionViewsToLoad() { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for all the extension render views that exist to finish loading. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: This assumes that the extension views list is not changing while 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this method is running. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING, 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::CancelableClosure timeout( 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TimeoutCallback, "Extension host load timed out.")); 38690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FROM_HERE, timeout.callback(), TestTimeouts::action_timeout()); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ProcessManager* manager = 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())-> 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_manager(); 392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ProcessManager::ViewSet all_views = manager->GetAllViews(); 393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (extensions::ProcessManager::ViewSet::const_iterator iter = 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) all_views.begin(); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != all_views.end();) { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(*iter)->IsLoading()) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++iter; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timeout.Cancel(); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Observe(int type, 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_EXTENSION_LOADED: 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING: 41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_extensions_dir_; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DevToolsExperimentalExtensionTest : public DevToolsExtensionTest { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 426a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) command_line->AppendSwitch( 427a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extensions::switches::kEnableExperimentalExtensionApis); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WorkerDevToolsSanityTest : public InProcessBrowserTest { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerDevToolsSanityTest() : window_(NULL) {} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class WorkerData : public base::RefCountedThreadSafe<WorkerData> { 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerData() : worker_process_id(0), worker_route_id(0) {} 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int worker_process_id; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int worker_route_id; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<WorkerData>; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~WorkerData() {} 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class WorkerCreationObserver : public WorkerServiceObserver { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit WorkerCreationObserver(WorkerData* worker_data) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : worker_data_(worker_data) { 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WorkerCreationObserver() {} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void WorkerCreated ( 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& name, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int process_id, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int route_id) OVERRIDE { 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) worker_data_->worker_process_id = process_id; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) worker_data_->worker_route_id = route_id; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerService::GetInstance()->RemoveObserver(this); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 46590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::QuitClosure()); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<WorkerData> worker_data_; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class WorkerTerminationObserver : public WorkerServiceObserver { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit WorkerTerminationObserver(WorkerData* worker_data) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : worker_data_(worker_data) { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WorkerTerminationObserver() {} 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void WorkerDestroyed(int process_id, int route_id) OVERRIDE { 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(worker_data_->worker_process_id, process_id); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(worker_data_->worker_route_id, route_id); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerService::GetInstance()->RemoveObserver(this); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 48590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::QuitClosure()); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<WorkerData> worker_data_; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunTest(const char* test_name, const char* test_page) { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL(test_page); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<WorkerData> worker_data = WaitForFirstSharedWorker(); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDevToolsWindowForSharedWorker(worker_data.get()); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTestFunction(window_, test_name); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseDevToolsWindow(); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void TerminateWorkerOnIOThread(scoped_refptr<WorkerData> worker_data) { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (WorkerService::GetInstance()->TerminateWorker( 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) worker_data->worker_process_id, worker_data->worker_route_id)) { 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerService::GetInstance()->AddObserver( 506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new WorkerTerminationObserver(worker_data.get())); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAIL() << "Failed to terminate worker.\n"; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void TerminateWorker(scoped_refptr<WorkerData> worker_data) { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TerminateWorkerOnIOThread, worker_data)); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WaitForFirstSharedWorkerOnIOThread( 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<WorkerData> worker_data) { 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<WorkerService::WorkerInfo> worker_info = 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerService::GetInstance()->GetWorkers(); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!worker_info.empty()) { 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) worker_data->worker_process_id = worker_info[0].process_id; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) worker_data->worker_route_id = worker_info[0].route_id; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 52790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::QuitClosure()); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkerService::GetInstance()->AddObserver( 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new WorkerCreationObserver(worker_data.get())); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static scoped_refptr<WorkerData> WaitForFirstSharedWorker() { 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<WorkerData> worker_data(new WorkerData()); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WaitForFirstSharedWorkerOnIOThread, worker_data)); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return worker_data; 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenDevToolsWindowForSharedWorker(WorkerData* worker_data) { 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = browser()->profile(); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_ = DevToolsWindow::CreateDevToolsWindowForWorker(profile); 5470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) window_->Show(DevToolsToggleAction::Show()); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DevToolsAgentHost> agent_host( 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DevToolsAgentHost::GetForWorker( 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) worker_data->worker_process_id, 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) worker_data->worker_route_id)); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsManager::GetInstance()->RegisterDevToolsClientHostFor( 553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) agent_host.get(), window_->GetDevToolsClientHostForTest()); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* client_rvh = window_->GetRenderViewHost(); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* client_contents = WebContents::FromRenderViewHost(client_rvh); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (client_contents->IsLoading()) { 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &client_contents->GetController())); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseDevToolsWindow() { 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser = window_->browser(); 5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::WindowedNotificationObserver close_observer( 5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::NOTIFICATION_WEB_CONTENTS_DESTROYED, 5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::Source<content::WebContents>(window_->web_contents())); 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser->tab_strip_model()->CloseAllTabs(); 5714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) close_observer.Wait(); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsWindow* window_; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on docked devtools if 578f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// we try to close them. 579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, TestDockedDevToolsClose) { 580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunBeforeUnloadSanityTest(DEVTOOLS_DOCK_SIDE_BOTTOM, base::Bind( 581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &DevToolsBeforeUnloadTest::CloseDockedDevTools, this), false); 582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on docked devtools if 585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// we try to close the inspected page. 586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, 587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestDockedDevToolsInspectedTabClose) { 588f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunBeforeUnloadSanityTest(DEVTOOLS_DOCK_SIDE_BOTTOM, base::Bind( 589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &DevToolsBeforeUnloadTest::CloseInspectedTab, this)); 590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on docked devtools if 593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// we try to close the inspected browser. 594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, 595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestDockedDevToolsInspectedBrowserClose) { 596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunBeforeUnloadSanityTest(DEVTOOLS_DOCK_SIDE_BOTTOM, base::Bind( 597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &DevToolsBeforeUnloadTest::CloseInspectedBrowser, this)); 598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on undocked devtools if 601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// we try to close them. 602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, TestUndockedDevToolsClose) { 603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunBeforeUnloadSanityTest(DEVTOOLS_DOCK_SIDE_UNDOCKED, base::Bind( 604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &DevToolsBeforeUnloadTest::CloseUndockedDevTools, this), false); 605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 607f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on undocked devtools if 608f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// we try to close the inspected page. 609f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, 610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestUndockedDevToolsInspectedTabClose) { 611f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunBeforeUnloadSanityTest(DEVTOOLS_DOCK_SIDE_UNDOCKED, base::Bind( 612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &DevToolsBeforeUnloadTest::CloseInspectedTab, this)); 613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on undocked devtools if 616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// we try to close the inspected browser. 617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, 618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestUndockedDevToolsInspectedBrowserClose) { 619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunBeforeUnloadSanityTest(DEVTOOLS_DOCK_SIDE_UNDOCKED, base::Bind( 620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &DevToolsBeforeUnloadTest::CloseInspectedBrowser, this)); 621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on undocked devtools if 624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// we try to exit application. 625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, 626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestUndockedDevToolsApplicationClose) { 627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunBeforeUnloadSanityTest(DEVTOOLS_DOCK_SIDE_UNDOCKED, base::Bind( 628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &chrome::CloseAllBrowsers)); 629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 630f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 631f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that inspected tab gets closed if devtools renderer 632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// becomes unresponsive during beforeunload event interception. 633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// @see http://crbug.com/322380 634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsUnresponsiveBeforeUnloadTest, 635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestUndockedDevToolsUnresponsive) { 636f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 637f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LoadTestPage(kDebuggerTestPage); 638f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DevToolsWindow* devtools_window = OpenDevToolWindowOnWebContents( 639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetInspectedTab()); 640f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) devtools_window->SetDockSideForTest(DEVTOOLS_DOCK_SIDE_UNDOCKED); 641f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver devtools_close_observer( 642f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NOTIFICATION_WEB_CONTENTS_DESTROYED, 643f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::Source<content::WebContents>( 644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) devtools_window->web_contents())); 645f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 646f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScript( 647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) devtools_window->web_contents()->GetRenderViewHost(), 648f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "window.addEventListener('beforeunload'," 649f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "function(event) { while (true); });")); 650f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CloseInspectedTab(); 651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) devtools_close_observer.Wait(); 652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Tests that closing worker inspector window does not cause browser crash 655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// @see http://crbug.com/323031 656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, 657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TestWorkerWindowClosing) { 658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoadTestPage(kDebuggerTestPage); 660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DevToolsWindow* devtools_window = OpenDevToolWindowOnWebContents( 661a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetInspectedTab()); 662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) devtools_window->SetDockSideForTest(DEVTOOLS_DOCK_SIDE_UNDOCKED); 663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::WindowedNotificationObserver devtools_close_observer( 664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::NOTIFICATION_WEB_CONTENTS_DESTROYED, 665a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::Source<content::WebContents>( 666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) devtools_window->web_contents())); 667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OpenDevToolsPopupWindow(devtools_window); 669a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CloseDevToolsPopupWindow(devtools_window); 670a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 671a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on devtools that are opened 673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// on another devtools. 674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, 675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TestDevToolsOnDevTools) { 676f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 677f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LoadTestPage(kDebuggerTestPage); 678f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 679f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<DevToolsWindow*> windows; 680f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<content::WindowedNotificationObserver*> close_observers; 681f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WebContents* inspected_web_contents = GetInspectedTab(); 682f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (int i = 0; i < 3; ++i) { 683f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DevToolsWindow* devtools_window = OpenDevToolWindowOnWebContents( 684f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) inspected_web_contents); 685f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) windows.push_back(devtools_window); 686f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver* close_observer = 687f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new content::WindowedNotificationObserver( 688f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NOTIFICATION_WEB_CONTENTS_DESTROYED, 689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::Source<content::WebContents>( 690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) devtools_window->web_contents())); 691f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) close_observers.push_back(close_observer); 692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) inspected_web_contents = devtools_window->web_contents(); 693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 694f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InjectBeforeUnloadListener(windows[0]->web_contents()); 696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InjectBeforeUnloadListener(windows[2]->web_contents()); 697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Try to close second devtools. 698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 699f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver cancel_browser( 700f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::CloseWindow(windows[1]->browser()); 703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CancelModalDialog(); 704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cancel_browser.Wait(); 705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Try to close browser window. 707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver cancel_browser( 709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::CloseWindow(browser()); 712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AcceptModalDialog(); 713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CancelModalDialog(); 714f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cancel_browser.Wait(); 715f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 716f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Try to exit application. 717f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { 718f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver close_observer( 719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::NOTIFICATION_BROWSER_CLOSED, 720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::Source<Browser>(browser())); 721f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::CloseAllBrowsers(); 722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AcceptModalDialog(); 723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AcceptModalDialog(); 724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) close_observer.Wait(); 725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < close_observers.size(); ++i) { 727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) close_observers[i]->Wait(); 728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delete close_observers[i]; 729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 7304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests scripts panel showing. 7330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// TODO(pfeldman): figure out flake. 7348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, DISABLED_TestShowScriptsTab) { 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest("testShowScriptsTab", kDebuggerTestPage); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that scripts tab is populated with inspected scripts even if it 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// hadn't been shown by the moment inspected paged refreshed. 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// @see http://crbug.com/26312 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsSanityTest, 7430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) TestScriptsTabIsPopulatedOnInspectedPageRefresh) { 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear inspector settings to ensure that Elements will be 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current panel when DevTools window is open. 746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::BrowserContext* browser_context = 747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetInspectedTab()->GetBrowserContext(); 748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile::FromBrowserContext(browser_context)->GetPrefs()-> 749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ClearPref(prefs::kWebKitInspectorSettings); 750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest("testScriptsTabIsPopulatedOnInspectedPageRefresh", 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDebuggerTestPage); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that chrome.devtools extension is correctly exposed. 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDevToolsExtensionAPI) { 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("devtools_extension"); 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RunTest("waitForTestResultsInConsole", std::string()); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/183649 7637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_WIN) 7647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAYBE_TestDevToolsExtensionMessaging DISABLED_TestDevToolsExtensionMessaging 7657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else 7667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAYBE_TestDevToolsExtensionMessaging TestDevToolsExtensionMessaging 7677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 7687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that chrome.devtools extension can communicate with background page 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// using extension messaging. 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, 7727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MAYBE_TestDevToolsExtensionMessaging) { 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("devtools_messaging"); 774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RunTest("waitForTestResultsInConsole", std::string()); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that chrome.experimental.devtools extension is correctly exposed 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// when the extension has experimental permission. 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsExperimentalExtensionTest, 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDevToolsExperimentalExtensionAPI) { 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("devtools_experimental"); 782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RunTest("waitForTestResultsInConsole", std::string()); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that a content script is in the scripts list. 786f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// History of flakiness: http://crbug.com/114104, http://crbug.com/315288. 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, 788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISABLED_TestContentScriptIsPresent) { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtension("simple_content_script"); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest("testContentScriptIsPresent", kPageWithContentScript); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Fails quite consistently on Win XP: crbug.com/317725. 794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 795f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_TestNoScriptDuplicatesOnPanelSwitch \ 796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISABLED_TestNoScriptDuplicatesOnPanelSwitch 797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else 798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_TestNoScriptDuplicatesOnPanelSwitch \ 799f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestNoScriptDuplicatesOnPanelSwitch 800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 801f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that scripts are not duplicated after Scripts Panel switch. 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, 804f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MAYBE_TestNoScriptDuplicatesOnPanelSwitch) { 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest("testNoScriptDuplicatesOnPanelSwitch", kDebuggerTestPage); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 808d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS) 809d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#define MAYBE_TestPauseWhenLoadingDevTools DISABLED_TestPauseWhenLoadingDevTools 810d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#else 811d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#define MAYBE_TestPauseWhenLoadingDevTools TestPauseWhenLoadingDevTools 812d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#endif 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that debugger works correctly if pause event occurs when DevTools 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// frontend is being loaded. 815d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)// Disabled because of flakiness on multiple platforms: crbug.com/329036 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, 817d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) MAYBE_TestPauseWhenLoadingDevTools) { 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest("testPauseWhenLoadingDevTools", kPauseWhenLoadingDevTools); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that pressing 'Pause' will pause script execution if the script 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is already running. 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Timing out on windows tryservers: http://crbug.com/219515 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TestPauseWhenScriptIsRunning DISABLED_TestPauseWhenScriptIsRunning 826b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#elif defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) 827b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Timing out on linux ARM bot: https://crbug/238453 828b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#define MAYBE_TestPauseWhenScriptIsRunning DISABLED_TestPauseWhenScriptIsRunning 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TestPauseWhenScriptIsRunning TestPauseWhenScriptIsRunning 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 8328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, 8330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) MAYBE_TestPauseWhenScriptIsRunning) { 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest("testPauseWhenScriptIsRunning", kPauseWhenScriptIsRunning); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests network timing. 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkTiming) { 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest("testNetworkTiming", kSlowTestPage); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests network size. 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkSize) { 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest("testNetworkSize", kChunkedTestPage); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests raw headers text. 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkSyncSize) { 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest("testNetworkSyncSize", kChunkedTestPage); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests raw headers text. 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkRawHeadersText) { 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest("testNetworkRawHeadersText", kChunkedTestPage); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that console messages are not duplicated on navigation back. 858a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestConsoleOnNavigateBack) { 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest("testConsoleOnNavigateBack", kNavigateBackTestPage); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that external navigation from inspector page is always handled by 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DevToolsWindow and results in inspected page navigation. 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDevToolsExternalNavigation) { 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OpenDevToolsWindow(kDebuggerTestPage); 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url = test_server()->GetURL(kNavigateBackTestPage); 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WindowedNotificationObserver observer( 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::AllSources()); 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(content::ExecuteScript( 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->web_contents(), 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string("window.location = \"") + url.spec() + "\"")); 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer.Wait(); 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(window_->web_contents()->GetURL(). 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SchemeIs(chrome::kChromeDevToolsScheme)); 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(GetInspectedTab()->GetURL(), url); 8794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CloseDevToolsWindow(); 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN) 883eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Flakily times out: http://crbug.com/163411 884eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_TestReattachAfterCrash DISABLED_TestReattachAfterCrash 885eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 886eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_TestReattachAfterCrash TestReattachAfterCrash 887eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that inspector will reattach to inspected page when it is reloaded 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after a crash. See http://crbug.com/101952 890eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(DevToolsSanityTest, MAYBE_TestReattachAfterCrash) { 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDevToolsWindow(kDebuggerTestPage); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::CrashTab(GetInspectedTab()); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &browser()->tab_strip_model()->GetActiveWebContents()-> 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController())); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::Reload(browser(), CURRENT_TAB); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTestFunction(window_, "testReattachAfterCrash"); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseDevToolsWindow(); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestPageWithNoJavaScript) { 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDevToolsWindow("about:blank"); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE( 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ExecuteScriptAndExtractString( 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->GetRenderViewHost(), 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "window.domAutomationController.send(" 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " '' + (window.uiTests && (typeof uiTests.runTest)));", 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result)); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("function", result) << "DevTools front-end is broken."; 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseDevToolsWindow(); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_InspectSharedWorker DISABLED_InspectSharedWorker 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_InspectSharedWorker InspectSharedWorker 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flakily fails with 25s timeout: http://crbug.com/89845 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest, MAYBE_InspectSharedWorker) { 926ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 927ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 928a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 929ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 930ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 931ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest("testSharedWorker", kSharedWorkerTestPage); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/100538 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PauseInSharedWorkerInitialization DISABLED_PauseInSharedWorkerInitialization 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PauseInSharedWorkerInitialization PauseInSharedWorkerInitialization 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/106114 is masking 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MAYBE_PauseInSharedWorkerInitialization into 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DISABLED_PauseInSharedWorkerInitialization 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest, 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAYBE_PauseInSharedWorkerInitialization) { 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url = test_server()->GetURL(kReloadSharedWorkerTestPage); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<WorkerData> worker_data = WaitForFirstSharedWorker(); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenDevToolsWindowForSharedWorker(worker_data.get()); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TerminateWorker(worker_data); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reload page to restart the worker. 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait until worker script is paused on the debugger statement. 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTestFunction(window_, "testPauseInSharedWorkerInitialization"); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseDevToolsWindow(); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DevToolsAgentHostTest : public InProcessBrowserTest {}; 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests DevToolsAgentHost retention by its target. 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsAgentHostTest, TestAgentHostReleased) { 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost* rvh = browser()->tab_strip_model()->GetWebContentsAt(0)-> 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetRenderViewHost(); 9717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DevToolsAgentHost* agent_raw = DevToolsAgentHost::GetOrCreateFor(rvh).get(); 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string agent_id = agent_raw->GetId(); 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(agent_raw, DevToolsAgentHost::GetForId(agent_id)) << 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "DevToolsAgentHost cannot be found by id"; 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()-> 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CloseWebContentsAt(0, TabStripModel::CLOSE_NONE); 9777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_FALSE(DevToolsAgentHost::GetForId(agent_id).get()) 9787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) << "DevToolsAgentHost is not released when the tab is closed"; 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RemoteDebuggingTest: public ExtensionApiTest { 982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionApiTest::SetUpCommandLine(command_line); 984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line->AppendSwitchASCII(switches::kRemoteDebuggingPort, "9222"); 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Override the extension root path. 987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_); 988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_data_dir_ = test_data_dir_.AppendASCII("devtools"); 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RemoteDebuggingTest, RemoteDebugger) { 993ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH) 994ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Disable this test in Metro+Ash for now (http://crbug.com/262796). 995a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 996ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 997ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 998ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(RunExtensionTest("target_list")) << message_; 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1003