diff options
Diffstat (limited to 'chromium/content/browser/devtools/devtools_http_handler_impl.cc')
-rw-r--r-- | chromium/content/browser/devtools/devtools_http_handler_impl.cc | 112 |
1 files changed, 73 insertions, 39 deletions
diff --git a/chromium/content/browser/devtools/devtools_http_handler_impl.cc b/chromium/content/browser/devtools/devtools_http_handler_impl.cc index 1d0fca1e282..d1b5b1e6724 100644 --- a/chromium/content/browser/devtools/devtools_http_handler_impl.cc +++ b/chromium/content/browser/devtools/devtools_http_handler_impl.cc @@ -14,6 +14,7 @@ #include "base/logging.h" #include "base/message_loop/message_loop_proxy.h" #include "base/stl_util.h" +#include "base/strings/string_number_conversions.h" #include "base/threading/thread.h" #include "base/values.h" #include "content/browser/devtools/devtools_browser_target.h" @@ -31,14 +32,15 @@ #include "content/public/browser/devtools_target.h" #include "content/public/common/content_client.h" #include "content/public/common/url_constants.h" +#include "content/public/common/user_agent.h" +#include "content/public/common/user_agent.h" #include "grit/devtools_resources_map.h" #include "net/base/escape.h" #include "net/base/io_buffer.h" #include "net/base/ip_endpoint.h" +#include "net/base/net_errors.h" #include "net/server/http_server_request_info.h" #include "net/server/http_server_response_info.h" -#include "webkit/common/user_agent/user_agent.h" -#include "webkit/common/user_agent/user_agent_util.h" #if defined(OS_ANDROID) #include "base/android/build_info.h" @@ -48,7 +50,8 @@ namespace content { namespace { -const char kProtocolVersion[] = "1.0"; +const base::FilePath::CharType kDevToolsActivePortFileName[] = + FILE_PATH_LITERAL("DevToolsActivePort"); const char kDevToolsHandlerThreadName[] = "Chrome_DevToolsHandlerThread"; @@ -56,6 +59,7 @@ const char kThumbUrlPrefix[] = "/thumb/"; const char kPageUrlPrefix[] = "/devtools/page/"; const char kTargetIdField[] = "id"; +const char kTargetParentIdField[] = "parentId"; const char kTargetTypeField[] = "type"; const char kTargetTitleField[] = "title"; const char kTargetDescriptionField[] = "description"; @@ -135,7 +139,7 @@ static bool TimeComparator(const DevToolsTarget* target1, // static bool DevToolsHttpHandler::IsSupportedProtocolVersion( const std::string& version) { - return version == kProtocolVersion; + return devtools::IsSupportedProtocolVersion(version); } // static @@ -151,11 +155,13 @@ int DevToolsHttpHandler::GetFrontendResourceId(const std::string& name) { DevToolsHttpHandler* DevToolsHttpHandler::Start( const net::StreamListenSocketFactory* socket_factory, const std::string& frontend_url, - DevToolsHttpHandlerDelegate* delegate) { + DevToolsHttpHandlerDelegate* delegate, + const base::FilePath& active_port_output_directory) { DevToolsHttpHandlerImpl* http_handler = new DevToolsHttpHandlerImpl(socket_factory, frontend_url, - delegate); + delegate, + active_port_output_directory); http_handler->Start(); return http_handler; } @@ -215,8 +221,7 @@ GURL DevToolsHttpHandlerImpl::GetFrontendURL() { net::IPEndPoint ip_address; if (server_->GetLocalAddress(&ip_address)) return GURL(); - return GURL(std::string("http://") + ip_address.ToString() + - overridden_frontend_url_); + return GURL(std::string("http://") + ip_address.ToString() + frontend_url_); } static std::string PathWithoutParams(const std::string& path) { @@ -237,7 +242,12 @@ static std::string GetMimeType(const std::string& filename) { return "image/png"; } else if (EndsWith(filename, ".gif", false)) { return "image/gif"; + } else if (EndsWith(filename, ".json", false)) { + return "application/json"; } + LOG(ERROR) << "GetMimeType doesn't know mime type for: " + << filename + << " text/plain will be returned"; NOTREACHED(); return "text/plain"; } @@ -262,7 +272,7 @@ void DevToolsHttpHandlerImpl::OnHttpRequest( DevToolsTarget* target = GetTarget(target_id); GURL page_url; if (target) - page_url = target->GetUrl(); + page_url = target->GetURL(); BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, @@ -318,24 +328,21 @@ void DevToolsHttpHandlerImpl::OnWebSocketRequest( std::string browser_prefix = "/devtools/browser"; size_t browser_pos = request.path.find(browser_prefix); if (browser_pos == 0) { - if (browser_target_) { - server_->Send500(connection_id, "Another client already attached"); - return; - } - browser_target_ = new DevToolsBrowserTarget( - thread_->message_loop_proxy().get(), server_.get(), connection_id); - browser_target_->RegisterDomainHandler( + scoped_refptr<DevToolsBrowserTarget> browser_target = + new DevToolsBrowserTarget(server_.get(), connection_id); + browser_target->RegisterDomainHandler( devtools::Tracing::kName, - new DevToolsTracingHandler(), + new DevToolsTracingHandler(DevToolsTracingHandler::Browser), true /* handle on UI thread */); - browser_target_->RegisterDomainHandler( + browser_target->RegisterDomainHandler( TetheringHandler::kDomain, new TetheringHandler(delegate_.get()), false /* handle on this thread */); - browser_target_->RegisterDomainHandler( + browser_target->RegisterDomainHandler( devtools::SystemInfo::kName, new DevToolsSystemInfoHandler(), true /* handle on UI thread */); + browser_targets_[connection_id] = browser_target; server_->AcceptWebSocket(connection_id, request); return; @@ -354,8 +361,9 @@ void DevToolsHttpHandlerImpl::OnWebSocketRequest( void DevToolsHttpHandlerImpl::OnWebSocketMessage( int connection_id, const std::string& data) { - if (browser_target_ && connection_id == browser_target_->connection_id()) { - browser_target_->HandleMessage(data); + BrowserTargets::iterator it = browser_targets_.find(connection_id); + if (it != browser_targets_.end()) { + it->second->HandleMessage(data); return; } @@ -370,9 +378,10 @@ void DevToolsHttpHandlerImpl::OnWebSocketMessage( } void DevToolsHttpHandlerImpl::OnClose(int connection_id) { - if (browser_target_ && browser_target_->connection_id() == connection_id) { - browser_target_->Detach(); - browser_target_ = NULL; + BrowserTargets::iterator it = browser_targets_.find(connection_id); + if (it != browser_targets_.end()) { + it->second->Detach(); + browser_targets_.erase(it); return; } @@ -390,8 +399,8 @@ std::string DevToolsHttpHandlerImpl::GetFrontendURLInternal( const std::string& host) { return base::StringPrintf( "%s%sws=%s%s%s", - overridden_frontend_url_.c_str(), - overridden_frontend_url_.find("?") == std::string::npos ? "?" : "&", + frontend_url_.c_str(), + frontend_url_.find("?") == std::string::npos ? "?" : "&", host.c_str(), kPageUrlPrefix, id.c_str()); @@ -452,11 +461,10 @@ void DevToolsHttpHandlerImpl::OnJsonRequestUI( if (command == "version") { base::DictionaryValue version; - version.SetString("Protocol-Version", kProtocolVersion); - version.SetString("WebKit-Version", webkit_glue::GetWebKitVersion()); - version.SetString("Browser", content::GetContentClient()->GetProduct()); - version.SetString("User-Agent", - webkit_glue::GetUserAgent(GURL(kAboutBlankURL))); + version.SetString("Protocol-Version", devtools::kProtocolVersion); + version.SetString("WebKit-Version", GetWebKitVersion()); + version.SetString("Browser", GetContentClient()->GetProduct()); + version.SetString("User-Agent", GetContentClient()->GetUserAgent()); #if defined(OS_ANDROID) version.SetString("Android-Package", base::android::BuildInfo::GetInstance()->package_name()); @@ -478,7 +486,7 @@ void DevToolsHttpHandlerImpl::OnJsonRequestUI( GURL url(net::UnescapeURLComponent( query, net::UnescapeRule::URL_SPECIAL_CHARS)); if (!url.is_valid()) - url = GURL(kAboutBlankURL); + url = GURL(url::kAboutBlankURL); scoped_ptr<DevToolsTarget> target(delegate_->CreateNewTarget(url)); if (!target) { SendJson(connection_id, @@ -641,12 +649,14 @@ void DevToolsHttpHandlerImpl::OnCloseUI(int connection_id) { DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl( const net::StreamListenSocketFactory* socket_factory, const std::string& frontend_url, - DevToolsHttpHandlerDelegate* delegate) - : overridden_frontend_url_(frontend_url), + DevToolsHttpHandlerDelegate* delegate, + const base::FilePath& active_port_output_directory) + : frontend_url_(frontend_url), socket_factory_(socket_factory), - delegate_(delegate) { - if (overridden_frontend_url_.empty()) - overridden_frontend_url_ = "/devtools/devtools.html"; + delegate_(delegate), + active_port_output_directory_(active_port_output_directory) { + if (frontend_url_.empty()) + frontend_url_ = "/devtools/devtools.html"; // Balanced in ResetHandlerThreadAndRelease(). AddRef(); @@ -655,6 +665,8 @@ DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl( // Runs on the handler thread void DevToolsHttpHandlerImpl::Init() { server_ = new net::HttpServer(*socket_factory_.get(), this); + if (!active_port_output_directory_.empty()) + WriteActivePortToUserProfile(); } // Runs on the handler thread @@ -674,6 +686,25 @@ void DevToolsHttpHandlerImpl::StopHandlerThread() { thread_->Stop(); } +void DevToolsHttpHandlerImpl::WriteActivePortToUserProfile() { + DCHECK(!active_port_output_directory_.empty()); + net::IPEndPoint endpoint; + int err; + if ((err = server_->GetLocalAddress(&endpoint)) != net::OK) { + LOG(ERROR) << "Error " << err << " getting local address"; + return; + } + + // Write this port to a well-known file in the profile directory + // so Telemetry can pick it up. + base::FilePath path = active_port_output_directory_.Append( + kDevToolsActivePortFileName); + std::string port_string = base::IntToString(endpoint.port()); + if (base::WriteFile(path, port_string.c_str(), port_string.length()) < 0) { + LOG(ERROR) << "Error writing DevTools active port to file"; + } +} + void DevToolsHttpHandlerImpl::SendJson(int connection_id, net::HttpStatusCode status_code, base::Value* value, @@ -753,15 +784,18 @@ base::DictionaryValue* DevToolsHttpHandlerImpl::SerializeTarget( std::string id = target.GetId(); dictionary->SetString(kTargetIdField, id); + std::string parent_id = target.GetParentId(); + if (!parent_id.empty()) + dictionary->SetString(kTargetParentIdField, parent_id); dictionary->SetString(kTargetTypeField, target.GetType()); dictionary->SetString(kTargetTitleField, net::EscapeForHTML(target.GetTitle())); dictionary->SetString(kTargetDescriptionField, target.GetDescription()); - GURL url = target.GetUrl(); + GURL url = target.GetURL(); dictionary->SetString(kTargetUrlField, url.spec()); - GURL favicon_url = target.GetFaviconUrl(); + GURL favicon_url = target.GetFaviconURL(); if (favicon_url.is_valid()) dictionary->SetString(kTargetFaviconUrlField, favicon_url.spec()); |