172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/devtools_ui.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/string_util.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/net/chrome_url_request_context.h"
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/profiles/profile.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/chrome_url_data_manager_backend.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/devtools_messages.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/url_constants.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/browser_thread.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/tab_contents/tab_contents.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/devtools_resources_map.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/resource/resource_bundle.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace {
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstd::string PathWithoutParams(const std::string& path) {
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return GURL(std::string("chrome-devtools://devtools/") + path)
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      .path().substr(1);
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass DevToolsDataSource : public ChromeURLDataManager::DataSource {
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DevToolsDataSource();
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void StartDataRequest(const std::string& path,
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                bool is_incognito,
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                int request_id);
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual std::string GetMimeType(const std::string& path) const;
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ~DevToolsDataSource() {}
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(DevToolsDataSource);
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenDevToolsDataSource::DevToolsDataSource()
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : DataSource(chrome::kChromeUIDevToolsHost, NULL) {
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid DevToolsDataSource::StartDataRequest(const std::string& path,
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                          bool is_incognito,
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                          int request_id) {
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string filename = PathWithoutParams(path);
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int resource_id = -1;
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (size_t i = 0; i < kDevtoolsResourcesSize; ++i) {
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (filename == kDevtoolsResources[i].name) {
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      resource_id = kDevtoolsResources[i].value;
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DLOG_IF(WARNING, -1 == resource_id) << "Unable to find dev tool resource: "
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      << filename << ". If you compiled with debug_devtools=1, try running"
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      " with --debug-devtools.";
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const ResourceBundle& rb = ResourceBundle::GetSharedInstance();
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<RefCountedStaticMemory> bytes(rb.LoadDataResourceBytes(
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      resource_id));
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SendResponse(request_id, bytes);
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstd::string DevToolsDataSource::GetMimeType(const std::string& path) const {
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string filename = PathWithoutParams(path);
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (EndsWith(filename, ".html", false)) {
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return "text/html";
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else if (EndsWith(filename, ".css", false)) {
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return "text/css";
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else if (EndsWith(filename, ".js", false)) {
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return "application/javascript";
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else if (EndsWith(filename, ".png", false)) {
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return "image/png";
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else if (EndsWith(filename, ".gif", false)) {
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return "image/gif";
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NOTREACHED();
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return "text/plain";
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid DevToolsUI::RegisterDevToolsDataSource() {
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static bool registered = false;
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!registered) {
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DevToolsDataSource* data_source = new DevToolsDataSource();
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ChromeURLRequestContext* context = static_cast<ChromeURLRequestContext*>(
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        Profile::GetDefaultRequestContext()->GetURLRequestContext());
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    context->GetChromeURLDataManagerBackend()->AddDataSource(data_source);
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    registered = true;
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDevToolsUI::DevToolsUI(TabContents* contents) : WebUI(contents) {
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DevToolsDataSource* data_source = new DevToolsDataSource();
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  contents->profile()->GetChromeURLDataManager()->AddDataSource(data_source);
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DevToolsUI::RenderViewCreated(RenderViewHost* render_view_host) {
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  render_view_host->Send(new DevToolsMsg_SetupDevToolsClient(
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      render_view_host->routing_id()));
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
108