| OLD | NEW | 
|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "base/memory/weak_ptr.h" | 5 #include "base/memory/weak_ptr.h" | 
| 6 #include "base/message_loop/message_loop.h" | 6 #include "base/message_loop/message_loop.h" | 
| 7 #include "base/rand_util.h" | 7 #include "base/rand_util.h" | 
| 8 #include "chrome/browser/devtools/device/android_device_manager.h" | 8 #include "chrome/browser/devtools/device/android_device_manager.h" | 
| 9 #include "content/public/browser/browser_thread.h" | 9 #include "content/public/browser/browser_thread.h" | 
| 10 #include "net/base/io_buffer.h" | 10 #include "net/base/io_buffer.h" | 
| 11 #include "net/base/net_errors.h" | 11 #include "net/base/net_errors.h" | 
| 12 #include "net/server/web_socket_encoder.h" | 12 #include "net/server/web_socket_encoder.h" | 
| 13 #include "net/socket/stream_socket.h" | 13 #include "net/socket/stream_socket.h" | 
| 14 | 14 | 
| 15 using content::BrowserThread; | 15 using content::BrowserThread; | 
| 16 using net::WebSocket; | 16 using net::WebSocket; | 
| 17 | 17 | 
| 18 namespace { | 18 namespace { | 
| 19 | 19 | 
| 20 const int kBufferSize = 16 * 1024; | 20 const int kBufferSize = 16 * 1024; | 
| 21 | 21 | 
| 22 }  // namespace | 22 }  // namespace | 
| 23 | 23 | 
| 24 class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { | 24 class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { | 
| 25  public: | 25  public: | 
| 26    WebSocketImpl(scoped_refptr<base::MessageLoopProxy> response_message_loop, | 26   WebSocketImpl(scoped_refptr<base::MessageLoopProxy> response_message_loop, | 
| 27                  base::WeakPtr<AndroidWebSocket> weak_socket, | 27                 base::WeakPtr<AndroidWebSocket> weak_socket, | 
| 28                  const std::string& extensions, | 28                 const std::string& extensions, | 
| 29                  scoped_ptr<net::StreamSocket> socket) | 29                 const std::string& leading_bytes, | 
| 30        : response_message_loop_(response_message_loop), | 30                 scoped_ptr<net::StreamSocket> socket) | 
| 31          weak_socket_(weak_socket), | 31       : response_message_loop_(response_message_loop), | 
| 32          socket_(socket.Pass()), | 32         weak_socket_(weak_socket), | 
| 33          encoder_(net::WebSocketEncoder::CreateClient(extensions)) { | 33         socket_(socket.Pass()), | 
|  | 34         encoder_(net::WebSocketEncoder::CreateClient(extensions)), | 
|  | 35         leading_bytes_(leading_bytes) { | 
| 34     thread_checker_.DetachFromThread(); | 36     thread_checker_.DetachFromThread(); | 
| 35   } | 37   } | 
| 36 | 38 | 
| 37   void StartListening() { | 39   void StartListening() { | 
| 38     DCHECK(thread_checker_.CalledOnValidThread()); | 40     DCHECK(thread_checker_.CalledOnValidThread()); | 
| 39     DCHECK(socket_); | 41     DCHECK(socket_); | 
| 40     scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); | 42     scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); | 
| 41     Read(buffer); | 43     if (leading_bytes_.length()) { | 
|  | 44       leading_bytes_.swap(response_buffer_); | 
|  | 45       ConsumeResponse(buffer); | 
|  | 46     } else { | 
|  | 47       Read(buffer); | 
|  | 48     } | 
| 42   } | 49   } | 
| 43 | 50 | 
| 44   void SendFrame(const std::string& message) { | 51   void SendFrame(const std::string& message) { | 
| 45     DCHECK(thread_checker_.CalledOnValidThread()); | 52     DCHECK(thread_checker_.CalledOnValidThread()); | 
| 46     if (!socket_) | 53     if (!socket_) | 
| 47       return; | 54       return; | 
| 48     int mask = base::RandInt(0, 0x7FFFFFFF); | 55     int mask = base::RandInt(0, 0x7FFFFFFF); | 
| 49     std::string encoded_frame; | 56     std::string encoded_frame; | 
| 50     encoder_->EncodeFrame(message, mask, &encoded_frame); | 57     encoder_->EncodeFrame(message, mask, &encoded_frame); | 
| 51     request_buffer_ += encoded_frame; | 58     request_buffer_ += encoded_frame; | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 64       OnBytesRead(response_buffer, result); | 71       OnBytesRead(response_buffer, result); | 
| 65   } | 72   } | 
| 66 | 73 | 
| 67   void OnBytesRead(scoped_refptr<net::IOBuffer> response_buffer, int result) { | 74   void OnBytesRead(scoped_refptr<net::IOBuffer> response_buffer, int result) { | 
| 68     DCHECK(thread_checker_.CalledOnValidThread()); | 75     DCHECK(thread_checker_.CalledOnValidThread()); | 
| 69     if (result <= 0) { | 76     if (result <= 0) { | 
| 70       Disconnect(); | 77       Disconnect(); | 
| 71       return; | 78       return; | 
| 72     } | 79     } | 
| 73     response_buffer_.append(response_buffer->data(), result); | 80     response_buffer_.append(response_buffer->data(), result); | 
|  | 81     ConsumeResponse(response_buffer); | 
|  | 82   } | 
| 74 | 83 | 
|  | 84   void ConsumeResponse(scoped_refptr<net::IOBuffer> response_buffer) { | 
| 75     int bytes_consumed; | 85     int bytes_consumed; | 
| 76     std::string output; | 86     std::string output; | 
| 77     WebSocket::ParseResult parse_result = encoder_->DecodeFrame( | 87     WebSocket::ParseResult parse_result = encoder_->DecodeFrame( | 
| 78         response_buffer_, &bytes_consumed, &output); | 88         response_buffer_, &bytes_consumed, &output); | 
| 79 | 89 | 
| 80     while (parse_result == WebSocket::FRAME_OK) { | 90     while (parse_result == WebSocket::FRAME_OK) { | 
| 81       response_buffer_ = response_buffer_.substr(bytes_consumed); | 91       response_buffer_ = response_buffer_.substr(bytes_consumed); | 
| 82       response_message_loop_->PostTask( | 92       response_message_loop_->PostTask( | 
| 83           FROM_HERE, | 93           FROM_HERE, | 
| 84           base::Bind(&AndroidWebSocket::OnFrameRead, weak_socket_, output)); | 94           base::Bind(&AndroidWebSocket::OnFrameRead, weak_socket_, output)); | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 120         FROM_HERE, | 130         FROM_HERE, | 
| 121         base::Bind(&AndroidWebSocket::OnSocketClosed, weak_socket_)); | 131         base::Bind(&AndroidWebSocket::OnSocketClosed, weak_socket_)); | 
| 122   } | 132   } | 
| 123 | 133 | 
| 124   scoped_refptr<base::MessageLoopProxy> response_message_loop_; | 134   scoped_refptr<base::MessageLoopProxy> response_message_loop_; | 
| 125   base::WeakPtr<AndroidWebSocket> weak_socket_; | 135   base::WeakPtr<AndroidWebSocket> weak_socket_; | 
| 126   scoped_ptr<net::StreamSocket> socket_; | 136   scoped_ptr<net::StreamSocket> socket_; | 
| 127   scoped_ptr<net::WebSocketEncoder> encoder_; | 137   scoped_ptr<net::WebSocketEncoder> encoder_; | 
| 128   std::string response_buffer_; | 138   std::string response_buffer_; | 
| 129   std::string request_buffer_; | 139   std::string request_buffer_; | 
|  | 140   std::string leading_bytes_; | 
| 130   base::ThreadChecker thread_checker_; | 141   base::ThreadChecker thread_checker_; | 
| 131   DISALLOW_COPY_AND_ASSIGN(WebSocketImpl); | 142   DISALLOW_COPY_AND_ASSIGN(WebSocketImpl); | 
| 132 }; | 143 }; | 
| 133 | 144 | 
| 134 AndroidDeviceManager::AndroidWebSocket::AndroidWebSocket( | 145 AndroidDeviceManager::AndroidWebSocket::AndroidWebSocket( | 
| 135     scoped_refptr<Device> device, | 146     scoped_refptr<Device> device, | 
| 136     const std::string& socket_name, | 147     const std::string& socket_name, | 
| 137     const std::string& url, | 148     const std::string& url, | 
| 138     Delegate* delegate) | 149     Delegate* delegate) | 
| 139     : device_(device.get()), | 150     : device_(device.get()), | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 161   DCHECK(device_); | 172   DCHECK(device_); | 
| 162   device_->message_loop_proxy_->PostTask( | 173   device_->message_loop_proxy_->PostTask( | 
| 163       FROM_HERE, | 174       FROM_HERE, | 
| 164       base::Bind(&WebSocketImpl::SendFrame, | 175       base::Bind(&WebSocketImpl::SendFrame, | 
| 165                  base::Unretained(socket_impl_), message)); | 176                  base::Unretained(socket_impl_), message)); | 
| 166 } | 177 } | 
| 167 | 178 | 
| 168 void AndroidDeviceManager::AndroidWebSocket::Connected( | 179 void AndroidDeviceManager::AndroidWebSocket::Connected( | 
| 169     int result, | 180     int result, | 
| 170     const std::string& extensions, | 181     const std::string& extensions, | 
|  | 182     const std::string& leading_bytes, | 
| 171     scoped_ptr<net::StreamSocket> socket) { | 183     scoped_ptr<net::StreamSocket> socket) { | 
| 172   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 184   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 173   if (result != net::OK || !socket.get()) { | 185   if (result != net::OK || !socket.get()) { | 
| 174     OnSocketClosed(); | 186     OnSocketClosed(); | 
| 175     return; | 187     return; | 
| 176   } | 188   } | 
| 177   socket_impl_ = new WebSocketImpl(base::MessageLoopProxy::current(), | 189   socket_impl_ = new WebSocketImpl(base::MessageLoopProxy::current(), | 
| 178                                    weak_factory_.GetWeakPtr(), | 190                                    weak_factory_.GetWeakPtr(), extensions, | 
| 179                                    extensions, | 191                                    leading_bytes, socket.Pass()); | 
| 180                                    socket.Pass()); |  | 
| 181   device_->message_loop_proxy_->PostTask( | 192   device_->message_loop_proxy_->PostTask( | 
| 182       FROM_HERE, | 193       FROM_HERE, | 
| 183       base::Bind(&WebSocketImpl::StartListening, | 194       base::Bind(&WebSocketImpl::StartListening, | 
| 184                  base::Unretained(socket_impl_))); | 195                  base::Unretained(socket_impl_))); | 
| 185   delegate_->OnSocketOpened(); | 196   delegate_->OnSocketOpened(); | 
| 186 } | 197 } | 
| 187 | 198 | 
| 188 void AndroidDeviceManager::AndroidWebSocket::OnFrameRead( | 199 void AndroidDeviceManager::AndroidWebSocket::OnFrameRead( | 
| 189     const std::string& message) { | 200     const std::string& message) { | 
| 190   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 201   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 210   } | 221   } | 
| 211 } | 222 } | 
| 212 | 223 | 
| 213 AndroidDeviceManager::AndroidWebSocket* | 224 AndroidDeviceManager::AndroidWebSocket* | 
| 214 AndroidDeviceManager::Device::CreateWebSocket( | 225 AndroidDeviceManager::Device::CreateWebSocket( | 
| 215     const std::string& socket_name, | 226     const std::string& socket_name, | 
| 216     const std::string& url, | 227     const std::string& url, | 
| 217     AndroidWebSocket::Delegate* delegate) { | 228     AndroidWebSocket::Delegate* delegate) { | 
| 218   return new AndroidWebSocket(this, socket_name, url, delegate); | 229   return new AndroidWebSocket(this, socket_name, url, delegate); | 
| 219 } | 230 } | 
| OLD | NEW | 
|---|