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