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..98bae3d31d826ac98ea2d08966f81791aee37cc2 100644 |
--- a/chrome/browser/devtools/device/android_web_socket.cc |
+++ b/chrome/browser/devtools/device/android_web_socket.cc |
@@ -23,22 +23,29 @@ const int kBufferSize = 16 * 1024; |
class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { |
public: |
- WebSocketImpl(scoped_refptr<base::MessageLoopProxy> response_message_loop, |
+ WebSocketImpl(scoped_refptr<base::MessageLoopProxy> response_message_loop, |
base::WeakPtr<AndroidWebSocket> weak_socket, |
const std::string& extensions, |
+ const std::string& body_head, |
scoped_ptr<net::StreamSocket> socket) |
: response_message_loop_(response_message_loop), |
weak_socket_(weak_socket), |
socket_(socket.Pass()), |
- encoder_(net::WebSocketEncoder::CreateClient(extensions)) { |
+ encoder_(net::WebSocketEncoder::CreateClient(extensions)), |
+ response_buffer_(body_head) { |
thread_checker_.DetachFromThread(); |
} |
void StartListening() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
DCHECK(socket_); |
+ |
scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); |
- Read(buffer); |
+ |
+ if (response_buffer_.size() > 0) |
+ ProcessResponseBuffer(buffer); |
+ else |
+ Read(buffer); |
} |
void SendFrame(const std::string& message) { |
@@ -54,24 +61,28 @@ class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { |
} |
private: |
- void Read(scoped_refptr<net::IOBuffer> response_buffer) { |
+ void Read(scoped_refptr<net::IOBuffer> io_buffer) { |
int result = socket_->Read( |
- response_buffer.get(), |
+ io_buffer.get(), |
kBufferSize, |
base::Bind(&WebSocketImpl::OnBytesRead, |
- base::Unretained(this), response_buffer)); |
+ base::Unretained(this), io_buffer)); |
if (result != net::ERR_IO_PENDING) |
- OnBytesRead(response_buffer, result); |
+ OnBytesRead(io_buffer, result); |
} |
- void OnBytesRead(scoped_refptr<net::IOBuffer> response_buffer, int result) { |
+ void OnBytesRead(scoped_refptr<net::IOBuffer> io_buffer, int result) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
if (result <= 0) { |
Disconnect(); |
return; |
} |
- response_buffer_.append(response_buffer->data(), result); |
+ response_buffer_.append(io_buffer->data(), result); |
+ |
+ ProcessResponseBuffer(io_buffer); |
+ } |
+ void ProcessResponseBuffer(scoped_refptr<net::IOBuffer> io_buffer) { |
int bytes_consumed; |
std::string output; |
WebSocket::ParseResult parse_result = encoder_->DecodeFrame( |
@@ -91,7 +102,7 @@ class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { |
Disconnect(); |
return; |
} |
- Read(response_buffer); |
+ Read(io_buffer); |
} |
void SendPendingRequests(int result) { |
@@ -168,6 +179,7 @@ void AndroidDeviceManager::AndroidWebSocket::SendFrame( |
void AndroidDeviceManager::AndroidWebSocket::Connected( |
int result, |
const std::string& extensions, |
+ const std::string& body_head, |
scoped_ptr<net::StreamSocket> socket) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
if (result != net::OK || !socket.get()) { |
@@ -177,6 +189,7 @@ void AndroidDeviceManager::AndroidWebSocket::Connected( |
socket_impl_ = new WebSocketImpl(base::MessageLoopProxy::current(), |
weak_factory_.GetWeakPtr(), |
extensions, |
+ body_head, |
socket.Pass()); |
device_->message_loop_proxy_->PostTask( |
FROM_HERE, |