Index: chrome/browser/devtools/device/android_web_socket.cc |
diff --git a/chrome/browser/devtools/device/android_web_socket.cc b/chrome/browser/devtools/device/android_web_socket.cc |
index 84eea201d2b557555dc1ca2538f57e0e1cdef57b..dae8077127c79ec0bb5f2bfe0464b165c1a4cf47 100644 |
--- a/chrome/browser/devtools/device/android_web_socket.cc |
+++ b/chrome/browser/devtools/device/android_web_socket.cc |
@@ -23,14 +23,16 @@ const int kBufferSize = 16 * 1024; |
class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { |
public: |
- WebSocketImpl(scoped_refptr<base::MessageLoopProxy> response_message_loop, |
- base::WeakPtr<AndroidWebSocket> weak_socket, |
- const std::string& extensions, |
- scoped_ptr<net::StreamSocket> socket) |
- : response_message_loop_(response_message_loop), |
- weak_socket_(weak_socket), |
- socket_(socket.Pass()), |
- encoder_(net::WebSocketEncoder::CreateClient(extensions)) { |
+ WebSocketImpl(scoped_refptr<base::MessageLoopProxy> response_message_loop, |
+ base::WeakPtr<AndroidWebSocket> weak_socket, |
+ const std::string& extensions, |
+ const std::string& leading_bytes, |
+ scoped_ptr<net::StreamSocket> socket) |
+ : response_message_loop_(response_message_loop), |
+ weak_socket_(weak_socket), |
+ socket_(socket.Pass()), |
+ encoder_(net::WebSocketEncoder::CreateClient(extensions)), |
+ leading_bytes_(leading_bytes) { |
thread_checker_.DetachFromThread(); |
} |
@@ -38,7 +40,12 @@ class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { |
DCHECK(thread_checker_.CalledOnValidThread()); |
DCHECK(socket_); |
scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); |
- Read(buffer); |
+ if (leading_bytes_.length()) { |
+ leading_bytes_.swap(response_buffer_); |
+ ConsumeResponse(buffer); |
+ } else { |
+ Read(buffer); |
+ } |
} |
void SendFrame(const std::string& message) { |
@@ -71,7 +78,10 @@ class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { |
return; |
} |
response_buffer_.append(response_buffer->data(), result); |
+ ConsumeResponse(response_buffer); |
+ } |
+ void ConsumeResponse(scoped_refptr<net::IOBuffer> response_buffer) { |
int bytes_consumed; |
std::string output; |
WebSocket::ParseResult parse_result = encoder_->DecodeFrame( |
@@ -127,6 +137,7 @@ class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { |
scoped_ptr<net::WebSocketEncoder> encoder_; |
std::string response_buffer_; |
std::string request_buffer_; |
+ std::string leading_bytes_; |
base::ThreadChecker thread_checker_; |
DISALLOW_COPY_AND_ASSIGN(WebSocketImpl); |
}; |
@@ -168,6 +179,7 @@ void AndroidDeviceManager::AndroidWebSocket::SendFrame( |
void AndroidDeviceManager::AndroidWebSocket::Connected( |
int result, |
const std::string& extensions, |
+ const std::string& leading_bytes, |
scoped_ptr<net::StreamSocket> socket) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
if (result != net::OK || !socket.get()) { |
@@ -175,9 +187,8 @@ void AndroidDeviceManager::AndroidWebSocket::Connected( |
return; |
} |
socket_impl_ = new WebSocketImpl(base::MessageLoopProxy::current(), |
- weak_factory_.GetWeakPtr(), |
- extensions, |
- socket.Pass()); |
+ weak_factory_.GetWeakPtr(), extensions, |
+ leading_bytes, socket.Pass()); |
device_->message_loop_proxy_->PostTask( |
FROM_HERE, |
base::Bind(&WebSocketImpl::StartListening, |