shell_devtools_frontend.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/shell/browser/shell_devtools_frontend.h"
6
7#include "base/command_line.h"
8#include "base/path_service.h"
9#include "content/public/browser/devtools_http_handler.h"
10#include "content/public/browser/devtools_manager.h"
11#include "content/public/browser/web_contents.h"
12#include "content/public/browser/web_contents_view.h"
13#include "content/public/common/content_client.h"
14#include "content/shell/browser/shell.h"
15#include "content/shell/browser/shell_browser_context.h"
16#include "content/shell/browser/shell_browser_main_parts.h"
17#include "content/shell/browser/shell_content_browser_client.h"
18#include "content/shell/browser/shell_devtools_delegate.h"
19#include "content/shell/common/shell_switches.h"
20#include "net/base/net_util.h"
21
22namespace content {
23
24namespace {
25
26// DevTools frontend path for inspector LayoutTests.
27GURL GetDevToolsPathAsURL() {
28  base::FilePath dir_exe;
29  if (!PathService::Get(base::DIR_EXE, &dir_exe)) {
30    NOTREACHED();
31    return GURL();
32  }
33#if defined(OS_MACOSX)
34  // On Mac, the executable is in
35  // out/Release/Content Shell.app/Contents/MacOS/Content Shell.
36  // We need to go up 3 directories to get to out/Release.
37  dir_exe = dir_exe.AppendASCII("../../..");
38#endif
39  base::FilePath dev_tools_path = dir_exe.AppendASCII(
40      "resources/inspector/devtools.html");
41  return net::FilePathToFileURL(dev_tools_path);
42}
43
44}  // namespace
45
46// static
47ShellDevToolsFrontend* ShellDevToolsFrontend::Show(
48    WebContents* inspected_contents) {
49  Shell* shell = Shell::CreateNewWindow(inspected_contents->GetBrowserContext(),
50                                        GURL(),
51                                        NULL,
52                                        MSG_ROUTING_NONE,
53                                        gfx::Size());
54  ShellDevToolsFrontend* devtools_frontend = new ShellDevToolsFrontend(
55      shell,
56      DevToolsAgentHost::GetOrCreateFor(inspected_contents->GetRenderViewHost())
57          .get());
58
59  ShellDevToolsDelegate* delegate = ShellContentBrowserClient::Get()->
60      shell_browser_main_parts()->devtools_delegate();
61  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
62    shell->LoadURL(GetDevToolsPathAsURL());
63  else
64    shell->LoadURL(delegate->devtools_http_handler()->GetFrontendURL());
65
66  return devtools_frontend;
67}
68
69void ShellDevToolsFrontend::Focus() {
70  web_contents()->GetView()->Focus();
71}
72
73void ShellDevToolsFrontend::Close() {
74  frontend_shell_->Close();
75}
76
77ShellDevToolsFrontend::ShellDevToolsFrontend(Shell* frontend_shell,
78                                             DevToolsAgentHost* agent_host)
79    : WebContentsObserver(frontend_shell->web_contents()),
80      frontend_shell_(frontend_shell),
81      agent_host_(agent_host) {
82  frontend_host_.reset(
83      DevToolsClientHost::CreateDevToolsFrontendHost(web_contents(), this));
84}
85
86ShellDevToolsFrontend::~ShellDevToolsFrontend() {
87}
88
89void ShellDevToolsFrontend::RenderViewCreated(
90    RenderViewHost* render_view_host) {
91  DevToolsClientHost::SetupDevToolsFrontendClient(
92      web_contents()->GetRenderViewHost());
93  DevToolsManager* manager = DevToolsManager::GetInstance();
94  manager->RegisterDevToolsClientHostFor(agent_host_.get(),
95                                         frontend_host_.get());
96}
97
98void ShellDevToolsFrontend::WebContentsDestroyed(WebContents* web_contents) {
99  DevToolsManager::GetInstance()->ClientHostClosing(frontend_host_.get());
100  delete this;
101}
102
103void ShellDevToolsFrontend::InspectedContentsClosing() {
104  frontend_shell_->Close();
105}
106
107}  // namespace content
108