From b1ba710d5745e57a4ed88bea799b819817d04b8b Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 9 Jan 2017 16:43:38 +0100 Subject: Adapt devtools to Chromium 55 A restructuring of all our devtools integration classes. Change-Id: I2a32b9b2e66c17b72aaa3bbf246a22d211409aa5 Reviewed-by: Michal Klocek --- src/core/dev_tools_http_handler_delegate_qt.cpp | 183 ++++++++---------------- src/core/dev_tools_http_handler_delegate_qt.h | 36 ++--- src/core/web_contents_adapter.cpp | 2 +- src/core/web_engine_context.cpp | 11 +- src/core/web_engine_context.h | 7 +- 5 files changed, 84 insertions(+), 155 deletions(-) (limited to 'src/core') diff --git a/src/core/dev_tools_http_handler_delegate_qt.cpp b/src/core/dev_tools_http_handler_delegate_qt.cpp index 5fd35ee29..468c5f05f 100644 --- a/src/core/dev_tools_http_handler_delegate_qt.cpp +++ b/src/core/dev_tools_http_handler_delegate_qt.cpp @@ -53,11 +53,10 @@ #include "base/memory/ptr_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" -#include "components/devtools_discovery/devtools_discovery_manager.h" -#include "components/devtools_discovery/devtools_target_descriptor.h" -#include "components/devtools_http_handler/devtools_http_handler.h" +#include "content/browser/devtools/devtools_http_handler.h" #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/devtools_frontend_host.h" +#include "content/public/browser/devtools_socket_factory.h" #include "content/public/browser/favicon_status.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/render_view_host.h" @@ -69,30 +68,26 @@ #include "net/socket/tcp_server_socket.h" using namespace content; -using namespace devtools_discovery; -using namespace devtools_http_handler; namespace { -const char kTargetTypePage[] = "page"; -const char kTargetTypeSharedWorker[] = "worker"; -const char kTargetTypeServiceWorker[] = "service_worker"; -const char kTargetTypeOther[] = "other"; - -class TCPServerSocketFactory - : public DevToolsHttpHandler::ServerSocketFactory { +class TCPServerSocketFactory : public content::DevToolsSocketFactory { public: TCPServerSocketFactory(const std::string& address, int port, int backlog) : m_address(address), m_port(port), m_backlog(backlog) {} private: std::unique_ptr CreateForHttpServer() override { - std::unique_ptr socket(new net::TCPServerSocket(nullptr, net::NetLog::Source())); + std::unique_ptr socket(new net::TCPServerSocket(nullptr, net::NetLogSource())); if (socket->ListenWithAddressAndPort(m_address, m_port, m_backlog) != net::OK) return std::unique_ptr(); return socket; } + std::unique_ptr CreateForTethering(std::string* out_name) override + { + return nullptr; + } const std::string m_address; int m_port; @@ -100,103 +95,23 @@ private: DISALLOW_COPY_AND_ASSIGN(TCPServerSocketFactory); }; -class DevToolsDiscoveryProviderQt : public DevToolsDiscoveryManager::Provider { -public: - DevToolsTargetDescriptor::List GetDescriptors() override; -}; - -class Target : public DevToolsTargetDescriptor { -public: - explicit Target(scoped_refptr agent_host); - - virtual std::string GetId() const override { return agent_host_->GetId(); } - virtual std::string GetParentId() const override { return std::string(); } - virtual std::string GetType() const override { - switch (agent_host_->GetType()) { - case DevToolsAgentHost::TYPE_WEB_CONTENTS: - return kTargetTypePage; - case DevToolsAgentHost::TYPE_SHARED_WORKER: - return kTargetTypeSharedWorker; - case DevToolsAgentHost::TYPE_SERVICE_WORKER: - return kTargetTypeServiceWorker; - default: - break; - } - return kTargetTypeOther; - } - virtual std::string GetTitle() const override { return agent_host_->GetTitle(); } - virtual std::string GetDescription() const override { return std::string(); } - virtual GURL GetURL() const override { return agent_host_->GetURL(); } - virtual GURL GetFaviconURL() const override { return favicon_url_; } - virtual base::TimeTicks GetLastActivityTime() const override { - return last_activity_time_; - } - virtual bool IsAttached() const override { - return agent_host_->IsAttached(); - } - virtual scoped_refptr GetAgentHost() const override { - return agent_host_; - } - virtual bool Activate() const override; - virtual bool Close() const override; - -private: - scoped_refptr agent_host_; - GURL favicon_url_; - base::TimeTicks last_activity_time_; -}; - -Target::Target(scoped_refptr agent_host) - : agent_host_(agent_host) -{ - if (WebContents* web_contents = agent_host_->GetWebContents()) { - NavigationController& controller = web_contents->GetController(); - NavigationEntry* entry = controller.GetActiveEntry(); - if (entry != NULL && entry->GetURL().is_valid()) - favicon_url_ = entry->GetFavicon().url; - last_activity_time_ = web_contents->GetLastActiveTime(); - } -} - -bool Target::Activate() const { - return agent_host_->Activate(); -} - -bool Target::Close() const { - return agent_host_->Close(); -} - -DevToolsTargetDescriptor::List DevToolsDiscoveryProviderQt::GetDescriptors() -{ - DevToolsTargetDescriptor::List targets; - for (const auto& agent_host : DevToolsAgentHost::GetOrCreateAll()) { - targets.push_back(new Target(agent_host)); - } - return targets; -} - } // namespace namespace QtWebEngineCore { -std::unique_ptr createDevToolsHttpHandler() -{ - DevToolsHttpHandlerDelegateQt *delegate = new DevToolsHttpHandlerDelegateQt(); - if (!delegate->isValid()) { - delete delegate; - return nullptr; - } - std::unique_ptr factory(new TCPServerSocketFactory(delegate->bindAddress().toStdString(), delegate->port(), 1)); - // Ownership of the delegate is taken over the devtools http handler. - std::unique_ptr handler(new DevToolsHttpHandler(std::move(factory), std::string(), delegate, base::FilePath(), base::FilePath(), std::string(), std::string())); - DevToolsDiscoveryManager::GetInstance()->AddProvider(base::WrapUnique(new DevToolsDiscoveryProviderQt())); - return std::move(handler); -} - -DevToolsHttpHandlerDelegateQt::DevToolsHttpHandlerDelegateQt() +DevToolsServerQt::DevToolsServerQt() : m_bindAddress(QLatin1String("127.0.0.1")) , m_port(0) , m_valid(false) + , m_isStarted(false) +{ } + +DevToolsServerQt::~DevToolsServerQt() +{ + stop(); +} + +void DevToolsServerQt::parseAddressAndPort() { const QString inspectorEnv = QString::fromUtf8(qgetenv("QTWEBENGINE_REMOTE_DEBUGGING")); const base::CommandLine &commandLine = *base::CommandLine::ForCurrentProcess(); @@ -215,21 +130,56 @@ DevToolsHttpHandlerDelegateQt::DevToolsHttpHandlerDelegateQt() return; m_port = portStr.toInt(&m_valid); - m_valid = m_valid && m_port > 0 && m_port < 65535; + m_valid = m_valid && (m_port > 0 && m_port < 65535); if (!m_valid) qWarning("Invalid port given for the inspector server \"%s\". Examples of valid input: \"12345\" or \"192.168.2.14:12345\" (with the address of one of this host's network interface).", qPrintable(portStr)); } -void DevToolsHttpHandlerDelegateQt::Initialized(const net::IPEndPoint *ip_address) +std::unique_ptr DevToolsServerQt::CreateSocketFactory() +{ + if (!m_valid) + return nullptr; + return std::unique_ptr( + new TCPServerSocketFactory(m_bindAddress.toStdString(), m_port, 1)); +} + + +void DevToolsServerQt::start() +{ + if (m_isStarted) + return; + + if (!m_valid) + parseAddressAndPort(); + + std::unique_ptr socketFactory = CreateSocketFactory(); + if (!socketFactory) + return; + + m_isStarted = true; + DevToolsAgentHost::StartRemoteDebuggingServer( + std::move(socketFactory), std::string(), + base::FilePath(), base::FilePath(), + std::string(), std::string()); +} + +void DevToolsServerQt::stop() +{ + DevToolsAgentHost::StopRemoteDebuggingServer(); + m_isStarted = false; +} + +void DevToolsManagerDelegateQt::Initialized(const net::IPEndPoint *ip_address) { if (ip_address && ip_address->address().size()) { QString addressAndPort = QString::fromStdString(ip_address->ToString()); qWarning("Remote debugging server started successfully. Try pointing a Chromium-based browser to http://%s", qPrintable(addressAndPort)); - } else - qWarning("Couldn't start the inspector server on bind address \"%s\" and port \"%d\". In case of invalid input, try something like: \"12345\" or \"192.168.2.14:12345\" (with the address of one of this host's interface).", qPrintable(m_bindAddress), m_port); + } + else + qWarning("Couldn't start the inspector server on bind address. In case of invalid input, try something like: \"12345\" or \"192.168.2.14:12345\" (with the address of one of this host's interface)."); } -std::string DevToolsHttpHandlerDelegateQt::GetDiscoveryPageHTML() +std::string DevToolsManagerDelegateQt::GetDiscoveryPageHTML() { static std::string html; if (html.empty()) { @@ -241,24 +191,9 @@ std::string DevToolsHttpHandlerDelegateQt::GetDiscoveryPageHTML() return html; } -std::string DevToolsHttpHandlerDelegateQt::GetPageThumbnailData(const GURL& url) -{ - return std::string(); -} - -std::string DevToolsHttpHandlerDelegateQt::GetFrontendResource(const std::string &path) +std::string DevToolsManagerDelegateQt::GetFrontendResource(const std::string& path) { return content::DevToolsFrontendHost::GetFrontendResource(path).as_string(); } -content::DevToolsExternalAgentProxyDelegate* DevToolsHttpHandlerDelegateQt::HandleWebSocketConnection(const std::string&) -{ - return 0; -} - -base::DictionaryValue* DevToolsManagerDelegateQt::HandleCommand(DevToolsAgentHost *, base::DictionaryValue *) -{ - return 0; -} - } //namespace QtWebEngineCore diff --git a/src/core/dev_tools_http_handler_delegate_qt.h b/src/core/dev_tools_http_handler_delegate_qt.h index 6512146a5..1b0e82bc0 100644 --- a/src/core/dev_tools_http_handler_delegate_qt.h +++ b/src/core/dev_tools_http_handler_delegate_qt.h @@ -40,51 +40,45 @@ #ifndef DEV_TOOLS_HTTP_HANDLER_DELEGATE_QT_H #define DEV_TOOLS_HTTP_HANDLER_DELEGATE_QT_H -#include "components/devtools_http_handler/devtools_http_handler_delegate.h" #include "content/public/browser/devtools_manager_delegate.h" #include -#include // needed for Q_DECL_OVERRIDE namespace content { -class BrowserContext; -} - -namespace devtools_http_handler { -class DevToolsHttpHandler; +class DevToolsSocketFactory; } namespace QtWebEngineCore { -std::unique_ptr createDevToolsHttpHandler(); - -class DevToolsHttpHandlerDelegateQt : public devtools_http_handler::DevToolsHttpHandlerDelegate { +class DevToolsServerQt { public: - DevToolsHttpHandlerDelegateQt(); + DevToolsServerQt(); + ~DevToolsServerQt(); bool isValid() const { return m_valid; } QString bindAddress() const { return m_bindAddress; } int port() const { return m_port; } - // devtools_http_handler::DevToolsHttpHandlerDelegate Overrides - void Initialized(const net::IPEndPoint *ip_address) Q_DECL_OVERRIDE; - std::string GetDiscoveryPageHTML() Q_DECL_OVERRIDE; - std::string GetFrontendResource(const std::string&) Q_DECL_OVERRIDE; - std::string GetPageThumbnailData(const GURL &url) Q_DECL_OVERRIDE; - - content::DevToolsExternalAgentProxyDelegate* HandleWebSocketConnection(const std::string&) Q_DECL_OVERRIDE; + void start(); + void stop(); + bool isStarted() const { return m_isStarted; } private: + void parseAddressAndPort(); + std::unique_ptr CreateSocketFactory(); + QString m_bindAddress; int m_port; bool m_valid; + bool m_isStarted; }; + class DevToolsManagerDelegateQt : public content::DevToolsManagerDelegate { public: - void Inspect(content::BrowserContext *browser_context, content::DevToolsAgentHost *agent_host) Q_DECL_OVERRIDE { } - void DevToolsAgentStateChanged(content::DevToolsAgentHost *agent_host, bool attached) Q_DECL_OVERRIDE { } - base::DictionaryValue *HandleCommand(content::DevToolsAgentHost *agent_host, base::DictionaryValue *command) Q_DECL_OVERRIDE; + std::string GetDiscoveryPageHTML() override; + std::string GetFrontendResource(const std::string& path) override; + void Initialized(const net::IPEndPoint *ip_address) override; }; } // namespace QtWebEngineCore diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index f3a75ecff..384724736 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -974,7 +974,7 @@ void WebContentsAdapter::inspectElementAt(const QPoint &location) { Q_D(WebContentsAdapter); if (content::DevToolsAgentHost::HasFor(d->webContents.get())) { - content::DevToolsAgentHost::GetOrCreateFor(d->webContents.get())->InspectElement(location.x(), location.y()); + content::DevToolsAgentHost::GetOrCreateFor(d->webContents.get())->InspectElement(nullptr, location.x(), location.y()); } } diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp index b88f6308f..b4788e02d 100644 --- a/src/core/web_engine_context.cpp +++ b/src/core/web_engine_context.cpp @@ -51,7 +51,7 @@ #if defined(ENABLE_BASIC_PRINTING) #include "chrome/browser/printing/print_job_manager.h" #endif // defined(ENABLE_BASIC_PRINTING) -#include "components/devtools_http_handler/devtools_http_handler.h" +#include "content/browser/devtools/devtools_http_handler.h" #include "content/browser/gpu/gpu_process_host.h" #include "content/browser/renderer_host/render_process_host_impl.h" #include "content/browser/utility_process_host_impl.h" @@ -183,13 +183,15 @@ void WebEngineContext::destroyBrowserContext() void WebEngineContext::destroy() { + if (m_devtoolsServer) + m_devtoolsServer->stop(); delete m_globalQObject; m_globalQObject = 0; base::MessagePump::Delegate *delegate = m_runLoop->loop_; // Flush the UI message loop before quitting. while (delegate->DoWork()) { } GLContextHelper::destroy(); - m_devtools.reset(0); + m_devtoolsServer.reset(0); m_runLoop->AfterRun(); // Force to destroy RenderProcessHostImpl by destroying BrowserMainRunner. @@ -205,7 +207,7 @@ WebEngineContext::~WebEngineContext() { // WebEngineContext::destroy() must be called before we are deleted Q_ASSERT(!m_globalQObject); - Q_ASSERT(!m_devtools); + Q_ASSERT(!m_devtoolsServer); Q_ASSERT(!m_browserRunner); } @@ -404,7 +406,8 @@ WebEngineContext::WebEngineContext() m_runLoop.reset(new base::RunLoop); m_runLoop->BeforeRun(); - m_devtools = createDevToolsHttpHandler(); + m_devtoolsServer.reset(new DevToolsServerQt()); + m_devtoolsServer->start(); // Force the initialization of MediaCaptureDevicesDispatcher on the UI // thread to avoid a thread check assertion in its constructor when it // first gets referenced on the IO thread. diff --git a/src/core/web_engine_context.h b/src/core/web_engine_context.h index 878b651de..0058ccd84 100644 --- a/src/core/web_engine_context.h +++ b/src/core/web_engine_context.h @@ -56,10 +56,6 @@ class BrowserMainRunner; class ContentMainRunner; } -namespace devtools_http_handler { -class DevToolsHttpHandler; -} - #if defined(ENABLE_BASIC_PRINTING) namespace printing { class PrintJobManager; @@ -72,6 +68,7 @@ namespace QtWebEngineCore { class BrowserContextAdapter; class ContentMainDelegateQt; +class DevToolsServerQt; class SurfaceFactoryQt; class WebEngineContext : public base::RefCounted { @@ -97,7 +94,7 @@ private: std::unique_ptr m_browserRunner; QObject* m_globalQObject; QSharedPointer m_defaultBrowserContext; - std::unique_ptr m_devtools; + std::unique_ptr m_devtoolsServer; #if defined(ENABLE_BASIC_PRINTING) std::unique_ptr m_printJobManager; #endif // defined(ENABLE_BASIC_PRINTING) -- cgit v1.2.3