diff options
13 files changed, 327 insertions, 42 deletions
diff --git a/content/browser/devtools/devtools_agent_host_impl.cc b/content/browser/devtools/devtools_agent_host_impl.cc index a4c9449..a0f337a 100644 --- a/content/browser/devtools/devtools_agent_host_impl.cc +++ b/content/browser/devtools/devtools_agent_host_impl.cc @@ -9,7 +9,6 @@ #include "base/basictypes.h" #include "base/guid.h" #include "base/lazy_instance.h" -#include "content/common/devtools_messages.h" namespace content { @@ -38,32 +37,7 @@ scoped_refptr<DevToolsAgentHost> DevToolsAgentHost::GetForId( return it->second; } -void DevToolsAgentHostImpl::Attach() { - SendMessageToAgent(new DevToolsAgentMsg_Attach(MSG_ROUTING_NONE)); - NotifyClientAttaching(); -} - -void DevToolsAgentHostImpl::Reattach(const std::string& saved_agent_state) { - SendMessageToAgent(new DevToolsAgentMsg_Reattach( - MSG_ROUTING_NONE, - saved_agent_state)); - NotifyClientAttaching(); -} - -void DevToolsAgentHostImpl::Detach() { - SendMessageToAgent(new DevToolsAgentMsg_Detach(MSG_ROUTING_NONE)); - NotifyClientDetaching(); -} - -void DevToolsAgentHostImpl::DispatchOnInspectorBackend( - const std::string& message) { - SendMessageToAgent(new DevToolsAgentMsg_DispatchOnInspectorBackend( - MSG_ROUTING_NONE, message)); -} - void DevToolsAgentHostImpl::InspectElement(int x, int y) { - SendMessageToAgent(new DevToolsAgentMsg_InspectElement(MSG_ROUTING_NONE, - x, y)); } std::string DevToolsAgentHostImpl::GetId() { diff --git a/content/browser/devtools/devtools_agent_host_impl.h b/content/browser/devtools/devtools_agent_host_impl.h index 6e1f481..91f802a 100644 --- a/content/browser/devtools/devtools_agent_host_impl.h +++ b/content/browser/devtools/devtools_agent_host_impl.h @@ -27,11 +27,14 @@ class CONTENT_EXPORT DevToolsAgentHostImpl : public DevToolsAgentHost { virtual ~CloseListener() {} }; - // Sends the message to the devtools agent hosted by this object. - void Attach(); - void Reattach(const std::string& saved_agent_state); - void Detach(); - virtual void DispatchOnInspectorBackend(const std::string& message); + // Informs the hosted agent that a client host has attached. + virtual void Attach() = 0; + + // Informs the hosted agent that a client host has detached. + virtual void Detach() = 0; + + // Sends a message to the agent hosted by this object. + virtual void DispatchOnInspectorBackend(const std::string& message) = 0; void set_close_listener(CloseListener* listener) { close_listener_ = listener; @@ -48,10 +51,6 @@ class CONTENT_EXPORT DevToolsAgentHostImpl : public DevToolsAgentHost { DevToolsAgentHostImpl(); virtual ~DevToolsAgentHostImpl(); - virtual void SendMessageToAgent(IPC::Message* msg) = 0; - virtual void NotifyClientAttaching() = 0; - virtual void NotifyClientDetaching() = 0; - void NotifyCloseListener(); private: diff --git a/content/browser/devtools/devtools_external_agent_proxy_impl.cc b/content/browser/devtools/devtools_external_agent_proxy_impl.cc new file mode 100644 index 0000000..0d77b53 --- /dev/null +++ b/content/browser/devtools/devtools_external_agent_proxy_impl.cc @@ -0,0 +1,66 @@ +// Copyright (c) 2013 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 "content/browser/devtools/devtools_external_agent_proxy_impl.h" + +#include "content/browser/devtools/devtools_agent_host_impl.h" +#include "content/public/browser/devtools_external_agent_proxy_delegate.h" + +namespace content { + +class DevToolsExternalAgentProxyImpl::ForwardingAgentHost + : public DevToolsAgentHostImpl { + public: + ForwardingAgentHost(DevToolsExternalAgentProxyDelegate* delegate) + : delegate_(delegate) { + } + + void ConnectionClosed() { + NotifyCloseListener(); + } + + private: + ~ForwardingAgentHost() { + } + + // DevToolsAgentHostImpl implementation. + virtual void Attach() OVERRIDE { + delegate_->Attach(); + }; + + virtual void Detach() OVERRIDE { + delegate_->Detach(); + }; + + virtual void DispatchOnInspectorBackend(const std::string& message) OVERRIDE { + delegate_->SendMessageToBackend(message); + } + + DevToolsExternalAgentProxyDelegate* delegate_; +}; + +//static +DevToolsExternalAgentProxy* DevToolsExternalAgentProxy::Create( + DevToolsExternalAgentProxyDelegate* delegate) { + return new DevToolsExternalAgentProxyImpl(delegate); +} + +DevToolsExternalAgentProxyImpl::DevToolsExternalAgentProxyImpl( + DevToolsExternalAgentProxyDelegate* delegate) + : agent_host_(new ForwardingAgentHost(delegate)) { +} + +DevToolsExternalAgentProxyImpl::~DevToolsExternalAgentProxyImpl() { +} + +scoped_refptr<DevToolsAgentHost> DevToolsExternalAgentProxyImpl:: + GetAgentHost() { + return agent_host_; +} + +void DevToolsExternalAgentProxyImpl::ConnectionClosed() { + agent_host_->ConnectionClosed(); +} + +} // content diff --git a/content/browser/devtools/devtools_external_agent_proxy_impl.h b/content/browser/devtools/devtools_external_agent_proxy_impl.h new file mode 100644 index 0000000..39f40df --- /dev/null +++ b/content/browser/devtools/devtools_external_agent_proxy_impl.h @@ -0,0 +1,34 @@ +// Copyright (c) 2013 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_BROWSER_DEVTOOLS_DEVTOOLS_EXTERNAL_AGENT_PROXY_IMPL_H +#define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_EXTERNAL_AGENT_PROXY_IMPL_H + +#include "base/memory/ref_counted.h" +#include "content/public/browser/devtools_external_agent_proxy.h" + +namespace content { + +class DevToolsExternalAgentProxyImpl + : public DevToolsExternalAgentProxy { + public: + explicit DevToolsExternalAgentProxyImpl( + DevToolsExternalAgentProxyDelegate* delegate); + virtual ~DevToolsExternalAgentProxyImpl(); + + // DevToolsExternalAgentProxy implementation. + virtual scoped_refptr<DevToolsAgentHost> GetAgentHost() OVERRIDE; + virtual void ConnectionClosed() OVERRIDE; + + private: + class ForwardingAgentHost; + + scoped_refptr<ForwardingAgentHost> agent_host_; + + DISALLOW_COPY_AND_ASSIGN(DevToolsExternalAgentProxyImpl); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_EXTERNAL_AGENT_PROXY_IMPL_H diff --git a/content/browser/devtools/devtools_manager_unittest.cc b/content/browser/devtools/devtools_manager_unittest.cc index deac3c1..e2ab0e3 100644 --- a/content/browser/devtools/devtools_manager_unittest.cc +++ b/content/browser/devtools/devtools_manager_unittest.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "base/basictypes.h" +#include "base/memory/scoped_ptr.h" #include "base/time.h" #include "content/browser/devtools/devtools_manager_impl.h" #include "content/browser/devtools/render_view_devtools_agent_host.h" @@ -11,6 +12,8 @@ #include "content/public/browser/content_browser_client.h" #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/devtools_client_host.h" +#include "content/public/browser/devtools_external_agent_proxy.h" +#include "content/public/browser/devtools_external_agent_proxy_delegate.h" #include "content/public/browser/web_contents_delegate.h" #include "content/test/test_content_browser_client.h" #include "content/test/test_web_contents.h" @@ -237,4 +240,60 @@ TEST_F(DevToolsManagerTest, ReattachOnCancelPendingNavigation) { client_host.Close(DevToolsManager::GetInstance()); } +class TestExternalAgentDelegate: public DevToolsExternalAgentProxyDelegate { + std::map<std::string,int> event_counter_; + + void recordEvent(const std::string& name) { + if (event_counter_.find(name) == event_counter_.end()) + event_counter_[name] = 0; + event_counter_[name] = event_counter_[name] + 1; + } + + void expectEvent(int count, const std::string& name) { + EXPECT_EQ(count, event_counter_[name]); + } + + virtual void Attach() OVERRIDE { + recordEvent("Attach"); + }; + + virtual void Detach() OVERRIDE { + recordEvent("Detach"); + }; + + virtual void SendMessageToBackend(const std::string& message) OVERRIDE { + recordEvent(std::string("SendMessageToBackend.") + message); + }; + + public : + ~TestExternalAgentDelegate() { + expectEvent(1, "Attach"); + expectEvent(1, "Detach"); + expectEvent(0, "SendMessageToBackend.message0"); + expectEvent(1, "SendMessageToBackend.message1"); + expectEvent(2, "SendMessageToBackend.message2"); + } +}; + +TEST_F(DevToolsManagerTest, TestExternalProxy) { + TestExternalAgentDelegate delegate; + + scoped_ptr<DevToolsExternalAgentProxy> proxy( + DevToolsExternalAgentProxy::Create(&delegate)); + + scoped_refptr<DevToolsAgentHost> agent_host = proxy->GetAgentHost(); + EXPECT_EQ(agent_host, DevToolsAgentHost::GetForId(agent_host->GetId())); + + DevToolsManager* manager = DevToolsManager::GetInstance(); + + TestDevToolsClientHost client_host; + manager->RegisterDevToolsClientHostFor(agent_host, &client_host); + + manager->DispatchOnInspectorBackend(&client_host, "message1"); + manager->DispatchOnInspectorBackend(&client_host, "message2"); + manager->DispatchOnInspectorBackend(&client_host, "message2"); + + client_host.Close(manager); +} + } // namespace content diff --git a/content/browser/devtools/ipc_devtools_agent_host.cc b/content/browser/devtools/ipc_devtools_agent_host.cc new file mode 100644 index 0000000..d8c5001 --- /dev/null +++ b/content/browser/devtools/ipc_devtools_agent_host.cc @@ -0,0 +1,42 @@ +// Copyright (c) 2013 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 "content/browser/devtools/ipc_devtools_agent_host.h" + +#include "content/common/devtools_messages.h" + +namespace content { + +void IPCDevToolsAgentHost::Attach() { + SendMessageToAgent(new DevToolsAgentMsg_Attach(MSG_ROUTING_NONE)); + NotifyClientAttaching(); +} + +void IPCDevToolsAgentHost::Detach() { + SendMessageToAgent(new DevToolsAgentMsg_Detach(MSG_ROUTING_NONE)); + NotifyClientDetaching(); +} + +void IPCDevToolsAgentHost::DispatchOnInspectorBackend( + const std::string& message) { + SendMessageToAgent(new DevToolsAgentMsg_DispatchOnInspectorBackend( + MSG_ROUTING_NONE, message)); +} + +void IPCDevToolsAgentHost::InspectElement(int x, int y) { + SendMessageToAgent(new DevToolsAgentMsg_InspectElement(MSG_ROUTING_NONE, + x, y)); +} + +IPCDevToolsAgentHost::~IPCDevToolsAgentHost() { +} + +void IPCDevToolsAgentHost::Reattach(const std::string& saved_agent_state) { + SendMessageToAgent(new DevToolsAgentMsg_Reattach( + MSG_ROUTING_NONE, + saved_agent_state)); + NotifyClientAttaching(); +} + +} // namespace content diff --git a/content/browser/devtools/ipc_devtools_agent_host.h b/content/browser/devtools/ipc_devtools_agent_host.h new file mode 100644 index 0000000..33e7a3e --- /dev/null +++ b/content/browser/devtools/ipc_devtools_agent_host.h @@ -0,0 +1,36 @@ +// Copyright (c) 2013 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_BROWSER_DEVTOOLS_IPC_DEVTOOLS_AGENT_HOST_H_ +#define CONTENT_BROWSER_DEVTOOLS_IPC_DEVTOOLS_AGENT_HOST_H_ + +#include "content/browser/devtools/devtools_agent_host_impl.h" + +namespace IPC { +class Message; +} + +namespace content { + +class CONTENT_EXPORT IPCDevToolsAgentHost : public DevToolsAgentHostImpl { + public: + // DevToolsAgentHostImpl implementation. + virtual void Attach() OVERRIDE; + virtual void Detach() OVERRIDE; + virtual void DispatchOnInspectorBackend(const std::string& message) OVERRIDE; + virtual void InspectElement(int x, int y) OVERRIDE; + + protected: + virtual ~IPCDevToolsAgentHost(); + + void Reattach(const std::string& saved_agent_state); + + virtual void SendMessageToAgent(IPC::Message* msg) = 0; + virtual void NotifyClientAttaching() = 0; + virtual void NotifyClientDetaching() = 0; +}; + +} // namespace content + +#endif // CONTENT_BROWSER_DEVTOOLS_IPC_DEVTOOLS_AGENT_HOST_H_ diff --git a/content/browser/devtools/render_view_devtools_agent_host.cc b/content/browser/devtools/render_view_devtools_agent_host.cc index 91f17a1..3687766 100644 --- a/content/browser/devtools/render_view_devtools_agent_host.cc +++ b/content/browser/devtools/render_view_devtools_agent_host.cc @@ -203,7 +203,7 @@ void RenderViewDevToolsAgentHost::DispatchOnInspectorBackend( if (overridden_response) OnDispatchOnInspectorFrontend(overridden_response->Serialize()); else - DevToolsAgentHostImpl::DispatchOnInspectorBackend(message); + IPCDevToolsAgentHost::DispatchOnInspectorBackend(message); } void RenderViewDevToolsAgentHost::SendMessageToAgent(IPC::Message* msg) { diff --git a/content/browser/devtools/render_view_devtools_agent_host.h b/content/browser/devtools/render_view_devtools_agent_host.h index 436776b..53f89da 100644 --- a/content/browser/devtools/render_view_devtools_agent_host.h +++ b/content/browser/devtools/render_view_devtools_agent_host.h @@ -10,7 +10,7 @@ #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" -#include "content/browser/devtools/devtools_agent_host_impl.h" +#include "content/browser/devtools/ipc_devtools_agent_host.h" #include "content/common/content_export.h" #include "content/public/browser/render_view_host_observer.h" #include "content/public/browser/web_contents_observer.h" @@ -21,7 +21,7 @@ class RendererOverridesHandler; class RenderViewHost; class CONTENT_EXPORT RenderViewDevToolsAgentHost - : public DevToolsAgentHostImpl, + : public IPCDevToolsAgentHost, private WebContentsObserver { public: static void OnCancelPendingNavigation(RenderViewHost* pending, @@ -40,7 +40,7 @@ class CONTENT_EXPORT RenderViewDevToolsAgentHost // DevTooolsAgentHost overrides. virtual RenderViewHost* GetRenderViewHost() OVERRIDE; - // DevToolsAgentHostImpl overrides. + // IPCDevToolsAgentHost overrides. virtual void DispatchOnInspectorBackend(const std::string& message) OVERRIDE; virtual void SendMessageToAgent(IPC::Message* msg) OVERRIDE; virtual void NotifyClientAttaching() OVERRIDE; diff --git a/content/browser/devtools/worker_devtools_manager.cc b/content/browser/devtools/worker_devtools_manager.cc index ae32629..4a19c62 100644 --- a/content/browser/devtools/worker_devtools_manager.cc +++ b/content/browser/devtools/worker_devtools_manager.cc @@ -9,8 +9,8 @@ #include "base/bind.h" #include "base/lazy_instance.h" -#include "content/browser/devtools/devtools_agent_host_impl.h" #include "content/browser/devtools/devtools_manager_impl.h" +#include "content/browser/devtools/ipc_devtools_agent_host.h" #include "content/browser/devtools/worker_devtools_message_filter.h" #include "content/browser/worker_host/worker_service_impl.h" #include "content/common/devtools_messages.h" @@ -56,7 +56,7 @@ struct WorkerDevToolsManager::TerminatedInspectedWorker { class WorkerDevToolsManager::WorkerDevToolsAgentHost - : public DevToolsAgentHostImpl { + : public IPCDevToolsAgentHost { public: explicit WorkerDevToolsAgentHost(WorkerId worker_id) : has_worker_id_(false) { @@ -117,7 +117,7 @@ class WorkerDevToolsManager::WorkerDevToolsAgentHost worker_process_id, worker_route_id, *message); } - // DevToolsAgentHostImpl implementation. + // IPCDevToolsAgentHost implementation. virtual void SendMessageToAgent(IPC::Message* message) OVERRIDE { if (!has_worker_id_) { delete message; diff --git a/content/content_browser.gypi b/content/content_browser.gypi index d70e151..bf67cedd 100644 --- a/content/content_browser.gypi +++ b/content/content_browser.gypi @@ -60,6 +60,8 @@ 'public/browser/content_browser_client.h', 'public/browser/devtools_agent_host.h', 'public/browser/devtools_client_host.h', + 'public/browser/devtools_external_agent_proxy.h', + 'public/browser/devtools_external_agent_proxy_delegate.h', 'public/browser/download_danger_type.h', 'public/browser/download_id.h', 'public/browser/devtools_frontend_host_delegate.h', @@ -304,6 +306,8 @@ 'browser/devtools/devtools_agent_host_impl.h', 'browser/devtools/devtools_browser_target.cc', 'browser/devtools/devtools_browser_target.h', + 'browser/devtools/devtools_external_agent_proxy_impl.cc', + 'browser/devtools/devtools_external_agent_proxy_impl.h', 'browser/devtools/devtools_frontend_host.cc', 'browser/devtools/devtools_frontend_host.h', 'browser/devtools/devtools_http_handler_impl.cc', @@ -318,6 +322,8 @@ 'browser/devtools/devtools_protocol_constants.h', 'browser/devtools/devtools_tracing_handler.h', 'browser/devtools/devtools_tracing_handler.cc', + 'browser/devtools/ipc_devtools_agent_host.cc', + 'browser/devtools/ipc_devtools_agent_host.h', 'browser/devtools/render_view_devtools_agent_host.cc', 'browser/devtools/render_view_devtools_agent_host.h', 'browser/devtools/renderer_overrides_handler.cc', diff --git a/content/public/browser/devtools_external_agent_proxy.h b/content/public/browser/devtools_external_agent_proxy.h new file mode 100644 index 0000000..9e43c64 --- /dev/null +++ b/content/public/browser/devtools_external_agent_proxy.h @@ -0,0 +1,37 @@ +// Copyright (c) 2013 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_EXTERNAL_AGENT_PROXY_H_ +#define CONTENT_PUBLIC_BROWSER_DEVTOOLS_EXTERNAL_AGENT_PROXY_H_ + +#include <string> + +#include "content/common/content_export.h" + +namespace content { + +class DevToolsAgentHost; +class DevToolsExternalAgentProxyDelegate; + +// Describes interface for communication with an external DevTools agent. +class DevToolsExternalAgentProxy { + public: + // Creates DevToolsExternalAgentProxy to communicate with an agent + // via the provided |delegate|. + // Caller get the proxy ownership and keeps the |delegate| ownership. + static CONTENT_EXPORT DevToolsExternalAgentProxy* Create( + DevToolsExternalAgentProxyDelegate* delegate); + + // Returns the local DevToolsAgentHost for the external agent. + virtual scoped_refptr<DevToolsAgentHost> GetAgentHost() = 0; + + // Informs the client that the connection has closed. + virtual void ConnectionClosed() = 0; + + virtual ~DevToolsExternalAgentProxy() {} +}; + +} // namespace content + +#endif // CONTENT_PUBLIC_BROWSER_DEVTOOLS_EXTERNAL_AGENT_PROXY_H_ diff --git a/content/public/browser/devtools_external_agent_proxy_delegate.h b/content/public/browser/devtools_external_agent_proxy_delegate.h new file mode 100644 index 0000000..d68854f --- /dev/null +++ b/content/public/browser/devtools_external_agent_proxy_delegate.h @@ -0,0 +1,32 @@ +// Copyright (c) 2013 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_EXTERNAL_AGENT_PROXY_DELEGATE_H_ +#define CONTENT_PUBLIC_BROWSER_DEVTOOLS_EXTERNAL_AGENT_PROXY_DELEGATE_H_ + +#include <string> + +#include "content/common/content_export.h" + +namespace content { + +// Describes the interface for sending messages to an external DevTools agent. +class DevToolsExternalAgentProxyDelegate { + public: + // Informs the agent that a client host has attached. + virtual void Attach() = 0; + + // Informs the agent that a client host has detached. + virtual void Detach() = 0; + + // Sends a message to the agent. + virtual void SendMessageToBackend(const std::string& message) = 0; + + protected: + virtual ~DevToolsExternalAgentProxyDelegate() {} +}; + +} // namespace content + +#endif // CONTENT_PUBLIC_BROWSER_DEVTOOLS_EXTERNAL_AGENT_PROXY_DELEGATE_H_ |