Index: mojo/spy/spy.cc |
diff --git a/mojo/spy/spy.cc b/mojo/spy/spy.cc |
index 8de82290bf65a300fcce2e0f1117137ba5f8db46..d239d64e0b14085b179201ca8ddfe7ae89348197 100644 |
--- a/mojo/spy/spy.cc |
+++ b/mojo/spy/spy.cc |
@@ -22,13 +22,10 @@ |
#include "mojo/spy/common.h" |
#include "mojo/spy/public/spy.mojom.h" |
#include "mojo/spy/spy_server_impl.h" |
-#include "mojo/spy/websocket_server.h" |
#include "url/gurl.h" |
namespace { |
-mojo::WebSocketServer* ws_server = NULL; |
- |
const size_t kMessageBufSize = 2 * 1024; |
const size_t kHandleBufSize = 64; |
const int kDefaultWebSocketPort = 42424; |
@@ -43,9 +40,11 @@ void CloseHandles(MojoHandle* handles, size_t count) { |
class MessageProcessor : |
public base::RefCountedThreadSafe<MessageProcessor> { |
public: |
- MessageProcessor(base::MessageLoopProxy* control_loop_proxy) |
+ MessageProcessor(mojo::Spy::WebSocketDelegate* websocket_delegate, |
+ base::MessageLoopProxy* control_loop_proxy) |
: last_result_(MOJO_RESULT_OK), |
bytes_transfered_(0), |
+ websocket_delegate_(websocket_delegate), |
control_loop_proxy_(control_loop_proxy) { |
message_count_[0] = 0; |
message_count_[1] = 0; |
@@ -115,10 +114,10 @@ class MessageProcessor : |
base::WorkerPool::PostTask( |
FROM_HERE, |
base::Bind(&MessageProcessor::Start, |
- this, |
- base::Passed(&message_pipe_handle), |
- base::Passed(&interceptor), |
- url), |
+ this, |
+ base::Passed(&message_pipe_handle), |
+ base::Passed(&interceptor), |
+ url), |
true); |
hbuf.get()[i] = faux_client.release().value(); |
} |
@@ -203,14 +202,19 @@ class MessageProcessor : |
} |
void LogMessageInfo(void* data, const GURL& url) { |
+ if (!websocket_delegate_) |
+ return; |
+ |
mojo::MojoMessageData* message_data = |
reinterpret_cast<mojo::MojoMessageData*>(data); |
if (IsValidMessage(message_data->header)) { |
control_loop_proxy_->PostTask( |
FROM_HERE, |
- base::Bind(&mojo::WebSocketServer::LogMessageInfo, |
- base::Unretained(ws_server), |
- message_data->header, url, base::Time::Now())); |
+ base::Bind(&mojo::Spy::WebSocketDelegate::OnMessage, |
+ base::Unretained(websocket_delegate_), |
+ message_data, |
+ url, |
+ base::Time::Now())); |
} |
} |
@@ -218,6 +222,7 @@ class MessageProcessor : |
uint32_t bytes_transfered_; |
uint32_t message_count_[2]; |
uint32_t handle_count_[2]; |
+ mojo::Spy::WebSocketDelegate* websocket_delegate_; |
scoped_refptr<base::MessageLoopProxy> control_loop_proxy_; |
}; |
@@ -226,10 +231,12 @@ class SpyInterceptor : public mojo::ApplicationManager::Interceptor { |
public: |
explicit SpyInterceptor( |
scoped_refptr<mojo::SpyServerImpl> spy_server, |
- const scoped_refptr<base::MessageLoopProxy>& control_loop_proxy) |
+ const scoped_refptr<base::MessageLoopProxy>& control_loop_proxy, |
+ mojo::Spy::WebSocketDelegate* websocket_delegate) |
: spy_server_(spy_server), |
proxy_(base::MessageLoopProxy::current()), |
- control_loop_proxy_(control_loop_proxy) {} |
+ control_loop_proxy_(control_loop_proxy), |
+ websocket_delegate_(websocket_delegate) {} |
private: |
virtual mojo::ServiceProviderPtr OnConnectToClient( |
@@ -247,7 +254,7 @@ class SpyInterceptor : public mojo::ApplicationManager::Interceptor { |
CreateMessagePipe(NULL, &faux_client, &interceptor); |
scoped_refptr<MessageProcessor> processor = |
- new MessageProcessor(control_loop_proxy_.get()); |
+ new MessageProcessor(websocket_delegate_, control_loop_proxy_.get()); |
mojo::ScopedMessagePipeHandle real_handle = real_client.PassMessagePipe(); |
base::WorkerPool::PostTask( |
FROM_HERE, |
@@ -273,13 +280,12 @@ class SpyInterceptor : public mojo::ApplicationManager::Interceptor { |
scoped_refptr<mojo::SpyServerImpl> spy_server_; |
scoped_refptr<base::MessageLoopProxy> proxy_; |
scoped_refptr<base::MessageLoopProxy> control_loop_proxy_; |
+ mojo::Spy::WebSocketDelegate* websocket_delegate_; |
}; |
-void StartWebServer(int port, mojo::ScopedMessagePipeHandle pipe) { |
- // TODO(cpu) figure out lifetime of the server. See Spy() dtor. |
- ws_server = new mojo::WebSocketServer(port, pipe.Pass()); |
- ws_server->Start(); |
-} |
+} // namespace |
+ |
+namespace mojo { |
struct SpyOptions { |
int websocket_port; |
@@ -306,28 +312,18 @@ SpyOptions ProcessOptions(const std::string& options) { |
return spy_options; |
} |
-} // namespace |
- |
-namespace mojo { |
- |
Spy::Spy(mojo::ApplicationManager* application_manager, |
- const std::string& options) { |
- SpyOptions spy_options = ProcessOptions(options); |
- |
+ const std::string& options) |
+ : websocket_delegate_(NULL), |
+ application_manager_(application_manager), |
+ spy_options_(NULL) { |
+ spy_options_ = new SpyOptions(ProcessOptions(options)); |
spy_server_ = new SpyServerImpl(); |
// Start the tread what will accept commands from the frontend. |
control_thread_.reset(new base::Thread("mojo_spy_control_thread")); |
base::Thread::Options thread_options(base::MessageLoop::TYPE_IO, 0); |
control_thread_->StartWithOptions(thread_options); |
- control_thread_->message_loop_proxy()->PostTask( |
- FROM_HERE, base::Bind(&StartWebServer, |
- spy_options.websocket_port, |
- base::Passed(spy_server_->ServerPipe()))); |
- |
- // Start intercepting mojo services. |
- application_manager->SetInterceptor( |
- new SpyInterceptor(spy_server_, control_thread_->message_loop_proxy())); |
} |
Spy::~Spy() { |
@@ -335,4 +331,19 @@ Spy::~Spy() { |
// application_manager and the spy is still unclear hence the leak. |
} |
+void Spy::SetWebSocketDelegate(WebSocketDelegate* websocket_delegate) { |
+ DCHECK(websocket_delegate_ == NULL); |
+ websocket_delegate_ = websocket_delegate; |
+ |
+ control_thread_->message_loop_proxy()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&WebSocketDelegate::Start, |
+ base::Unretained(websocket_delegate_), |
+ spy_options_->websocket_port, |
+ base::Passed(spy_server_->ServerPipe()))); |
+ // Start intercepting mojo services. |
+ application_manager_->SetInterceptor(new SpyInterceptor( |
+ spy_server_, control_thread_->message_loop_proxy(), websocket_delegate_)); |
+} |
+ |
} // namespace mojo |