diff options
author | dgozman <dgozman@chromium.org> | 2015-04-20 08:45:46 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-20 15:45:59 +0000 |
commit | 102fee9bf48795fced65a8a817a5f62e054e1fc6 (patch) | |
tree | 1ad92bd0086fe998507a033187e25503c052da32 | |
parent | e936869562e01bd1f1d36797641922d9753e580f (diff) | |
download | chromium_src-102fee9bf48795fced65a8a817a5f62e054e1fc6.zip chromium_src-102fee9bf48795fced65a8a817a5f62e054e1fc6.tar.gz chromium_src-102fee9bf48795fced65a8a817a5f62e054e1fc6.tar.bz2 |
Componentize devtools_http_handler.
This moves DevToolsHttpHandler into it's own component.
It still depends on content::DevToolsTarget, which will be moved to
devtools_discovery component next.
BUG=476496
Review URL: https://codereview.chromium.org/1089413002
Cr-Commit-Position: refs/heads/master@{#325849}
61 files changed, 706 insertions, 553 deletions
diff --git a/android_webview/common/aw_content_client.cc b/android_webview/common/aw_content_client.cc index 240b734..b4400ae 100644 --- a/android_webview/common/aw_content_client.cc +++ b/android_webview/common/aw_content_client.cc @@ -13,16 +13,12 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" -namespace { +namespace android_webview { std::string GetProduct() { return "Chrome/" PRODUCT_VERSION; } -} - -namespace android_webview { - std::string GetUserAgent() { // "Version/4.0" had been hardcoded in the legacy WebView. std::string product = "Version/4.0 " + GetProduct(); @@ -40,7 +36,7 @@ std::string GetExtraOSUserAgentInfo() { } std::string AwContentClient::GetProduct() const { - return ::GetProduct(); + return android_webview::GetProduct(); } std::string AwContentClient::GetUserAgent() const { diff --git a/android_webview/common/aw_content_client.h b/android_webview/common/aw_content_client.h index 957b7b6c..01f4ff8 100644 --- a/android_webview/common/aw_content_client.h +++ b/android_webview/common/aw_content_client.h @@ -11,6 +11,7 @@ namespace android_webview { +std::string GetProduct(); std::string GetUserAgent(); // extra text to be put into the OS section of the user agent text std::string GetExtraOSUserAgentInfo(); diff --git a/android_webview/native/DEPS b/android_webview/native/DEPS index 4b8dbbb..d1c0799 100644 --- a/android_webview/native/DEPS +++ b/android_webview/native/DEPS @@ -12,6 +12,7 @@ include_rules = [ "+components/autofill/core/browser", "+components/autofill/core/common", "+components/data_reduction_proxy/core/browser", + "+components/devtools_http_handler", "+components/navigation_interception", "+components/user_prefs", "+components/web_contents_delegate_android", diff --git a/android_webview/native/aw_dev_tools_server.cc b/android_webview/native/aw_dev_tools_server.cc index 52d474e..1e11f28 100644 --- a/android_webview/native/aw_dev_tools_server.cc +++ b/android_webview/native/aw_dev_tools_server.cc @@ -4,6 +4,8 @@ #include "android_webview/native/aw_dev_tools_server.h" +#include "android_webview/browser/aw_dev_tools_manager_delegate.h" +#include "android_webview/common/aw_content_client.h" #include "android_webview/native/aw_contents.h" #include "base/bind.h" #include "base/files/file_path.h" @@ -11,10 +13,10 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" +#include "components/devtools_http_handler/devtools_http_handler.h" +#include "components/devtools_http_handler/devtools_http_handler_delegate.h" #include "content/public/browser/android/devtools_auth.h" #include "content/public/browser/devtools_agent_host.h" -#include "content/public/browser/devtools_http_handler.h" -#include "content/public/browser/devtools_http_handler_delegate.h" #include "content/public/browser/devtools_target.h" #include "content/public/browser/web_contents.h" #include "content/public/common/user_agent.h" @@ -25,6 +27,7 @@ using content::DevToolsAgentHost; using content::RenderViewHost; using content::WebContents; +using devtools_http_handler::DevToolsHttpHandler; namespace { @@ -37,23 +40,18 @@ const int kBackLog = 10; // Delegate implementation for the devtools http handler for WebView. A new // instance of this gets created each time web debugging is enabled. -class AwDevToolsServerDelegate : public content::DevToolsHttpHandlerDelegate { +class AwDevToolsServerDelegate : + public devtools_http_handler::DevToolsHttpHandlerDelegate { public: AwDevToolsServerDelegate() { } ~AwDevToolsServerDelegate() override {} - // DevToolsHttpProtocolHandler::Delegate overrides. + // devtools_http_handler::DevToolsHttpHandlerDelegate implementation. std::string GetDiscoveryPageHTML() override; + std::string GetFrontendResource(const std::string& path) override; - bool BundlesFrontendResources() override { - return false; - } - - base::FilePath GetDebugFrontendDir() override { - return base::FilePath(); - } private: DISALLOW_COPY_AND_ASSIGN(AwDevToolsServerDelegate); @@ -70,9 +68,14 @@ std::string AwDevToolsServerDelegate::GetDiscoveryPageHTML() { return html; } +std::string AwDevToolsServerDelegate::GetFrontendResource( + const std::string& path) { + return std::string(); +} + // Factory for UnixDomainServerSocket. class UnixDomainServerSocketFactory - : public content::DevToolsHttpHandler::ServerSocketFactory { + : public DevToolsHttpHandler::ServerSocketFactory { public: explicit UnixDomainServerSocketFactory(const std::string& socket_name) : socket_name_(socket_name), @@ -80,7 +83,7 @@ class UnixDomainServerSocketFactory } private: - // content::DevToolsHttpHandler::ServerSocketFactory. + // devtools_http_handler::DevToolsHttpHandler::ServerSocketFactory. scoped_ptr<net::ServerSocket> CreateForHttpServer() override { scoped_ptr<net::ServerSocket> socket( new net::UnixDomainServerSocket( @@ -122,25 +125,31 @@ AwDevToolsServer::~AwDevToolsServer() { } void AwDevToolsServer::Start() { - if (protocol_handler_) + if (devtools_http_handler_) return; - scoped_ptr<content::DevToolsHttpHandler::ServerSocketFactory> factory( + scoped_ptr<DevToolsHttpHandler::ServerSocketFactory> factory( new UnixDomainServerSocketFactory( base::StringPrintf(kSocketNameFormat, getpid()))); - protocol_handler_.reset(content::DevToolsHttpHandler::Start( + manager_delegate_.reset(new AwDevToolsManagerDelegate()); + devtools_http_handler_.reset(new DevToolsHttpHandler( factory.Pass(), base::StringPrintf(kFrontEndURL, content::GetWebKitRevision().c_str()), new AwDevToolsServerDelegate(), - base::FilePath())); + manager_delegate_.get(), + base::FilePath(), + base::FilePath(), + GetProduct(), + GetUserAgent())); } void AwDevToolsServer::Stop() { - protocol_handler_.reset(); + devtools_http_handler_.reset(); + manager_delegate_.reset(); } bool AwDevToolsServer::IsStarted() const { - return protocol_handler_; + return devtools_http_handler_; } bool RegisterAwDevToolsServer(JNIEnv* env) { diff --git a/android_webview/native/aw_dev_tools_server.h b/android_webview/native/aw_dev_tools_server.h index 33955dc..48669a5 100644 --- a/android_webview/native/aw_dev_tools_server.h +++ b/android_webview/native/aw_dev_tools_server.h @@ -11,12 +11,14 @@ #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" -namespace content { +namespace devtools_http_handler { class DevToolsHttpHandler; } namespace android_webview { +class AwDevToolsManagerDelegate; + // This class controls WebView-specific Developer Tools remote debugging server. class AwDevToolsServer { public: @@ -32,7 +34,9 @@ class AwDevToolsServer { bool IsStarted() const; private: - scoped_ptr<content::DevToolsHttpHandler> protocol_handler_; + // TODO(dgozman): remove once devtools_discovery component is extracted. + scoped_ptr<AwDevToolsManagerDelegate> manager_delegate_; + scoped_ptr<devtools_http_handler::DevToolsHttpHandler> devtools_http_handler_; DISALLOW_COPY_AND_ASSIGN(AwDevToolsServer); }; diff --git a/android_webview/native/webview_native.gyp b/android_webview/native/webview_native.gyp index 121a876..960dc0f 100644 --- a/android_webview/native/webview_native.gyp +++ b/android_webview/native/webview_native.gyp @@ -14,6 +14,7 @@ '../../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations', '../../cc/cc.gyp:cc', '../../components/components.gyp:autofill_content_browser', + '../../components/components.gyp:devtools_http_handler', '../../components/components.gyp:web_contents_delegate_android', '../../content/content.gyp:content_common', '../../media/media.gyp:player_android', diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 80b2f9b..adb4c14 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn @@ -239,6 +239,7 @@ source_set("browser") { "//components/autofill/content/browser", "//components/browsing_data", "//components/data_reduction_proxy/content/browser", + "//components/devtools_http_handler", "//components/dom_distiller/content", "//components/favicon/content", "//components/history/content/browser", diff --git a/chrome/browser/android/DEPS b/chrome/browser/android/DEPS index a78dfeb..9838090 100644 --- a/chrome/browser/android/DEPS +++ b/chrome/browser/android/DEPS @@ -1,5 +1,6 @@ include_rules = [ "-components/devtools_bridge", + "+components/devtools_http_handler", "+components/service_tab_launcher", "+components/web_contents_delegate_android", "+cc/layers/layer.h" diff --git a/chrome/browser/android/dev_tools_server.cc b/chrome/browser/android/dev_tools_server.cc index e6d15aa..9a91c6b 100644 --- a/chrome/browser/android/dev_tools_server.cc +++ b/chrome/browser/android/dev_tools_server.cc @@ -18,18 +18,21 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "chrome/browser/android/dev_tools_manager_delegate_android.h" #include "chrome/browser/android/tab_android.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/history/top_sites_factory.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/android/tab_model/tab_model.h" #include "chrome/browser/ui/android/tab_model/tab_model_list.h" +#include "chrome/common/chrome_content_client.h" +#include "chrome/common/chrome_version_info.h" +#include "components/devtools_http_handler/devtools_http_handler.h" +#include "components/devtools_http_handler/devtools_http_handler_delegate.h" #include "components/history/core/browser/top_sites.h" #include "content/public/browser/android/devtools_auth.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/devtools_agent_host.h" -#include "content/public/browser/devtools_http_handler.h" -#include "content/public/browser/devtools_http_handler_delegate.h" #include "content/public/browser/devtools_target.h" #include "content/public/browser/favicon_status.h" #include "content/public/browser/navigation_entry.h" @@ -50,6 +53,7 @@ using content::DevToolsAgentHost; using content::RenderViewHost; using content::WebContents; +using devtools_http_handler::DevToolsHttpHandler; namespace { @@ -81,7 +85,8 @@ bool AuthorizeSocketAccessWithDebugPermission( // Delegate implementation for the devtools http handler on android. A new // instance of this gets created each time devtools is enabled. -class DevToolsServerDelegate : public content::DevToolsHttpHandlerDelegate { +class DevToolsServerDelegate : + public devtools_http_handler::DevToolsHttpHandlerDelegate { public: DevToolsServerDelegate() { } @@ -97,12 +102,8 @@ class DevToolsServerDelegate : public content::DevToolsHttpHandlerDelegate { IDR_DEVTOOLS_DISCOVERY_PAGE_HTML).as_string(); } - bool BundlesFrontendResources() override { - return false; - } - - base::FilePath GetDebugFrontendDir() override { - return base::FilePath(); + std::string GetFrontendResource(const std::string& path) override { + return std::string(); } private: @@ -121,7 +122,7 @@ class DevToolsServerDelegate : public content::DevToolsHttpHandlerDelegate { // Factory for UnixDomainServerSocket. It tries a fallback socket when // original socket doesn't work. class UnixDomainServerSocketFactory - : public content::DevToolsHttpHandler::ServerSocketFactory { + : public DevToolsHttpHandler::ServerSocketFactory { public: UnixDomainServerSocketFactory( const std::string& socket_name, @@ -187,28 +188,36 @@ DevToolsServer::~DevToolsServer() { } void DevToolsServer::Start(bool allow_debug_permission) { - if (protocol_handler_) + if (devtools_http_handler_) return; net::UnixDomainServerSocket::AuthCallback auth_callback = allow_debug_permission ? base::Bind(&AuthorizeSocketAccessWithDebugPermission) : base::Bind(&content::CanUserConnectToDevTools); - scoped_ptr<content::DevToolsHttpHandler::ServerSocketFactory> factory( + manager_delegate_.reset(new DevToolsManagerDelegateAndroid()); + chrome::VersionInfo version_info; + + scoped_ptr<DevToolsHttpHandler::ServerSocketFactory> factory( new UnixDomainServerSocketFactory(socket_name_, auth_callback)); - protocol_handler_.reset(content::DevToolsHttpHandler::Start( + devtools_http_handler_.reset(new DevToolsHttpHandler( factory.Pass(), base::StringPrintf(kFrontEndURL, content::GetWebKitRevision().c_str()), new DevToolsServerDelegate(), - base::FilePath())); + manager_delegate_.get(), + base::FilePath(), + base::FilePath(), + version_info.ProductNameAndVersionForUserAgent(), + ::GetUserAgent())); } void DevToolsServer::Stop() { - protocol_handler_.reset(); + devtools_http_handler_.reset(); + manager_delegate_.reset(); } bool DevToolsServer::IsStarted() const { - return protocol_handler_; + return devtools_http_handler_; } bool RegisterDevToolsServer(JNIEnv* env) { diff --git a/chrome/browser/android/dev_tools_server.h b/chrome/browser/android/dev_tools_server.h index 614d4c9..2716ef3 100644 --- a/chrome/browser/android/dev_tools_server.h +++ b/chrome/browser/android/dev_tools_server.h @@ -10,10 +10,12 @@ #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" -namespace content { +namespace devtools_http_handler { class DevToolsHttpHandler; } +class DevToolsManagerDelegateAndroid; + // This class controls Developer Tools remote debugging server. class DevToolsServer { public: @@ -30,7 +32,9 @@ class DevToolsServer { private: std::string socket_name_; - scoped_ptr<content::DevToolsHttpHandler> protocol_handler_; + // TODO(dgozman): remove once devtools_discovery component is extracted. + scoped_ptr<DevToolsManagerDelegateAndroid> manager_delegate_; + scoped_ptr<devtools_http_handler::DevToolsHttpHandler> devtools_http_handler_; DISALLOW_COPY_AND_ASSIGN(DevToolsServer); }; diff --git a/chrome/browser/devtools/BUILD.gn b/chrome/browser/devtools/BUILD.gn index a7580cb..b4ab715 100644 --- a/chrome/browser/devtools/BUILD.gn +++ b/chrome/browser/devtools/BUILD.gn @@ -68,6 +68,7 @@ static_library("devtools") { "//chrome:extra_resources", "//chrome:resources", "//chrome:strings", + "//components/devtools_http_handler", "//net:http_server", "//skia", "//third_party/icu", @@ -76,8 +77,6 @@ static_library("devtools") { ":webrtc_device_provider_resources", ] sources += [ - "browser_list_tabcontents_provider.cc", - "browser_list_tabcontents_provider.h", "chrome_devtools_manager_delegate.cc", "chrome_devtools_manager_delegate.h", "device/adb/adb_client_socket.cc", diff --git a/chrome/browser/devtools/DEPS b/chrome/browser/devtools/DEPS new file mode 100644 index 0000000..8b64aaa --- /dev/null +++ b/chrome/browser/devtools/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + "+components/devtools_http_handler", +] diff --git a/chrome/browser/devtools/browser_list_tabcontents_provider.cc b/chrome/browser/devtools/browser_list_tabcontents_provider.cc deleted file mode 100644 index 5c4d4f7..0000000 --- a/chrome/browser/devtools/browser_list_tabcontents_provider.cc +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/devtools/browser_list_tabcontents_provider.h" - -#include "base/path_service.h" -#include "chrome/browser/history/top_sites_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_iterator.h" -#include "chrome/common/chrome_paths.h" -#include "components/history/core/browser/top_sites.h" -#include "grit/browser_resources.h" -#include "ui/base/resource/resource_bundle.h" - -BrowserListTabContentsProvider::BrowserListTabContentsProvider() { -} - -BrowserListTabContentsProvider::~BrowserListTabContentsProvider() { -} - -std::string BrowserListTabContentsProvider::GetDiscoveryPageHTML() { - std::set<Profile*> profiles; - for (chrome::BrowserIterator it; !it.done(); it.Next()) - profiles.insert((*it)->profile()); - - for (std::set<Profile*>::iterator it = profiles.begin(); - it != profiles.end(); ++it) { - scoped_refptr<history::TopSites> ts = TopSitesFactory::GetForProfile(*it); - if (ts) { - // TopSites updates itself after a delay. Ask TopSites to update itself - // when we're about to show the remote debugging landing page. - ts->SyncWithHistory(); - } - } - return ResourceBundle::GetSharedInstance().GetRawDataResource( - IDR_DEVTOOLS_DISCOVERY_PAGE_HTML).as_string(); -} - -bool BrowserListTabContentsProvider::BundlesFrontendResources() { - return true; -} - -base::FilePath BrowserListTabContentsProvider::GetDebugFrontendDir() { -#if defined(DEBUG_DEVTOOLS) - base::FilePath inspector_dir; - PathService::Get(chrome::DIR_INSPECTOR, &inspector_dir); - return inspector_dir; -#else - return base::FilePath(); -#endif -} diff --git a/chrome/browser/devtools/browser_list_tabcontents_provider.h b/chrome/browser/devtools/browser_list_tabcontents_provider.h deleted file mode 100644 index fa36ae1..0000000 --- a/chrome/browser/devtools/browser_list_tabcontents_provider.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_DEVTOOLS_BROWSER_LIST_TABCONTENTS_PROVIDER_H_ -#define CHROME_BROWSER_DEVTOOLS_BROWSER_LIST_TABCONTENTS_PROVIDER_H_ - -#include "chrome/browser/ui/host_desktop.h" -#include "content/public/browser/devtools_http_handler_delegate.h" - -class BrowserListTabContentsProvider - : public content::DevToolsHttpHandlerDelegate { - public: - BrowserListTabContentsProvider(); - ~BrowserListTabContentsProvider() override; - - // DevToolsHttpHandlerDelegate implementation. - std::string GetDiscoveryPageHTML() override; - bool BundlesFrontendResources() override; - base::FilePath GetDebugFrontendDir() override; - - private: - DISALLOW_COPY_AND_ASSIGN(BrowserListTabContentsProvider); -}; - -#endif // CHROME_BROWSER_DEVTOOLS_BROWSER_LIST_TABCONTENTS_PROVIDER_H_ diff --git a/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chrome/browser/devtools/devtools_sanity_browsertest.cc index db9eb50..382133c 100644 --- a/chrome/browser/devtools/devtools_sanity_browsertest.cc +++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc @@ -14,7 +14,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/test_timeouts.h" #include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/devtools/browser_list_tabcontents_provider.h" #include "chrome/browser/devtools/device/self_device_provider.h" #include "chrome/browser/devtools/devtools_window_testing.h" #include "chrome/browser/extensions/extension_apitest.h" @@ -39,7 +38,6 @@ #include "content/public/browser/child_process_data.h" #include "content/public/browser/content_browser_client.h" #include "content/public/browser/devtools_agent_host.h" -#include "content/public/browser/devtools_http_handler.h" #include "content/public/browser/notification_registrar.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/render_view_host.h" diff --git a/chrome/browser/devtools/remote_debugging_server.cc b/chrome/browser/devtools/remote_debugging_server.cc index 9805cd9..4fe1064 100644 --- a/chrome/browser/devtools/remote_debugging_server.cc +++ b/chrome/browser/devtools/remote_debugging_server.cc @@ -7,11 +7,22 @@ #include "base/lazy_instance.h" #include "base/path_service.h" #include "base/strings/string_number_conversions.h" -#include "chrome/browser/devtools/browser_list_tabcontents_provider.h" +#include "chrome/browser/devtools/chrome_devtools_manager_delegate.h" +#include "chrome/browser/history/top_sites_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_iterator.h" +#include "chrome/common/chrome_content_client.h" #include "chrome/common/chrome_paths.h" -#include "content/public/browser/devtools_http_handler.h" +#include "chrome/common/chrome_version_info.h" +#include "components/devtools_http_handler/devtools_http_handler.h" +#include "components/devtools_http_handler/devtools_http_handler_delegate.h" +#include "components/history/core/browser/top_sites.h" +#include "content/public/browser/devtools_frontend_host.h" +#include "grit/browser_resources.h" #include "net/base/net_errors.h" #include "net/socket/tcp_server_socket.h" +#include "ui/base/resource/resource_bundle.h" namespace { @@ -22,7 +33,7 @@ const uint16 kMaxTetheringPort = 9444; const int kBackLog = 10; class TCPServerSocketFactory - : public content::DevToolsHttpHandler::ServerSocketFactory { + : public devtools_http_handler::DevToolsHttpHandler::ServerSocketFactory { public: TCPServerSocketFactory(const std::string& address, uint16 port) : address_(address), @@ -31,7 +42,7 @@ class TCPServerSocketFactory } private: - // content::DevToolsHttpHandler::ServerSocketFactory. + // devtools_http_handler::DevToolsHttpHandler::ServerSocketFactory. scoped_ptr<net::ServerSocket> CreateForHttpServer() override { scoped_ptr<net::ServerSocket> socket( new net::TCPServerSocket(nullptr, net::NetLog::Source())); @@ -65,6 +76,49 @@ class TCPServerSocketFactory DISALLOW_COPY_AND_ASSIGN(TCPServerSocketFactory); }; +class ChromeDevToolsHttpHandlerDelegate + : public devtools_http_handler::DevToolsHttpHandlerDelegate { + public: + ChromeDevToolsHttpHandlerDelegate(); + ~ChromeDevToolsHttpHandlerDelegate() override; + + // devtools_http_handler::DevToolsHttpHandlerDelegate implementation. + std::string GetDiscoveryPageHTML() override; + std::string GetFrontendResource(const std::string& path) override; + + private: + DISALLOW_COPY_AND_ASSIGN(ChromeDevToolsHttpHandlerDelegate); +}; + +ChromeDevToolsHttpHandlerDelegate::ChromeDevToolsHttpHandlerDelegate() { +} + +ChromeDevToolsHttpHandlerDelegate::~ChromeDevToolsHttpHandlerDelegate() { +} + +std::string ChromeDevToolsHttpHandlerDelegate::GetDiscoveryPageHTML() { + std::set<Profile*> profiles; + for (chrome::BrowserIterator it; !it.done(); it.Next()) + profiles.insert((*it)->profile()); + + for (std::set<Profile*>::iterator it = profiles.begin(); + it != profiles.end(); ++it) { + scoped_refptr<history::TopSites> ts = TopSitesFactory::GetForProfile(*it); + if (ts) { + // TopSites updates itself after a delay. Ask TopSites to update itself + // when we're about to show the remote debugging landing page. + ts->SyncWithHistory(); + } + } + return ResourceBundle::GetSharedInstance().GetRawDataResource( + IDR_DEVTOOLS_DISCOVERY_PAGE_HTML).as_string(); +} + +std::string ChromeDevToolsHttpHandlerDelegate::GetFrontendResource( + const std::string& path) { + return content::DevToolsFrontendHost::GetFrontendResource(path).as_string(); +} + } // namespace // static @@ -85,11 +139,24 @@ RemoteDebuggingServer::RemoteDebuggingServer( DCHECK(result); } - devtools_http_handler_.reset(content::DevToolsHttpHandler::Start( + manager_delegate_.reset(new ChromeDevToolsManagerDelegate()); + + base::FilePath debug_frontend_dir; +#if defined(DEBUG_DEVTOOLS) + PathService::Get(chrome::DIR_INSPECTOR, &debug_frontend_dir); +#endif + + chrome::VersionInfo version_info; + + devtools_http_handler_.reset(new devtools_http_handler::DevToolsHttpHandler( make_scoped_ptr(new TCPServerSocketFactory(ip, port)), std::string(), - new BrowserListTabContentsProvider(), - output_dir)); + new ChromeDevToolsHttpHandlerDelegate(), + manager_delegate_.get(), + output_dir, + debug_frontend_dir, + version_info.ProductNameAndVersionForUserAgent(), + ::GetUserAgent())); } RemoteDebuggingServer::~RemoteDebuggingServer() { diff --git a/chrome/browser/devtools/remote_debugging_server.h b/chrome/browser/devtools/remote_debugging_server.h index c8afa6f..c82565f 100644 --- a/chrome/browser/devtools/remote_debugging_server.h +++ b/chrome/browser/devtools/remote_debugging_server.h @@ -11,10 +11,12 @@ #include "base/memory/scoped_ptr.h" #include "chrome/browser/ui/host_desktop.h" -namespace content { +namespace devtools_http_handler { class DevToolsHttpHandler; } +class ChromeDevToolsManagerDelegate; + class RemoteDebuggingServer { public: static void EnableTetheringForDebug(); @@ -26,7 +28,9 @@ class RemoteDebuggingServer { virtual ~RemoteDebuggingServer(); private: - scoped_ptr<content::DevToolsHttpHandler> devtools_http_handler_; + // TODO(dgozman): remove once devtools_discovery component is extracted. + scoped_ptr<ChromeDevToolsManagerDelegate> manager_delegate_; + scoped_ptr<devtools_http_handler::DevToolsHttpHandler> devtools_http_handler_; DISALLOW_COPY_AND_ASSIGN(RemoteDebuggingServer); }; diff --git a/chrome/browser/extensions/api/debugger/debugger_api.cc b/chrome/browser/extensions/api/debugger/debugger_api.cc index 9acec23..c5900b8 100644 --- a/chrome/browser/extensions/api/debugger/debugger_api.cc +++ b/chrome/browser/extensions/api/debugger/debugger_api.cc @@ -32,7 +32,6 @@ #include "components/infobars/core/confirm_infobar_delegate.h" #include "components/infobars/core/infobar.h" #include "content/public/browser/devtools_agent_host.h" -#include "content/public/browser/devtools_http_handler.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/notification_source.h" #include "content/public/browser/render_process_host.h" @@ -54,7 +53,6 @@ #include "ui/base/l10n/l10n_util.h" using content::DevToolsAgentHost; -using content::DevToolsHttpHandler; using content::RenderProcessHost; using content::RenderViewHost; using content::RenderWidgetHost; @@ -581,7 +579,7 @@ bool DebuggerAttachFunction::RunAsync() { if (!InitAgentHost()) return false; - if (!DevToolsHttpHandler::IsSupportedProtocolVersion( + if (!DevToolsAgentHost::IsSupportedProtocolVersion( params->required_version)) { error_ = ErrorUtils::FormatErrorMessage( keys::kProtocolVersionNotSupportedError, diff --git a/chrome/browser/ui/webui/devtools_ui.cc b/chrome/browser/ui/webui/devtools_ui.cc index 6daac95..541fcc3 100644 --- a/chrome/browser/ui/webui/devtools_ui.cc +++ b/chrome/browser/ui/webui/devtools_ui.cc @@ -10,7 +10,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/common/url_constants.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/devtools_http_handler.h" +#include "content/public/browser/devtools_frontend_host.h" #include "content/public/browser/url_data_source.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" @@ -18,7 +18,6 @@ #include "net/url_request/url_fetcher.h" #include "net/url_request/url_fetcher_delegate.h" #include "net/url_request/url_request_context_getter.h" -#include "ui/base/resource/resource_bundle.h" using content::BrowserThread; using content::WebContents; @@ -184,17 +183,15 @@ void DevToolsDataSource::StartBundledDataRequest( int render_frame_id, const content::URLDataSource::GotDataCallback& callback) { std::string filename = PathWithoutParams(path); + base::StringPiece resource = + content::DevToolsFrontendHost::GetFrontendResource(filename); - int resource_id = - content::DevToolsHttpHandler::GetFrontendResourceId(filename); - - DLOG_IF(WARNING, resource_id == -1) + DLOG_IF(WARNING, resource.empty()) << "Unable to find dev tool resource: " << filename << ". If you compiled with debug_devtools=1, try running with " "--debug-devtools."; - const ResourceBundle& rb = ResourceBundle::GetSharedInstance(); - scoped_refptr<base::RefCountedStaticMemory> bytes(rb.LoadDataResourceBytes( - resource_id)); + scoped_refptr<base::RefCountedStaticMemory> bytes( + new base::RefCountedStaticMemory(resource.data(), resource.length())); callback.Run(bytes.get()); } diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 278066e..c2496be 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -3089,6 +3089,7 @@ '../components/components.gyp:autofill_content_browser', '../components/components.gyp:browsing_data', '../components/components.gyp:data_reduction_proxy_content_browser', + '../components/components.gyp:devtools_http_handler', '../components/components.gyp:dom_distiller_content', '../components/components.gyp:favicon_content', '../components/components.gyp:history_content_browser', diff --git a/chrome/chrome_debugger.gypi b/chrome/chrome_debugger.gypi index 09b182a..f91380b 100644 --- a/chrome/chrome_debugger.gypi +++ b/chrome/chrome_debugger.gypi @@ -41,6 +41,7 @@ 'conditions': [ ['OS!="android"', { 'dependencies': [ + '../components/components.gyp:devtools_http_handler', '../net/net.gyp:http_server', '../skia/skia.gyp:skia', '../third_party/icu/icu.gyp:icui18n', @@ -56,8 +57,6 @@ 'sources': [ '<(SHARED_INTERMEDIATE_DIR)/chrome/grit/webrtc_device_provider_resources_map.cc', '<(SHARED_INTERMEDIATE_DIR)/chrome/grit/webrtc_device_provider_resources_map.h', - 'browser/devtools/browser_list_tabcontents_provider.cc', - 'browser/devtools/browser_list_tabcontents_provider.h', 'browser/devtools/chrome_devtools_manager_delegate.cc', 'browser/devtools/chrome_devtools_manager_delegate.h', 'browser/devtools/device/adb/adb_client_socket.cc', diff --git a/chromecast/browser/DEPS b/chromecast/browser/DEPS index 6998b2b..e91498e 100644 --- a/chromecast/browser/DEPS +++ b/chromecast/browser/DEPS @@ -4,6 +4,7 @@ include_rules = [ "+cc/base/switches.h", "+chromecast", "+components/crash", + "+components/devtools_http_handler", "+components/network_hints/browser", "+content/public/browser", "+gin/v8_initializer.h", diff --git a/chromecast/browser/devtools/cast_dev_tools_delegate.cc b/chromecast/browser/devtools/cast_dev_tools_delegate.cc index 727b47a..d5bbf17 100644 --- a/chromecast/browser/devtools/cast_dev_tools_delegate.cc +++ b/chromecast/browser/devtools/cast_dev_tools_delegate.cc @@ -98,12 +98,9 @@ std::string CastDevToolsDelegate::GetDiscoveryPageHTML() { #endif // defined(OS_ANDROID) } -bool CastDevToolsDelegate::BundlesFrontendResources() { - return false; -} - -base::FilePath CastDevToolsDelegate::GetDebugFrontendDir() { - return base::FilePath(); +std::string CastDevToolsDelegate::GetFrontendResource( + const std::string& path) { + return std::string(); } // CastDevToolsManagerDelegate ----------------------------------------------- diff --git a/chromecast/browser/devtools/cast_dev_tools_delegate.h b/chromecast/browser/devtools/cast_dev_tools_delegate.h index 809667b..38fbfcb 100644 --- a/chromecast/browser/devtools/cast_dev_tools_delegate.h +++ b/chromecast/browser/devtools/cast_dev_tools_delegate.h @@ -5,7 +5,7 @@ #ifndef CHROMECAST_BROWSER_DEVTOOLS_CAST_DEV_TOOLS_DELEGATE_H_ #define CHROMECAST_BROWSER_DEVTOOLS_CAST_DEV_TOOLS_DELEGATE_H_ -#include "content/public/browser/devtools_http_handler_delegate.h" +#include "components/devtools_http_handler/devtools_http_handler_delegate.h" #include "content/public/browser/devtools_manager_delegate.h" #include "net/socket/stream_listen_socket.h" @@ -20,15 +20,15 @@ class BrowserContext; namespace chromecast { namespace shell { -class CastDevToolsDelegate : public content::DevToolsHttpHandlerDelegate { +class CastDevToolsDelegate : + public devtools_http_handler::DevToolsHttpHandlerDelegate { public: CastDevToolsDelegate(); ~CastDevToolsDelegate() override; - // DevToolsHttpHandlerDelegate implementation. + // devtools_http_handler::DevToolsHttpHandlerDelegate implementation. std::string GetDiscoveryPageHTML() override; - bool BundlesFrontendResources() override; - base::FilePath GetDebugFrontendDir() override; + std::string GetFrontendResource(const std::string& path) override; private: DISALLOW_COPY_AND_ASSIGN(CastDevToolsDelegate); diff --git a/chromecast/browser/devtools/remote_debugging_server.cc b/chromecast/browser/devtools/remote_debugging_server.cc index 29aa7d8..3b78e38b 100644 --- a/chromecast/browser/devtools/remote_debugging_server.cc +++ b/chromecast/browser/devtools/remote_debugging_server.cc @@ -11,10 +11,11 @@ #include "base/strings/stringprintf.h" #include "chromecast/browser/cast_browser_process.h" #include "chromecast/browser/devtools/cast_dev_tools_delegate.h" +#include "chromecast/common/cast_content_client.h" #include "chromecast/common/pref_names.h" +#include "components/devtools_http_handler/devtools_http_handler.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/devtools_http_handler.h" #include "content/public/common/content_switches.h" #include "content/public/common/user_agent.h" #include "net/base/net_errors.h" @@ -25,6 +26,8 @@ #include "net/socket/unix_domain_server_socket_posix.h" #endif // defined(OS_ANDROID) +using devtools_http_handler::DevToolsHttpHandler; + namespace chromecast { namespace shell { @@ -38,13 +41,13 @@ const int kBackLog = 10; #if defined(OS_ANDROID) class UnixDomainServerSocketFactory - : public content::DevToolsHttpHandler::ServerSocketFactory { + : public DevToolsHttpHandler::ServerSocketFactory { public: explicit UnixDomainServerSocketFactory(const std::string& socket_name) : socket_name_(socket_name) {} private: - // content::DevToolsHttpHandler::ServerSocketFactory. + // devtools_http_handler::DevToolsHttpHandler::ServerSocketFactory. scoped_ptr<net::ServerSocket> CreateForHttpServer() override { scoped_ptr<net::ServerSocket> socket( new net::UnixDomainServerSocket( @@ -62,14 +65,14 @@ class UnixDomainServerSocketFactory }; #else class TCPServerSocketFactory - : public content::DevToolsHttpHandler::ServerSocketFactory { + : public DevToolsHttpHandler::ServerSocketFactory { public: TCPServerSocketFactory(const std::string& address, uint16 port) : address_(address), port_(port) { } private: - // content::DevToolsHttpHandler::ServerSocketFactory. + // devtools_http_handler::DevToolsHttpHandler::ServerSocketFactory. scoped_ptr<net::ServerSocket> CreateForHttpServer() override { scoped_ptr<net::ServerSocket> socket( new net::TCPServerSocket(nullptr, net::NetLog::Source())); @@ -86,7 +89,7 @@ class TCPServerSocketFactory }; #endif -scoped_ptr<content::DevToolsHttpHandler::ServerSocketFactory> +scoped_ptr<DevToolsHttpHandler::ServerSocketFactory> CreateSocketFactory(uint16 port) { #if defined(OS_ANDROID) base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); @@ -95,10 +98,10 @@ CreateSocketFactory(uint16 port) { socket_name = command_line->GetSwitchValueASCII( switches::kRemoteDebuggingSocketName); } - return scoped_ptr<content::DevToolsHttpHandler::ServerSocketFactory>( + return scoped_ptr<DevToolsHttpHandler::ServerSocketFactory>( new UnixDomainServerSocketFactory(socket_name)); #else - return scoped_ptr<content::DevToolsHttpHandler::ServerSocketFactory>( + return scoped_ptr<DevToolsHttpHandler::ServerSocketFactory>( new TCPServerSocketFactory("0.0.0.0", port)); #endif } @@ -145,11 +148,16 @@ void RemoteDebuggingServer::OnPortChanged() { port_ = new_port; if (port_ > 0) { - devtools_http_handler_.reset(content::DevToolsHttpHandler::Start( + manager_delegate_.reset(new CastDevToolsManagerDelegate()); + devtools_http_handler_.reset(new DevToolsHttpHandler( CreateSocketFactory(port_), GetFrontendUrl(), new CastDevToolsDelegate(), - base::FilePath())); + manager_delegate_.get(), + base::FilePath(), + base::FilePath(), + std::string(), + GetUserAgent())); LOG(INFO) << "Devtools started: port=" << port_; } } diff --git a/chromecast/browser/devtools/remote_debugging_server.h b/chromecast/browser/devtools/remote_debugging_server.h index ed662f8..2d9e48e 100644 --- a/chromecast/browser/devtools/remote_debugging_server.h +++ b/chromecast/browser/devtools/remote_debugging_server.h @@ -8,13 +8,15 @@ #include "base/memory/scoped_ptr.h" #include "base/prefs/pref_member.h" -namespace content { +namespace devtools_http_handler { class DevToolsHttpHandler; -} // namespace content +} namespace chromecast { namespace shell { +class CastDevToolsManagerDelegate; + class RemoteDebuggingServer { public: RemoteDebuggingServer(); @@ -28,7 +30,9 @@ class RemoteDebuggingServer { // on device startup. bool ShouldStartImmediately(); - scoped_ptr<content::DevToolsHttpHandler> devtools_http_handler_; + // TODO(dgozman): remove once devtools_discovery component is extracted. + scoped_ptr<CastDevToolsManagerDelegate> manager_delegate_; + scoped_ptr<devtools_http_handler::DevToolsHttpHandler> devtools_http_handler_; IntegerPrefMember pref_port_; uint16 port_; diff --git a/chromecast/chromecast.gyp b/chromecast/chromecast.gyp index df549c2..15b31b4 100644 --- a/chromecast/chromecast.gyp +++ b/chromecast/chromecast.gyp @@ -186,6 +186,7 @@ '../components/components.gyp:cdm_renderer', '../components/components.gyp:component_metrics_proto', '../components/components.gyp:crash_component', + '../components/components.gyp:devtools_http_handler', '../components/components.gyp:network_hints_browser', '../components/components.gyp:network_hints_renderer', '../components/components.gyp:metrics', diff --git a/components/BUILD.gn b/components/BUILD.gn index c6ab797..c0f6ad8 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn @@ -36,6 +36,7 @@ group("all_components") { "//components/data_reduction_proxy/core/browser", "//components/data_reduction_proxy/core/common", "//components/device_event_log", + "//components/devtools_http_handler", "//components/dom_distiller/core", "//components/domain_reliability", "//components/enhanced_bookmarks", @@ -259,6 +260,7 @@ test("components_unittests") { "//components/data_reduction_proxy/core/browser:unit_tests", "//components/data_reduction_proxy/core/common:unit_tests", "//components/device_event_log:unit_tests", + "//components/devtools_http_handler:unit_tests", "//components/dom_distiller/core:unit_tests", "//components/domain_reliability:unit_tests", "//components/favicon_base:unit_tests", @@ -301,6 +303,9 @@ test("components_unittests") { if (is_win) { deps += [ "//components/browser_watcher:unit_tests" ] } + if (is_ios) { + deps -= [ "//components/devtools_http_handler:unit_tests" ] + } } repack("components_tests_pak") { diff --git a/components/OWNERS b/components/OWNERS index 4203294..05b239f 100644 --- a/components/OWNERS +++ b/components/OWNERS @@ -58,6 +58,9 @@ per-file data_reduction_proxy*=jeremyim@chromium.org per-file devtools_bridge.gyp=mnaganov@chromium.org per-file devtools_bridge.gyp=serya@chromium.org +per-file devtools_http_handler.gyp*=dgozman@chromium.org +per-file devtools_http_handler.gyp*=pfeldman@chromium.org + per-file network_hints*=jar@chromium.org per-file network_hints*=ttuttle@chromium.org diff --git a/components/components.gyp b/components/components.gyp index c5c752d..9327c97 100644 --- a/components/components.gyp +++ b/components/components.gyp @@ -88,6 +88,7 @@ 'app_modal.gypi', 'browsing_data.gypi', 'cdm.gypi', + 'devtools_http_handler.gypi', 'navigation_interception.gypi', 'power.gypi', 'visitedlink.gypi', diff --git a/components/components_tests.gyp b/components/components_tests.gyp index a9e46e3..14710fa 100644 --- a/components/components_tests.gyp +++ b/components/components_tests.gyp @@ -128,6 +128,9 @@ 'device_event_log_unittest_sources': [ 'device_event_log/device_event_log_impl_unittest.cc', ], + 'devtools_http_handler_unittest_sources': [ + 'devtools_http_handler/devtools_http_handler_unittest.cc', + ], 'dom_distiller_unittest_sources': [ 'dom_distiller/content/dom_distiller_viewer_source_unittest.cc', 'dom_distiller/content/web_contents_main_frame_observer_unittest.cc', @@ -807,6 +810,7 @@ }], ['OS != "ios"', { 'sources': [ + '<@(devtools_http_handler_unittest_sources)', '<@(error_page_unittest_sources)', '<@(navigation_interception_unittest_sources)', '<@(network_hints_unittest_sources)', @@ -824,6 +828,7 @@ 'components.gyp:autofill_content_renderer', 'components.gyp:autofill_content_test_support', 'components.gyp:data_reduction_proxy_content_browser', + 'components.gyp:devtools_http_handler', 'components.gyp:dom_distiller_content', 'components.gyp:error_page_renderer', 'components.gyp:favicon_content', diff --git a/components/devtools_http_handler.gypi b/components/devtools_http_handler.gypi new file mode 100644 index 0000000..32f051d --- /dev/null +++ b/components/devtools_http_handler.gypi @@ -0,0 +1,26 @@ +# Copyright 2015 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +{ + 'targets': [ + { + 'target_name': 'devtools_http_handler', + 'type': 'static_library', + 'dependencies': [ + '../base/base.gyp:base', + '../content/content.gyp:content_browser', + '../net/net.gyp:net', + '../net/net.gyp:http_server', + ], + 'include_dirs': [ + '..', + ], + 'sources': [ + 'devtools_http_handler/devtools_http_handler.cc', + 'devtools_http_handler/devtools_http_handler.h', + 'devtools_http_handler/devtools_http_handler_delegate.h', + ], + }, + ], +} diff --git a/components/devtools_http_handler/BUILD.gn b/components/devtools_http_handler/BUILD.gn new file mode 100644 index 0000000..61e618e --- /dev/null +++ b/components/devtools_http_handler/BUILD.gn @@ -0,0 +1,30 @@ +# Copyright 2015 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("devtools_http_handler") { + sources = [ + "devtools_http_handler.cc", + "devtools_http_handler.h", + "devtools_http_handler_delegate.h", + ] + + deps = [ + "//base", + "//content/public/browser", + "//net", + "//net:http_server", + ] +} + +source_set("unit_tests") { + testonly = true + sources = [ + "devtools_http_handler_unittest.cc", + ] + + deps = [ + ":devtools_http_handler", + "//testing/gtest", + ] +} diff --git a/components/devtools_http_handler/DEPS b/components/devtools_http_handler/DEPS new file mode 100644 index 0000000..3bcaf2e --- /dev/null +++ b/components/devtools_http_handler/DEPS @@ -0,0 +1,6 @@ +include_rules = [ + "+content/public/browser", + "+content/public/common", + "+content/public/test", + "+net", +] diff --git a/components/devtools_http_handler/OWNERS b/components/devtools_http_handler/OWNERS new file mode 100644 index 0000000..fe38b0f --- /dev/null +++ b/components/devtools_http_handler/OWNERS @@ -0,0 +1,2 @@ +dgozman@chromium.org +pfeldman@chromium.org diff --git a/content/browser/devtools/devtools_http_handler_impl.cc b/components/devtools_http_handler/devtools_http_handler.cc index 4cae448..184c039 100644 --- a/content/browser/devtools/devtools_http_handler_impl.cc +++ b/components/devtools_http_handler/devtools_http_handler.cc @@ -17,16 +17,13 @@ #include "base/strings/stringprintf.h" #include "base/threading/thread.h" #include "base/values.h" -#include "content/browser/devtools/devtools_manager.h" +#include "components/devtools_http_handler/devtools_http_handler.h" +#include "components/devtools_http_handler/devtools_http_handler_delegate.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/devtools_agent_host.h" -#include "content/public/browser/devtools_http_handler.h" -#include "content/public/browser/devtools_http_handler_delegate.h" #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 "grit/devtools_resources_map.h" #include "net/base/escape.h" #include "net/base/io_buffer.h" #include "net/base/ip_endpoint.h" @@ -40,7 +37,13 @@ #include "base/android/build_info.h" #endif -namespace content { +using content::BrowserThread; +using content::DevToolsAgentHost; +using content::DevToolsAgentHostClient; +using content::DevToolsManagerDelegate; +using content::DevToolsTarget; + +namespace devtools_http_handler { namespace { @@ -68,92 +71,13 @@ const char kTargetDevtoolsFrontendUrlField[] = "devtoolsFrontendUrl"; // added back pressure on the TraceComplete message protocol - crbug.com/456845. const int32 kSendBufferSizeForDevTools = 256 * 1024 * 1024; // 256Mb -class DevToolsAgentHostClientImpl; -class ServerWrapper; - -// DevToolsHttpHandlerImpl --------------------------------------------------- - -class DevToolsHttpHandlerImpl : public DevToolsHttpHandler { - public: - DevToolsHttpHandlerImpl(scoped_ptr<ServerSocketFactory> server_socket_factory, - const std::string& frontend_url, - DevToolsHttpHandlerDelegate* delegate, - const base::FilePath& output_directory); - ~DevToolsHttpHandlerImpl() override; - - void OnJsonRequest(int connection_id, - const net::HttpServerRequestInfo& info); - void OnThumbnailRequest(int connection_id, const std::string& target_id); - void OnDiscoveryPageRequest(int connection_id); - - void OnWebSocketRequest(int connection_id, - const net::HttpServerRequestInfo& info); - void OnWebSocketMessage(int connection_id, const std::string& data); - void OnClose(int connection_id); - - void ServerStarted(base::Thread* thread, - ServerWrapper* server_wrapper, - ServerSocketFactory* socket_factory, - scoped_ptr<net::IPEndPoint> ip_address); - - private: - // DevToolsHttpHandler implementation. - GURL GetFrontendURL(const std::string& path) override; - - static void OnTargetListReceivedWeak( - base::WeakPtr<DevToolsHttpHandlerImpl> handler, - int connection_id, - const std::string& host, - const DevToolsManagerDelegate::TargetList& targets); - void OnTargetListReceived( - int connection_id, - const std::string& host, - const DevToolsManagerDelegate::TargetList& targets); - - DevToolsTarget* GetTarget(const std::string& id); - - void SendJson(int connection_id, - net::HttpStatusCode status_code, - base::Value* value, - const std::string& message); - void Send200(int connection_id, - const std::string& data, - const std::string& mime_type); - void Send404(int connection_id); - void Send500(int connection_id, - const std::string& message); - void AcceptWebSocket(int connection_id, - const net::HttpServerRequestInfo& request); - - // Returns the front end url without the host at the beginning. - std::string GetFrontendURLInternal(const std::string target_id, - const std::string& host); - - base::DictionaryValue* SerializeTarget(const DevToolsTarget& target, - const std::string& host); - - // The thread used by the devtools handler to run server socket. - base::Thread* thread_; - - std::string frontend_url_; - ServerWrapper* server_wrapper_; - scoped_ptr<net::IPEndPoint> server_ip_address_; - typedef std::map<int, DevToolsAgentHostClientImpl*> ConnectionToClientMap; - ConnectionToClientMap connection_to_client_; - const scoped_ptr<DevToolsHttpHandlerDelegate> delegate_; - ServerSocketFactory* socket_factory_; - typedef std::map<std::string, DevToolsTarget*> TargetMap; - TargetMap target_map_; - base::WeakPtrFactory<DevToolsHttpHandlerImpl> weak_factory_; - - DISALLOW_COPY_AND_ASSIGN(DevToolsHttpHandlerImpl); -}; +} // namespace // ServerWrapper ------------------------------------------------------------- // All methods in this class are only called on handler thread. class ServerWrapper : net::HttpServer::Delegate { public: - ServerWrapper(base::WeakPtr<DevToolsHttpHandlerImpl> handler, + ServerWrapper(base::WeakPtr<DevToolsHttpHandler> handler, scoped_ptr<net::ServerSocket> socket, const base::FilePath& frontend_dir, bool bundles_resources); @@ -187,13 +111,13 @@ class ServerWrapper : net::HttpServer::Delegate { const std::string& data) override; void OnClose(int connection_id) override; - base::WeakPtr<DevToolsHttpHandlerImpl> handler_; + base::WeakPtr<DevToolsHttpHandler> handler_; scoped_ptr<net::HttpServer> server_; base::FilePath frontend_dir_; bool bundles_resources_; }; -ServerWrapper::ServerWrapper(base::WeakPtr<DevToolsHttpHandlerImpl> handler, +ServerWrapper::ServerWrapper(base::WeakPtr<DevToolsHttpHandler> handler, scoped_ptr<net::ServerSocket> socket, const base::FilePath& frontend_dir, bool bundles_resources) @@ -262,7 +186,7 @@ void TerminateOnUI(base::Thread* thread, } void ServerStartedOnUI( - base::WeakPtr<DevToolsHttpHandlerImpl> handler, + base::WeakPtr<DevToolsHttpHandler> handler, base::Thread* thread, ServerWrapper* server_wrapper, DevToolsHttpHandler::ServerSocketFactory* socket_factory, @@ -277,7 +201,7 @@ void ServerStartedOnUI( } void StartServerOnHandlerThread( - base::WeakPtr<DevToolsHttpHandlerImpl> handler, + base::WeakPtr<DevToolsHttpHandler> handler, base::Thread* thread, DevToolsHttpHandler::ServerSocketFactory* server_socket_factory, const base::FilePath& output_directory, @@ -310,7 +234,7 @@ void StartServerOnHandlerThread( } void StartServerOnFile( - base::WeakPtr<DevToolsHttpHandlerImpl> handler, + base::WeakPtr<DevToolsHttpHandler> handler, DevToolsHttpHandler::ServerSocketFactory* server_socket_factory, const base::FilePath& output_directory, const base::FilePath& frontend_dir, @@ -400,39 +324,6 @@ static bool TimeComparator(const DevToolsTarget* target1, return target1->GetLastActivityTime() > target2->GetLastActivityTime(); } -} // namespace - -// DevToolsHttpHandler ------------------------------------------------------- - -// static -bool DevToolsHttpHandler::IsSupportedProtocolVersion( - const std::string& version) { - return DevToolsAgentHost::IsSupportedProtocolVersion(version); -} - -// static -int DevToolsHttpHandler::GetFrontendResourceId(const std::string& name) { - for (size_t i = 0; i < kDevtoolsResourcesSize; ++i) { - if (name == kDevtoolsResources[i].name) - return kDevtoolsResources[i].value; - } - return -1; -} - -// static -DevToolsHttpHandler* DevToolsHttpHandler::Start( - scoped_ptr<ServerSocketFactory> server_socket_factory, - const std::string& frontend_url, - DevToolsHttpHandlerDelegate* delegate, - const base::FilePath& active_port_output_directory) { - DevToolsHttpHandlerImpl* http_handler = - new DevToolsHttpHandlerImpl(server_socket_factory.Pass(), - frontend_url, - delegate, - active_port_output_directory); - return http_handler; -} - // DevToolsHttpHandler::ServerSocketFactory ---------------------------------- scoped_ptr<net::ServerSocket> @@ -446,15 +337,15 @@ DevToolsHttpHandler::ServerSocketFactory::CreateForTethering( return scoped_ptr<net::ServerSocket>(); } -// DevToolsHttpHandlerImpl --------------------------------------------------- +// DevToolsHttpHandler ------------------------------------------------------- -DevToolsHttpHandlerImpl::~DevToolsHttpHandlerImpl() { +DevToolsHttpHandler::~DevToolsHttpHandler() { TerminateOnUI(thread_, server_wrapper_, socket_factory_); STLDeleteValues(&target_map_); STLDeleteValues(&connection_to_client_); } -GURL DevToolsHttpHandlerImpl::GetFrontendURL(const std::string& path) { +GURL DevToolsHttpHandler::GetFrontendURL(const std::string& path) { if (!server_ip_address_) return GURL(); return GURL(std::string("http://") + server_ip_address_->ToString() + @@ -497,7 +388,7 @@ void ServerWrapper::OnHttpRequest(int connection_id, BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, - base::Bind(&DevToolsHttpHandlerImpl::OnJsonRequest, + base::Bind(&DevToolsHttpHandler::OnJsonRequest, handler_, connection_id, info)); @@ -510,7 +401,7 @@ void ServerWrapper::OnHttpRequest(int connection_id, BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, - base::Bind(&DevToolsHttpHandlerImpl::OnThumbnailRequest, + base::Bind(&DevToolsHttpHandler::OnThumbnailRequest, handler_, connection_id, target_id)); @@ -522,7 +413,7 @@ void ServerWrapper::OnHttpRequest(int connection_id, BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, - base::Bind(&DevToolsHttpHandlerImpl::OnDiscoveryPageRequest, + base::Bind(&DevToolsHttpHandler::OnDiscoveryPageRequest, handler_, connection_id)); return; @@ -543,14 +434,16 @@ void ServerWrapper::OnHttpRequest(int connection_id, server_->Send200(connection_id, data, mime_type); return; } + if (bundles_resources_) { - int resource_id = DevToolsHttpHandler::GetFrontendResourceId(filename); - if (resource_id != -1) { - base::StringPiece data = GetContentClient()->GetDataResource( - resource_id, ui::SCALE_FACTOR_NONE); - server_->Send200(connection_id, data.as_string(), mime_type); - return; - } + BrowserThread::PostTask( + BrowserThread::UI, + FROM_HERE, + base::Bind(&DevToolsHttpHandler::OnFrontendResourceRequest, + handler_, + connection_id, + filename)); + return; } server_->Send404(connection_id); } @@ -562,7 +455,7 @@ void ServerWrapper::OnWebSocketRequest( BrowserThread::UI, FROM_HERE, base::Bind( - &DevToolsHttpHandlerImpl::OnWebSocketRequest, + &DevToolsHttpHandler::OnWebSocketRequest, handler_, connection_id, request)); @@ -574,7 +467,7 @@ void ServerWrapper::OnWebSocketMessage(int connection_id, BrowserThread::UI, FROM_HERE, base::Bind( - &DevToolsHttpHandlerImpl::OnWebSocketMessage, + &DevToolsHttpHandler::OnWebSocketMessage, handler_, connection_id, data)); @@ -585,12 +478,12 @@ void ServerWrapper::OnClose(int connection_id) { BrowserThread::UI, FROM_HERE, base::Bind( - &DevToolsHttpHandlerImpl::OnClose, + &DevToolsHttpHandler::OnClose, handler_, connection_id)); } -std::string DevToolsHttpHandlerImpl::GetFrontendURLInternal( +std::string DevToolsHttpHandler::GetFrontendURLInternal( const std::string id, const std::string& host) { return base::StringPrintf( @@ -627,7 +520,7 @@ static bool ParseJsonPath( return true; } -void DevToolsHttpHandlerImpl::OnJsonRequest( +void DevToolsHttpHandler::OnJsonRequest( int connection_id, const net::HttpServerRequestInfo& info) { // Trim /json @@ -659,9 +552,9 @@ void DevToolsHttpHandlerImpl::OnJsonRequest( base::DictionaryValue version; version.SetString("Protocol-Version", DevToolsAgentHost::GetProtocolVersion().c_str()); - version.SetString("WebKit-Version", GetWebKitVersion()); - version.SetString("Browser", GetContentClient()->GetProduct()); - version.SetString("User-Agent", GetContentClient()->GetUserAgent()); + version.SetString("WebKit-Version", content::GetWebKitVersion()); + version.SetString("Browser", product_name_); + version.SetString("User-Agent", user_agent_); #if defined(OS_ANDROID) version.SetString("Android-Package", base::android::BuildInfo::GetInstance()->package_name()); @@ -672,11 +565,9 @@ void DevToolsHttpHandlerImpl::OnJsonRequest( if (command == "list") { std::string host = info.headers["host"]; - DevToolsManagerDelegate* manager_delegate = - DevToolsManager::GetInstance()->delegate(); - if (manager_delegate) { - manager_delegate->EnumerateTargets( - base::Bind(&DevToolsHttpHandlerImpl::OnTargetListReceivedWeak, + if (manager_delegate_) { + manager_delegate_->EnumerateTargets( + base::Bind(&DevToolsHttpHandler::OnTargetListReceivedWeak, weak_factory_.GetWeakPtr(), connection_id, host)); } else { DevToolsManagerDelegate::TargetList empty_list; @@ -691,10 +582,8 @@ void DevToolsHttpHandlerImpl::OnJsonRequest( if (!url.is_valid()) url = GURL(url::kAboutBlankURL); scoped_ptr<DevToolsTarget> target; - DevToolsManagerDelegate* manager_delegate = - DevToolsManager::GetInstance()->delegate(); - if (manager_delegate) - target = manager_delegate->CreateNewTarget(url); + if (manager_delegate_) + target = manager_delegate_->CreateNewTarget(url); if (!target) { SendJson(connection_id, net::HTTP_INTERNAL_SERVER_ERROR, @@ -753,8 +642,8 @@ void DevToolsHttpHandlerImpl::OnJsonRequest( } // static -void DevToolsHttpHandlerImpl::OnTargetListReceivedWeak( - base::WeakPtr<DevToolsHttpHandlerImpl> handler, +void DevToolsHttpHandler::OnTargetListReceivedWeak( + base::WeakPtr<DevToolsHttpHandler> handler, int connection_id, const std::string& host, const DevToolsManagerDelegate::TargetList& targets) { @@ -765,7 +654,7 @@ void DevToolsHttpHandlerImpl::OnTargetListReceivedWeak( } } -void DevToolsHttpHandlerImpl::OnTargetListReceived( +void DevToolsHttpHandler::OnTargetListReceived( int connection_id, const std::string& host, const DevToolsManagerDelegate::TargetList& targets) { @@ -783,35 +672,40 @@ void DevToolsHttpHandlerImpl::OnTargetListReceived( SendJson(connection_id, net::HTTP_OK, &list_value, std::string()); } -DevToolsTarget* DevToolsHttpHandlerImpl::GetTarget(const std::string& id) { +DevToolsTarget* DevToolsHttpHandler::GetTarget(const std::string& id) { TargetMap::const_iterator it = target_map_.find(id); if (it == target_map_.end()) return NULL; return it->second; } -void DevToolsHttpHandlerImpl::OnThumbnailRequest( +void DevToolsHttpHandler::OnThumbnailRequest( int connection_id, const std::string& target_id) { DevToolsTarget* target = GetTarget(target_id); GURL page_url; if (target) page_url = target->GetURL(); - DevToolsManagerDelegate* manager_delegate = - DevToolsManager::GetInstance()->delegate(); - std::string data = - manager_delegate ? manager_delegate->GetPageThumbnailData(page_url) : ""; + std::string data = manager_delegate_ ? + manager_delegate_->GetPageThumbnailData(page_url) : ""; if (!data.empty()) Send200(connection_id, data, "image/png"); else Send404(connection_id); } -void DevToolsHttpHandlerImpl::OnDiscoveryPageRequest(int connection_id) { +void DevToolsHttpHandler::OnDiscoveryPageRequest(int connection_id) { std::string response = delegate_->GetDiscoveryPageHTML(); Send200(connection_id, response, "text/html; charset=UTF-8"); } -void DevToolsHttpHandlerImpl::OnWebSocketRequest( +void DevToolsHttpHandler::OnFrontendResourceRequest( + int connection_id, const std::string& path) { + Send200(connection_id, + delegate_->GetFrontendResource(path), + GetMimeType(path)); +} + +void DevToolsHttpHandler::OnWebSocketRequest( int connection_id, const net::HttpServerRequestInfo& request) { if (!thread_) @@ -859,7 +753,7 @@ void DevToolsHttpHandlerImpl::OnWebSocketRequest( AcceptWebSocket(connection_id, request); } -void DevToolsHttpHandlerImpl::OnWebSocketMessage( +void DevToolsHttpHandler::OnWebSocketMessage( int connection_id, const std::string& data) { ConnectionToClientMap::iterator it = @@ -868,7 +762,7 @@ void DevToolsHttpHandlerImpl::OnWebSocketMessage( it->second->OnMessage(data); } -void DevToolsHttpHandlerImpl::OnClose(int connection_id) { +void DevToolsHttpHandler::OnClose(int connection_id) { ConnectionToClientMap::iterator it = connection_to_client_.find(connection_id); if (it != connection_to_client_.end()) { @@ -877,17 +771,25 @@ void DevToolsHttpHandlerImpl::OnClose(int connection_id) { } } -DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl( +DevToolsHttpHandler::DevToolsHttpHandler( scoped_ptr<ServerSocketFactory> server_socket_factory, const std::string& frontend_url, DevToolsHttpHandlerDelegate* delegate, - const base::FilePath& output_directory) + DevToolsManagerDelegate* manager_delegate, + const base::FilePath& output_directory, + const base::FilePath& debug_frontend_dir, + const std::string& product_name, + const std::string& user_agent) : thread_(nullptr), frontend_url_(frontend_url), + product_name_(product_name), + user_agent_(user_agent), server_wrapper_(nullptr), delegate_(delegate), + manager_delegate_(manager_delegate), socket_factory_(nullptr), weak_factory_(this) { + bool bundles_resources = frontend_url_.empty(); if (frontend_url_.empty()) frontend_url_ = "/devtools/inspector.html"; @@ -897,11 +799,11 @@ DevToolsHttpHandlerImpl::DevToolsHttpHandlerImpl( weak_factory_.GetWeakPtr(), server_socket_factory.release(), output_directory, - delegate_->GetDebugFrontendDir(), - delegate_->BundlesFrontendResources())); + debug_frontend_dir, + bundles_resources)); } -void DevToolsHttpHandlerImpl::ServerStarted( +void DevToolsHttpHandler::ServerStarted( base::Thread* thread, ServerWrapper* server_wrapper, ServerSocketFactory* socket_factory, @@ -926,15 +828,16 @@ void ServerWrapper::WriteActivePortToUserProfile( // so Telemetry can pick it up. base::FilePath path = output_directory.Append(kDevToolsActivePortFileName); std::string port_string = base::IntToString(endpoint.port()); - if (base::WriteFile(path, port_string.c_str(), port_string.length()) < 0) { + if (base::WriteFile(path, port_string.c_str(), + static_cast<int>(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, - const std::string& message) { +void DevToolsHttpHandler::SendJson(int connection_id, + net::HttpStatusCode status_code, + base::Value* value, + const std::string& message) { if (!thread_) return; @@ -960,9 +863,9 @@ void DevToolsHttpHandlerImpl::SendJson(int connection_id, response)); } -void DevToolsHttpHandlerImpl::Send200(int connection_id, - const std::string& data, - const std::string& mime_type) { +void DevToolsHttpHandler::Send200(int connection_id, + const std::string& data, + const std::string& mime_type) { if (!thread_) return; thread_->message_loop()->PostTask( @@ -974,7 +877,7 @@ void DevToolsHttpHandlerImpl::Send200(int connection_id, mime_type)); } -void DevToolsHttpHandlerImpl::Send404(int connection_id) { +void DevToolsHttpHandler::Send404(int connection_id) { if (!thread_) return; thread_->message_loop()->PostTask( @@ -984,8 +887,8 @@ void DevToolsHttpHandlerImpl::Send404(int connection_id) { connection_id)); } -void DevToolsHttpHandlerImpl::Send500(int connection_id, - const std::string& message) { +void DevToolsHttpHandler::Send500(int connection_id, + const std::string& message) { if (!thread_) return; thread_->message_loop()->PostTask( @@ -996,7 +899,7 @@ void DevToolsHttpHandlerImpl::Send500(int connection_id, message)); } -void DevToolsHttpHandlerImpl::AcceptWebSocket( +void DevToolsHttpHandler::AcceptWebSocket( int connection_id, const net::HttpServerRequestInfo& request) { if (!thread_) @@ -1009,7 +912,7 @@ void DevToolsHttpHandlerImpl::AcceptWebSocket( request)); } -base::DictionaryValue* DevToolsHttpHandlerImpl::SerializeTarget( +base::DictionaryValue* DevToolsHttpHandler::SerializeTarget( const DevToolsTarget& target, const std::string& host) { base::DictionaryValue* dictionary = new base::DictionaryValue; @@ -1031,10 +934,8 @@ base::DictionaryValue* DevToolsHttpHandlerImpl::SerializeTarget( if (favicon_url.is_valid()) dictionary->SetString(kTargetFaviconUrlField, favicon_url.spec()); - DevToolsManagerDelegate* manager_delegate = - DevToolsManager::GetInstance()->delegate(); - if (manager_delegate && - !manager_delegate->GetPageThumbnailData(url).empty()) { + if (manager_delegate_ && + !manager_delegate_->GetPageThumbnailData(url).empty()) { dictionary->SetString(kTargetThumbnailUrlField, std::string(kThumbUrlPrefix) + id); } @@ -1055,4 +956,4 @@ base::DictionaryValue* DevToolsHttpHandlerImpl::SerializeTarget( return dictionary; } -} // namespace content +} // namespace devtools_http_handler diff --git a/components/devtools_http_handler/devtools_http_handler.h b/components/devtools_http_handler/devtools_http_handler.h new file mode 100644 index 0000000..23a6773 --- /dev/null +++ b/components/devtools_http_handler/devtools_http_handler.h @@ -0,0 +1,160 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_DEVTOOLS_HTTP_HANDLER_DEVTOOLS_HTTP_HANDLER_H_ +#define COMPONENTS_DEVTOOLS_HTTP_HANDLER_DEVTOOLS_HTTP_HANDLER_H_ + +#include <map> +#include <string> + +#include "base/files/file_path.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" +#include "content/public/browser/devtools_manager_delegate.h" +#include "net/http/http_status_code.h" + +class GURL; + +namespace base { +class Thread; +class Value; +} + +namespace net { +class IPEndPoint; +class HttpServerRequestInfo; +class ServerSocket; +} + +namespace devtools_http_handler { + +class DevToolsAgentHostClientImpl; +class DevToolsHttpHandlerDelegate; +class ServerWrapper; + +// This class is used for managing DevTools remote debugging server. +// Clients can connect to the specified ip:port and start debugging +// this browser. +class DevToolsHttpHandler { + public: + + // Factory of net::ServerSocket. This is to separate instantiating dev tools + // and instantiating server sockets. + // All methods including destructor are called on a separate thread + // different from any BrowserThread instance. + class ServerSocketFactory { + public: + virtual ~ServerSocketFactory() {} + + // Returns a new instance of ServerSocket or nullptr if an error occurred. + virtual scoped_ptr<net::ServerSocket> CreateForHttpServer(); + + // Creates a named socket for reversed tethering implementation (used with + // remote debugging, primarily for mobile). + virtual scoped_ptr<net::ServerSocket> CreateForTethering( + std::string* out_name); + }; + + // Takes ownership over |socket_factory| and |delegate|. + // If |frontend_url| is empty, assumes it's bundled, and uses + // |delegate->GetFrontendResource()|. + // |delegate| is only accessed on UI thread. + // If |active_port_output_directory| is non-empty, it is assumed the + // socket_factory was initialized with an ephemeral port (0). The + // port selected by the OS will be written to a well-known file in + // the output directory. + // TODO(dgozman): remove |manager_delegate| by moving targets to another + // component (http://crbug.com/476496). + DevToolsHttpHandler( + scoped_ptr<ServerSocketFactory> server_socket_factory, + const std::string& frontend_url, + DevToolsHttpHandlerDelegate* delegate, + content::DevToolsManagerDelegate* manager_delegate, + const base::FilePath& active_port_output_directory, + const base::FilePath& debug_frontend_dir, + const std::string& product_name, + const std::string& user_agent); + ~DevToolsHttpHandler(); + + // Returns the URL for the file at |path| in frontend. + GURL GetFrontendURL(const std::string& path); + + private: + friend class ServerWrapper; + friend void ServerStartedOnUI( + base::WeakPtr<DevToolsHttpHandler> handler, + base::Thread* thread, + ServerWrapper* server_wrapper, + DevToolsHttpHandler::ServerSocketFactory* socket_factory, + scoped_ptr<net::IPEndPoint> ip_address); + + void OnJsonRequest(int connection_id, + const net::HttpServerRequestInfo& info); + void OnThumbnailRequest(int connection_id, const std::string& target_id); + void OnDiscoveryPageRequest(int connection_id); + void OnFrontendResourceRequest(int connection_id, const std::string& path); + void OnWebSocketRequest(int connection_id, + const net::HttpServerRequestInfo& info); + void OnWebSocketMessage(int connection_id, const std::string& data); + void OnClose(int connection_id); + + void ServerStarted(base::Thread* thread, + ServerWrapper* server_wrapper, + ServerSocketFactory* socket_factory, + scoped_ptr<net::IPEndPoint> ip_address); + + static void OnTargetListReceivedWeak( + base::WeakPtr<DevToolsHttpHandler> handler, + int connection_id, + const std::string& host, + const content::DevToolsManagerDelegate::TargetList& targets); + void OnTargetListReceived( + int connection_id, + const std::string& host, + const content::DevToolsManagerDelegate::TargetList& targets); + + content::DevToolsTarget* GetTarget(const std::string& id); + + void SendJson(int connection_id, + net::HttpStatusCode status_code, + base::Value* value, + const std::string& message); + void Send200(int connection_id, + const std::string& data, + const std::string& mime_type); + void Send404(int connection_id); + void Send500(int connection_id, + const std::string& message); + void AcceptWebSocket(int connection_id, + const net::HttpServerRequestInfo& request); + + // Returns the front end url without the host at the beginning. + std::string GetFrontendURLInternal(const std::string target_id, + const std::string& host); + + base::DictionaryValue* SerializeTarget(const content::DevToolsTarget& target, + const std::string& host); + + // The thread used by the devtools handler to run server socket. + base::Thread* thread_; + std::string frontend_url_; + std::string product_name_; + std::string user_agent_; + ServerWrapper* server_wrapper_; + scoped_ptr<net::IPEndPoint> server_ip_address_; + typedef std::map<int, DevToolsAgentHostClientImpl*> ConnectionToClientMap; + ConnectionToClientMap connection_to_client_; + const scoped_ptr<DevToolsHttpHandlerDelegate> delegate_; + content::DevToolsManagerDelegate* manager_delegate_; + ServerSocketFactory* socket_factory_; + typedef std::map<std::string, content::DevToolsTarget*> TargetMap; + TargetMap target_map_; + base::WeakPtrFactory<DevToolsHttpHandler> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(DevToolsHttpHandler); +}; + +} // namespace devtools_http_handler + +#endif // COMPONENTS_DEVTOOLS_HTTP_HANDLER_DEVTOOLS_HTTP_HANDLER_H_ diff --git a/components/devtools_http_handler/devtools_http_handler_delegate.h b/components/devtools_http_handler/devtools_http_handler_delegate.h new file mode 100644 index 0000000..83235ae --- /dev/null +++ b/components/devtools_http_handler/devtools_http_handler_delegate.h @@ -0,0 +1,29 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_DEVTOOLS_HTTP_HANDLER_DEVTOOLS_HTTP_HANDLER_DELEGATE_H_ +#define COMPONENTS_DEVTOOLS_HTTP_HANDLER_DEVTOOLS_HTTP_HANDLER_DELEGATE_H_ + +#include <string> + +#include "base/files/file_path.h" + +namespace devtools_http_handler { + +class DevToolsHttpHandlerDelegate { + public: + virtual ~DevToolsHttpHandlerDelegate() {} + + // Should return discovery page HTML that should list available tabs + // and provide attach links. + virtual std::string GetDiscoveryPageHTML() = 0; + + // Returns frontend resource data by |path|. Only used if + // |BundlesFrontendResources| returns |true|. + virtual std::string GetFrontendResource(const std::string& path) = 0; +}; + +} // namespace devtools_http_handler + +#endif // COMPONENTS_DEVTOOLS_HTTP_HANDLER_DEVTOOLS_HTTP_HANDLER_DELEGATE_H_ diff --git a/content/browser/devtools/devtools_http_handler_unittest.cc b/components/devtools_http_handler/devtools_http_handler_unittest.cc index e8c131b..6b794c2 100644 --- a/content/browser/devtools/devtools_http_handler_unittest.cc +++ b/components/devtools_http_handler/devtools_http_handler_unittest.cc @@ -7,17 +7,19 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" -#include "content/browser/browser_thread_impl.h" -#include "content/public/browser/devtools_http_handler.h" -#include "content/public/browser/devtools_http_handler_delegate.h" +#include "components/devtools_http_handler/devtools_http_handler.h" +#include "components/devtools_http_handler/devtools_http_handler_delegate.h" #include "content/public/browser/devtools_target.h" +#include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_utils.h" #include "net/base/ip_endpoint.h" #include "net/base/net_errors.h" #include "net/socket/server_socket.h" #include "testing/gtest/include/gtest/gtest.h" -namespace content { +using content::BrowserThread; + +namespace devtools_http_handler { namespace { const uint16 kDummyPort = 4321; @@ -65,7 +67,7 @@ class DummyServerSocketFactory protected: scoped_ptr<net::ServerSocket> CreateForHttpServer() override { - base::MessageLoopProxy::current()->PostTask(FROM_HERE, + base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(&QuitFromHandlerThread, quit_closure_1_)); return scoped_ptr<net::ServerSocket>(new DummyServerSocket()); } @@ -83,7 +85,7 @@ class FailingServerSocketFactory : public DummyServerSocketFactory { private: scoped_ptr<net::ServerSocket> CreateForHttpServer() override { - base::MessageLoopProxy::current()->PostTask(FROM_HERE, + base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(&QuitFromHandlerThread, quit_closure_1_)); return scoped_ptr<net::ServerSocket>(); } @@ -93,31 +95,53 @@ class DummyDelegate : public DevToolsHttpHandlerDelegate { public: std::string GetDiscoveryPageHTML() override { return std::string(); } - bool BundlesFrontendResources() override { return true; } + std::string GetFrontendResource(const std::string& path) override { + return std::string(); + } +}; + +class DummyManagerDelegate : public content::DevToolsManagerDelegate { + public: + ~DummyManagerDelegate() override {} + + void Inspect(content::BrowserContext* browser_context, + content::DevToolsAgentHost* agent_host) override {} + + void DevToolsAgentStateChanged(content::DevToolsAgentHost* agent_host, + bool attached) override {} + + base::DictionaryValue* HandleCommand( + content::DevToolsAgentHost* agent_host, + base::DictionaryValue* command) override { + return NULL; + } - base::FilePath GetDebugFrontendDir() override { return base::FilePath(); } + scoped_ptr<content::DevToolsTarget> CreateNewTarget( + const GURL& url) override { + return scoped_ptr<content::DevToolsTarget>(); + } + + void EnumerateTargets(TargetCallback callback) override { + TargetList result; + callback.Run(result); + } + + std::string GetPageThumbnailData(const GURL& url) override { + return std::string(); + } }; } class DevToolsHttpHandlerTest : public testing::Test { public: - DevToolsHttpHandlerTest() - : ui_thread_(BrowserThread::UI, &message_loop_) { - } + DevToolsHttpHandlerTest() : testing::Test() { } protected: - void SetUp() override { - file_thread_.reset(new BrowserThreadImpl(BrowserThread::FILE)); - file_thread_->Start(); - } - - void TearDown() override { file_thread_->Stop(); } + DummyManagerDelegate manager_delegate_; private: - base::MessageLoopForIO message_loop_; - BrowserThreadImpl ui_thread_; - scoped_ptr<BrowserThreadImpl> file_thread_; + content::TestBrowserThreadBundle thread_bundle_; }; TEST_F(DevToolsHttpHandlerTest, TestStartStop) { @@ -125,11 +149,15 @@ TEST_F(DevToolsHttpHandlerTest, TestStartStop) { scoped_ptr<DevToolsHttpHandler::ServerSocketFactory> factory( new DummyServerSocketFactory(run_loop.QuitClosure(), run_loop_2.QuitClosure())); - scoped_ptr<content::DevToolsHttpHandler> devtools_http_handler( - content::DevToolsHttpHandler::Start(factory.Pass(), - std::string(), - new DummyDelegate(), - base::FilePath())); + scoped_ptr<DevToolsHttpHandler> devtools_http_handler( + new DevToolsHttpHandler(factory.Pass(), + std::string(), + new DummyDelegate(), + &manager_delegate_, + base::FilePath(), + base::FilePath(), + std::string(), + std::string())); // Our dummy socket factory will post a quit message once the server will // become ready. run_loop.Run(); @@ -143,11 +171,15 @@ TEST_F(DevToolsHttpHandlerTest, TestServerSocketFailed) { scoped_ptr<DevToolsHttpHandler::ServerSocketFactory> factory( new FailingServerSocketFactory(run_loop.QuitClosure(), run_loop_2.QuitClosure())); - scoped_ptr<content::DevToolsHttpHandler> devtools_http_handler( - content::DevToolsHttpHandler::Start(factory.Pass(), - std::string(), - new DummyDelegate(), - base::FilePath())); + scoped_ptr<DevToolsHttpHandler> devtools_http_handler( + new DevToolsHttpHandler(factory.Pass(), + std::string(), + new DummyDelegate(), + &manager_delegate_, + base::FilePath(), + base::FilePath(), + std::string(), + std::string())); // Our dummy socket factory will post a quit message once the server will // become ready. run_loop.Run(); @@ -168,11 +200,15 @@ TEST_F(DevToolsHttpHandlerTest, TestDevToolsActivePort) { scoped_ptr<DevToolsHttpHandler::ServerSocketFactory> factory( new DummyServerSocketFactory(run_loop.QuitClosure(), run_loop_2.QuitClosure())); - scoped_ptr<content::DevToolsHttpHandler> devtools_http_handler( - content::DevToolsHttpHandler::Start(factory.Pass(), - std::string(), - new DummyDelegate(), - temp_dir.path())); + scoped_ptr<DevToolsHttpHandler> devtools_http_handler( + new DevToolsHttpHandler(factory.Pass(), + std::string(), + new DummyDelegate(), + &manager_delegate_, + temp_dir.path(), + base::FilePath(), + std::string(), + std::string())); // Our dummy socket factory will post a quit message once the server will // become ready. run_loop.Run(); @@ -192,4 +228,4 @@ TEST_F(DevToolsHttpHandlerTest, TestDevToolsActivePort) { EXPECT_EQ(static_cast<int>(kDummyPort), port); } -} // namespace content +} // namespace devtools_http_handler diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 0198b51..b8066cb 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn @@ -106,7 +106,6 @@ source_set("browser") { "//content/common:mojo_bindings", "//content/public/common:mojo_bindings", "//device/bluetooth", - "//net:http_server", "//storage/browser", "//storage/common", "//third_party/WebKit/public:image_resources", diff --git a/content/browser/devtools/devtools_frontend_host_impl.cc b/content/browser/devtools/devtools_frontend_host_impl.cc index a25daee..712a9c9 100644 --- a/content/browser/devtools/devtools_frontend_host_impl.cc +++ b/content/browser/devtools/devtools_frontend_host_impl.cc @@ -9,6 +9,8 @@ #include "content/public/browser/navigation_entry.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/content_client.h" +#include "grit/devtools_resources_map.h" namespace content { @@ -19,6 +21,18 @@ DevToolsFrontendHost* DevToolsFrontendHost::Create( return new DevToolsFrontendHostImpl(frontend_main_frame, delegate); } +// static +base::StringPiece DevToolsFrontendHost::GetFrontendResource( + const std::string& path) { + for (size_t i = 0; i < kDevtoolsResourcesSize; ++i) { + if (path == kDevtoolsResources[i].name) { + return GetContentClient()->GetDataResource( + kDevtoolsResources[i].value, ui::SCALE_FACTOR_NONE); + } + } + return std::string(); +} + DevToolsFrontendHostImpl::DevToolsFrontendHostImpl( RenderFrameHost* frontend_main_frame, DevToolsFrontendHost::Delegate* delegate) diff --git a/content/browser/devtools/protocol/tethering_handler.cc b/content/browser/devtools/protocol/tethering_handler.cc index 291a132..b8b3e3f 100644 --- a/content/browser/devtools/protocol/tethering_handler.cc +++ b/content/browser/devtools/protocol/tethering_handler.cc @@ -5,7 +5,6 @@ #include "content/browser/devtools/protocol/tethering_handler.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/devtools_http_handler.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" #include "net/socket/server_socket.h" diff --git a/content/browser/devtools/protocol/tethering_handler.h b/content/browser/devtools/protocol/tethering_handler.h index 6be8a0a..04bf690 100644 --- a/content/browser/devtools/protocol/tethering_handler.h +++ b/content/browser/devtools/protocol/tethering_handler.h @@ -8,7 +8,10 @@ #include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop_proxy.h" #include "content/browser/devtools/protocol/devtools_protocol_handler.h" -#include "content/public/browser/devtools_http_handler.h" + +namespace net { +class ServerSocket; +} namespace content { namespace devtools { diff --git a/content/content_browser.gypi b/content/content_browser.gypi index 65500f8..3a2c4f6 100644 --- a/content/content_browser.gypi +++ b/content/content_browser.gypi @@ -112,8 +112,6 @@ 'public/browser/devtools_external_agent_proxy.h', 'public/browser/devtools_external_agent_proxy_delegate.h', 'public/browser/devtools_frontend_host.h', - 'public/browser/devtools_http_handler.h', - 'public/browser/devtools_http_handler_delegate.h', 'public/browser/devtools_manager_delegate.h', 'public/browser/devtools_target.h', 'public/browser/dom_operation_notification_details.h', @@ -530,7 +528,6 @@ 'browser/devtools/devtools_frame_trace_recorder.h', 'browser/devtools/devtools_frontend_host_impl.cc', 'browser/devtools/devtools_frontend_host_impl.h', - 'browser/devtools/devtools_http_handler_impl.cc', 'browser/devtools/devtools_manager.cc', 'browser/devtools/devtools_manager.h', 'browser/devtools/devtools_netlog_observer.cc', diff --git a/content/content_shell.gypi b/content/content_shell.gypi index 5df6def..4931f11 100644 --- a/content/content_shell.gypi +++ b/content/content_shell.gypi @@ -47,6 +47,7 @@ '../cc/blink/cc_blink.gyp:cc_blink', '../cc/cc.gyp:cc', '../components/components.gyp:crash_component_breakpad_mac_to_be_deleted', + '../components/components.gyp:devtools_http_handler', '../components/components.gyp:web_cache_renderer', '../device/bluetooth/bluetooth.gyp:device_bluetooth', '../gin/gin.gyp:gin', diff --git a/content/content_tests.gypi b/content/content_tests.gypi index f570627..b818d10 100644 --- a/content/content_tests.gypi +++ b/content/content_tests.gypi @@ -358,7 +358,6 @@ 'browser/device_sensors/data_fetcher_shared_memory_base_unittest.cc', 'browser/device_sensors/sensor_manager_android_unittest.cc', 'browser/device_sensors/sensor_manager_chromeos_unittest.cc', - 'browser/devtools/devtools_http_handler_unittest.cc', 'browser/devtools/devtools_manager_unittest.cc', 'browser/devtools/shared_worker_devtools_manager_unittest.cc', 'browser/dom_storage/dom_storage_area_unittest.cc', diff --git a/content/public/browser/devtools_frontend_host.h b/content/public/browser/devtools_frontend_host.h index c00f111..05d6ab1 100644 --- a/content/public/browser/devtools_frontend_host.h +++ b/content/public/browser/devtools_frontend_host.h @@ -7,6 +7,7 @@ #include <string> +#include "base/strings/string_piece.h" #include "content/common/content_export.h" namespace content { @@ -44,6 +45,11 @@ class DevToolsFrontendHost { CONTENT_EXPORT virtual ~DevToolsFrontendHost() {} CONTENT_EXPORT virtual void BadMessageRecieved() {} + + // Returns bundled DevTools frontend resource by |path|. Returns empty string + // if |path| does not correspond to any frontend resource. + CONTENT_EXPORT static base::StringPiece GetFrontendResource( + const std::string& path); }; } // namespace content diff --git a/content/public/browser/devtools_http_handler.h b/content/public/browser/devtools_http_handler.h deleted file mode 100644 index a61901b..0000000 --- a/content/public/browser/devtools_http_handler.h +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_PUBLIC_BROWSER_DEVTOOLS_HTTP_HANDLER_H_ -#define CONTENT_PUBLIC_BROWSER_DEVTOOLS_HTTP_HANDLER_H_ - -#include <string> - -#include "base/files/file_path.h" -#include "base/memory/scoped_ptr.h" -#include "content/common/content_export.h" - -class GURL; - -namespace net { -class ServerSocket; -} - -namespace content { - -class DevToolsHttpHandlerDelegate; - -// This class is used for managing DevTools remote debugging server. -// Clients can connect to the specified ip:port and start debugging -// this browser. -class DevToolsHttpHandler { - public: - - // Factory of net::ServerSocket. This is to separate instantiating dev tools - // and instantiating server sockets. - // All methods including destructor are called on a separate thread - // different from any BrowserThread instance. - class CONTENT_EXPORT ServerSocketFactory { - public: - virtual ~ServerSocketFactory() {} - - // Returns a new instance of ServerSocket or nullptr if an error occurred. - virtual scoped_ptr<net::ServerSocket> CreateForHttpServer(); - - // Creates a named socket for reversed tethering implementation (used with - // remote debugging, primarily for mobile). - virtual scoped_ptr<net::ServerSocket> CreateForTethering( - std::string* out_name); - }; - - // Returns true if the given protocol version is supported. - CONTENT_EXPORT static bool IsSupportedProtocolVersion( - const std::string& version); - - // Returns frontend resource id for the given resource |name|. - CONTENT_EXPORT static int GetFrontendResourceId( - const std::string& name); - - // Takes ownership over |socket_factory| and |delegate|. - // If |active_port_output_directory| is non-empty, it is assumed the - // socket_factory was initialized with an ephemeral port (0). The - // port selected by the OS will be written to a well-known file in - // the output directory. - CONTENT_EXPORT static DevToolsHttpHandler* Start( - scoped_ptr<ServerSocketFactory> server_socket_factory, - const std::string& frontend_url, - DevToolsHttpHandlerDelegate* delegate, - const base::FilePath& active_port_output_directory); - - // Returns the URL for the file at |path| in frontend. - virtual GURL GetFrontendURL(const std::string& path) = 0; - - virtual ~DevToolsHttpHandler() {} -}; - -} // namespace content - -#endif // CONTENT_PUBLIC_BROWSER_DEVTOOLS_HTTP_HANDLER_H_ diff --git a/content/public/browser/devtools_http_handler_delegate.h b/content/public/browser/devtools_http_handler_delegate.h deleted file mode 100644 index 4f96413..0000000 --- a/content/public/browser/devtools_http_handler_delegate.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_PUBLIC_BROWSER_DEVTOOLS_HTTP_HANDLER_DELEGATE_H_ -#define CONTENT_PUBLIC_BROWSER_DEVTOOLS_HTTP_HANDLER_DELEGATE_H_ - -#include <string> -#include <vector> - -#include "base/files/file_path.h" -#include "base/memory/scoped_ptr.h" -#include "net/socket/server_socket.h" - -namespace content { - -class DevToolsTarget; - -class DevToolsHttpHandlerDelegate { - public: - virtual ~DevToolsHttpHandlerDelegate() {} - - // Should return discovery page HTML that should list available tabs - // and provide attach links. - virtual std::string GetDiscoveryPageHTML() = 0; - - // Returns true if and only if frontend resources are bundled. - virtual bool BundlesFrontendResources() = 0; - - // Returns path to the front-end files on the local filesystem for debugging. - virtual base::FilePath GetDebugFrontendDir() = 0; -}; - -} // namespace content - -#endif // CONTENT_PUBLIC_BROWSER_DEVTOOLS_HTTP_HANDLER_DELEGATE_H_ diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn index 1bdf80b..e1d9b11 100644 --- a/content/shell/BUILD.gn +++ b/content/shell/BUILD.gn @@ -249,6 +249,7 @@ static_library("content_shell_lib") { "//base/third_party/dynamic_annotations", "//cc", "//components/crash/app", + "//components/devtools_http_handler", "//components/web_cache/renderer", "//content:resources", "//content/app/resources", diff --git a/content/shell/DEPS b/content/shell/DEPS index 3dfeb6b..44638c3 100644 --- a/content/shell/DEPS +++ b/content/shell/DEPS @@ -24,6 +24,7 @@ include_rules = [ "+ui/views", "+components/crash", + "+components/devtools_http_handler", # For enabling media related features. "+media/base/media_switches.h", diff --git a/content/shell/browser/shell_browser_main_parts.cc b/content/shell/browser/shell_browser_main_parts.cc index efc029e..750d70e 100644 --- a/content/shell/browser/shell_browser_main_parts.cc +++ b/content/shell/browser/shell_browser_main_parts.cc @@ -11,8 +11,8 @@ #include "base/message_loop/message_loop.h" #include "base/threading/thread.h" #include "base/threading/thread_restrictions.h" +#include "components/devtools_http_handler/devtools_http_handler.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/devtools_http_handler.h" #include "content/public/browser/storage_partition.h" #include "content/public/common/content_switches.h" #include "content/public/common/main_function_params.h" diff --git a/content/shell/browser/shell_browser_main_parts.h b/content/shell/browser/shell_browser_main_parts.h index f517b6e..5dc117e 100644 --- a/content/shell/browser/shell_browser_main_parts.h +++ b/content/shell/browser/shell_browser_main_parts.h @@ -21,14 +21,16 @@ namespace base { class Thread; } +namespace devtools_http_handler { +class DevToolsHttpHandler; +} + namespace net { class NetLog; } namespace content { -class DevToolsHttpHandler; - class ShellBrowserMainParts : public BrowserMainParts { public: explicit ShellBrowserMainParts(const MainFunctionParams& parameters); @@ -42,7 +44,7 @@ class ShellBrowserMainParts : public BrowserMainParts { bool MainMessageLoopRun(int* result_code) override; void PostMainMessageLoopRun() override; - DevToolsHttpHandler* devtools_http_handler() { + devtools_http_handler::DevToolsHttpHandler* devtools_http_handler() { return devtools_http_handler_.get(); } @@ -76,7 +78,7 @@ class ShellBrowserMainParts : public BrowserMainParts { const MainFunctionParams parameters_; bool run_message_loop_; - scoped_ptr<DevToolsHttpHandler> devtools_http_handler_; + scoped_ptr<devtools_http_handler::DevToolsHttpHandler> devtools_http_handler_; DISALLOW_COPY_AND_ASSIGN(ShellBrowserMainParts); }; diff --git a/content/shell/browser/shell_devtools_frontend.cc b/content/shell/browser/shell_devtools_frontend.cc index 6d8e163..8244717 100644 --- a/content/shell/browser/shell_devtools_frontend.cc +++ b/content/shell/browser/shell_devtools_frontend.cc @@ -11,8 +11,8 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" +#include "components/devtools_http_handler/devtools_http_handler.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/devtools_http_handler.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" @@ -107,9 +107,10 @@ ShellDevToolsFrontend* ShellDevToolsFrontend::Show( shell, inspected_contents); - DevToolsHttpHandler* http_handler = ShellContentBrowserClient::Get() - ->shell_browser_main_parts() - ->devtools_http_handler(); + devtools_http_handler::DevToolsHttpHandler* http_handler = + ShellContentBrowserClient::Get() + ->shell_browser_main_parts() + ->devtools_http_handler(); shell->LoadURL(http_handler->GetFrontendURL("/devtools/devtools.html")); return devtools_frontend; diff --git a/content/shell/browser/shell_devtools_manager_delegate.cc b/content/shell/browser/shell_devtools_manager_delegate.cc index 2b52385..8011145 100644 --- a/content/shell/browser/shell_devtools_manager_delegate.cc +++ b/content/shell/browser/shell_devtools_manager_delegate.cc @@ -12,8 +12,9 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "components/devtools_http_handler/devtools_http_handler.h" #include "content/public/browser/devtools_agent_host.h" -#include "content/public/browser/devtools_http_handler.h" +#include "content/public/browser/devtools_frontend_host.h" #include "content/public/browser/devtools_target.h" #include "content/public/browser/favicon_status.h" #include "content/public/browser/navigation_entry.h" @@ -23,6 +24,7 @@ #include "content/public/common/url_constants.h" #include "content/public/common/user_agent.h" #include "content/shell/browser/shell.h" +#include "content/shell/common/shell_content_client.h" #include "grit/shell_resources.h" #include "net/base/net_errors.h" #include "net/socket/tcp_server_socket.h" @@ -33,6 +35,8 @@ #include "net/socket/unix_domain_server_socket_posix.h" #endif +using devtools_http_handler::DevToolsHttpHandler; + namespace content { namespace { @@ -187,15 +191,15 @@ bool Target::Close() const { // ShellDevToolsDelegate ---------------------------------------------------- -class ShellDevToolsDelegate : public DevToolsHttpHandlerDelegate { +class ShellDevToolsDelegate : + public devtools_http_handler::DevToolsHttpHandlerDelegate { public: explicit ShellDevToolsDelegate(BrowserContext* browser_context); ~ShellDevToolsDelegate() override; - // DevToolsHttpHandlerDelegate implementation. + // devtools_http_handler::DevToolsHttpHandlerDelegate implementation. std::string GetDiscoveryPageHTML() override; - bool BundlesFrontendResources() override; - base::FilePath GetDebugFrontendDir() override; + std::string GetFrontendResource(const std::string& path) override; private: BrowserContext* browser_context_; @@ -219,16 +223,9 @@ std::string ShellDevToolsDelegate::GetDiscoveryPageHTML() { #endif } -bool ShellDevToolsDelegate::BundlesFrontendResources() { -#if defined(OS_ANDROID) - return false; -#else - return true; -#endif -} - -base::FilePath ShellDevToolsDelegate::GetDebugFrontendDir() { - return base::FilePath(); +std::string ShellDevToolsDelegate::GetFrontendResource( + const std::string& path) { + return content::DevToolsFrontendHost::GetFrontendResource(path).as_string(); } } // namespace @@ -243,10 +240,15 @@ ShellDevToolsManagerDelegate::CreateHttpHandler( #if defined(OS_ANDROID) frontend_url = base::StringPrintf(kFrontEndURL, GetWebKitRevision().c_str()); #endif - return DevToolsHttpHandler::Start(CreateSocketFactory(), - frontend_url, - new ShellDevToolsDelegate(browser_context), - base::FilePath()); + return new DevToolsHttpHandler( + CreateSocketFactory(), + frontend_url, + new ShellDevToolsDelegate(browser_context), + new ShellDevToolsManagerDelegate(browser_context), + base::FilePath(), + base::FilePath(), + std::string(), + GetShellUserAgent()); } ShellDevToolsManagerDelegate::ShellDevToolsManagerDelegate( diff --git a/content/shell/browser/shell_devtools_manager_delegate.h b/content/shell/browser/shell_devtools_manager_delegate.h index 061562d..702aa1d 100644 --- a/content/shell/browser/shell_devtools_manager_delegate.h +++ b/content/shell/browser/shell_devtools_manager_delegate.h @@ -7,17 +7,20 @@ #include "base/basictypes.h" #include "base/compiler_specific.h" -#include "content/public/browser/devtools_http_handler_delegate.h" +#include "components/devtools_http_handler/devtools_http_handler_delegate.h" #include "content/public/browser/devtools_manager_delegate.h" +namespace devtools_http_handler { +class DevToolsHttpHandler; +} + namespace content { class BrowserContext; -class DevToolsHttpHandler; class ShellDevToolsManagerDelegate : public DevToolsManagerDelegate { public: - static DevToolsHttpHandler* CreateHttpHandler( + static devtools_http_handler::DevToolsHttpHandler* CreateHttpHandler( BrowserContext* browser_context); explicit ShellDevToolsManagerDelegate(BrowserContext* browser_context); diff --git a/extensions/shell/BUILD.gn b/extensions/shell/BUILD.gn index 2e12978..64accfc 100644 --- a/extensions/shell/BUILD.gn +++ b/extensions/shell/BUILD.gn @@ -31,6 +31,7 @@ source_set("app_shell_lib") { ":version_header", "//base", "//base:prefs", + "//components/devtools_http_handler", "//components/pref_registry", "//components/update_client", "//components/user_prefs", diff --git a/extensions/shell/app_shell.gyp b/extensions/shell/app_shell.gyp index 1837fd8..466637d 100644 --- a/extensions/shell/app_shell.gyp +++ b/extensions/shell/app_shell.gyp @@ -22,6 +22,7 @@ 'app_shell_version_header', '<(DEPTH)/base/base.gyp:base', '<(DEPTH)/base/base.gyp:base_prefs', + '<(DEPTH)/components/components.gyp:devtools_http_handler', '<(DEPTH)/components/components.gyp:pref_registry', '<(DEPTH)/components/components.gyp:update_client', '<(DEPTH)/components/components.gyp:user_prefs', diff --git a/extensions/shell/browser/DEPS b/extensions/shell/browser/DEPS index 8b27b25..43dda94 100644 --- a/extensions/shell/browser/DEPS +++ b/extensions/shell/browser/DEPS @@ -1,5 +1,6 @@ include_rules = [ "+chromeos", + "+components/devtools_http_handler", "+components/keyed_service", "+components/nacl/browser", "+components/nacl/common", diff --git a/extensions/shell/browser/shell_browser_main_parts.cc b/extensions/shell/browser/shell_browser_main_parts.cc index 80deb9d..073dacb 100644 --- a/extensions/shell/browser/shell_browser_main_parts.cc +++ b/extensions/shell/browser/shell_browser_main_parts.cc @@ -9,12 +9,12 @@ #include "base/command_line.h" #include "base/prefs/pref_service.h" #include "base/run_loop.h" +#include "components/devtools_http_handler/devtools_http_handler.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/storage_monitor/storage_monitor.h" #include "components/update_client/update_query_params.h" #include "content/public/browser/child_process_security_policy.h" #include "content/public/browser/context_factory.h" -#include "content/public/browser/devtools_http_handler.h" #include "content/public/common/result_codes.h" #include "content/shell/browser/shell_devtools_manager_delegate.h" #include "extensions/browser/app_window/app_window_client.h" diff --git a/extensions/shell/browser/shell_browser_main_parts.h b/extensions/shell/browser/shell_browser_main_parts.h index 0406d82..18665b4 100644 --- a/extensions/shell/browser/shell_browser_main_parts.h +++ b/extensions/shell/browser/shell_browser_main_parts.h @@ -17,10 +17,13 @@ class PrefService; namespace content { class BrowserContext; -class DevToolsHttpHandler; struct MainFunctionParams; } +namespace devtools_http_handler { +class DevToolsHttpHandler; +} + namespace views { class Widget; } @@ -88,7 +91,7 @@ class ShellBrowserMainParts : public content::BrowserMainParts { scoped_ptr<AppWindowClient> app_window_client_; scoped_ptr<ExtensionsClient> extensions_client_; scoped_ptr<ExtensionsBrowserClient> extensions_browser_client_; - scoped_ptr<content::DevToolsHttpHandler> devtools_http_handler_; + scoped_ptr<devtools_http_handler::DevToolsHttpHandler> devtools_http_handler_; scoped_ptr<ShellUpdateQueryParamsDelegate> update_query_params_delegate_; scoped_ptr<ShellOAuth2TokenService> oauth2_token_service_; |