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"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/devtools/devtools_window_testing.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/unpacked_installer.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.h"
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/pref_names.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/child_process_data.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/content_browser_client.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_agent_host.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_http_handler.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/worker_service.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/worker_service_observer.h"
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/content_switches.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/notification_types.h"
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "extensions/common/switches.h"
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/socket/tcp_listen_socket.h"
53b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DevToolsAgentHost;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WorkerService;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WorkerServiceObserver;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDebuggerTestPage[] = "files/devtools/debugger_test_page.html";
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPauseWhenLoadingDevTools[] =
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "files/devtools/pause_when_loading_devtools.html";
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPauseWhenScriptIsRunning[] =
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "files/devtools/pause_when_script_is_running.html";
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPageWithContentScript[] =
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "files/devtools/page_with_content_script.html";
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNavigateBackTestPage[] =
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "files/devtools/navigate_back.html";
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kChunkedTestPage[] = "chunked";
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSlowTestPage[] =
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "chunked?waitBeforeHeaders=100&waitBetweenChunks=100&chunksNumber=2";
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSharedWorkerTestPage[] =
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "files/workers/workers_ui_shared_worker.html";
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kReloadSharedWorkerTestPage[] =
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "files/workers/debug_shared_worker_initialization.html";
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunTestFunction(DevToolsWindow* window, const char* test_name) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RenderViewHost* rvh = DevToolsWindowTesting::Get(window)->
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      main_web_contents()->GetRenderViewHost();
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(
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          rvh,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "window.domAutomationController.send("
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "    '' + (window.uiTests && (typeof uiTests.runTest)));",
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &result));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_EQ("function", result) << "DevTools front-end is broken.";
9823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      rvh,
10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      base::StringPrintf("uiTests.runTest('%s')", test_name),
10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      &result));
10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ("[OK]", result);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DevToolsSanityTest : public InProcessBrowserTest {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DevToolsSanityTest() : window_(NULL) {}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunTest(const std::string& test_name, const std::string& test_page) {
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OpenDevToolsWindow(test_page, false);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunTestFunction(window_, test_name.c_str());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CloseDevToolsWindow();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void LoadTestPage(const std::string& test_page) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = test_server()->GetURL(test_page);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OpenDevToolsWindow(const std::string& test_page, bool is_docked) {
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_TRUE(test_server()->Start());
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    LoadTestPage(test_page);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    window_ = DevToolsWindowTesting::OpenDevToolsWindowSync(GetInspectedTab(),
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                                            is_docked);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* GetInspectedTab() {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return browser()->tab_strip_model()->GetWebContentsAt(0);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void CloseDevToolsWindow() {
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DevToolsWindowTesting::CloseDevToolsWindowSync(window_);
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebContents* main_web_contents() {
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return DevToolsWindowTesting::Get(window_)->main_web_contents();
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebContents* toolbox_web_contents() {
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return DevToolsWindowTesting::Get(window_)->toolbox_web_contents();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DevToolsWindow* window_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Used to block until a dev tools window gets beforeunload event.
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class DevToolsWindowBeforeUnloadObserver
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public content::WebContentsObserver {
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  explicit DevToolsWindowBeforeUnloadObserver(DevToolsWindow*);
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Wait();
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Invoked when the beforeunload handler fires.
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BeforeUnloadFired(const base::TimeTicks& proceed_time) OVERRIDE;
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool m_fired;
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DevToolsWindowBeforeUnloadObserver);
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)DevToolsWindowBeforeUnloadObserver::DevToolsWindowBeforeUnloadObserver(
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DevToolsWindow* devtools_window)
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : WebContentsObserver(
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          DevToolsWindowTesting::Get(devtools_window)->main_web_contents()),
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      m_fired(false) {
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void DevToolsWindowBeforeUnloadObserver::Wait() {
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (m_fired)
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  message_loop_runner_ = new content::MessageLoopRunner;
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  message_loop_runner_->Run();
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void DevToolsWindowBeforeUnloadObserver::BeforeUnloadFired(
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const base::TimeTicks& proceed_time) {
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  m_fired = true;
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (message_loop_runner_.get())
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    message_loop_runner_->Quit();
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class DevToolsBeforeUnloadTest: public DevToolsSanityTest {
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    command_line->AppendSwitch(
190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        switches::kDisableHangMonitor);
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void CloseInspectedTab() {
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    browser()->tab_strip_model()->CloseWebContentsAt(0,
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        TabStripModel::CLOSE_NONE);
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void CloseDevToolsWindowAsync() {
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DevToolsWindowTesting::CloseDevToolsWindow(window_);
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void CloseInspectedBrowser() {
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    chrome::CloseWindow(browser());
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected:
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void InjectBeforeUnloadListener(content::WebContents* web_contents) {
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_TRUE(content::ExecuteScript(web_contents->GetRenderViewHost(),
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "window.addEventListener('beforeunload',"
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "function(event) { event.returnValue = 'Foo'; });"));
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void RunBeforeUnloadSanityTest(bool is_docked,
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 base::Callback<void(void)> close_method,
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 bool wait_for_browser_close = true) {
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OpenDevToolsWindow(kDebuggerTestPage, is_docked);
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_refptr<content::MessageLoopRunner> runner =
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new content::MessageLoopRunner;
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DevToolsWindowTesting::Get(window_)->
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        SetCloseCallback(runner->QuitClosure());
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    InjectBeforeUnloadListener(main_web_contents());
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      DevToolsWindowBeforeUnloadObserver before_unload_observer(window_);
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      close_method.Run();
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      CancelModalDialog();
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      before_unload_observer.Wait();
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::WindowedNotificationObserver close_observer(
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          chrome::NOTIFICATION_BROWSER_CLOSED,
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          content::Source<Browser>(browser()));
232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      close_method.Run();
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      AcceptModalDialog();
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (wait_for_browser_close)
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        close_observer.Wait();
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    runner->Run();
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DevToolsWindow* OpenDevToolWindowOnWebContents(
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::WebContents* contents, bool is_docked) {
2426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DevToolsWindow* window =
2436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        DevToolsWindowTesting::OpenDevToolsWindowSync(contents, is_docked);
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return window;
245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void OpenDevToolsPopupWindow(DevToolsWindow* devtools_window) {
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    content::WindowedNotificationObserver observer(
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        content::NotificationService::AllSources());
251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(content::ExecuteScript(
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        DevToolsWindowTesting::Get(devtools_window)->
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            main_web_contents()->GetRenderViewHost(),
254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        "window.open(\"\", \"\", \"location=0\");"));
255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    observer.Wait();
256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void CloseDevToolsPopupWindow(DevToolsWindow* devtools_window) {
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_window);
260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void AcceptModalDialog() {
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    NativeAppModalDialog* native_dialog = GetDialog();
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    native_dialog->AcceptAppModalDialog();
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void CancelModalDialog() {
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    NativeAppModalDialog* native_dialog = GetDialog();
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    native_dialog->CancelAppModalDialog();
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  NativeAppModalDialog* GetDialog() {
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    AppModalDialog* dialog = ui_test_utils::WaitForAppModalDialog();
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(dialog->IsJavaScriptModalDialog());
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    JavaScriptAppModalDialog* js_dialog =
276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        static_cast<JavaScriptAppModalDialog*>(dialog);
277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    NativeAppModalDialog* native_dialog = js_dialog->native_dialog();
278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(native_dialog);
279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return native_dialog;
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class DevToolsUnresponsiveBeforeUnloadTest: public DevToolsBeforeUnloadTest {
284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {}
286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TimeoutCallback(const std::string& timeout_message) {
28923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ADD_FAILURE() << timeout_message;
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Quit();
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for DevTools tests that test devtools functionality for
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions and content scripts.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DevToolsExtensionTest : public DevToolsSanityTest,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              public content::NotificationObserver {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DevToolsExtensionTest() : DevToolsSanityTest() {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(chrome::DIR_TEST_DATA, &test_extensions_dir_);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_extensions_dir_ = test_extensions_dir_.AppendASCII("devtools");
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_extensions_dir_ = test_extensions_dir_.AppendASCII("extensions");
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an extension from test\data\devtools\extensions\<extension_name>
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadExtension(const char* extension_name) {
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath path = test_extensions_dir_.AppendASCII(extension_name);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(LoadExtensionFromPath(path)) << "Failed to load extension.";
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool LoadExtensionFromPath(const base::FilePath& path) {
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExtensionService* service = extensions::ExtensionSystem::Get(
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->extension_service();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t num_before = service->extensions()->size();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationRegistrar registrar;
3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      registrar.Add(this,
3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    content::NotificationService::AllSources());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::CancelableClosure timeout(
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&TimeoutCallback, "Extension load timed out."));
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->PostDelayedTask(
324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          FROM_HERE, timeout.callback(), TestTimeouts::action_timeout());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::UnpackedInstaller::Create(service)->Load(path);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RunMessageLoop();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      timeout.Cancel();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t num_after = service->extensions()->size();
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (num_after != (num_before + 1))
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WaitForExtensionViewsToLoad();
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WaitForExtensionViewsToLoad() {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Wait for all the extension render views that exist to finish loading.
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NOTE: This assumes that the extension views list is not changing while
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // this method is running.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::NotificationRegistrar registrar;
3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    registrar.Add(this,
3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                  extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  content::NotificationService::AllSources());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::CancelableClosure timeout(
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&TimeoutCallback, "Extension host load timed out."));
34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        FROM_HERE, timeout.callback(), TestTimeouts::action_timeout());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extensions::ProcessManager* manager =
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extensions::ExtensionSystem::Get(browser()->profile())->
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            process_manager();
353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    extensions::ProcessManager::ViewSet all_views = manager->GetAllViews();
354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    for (extensions::ProcessManager::ViewSet::const_iterator iter =
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             all_views.begin();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         iter != all_views.end();) {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!(*iter)->IsLoading())
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ++iter;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::RunMessageLoop();
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    timeout.Cancel();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Observe(int type,
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationSource& source,
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      case extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED:
3725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      case extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING:
37390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::MessageLoopForUI::current()->Quit();
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_extensions_dir_;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DevToolsExperimentalExtensionTest : public DevToolsExtensionTest {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
387a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    command_line->AppendSwitch(
388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        extensions::switches::kEnableExperimentalExtensionApis);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WorkerDevToolsSanityTest : public InProcessBrowserTest {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WorkerDevToolsSanityTest() : window_(NULL) {}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class WorkerData : public base::RefCountedThreadSafe<WorkerData> {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WorkerData() : worker_process_id(0), worker_route_id(0) {}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int worker_process_id;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int worker_route_id;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class base::RefCountedThreadSafe<WorkerData>;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~WorkerData() {}
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class WorkerCreationObserver : public WorkerServiceObserver {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit WorkerCreationObserver(WorkerData* worker_data)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : worker_data_(worker_data) {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~WorkerCreationObserver() {}
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void WorkerCreated (
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const GURL& url,
419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        const base::string16& name,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int process_id,
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int route_id) OVERRIDE {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      worker_data_->worker_process_id = process_id;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      worker_data_->worker_route_id = route_id;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WorkerService::GetInstance()->RemoveObserver(this);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
42690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          base::MessageLoop::QuitClosure());
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete this;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<WorkerData> worker_data_;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class WorkerTerminationObserver : public WorkerServiceObserver {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit WorkerTerminationObserver(WorkerData* worker_data)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : worker_data_(worker_data) {
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~WorkerTerminationObserver() {}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void WorkerDestroyed(int process_id, int route_id) OVERRIDE {
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(worker_data_->worker_process_id, process_id);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(worker_data_->worker_route_id, route_id);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WorkerService::GetInstance()->RemoveObserver(this);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
44690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          base::MessageLoop::QuitClosure());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete this;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<WorkerData> worker_data_;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunTest(const char* test_name, const char* test_page) {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(test_server()->Start());
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = test_server()->GetURL(test_page);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<WorkerData> worker_data = WaitForFirstSharedWorker();
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OpenDevToolsWindowForSharedWorker(worker_data.get());
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunTestFunction(window_, test_name);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CloseDevToolsWindow();
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void TerminateWorkerOnIOThread(scoped_refptr<WorkerData> worker_data) {
46423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    if (!WorkerService::GetInstance()->TerminateWorker(
46523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        worker_data->worker_process_id, worker_data->worker_route_id))
46623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      FAIL() << "Failed to terminate worker.\n";
46723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    WorkerService::GetInstance()->AddObserver(
46823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        new WorkerTerminationObserver(worker_data.get()));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void TerminateWorker(scoped_refptr<WorkerData> worker_data) {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&TerminateWorkerOnIOThread, worker_data));
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void WaitForFirstSharedWorkerOnIOThread(
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<WorkerData> worker_data) {
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<WorkerService::WorkerInfo> worker_info =
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WorkerService::GetInstance()->GetWorkers();
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!worker_info.empty()) {
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      worker_data->worker_process_id = worker_info[0].process_id;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      worker_data->worker_route_id = worker_info[0].route_id;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
48690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          base::MessageLoop::QuitClosure());
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WorkerService::GetInstance()->AddObserver(
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new WorkerCreationObserver(worker_data.get()));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static scoped_refptr<WorkerData> WaitForFirstSharedWorker() {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<WorkerData> worker_data(new WorkerData());
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&WaitForFirstSharedWorkerOnIOThread, worker_data));
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return worker_data;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OpenDevToolsWindowForSharedWorker(WorkerData* worker_data) {
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile = browser()->profile();
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<DevToolsAgentHost> agent_host(
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DevToolsAgentHost::GetForWorker(
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            worker_data->worker_process_id,
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            worker_data->worker_route_id));
509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    window_ = DevToolsWindowTesting::OpenDevToolsWindowForWorkerSync(
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        profile, agent_host.get());
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseDevToolsWindow() {
514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DevToolsWindowTesting::CloseDevToolsWindowSync(window_);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DevToolsWindow* window_;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on docked devtools if
521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// we try to close them.
522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, TestDockedDevToolsClose) {
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunBeforeUnloadSanityTest(true, base::Bind(
524116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      &DevToolsBeforeUnloadTest::CloseDevToolsWindowAsync, this), false);
525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on docked devtools if
528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// we try to close the inspected page.
529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       TestDockedDevToolsInspectedTabClose) {
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunBeforeUnloadSanityTest(true, base::Bind(
532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      &DevToolsBeforeUnloadTest::CloseInspectedTab, this));
533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on docked devtools if
536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// we try to close the inspected browser.
537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       TestDockedDevToolsInspectedBrowserClose) {
5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunBeforeUnloadSanityTest(true, base::Bind(
540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      &DevToolsBeforeUnloadTest::CloseInspectedBrowser, this));
541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on undocked devtools if
544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// we try to close them.
545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, TestUndockedDevToolsClose) {
5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunBeforeUnloadSanityTest(false, base::Bind(
547116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      &DevToolsBeforeUnloadTest::CloseDevToolsWindowAsync, this), false);
548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on undocked devtools if
551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// we try to close the inspected page.
552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       TestUndockedDevToolsInspectedTabClose) {
5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunBeforeUnloadSanityTest(false, base::Bind(
555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      &DevToolsBeforeUnloadTest::CloseInspectedTab, this));
556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on undocked devtools if
559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// we try to close the inspected browser.
560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       TestUndockedDevToolsInspectedBrowserClose) {
5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunBeforeUnloadSanityTest(false, base::Bind(
563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      &DevToolsBeforeUnloadTest::CloseInspectedBrowser, this));
564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on undocked devtools if
567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// we try to exit application.
568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       TestUndockedDevToolsApplicationClose) {
5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunBeforeUnloadSanityTest(false, base::Bind(
571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      &chrome::CloseAllBrowsers));
572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Times out on Win and Linux
5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// @see http://crbug.com/410327
5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS))
5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MAYBE_TestUndockedDevToolsUnresponsive DISABLED_TestUndockedDevToolsUnresponsive
5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MAYBE_TestUndockedDevToolsUnresponsive TestUndockedDevToolsUnresponsive
5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that inspected tab gets closed if devtools renderer
583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// becomes unresponsive during beforeunload event interception.
584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// @see http://crbug.com/322380
585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsUnresponsiveBeforeUnloadTest,
5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       MAYBE_TestUndockedDevToolsUnresponsive) {
587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
588f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LoadTestPage(kDebuggerTestPage);
589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DevToolsWindow* devtools_window = OpenDevToolWindowOnWebContents(
5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetInspectedTab(), false);
591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<content::MessageLoopRunner> runner =
593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new content::MessageLoopRunner;
594116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DevToolsWindowTesting::Get(devtools_window)->SetCloseCallback(
595116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      runner->QuitClosure());
596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScript(
598116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      DevToolsWindowTesting::Get(devtools_window)->main_web_contents()->
599116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          GetRenderViewHost(),
600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "window.addEventListener('beforeunload',"
601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "function(event) { while (true); });"));
602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CloseInspectedTab();
603116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  runner->Run();
604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Tests that closing worker inspector window does not cause browser crash
607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// @see http://crbug.com/323031
608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       TestWorkerWindowClosing) {
610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  LoadTestPage(kDebuggerTestPage);
612a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DevToolsWindow* devtools_window = OpenDevToolWindowOnWebContents(
6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetInspectedTab(), false);
614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  OpenDevToolsPopupWindow(devtools_window);
616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CloseDevToolsPopupWindow(devtools_window);
617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that BeforeUnload event gets called on devtools that are opened
620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// on another devtools.
621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       TestDevToolsOnDevTools) {
623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LoadTestPage(kDebuggerTestPage);
625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::vector<DevToolsWindow*> windows;
627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::vector<content::WindowedNotificationObserver*> close_observers;
628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WebContents* inspected_web_contents = GetInspectedTab();
629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (int i = 0; i < 3; ++i) {
630f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DevToolsWindow* devtools_window = OpenDevToolWindowOnWebContents(
6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      inspected_web_contents, i == 0);
632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    windows.push_back(devtools_window);
633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::WindowedNotificationObserver* close_observer =
634f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        new content::WindowedNotificationObserver(
635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                content::NOTIFICATION_WEB_CONTENTS_DESTROYED,
636f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                content::Source<content::WebContents>(
637116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    DevToolsWindowTesting::Get(devtools_window)->
638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        main_web_contents()));
639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    close_observers.push_back(close_observer);
640116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    inspected_web_contents =
641116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        DevToolsWindowTesting::Get(devtools_window)->main_web_contents();
642f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
643f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
644116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InjectBeforeUnloadListener(
645116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      DevToolsWindowTesting::Get(windows[0])->main_web_contents());
646116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InjectBeforeUnloadListener(
647116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      DevToolsWindowTesting::Get(windows[2])->main_web_contents());
648f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Try to close second devtools.
649f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
650f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::WindowedNotificationObserver cancel_browser(
651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED,
652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::NotificationService::AllSources());
653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    chrome::CloseWindow(DevToolsWindowTesting::Get(windows[1])->browser());
654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CancelModalDialog();
655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    cancel_browser.Wait();
656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Try to close browser window.
658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::WindowedNotificationObserver cancel_browser(
660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED,
661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::NotificationService::AllSources());
662f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    chrome::CloseWindow(browser());
663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    AcceptModalDialog();
664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CancelModalDialog();
665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    cancel_browser.Wait();
666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Try to exit application.
668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::WindowedNotificationObserver close_observer(
670f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        chrome::NOTIFICATION_BROWSER_CLOSED,
671f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        content::Source<Browser>(browser()));
672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    chrome::IncrementKeepAliveCount();
673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    chrome::CloseAllBrowsers();
674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    AcceptModalDialog();
675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    AcceptModalDialog();
676f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    close_observer.Wait();
677f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
678f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (size_t i = 0; i < close_observers.size(); ++i) {
679f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    close_observers[i]->Wait();
680f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    delete close_observers[i];
681f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
6824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests scripts panel showing.
6855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestShowScriptsTab) {
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest("testShowScriptsTab", kDebuggerTestPage);
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that scripts tab is populated with inspected scripts even if it
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// hadn't been shown by the moment inspected paged refreshed.
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// @see http://crbug.com/26312
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DevToolsSanityTest,
6940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    TestScriptsTabIsPopulatedOnInspectedPageRefresh) {
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest("testScriptsTabIsPopulatedOnInspectedPageRefresh",
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kDebuggerTestPage);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that chrome.devtools extension is correctly exposed.
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TestDevToolsExtensionAPI) {
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("devtools_extension");
703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RunTest("waitForTestResultsInConsole", std::string());
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Disabled on Windows due to flakiness. http://crbug.com/183649
7077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_WIN)
7087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAYBE_TestDevToolsExtensionMessaging DISABLED_TestDevToolsExtensionMessaging
7097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else
7107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MAYBE_TestDevToolsExtensionMessaging TestDevToolsExtensionMessaging
7117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif
7127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that chrome.devtools extension can communicate with background page
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// using extension messaging.
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
7167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       MAYBE_TestDevToolsExtensionMessaging) {
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("devtools_messaging");
718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RunTest("waitForTestResultsInConsole", std::string());
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that chrome.experimental.devtools extension is correctly exposed
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// when the extension has experimental permission.
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsExperimentalExtensionTest,
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TestDevToolsExperimentalExtensionAPI) {
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("devtools_experimental");
726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RunTest("waitForTestResultsInConsole", std::string());
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that a content script is in the scripts list.
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
7315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       TestContentScriptIsPresent) {
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension("simple_content_script");
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest("testContentScriptIsPresent", kPageWithContentScript);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that scripts are not duplicated after Scripts Panel switch.
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
738116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       TestNoScriptDuplicatesOnPanelSwitch) {
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest("testNoScriptDuplicatesOnPanelSwitch", kDebuggerTestPage);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that debugger works correctly if pause event occurs when DevTools
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// frontend is being loaded.
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
7455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       TestPauseWhenLoadingDevTools) {
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest("testPauseWhenLoadingDevTools", kPauseWhenLoadingDevTools);
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that pressing 'Pause' will pause script execution if the script
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is already running.
7515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
752b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Timing out on linux ARM bot: https://crbug/238453
753b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#define MAYBE_TestPauseWhenScriptIsRunning DISABLED_TestPauseWhenScriptIsRunning
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TestPauseWhenScriptIsRunning TestPauseWhenScriptIsRunning
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
7578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
7580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                       MAYBE_TestPauseWhenScriptIsRunning) {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest("testPauseWhenScriptIsRunning", kPauseWhenScriptIsRunning);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests network timing.
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkTiming) {
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest("testNetworkTiming", kSlowTestPage);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests network size.
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkSize) {
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest("testNetworkSize", kChunkedTestPage);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests raw headers text.
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkSyncSize) {
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest("testNetworkSyncSize", kChunkedTestPage);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests raw headers text.
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkRawHeadersText) {
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest("testNetworkRawHeadersText", kChunkedTestPage);
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that console messages are not duplicated on navigation back.
7831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN)
7841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Flaking on windows swarm try runs: crbug.com/409285.
7851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MAYBE_TestConsoleOnNavigateBack DISABLED_TestConsoleOnNavigateBack
7861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
7871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MAYBE_TestConsoleOnNavigateBack TestConsoleOnNavigateBack
7881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
7891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(DevToolsSanityTest, MAYBE_TestConsoleOnNavigateBack) {
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest("testConsoleOnNavigateBack", kNavigateBackTestPage);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// https://crbug.com/397889
7945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, DISABLED_TestDeviceEmulation) {
795cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest("testDeviceMetricsOverrides", "about:blank");
796cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
797cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
798cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that external navigation from inspector page is always handled by
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DevToolsWindow and results in inspected page navigation.
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDevToolsExternalNavigation) {
8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OpenDevToolsWindow(kDebuggerTestPage, true);
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url = test_server()->GetURL(kNavigateBackTestPage);
804116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ui_test_utils::UrlLoadObserver observer(url,
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::NotificationService::AllSources());
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScript(
807116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      main_web_contents(),
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::string("window.location = \"") + url.spec() + "\""));
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observer.Wait();
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
811116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(main_web_contents()->GetURL().
8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  SchemeIs(content::kChromeDevToolsScheme));
8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(url, GetInspectedTab()->GetURL());
8144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CloseDevToolsWindow();
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
817116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that toolbox window is loaded when DevTools window is undocked.
818116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestToolboxLoadedUndocked) {
819116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  OpenDevToolsWindow(kDebuggerTestPage, false);
820116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(toolbox_web_contents());
8216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DevToolsWindow* on_self =
8226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      DevToolsWindowTesting::OpenDevToolsWindowSync(main_web_contents(), false);
823116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_FALSE(DevToolsWindowTesting::Get(on_self)->toolbox_web_contents());
824116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DevToolsWindowTesting::CloseDevToolsWindowSync(on_self);
825116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CloseDevToolsWindow();
826116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
827116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
828116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that toolbox window is not loaded when DevTools window is docked.
829116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestToolboxNotLoadedDocked) {
830116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  OpenDevToolsWindow(kDebuggerTestPage, true);
831116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_FALSE(toolbox_web_contents());
8326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DevToolsWindow* on_self =
8336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      DevToolsWindowTesting::OpenDevToolsWindowSync(main_web_contents(), false);
834116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_FALSE(DevToolsWindowTesting::Get(on_self)->toolbox_web_contents());
835116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DevToolsWindowTesting::CloseDevToolsWindowSync(on_self);
836116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CloseDevToolsWindow();
837116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
838116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that inspector will reattach to inspected page when it is reloaded
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after a crash. See http://crbug.com/101952
8410529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestReattachAfterCrash) {
8420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  RunTest("testReattachAfterCrash", std::string());
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestPageWithNoJavaScript) {
8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OpenDevToolsWindow("about:blank", false);
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result;
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::ExecuteScriptAndExtractString(
850116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          main_web_contents()->GetRenderViewHost(),
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "window.domAutomationController.send("
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "    '' + (window.uiTests && (typeof uiTests.runTest)));",
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &result));
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("function", result) << "DevTools front-end is broken.";
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloseDevToolsWindow();
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Flakily fails: http://crbug.com/403007 http://crbug.com/89845
85903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest, DISABLED_InspectSharedWorker) {
860ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
861ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
862a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
863ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
864ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
865ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest("testSharedWorker", kSharedWorkerTestPage);
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/100538
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest,
8715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       DISABLED_PauseInSharedWorkerInitialization) {
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = test_server()->GetURL(kReloadSharedWorkerTestPage);
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<WorkerData> worker_data = WaitForFirstSharedWorker();
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenDevToolsWindowForSharedWorker(worker_data.get());
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TerminateWorker(worker_data);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reload page to restart the worker.
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait until worker script is paused on the debugger statement.
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTestFunction(window_, "testPauseInSharedWorkerInitialization");
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloseDevToolsWindow();
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DevToolsAgentHostTest : public InProcessBrowserTest {};
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests DevToolsAgentHost retention by its target.
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DevToolsAgentHostTest, TestAgentHostReleased) {
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
8946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  WebContents* web_contents = browser()->tab_strip_model()->GetWebContentsAt(0);
8956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DevToolsAgentHost* agent_raw =
8966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      DevToolsAgentHost::GetOrCreateFor(web_contents).get();
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string agent_id = agent_raw->GetId();
8981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(agent_raw, DevToolsAgentHost::GetForId(agent_id).get())
8991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      << "DevToolsAgentHost cannot be found by id";
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CloseWebContentsAt(0, TabStripModel::CLOSE_NONE);
9027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_FALSE(DevToolsAgentHost::GetForId(agent_id).get())
9037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      << "DevToolsAgentHost is not released when the tab is closed";
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RemoteDebuggingTest: public ExtensionApiTest {
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExtensionApiTest::SetUpCommandLine(command_line);
909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    command_line->AppendSwitchASCII(switches::kRemoteDebuggingPort, "9222");
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Override the extension root path.
912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_);
913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    test_data_dir_ = test_data_dir_.AppendASCII("devtools");
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RemoteDebuggingTest, RemoteDebugger) {
918ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
919ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
920a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
921ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
922ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
923ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("target_list")) << message_;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
926