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