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 0e45830a86443387c138116a8ff35c3bd3bbb493..35ddf13ec5d392ff7d1d096a42afdbb7178a1334 100644 |
--- a/chrome/browser/devtools/device/android_web_socket.cc |
+++ b/chrome/browser/devtools/device/android_web_socket.cc |
@@ -19,262 +19,179 @@ namespace { |
const int kBufferSize = 16 * 1024; |
-class WebSocketImpl { |
- public: |
- typedef AndroidDeviceManager::AndroidWebSocket::Delegate Delegate; |
- |
- WebSocketImpl(Delegate* delegate, |
- scoped_ptr<net::StreamSocket> socket); |
- void StartListening(); |
- void SendFrame(const std::string& message); |
- |
- private: |
- void OnBytesRead(scoped_refptr<net::IOBuffer> response_buffer, int result); |
- void SendPendingRequests(int result); |
- void Disconnect(); |
- |
- Delegate* delegate_; |
- scoped_ptr<net::StreamSocket> socket_; |
- std::string response_buffer_; |
- std::string request_buffer_; |
- base::ThreadChecker thread_checker_; |
- DISALLOW_COPY_AND_ASSIGN(WebSocketImpl); |
-}; |
+} // namespace |
-class DelegateWrapper |
- : public AndroidDeviceManager::AndroidWebSocket::Delegate { |
+class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { |
public: |
- DelegateWrapper(base::WeakPtr<Delegate> weak_delegate, |
- scoped_refptr<base::MessageLoopProxy> message_loop) |
- : weak_delegate_(weak_delegate), |
- message_loop_(message_loop) { |
- } |
- |
- ~DelegateWrapper() override {} |
- |
- // AndroidWebSocket::Delegate implementation |
- void OnSocketOpened() override { |
- message_loop_->PostTask(FROM_HERE, |
- base::Bind(&Delegate::OnSocketOpened, weak_delegate_)); |
+ WebSocketImpl(scoped_refptr<base::MessageLoopProxy> response_message_loop, |
+ base::WeakPtr<AndroidWebSocket> weak_socket, |
+ scoped_ptr<net::StreamSocket> socket) |
+ : response_message_loop_(response_message_loop), |
+ weak_socket_(weak_socket), |
+ socket_(socket.Pass()) { |
+ thread_checker_.DetachFromThread(); |
} |
- void OnFrameRead(const std::string& message) override { |
- message_loop_->PostTask(FROM_HERE, |
- base::Bind(&Delegate::OnFrameRead, weak_delegate_, message)); |
+ void StartListening() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(socket_); |
+ scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); |
+ Read(buffer); |
} |
- void OnSocketClosed() override { |
- message_loop_->PostTask(FROM_HERE, |
- base::Bind(&Delegate::OnSocketClosed, weak_delegate_)); |
+ void SendFrame(const std::string& message) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (!socket_) |
+ return; |
+ int mask = base::RandInt(0, 0x7FFFFFFF); |
+ std::string encoded_frame = WebSocket::EncodeFrameHybi17(message, mask); |
+ request_buffer_ += encoded_frame; |
+ if (request_buffer_.length() == encoded_frame.length()) |
+ SendPendingRequests(0); |
} |
private: |
- base::WeakPtr<Delegate> weak_delegate_; |
- scoped_refptr<base::MessageLoopProxy> message_loop_; |
-}; |
- |
-class AndroidWebSocketImpl |
- : public AndroidDeviceManager::AndroidWebSocket, |
- public AndroidDeviceManager::AndroidWebSocket::Delegate { |
- public: |
- typedef AndroidDeviceManager::Device Device; |
- AndroidWebSocketImpl( |
- scoped_refptr<base::MessageLoopProxy> device_message_loop, |
- scoped_refptr<Device> device, |
- const std::string& socket_name, |
- const std::string& url, |
- AndroidWebSocket::Delegate* delegate); |
+ void Read(scoped_refptr<net::IOBuffer> response_buffer) { |
+ int result = socket_->Read( |
+ response_buffer.get(), |
+ kBufferSize, |
+ base::Bind(&WebSocketImpl::OnBytesRead, |
+ base::Unretained(this), response_buffer)); |
+ if (result != net::ERR_IO_PENDING) |
+ OnBytesRead(response_buffer, result); |
+ } |
- ~AndroidWebSocketImpl() override; |
+ void OnBytesRead(scoped_refptr<net::IOBuffer> response_buffer, int result) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (result <= 0) { |
+ Disconnect(); |
+ return; |
+ } |
+ response_buffer_.append(response_buffer->data(), result); |
+ |
+ int bytes_consumed; |
+ std::string output; |
+ WebSocket::ParseResult parse_result = WebSocket::DecodeFrameHybi17( |
+ response_buffer_, false, &bytes_consumed, &output); |
- // AndroidWebSocket implementation |
- void SendFrame(const std::string& message) override; |
+ while (parse_result == WebSocket::FRAME_OK) { |
+ response_buffer_ = response_buffer_.substr(bytes_consumed); |
+ response_message_loop_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&AndroidWebSocket::OnFrameRead, weak_socket_, output)); |
+ parse_result = WebSocket::DecodeFrameHybi17( |
+ response_buffer_, false, &bytes_consumed, &output); |
+ } |
+ |
+ if (parse_result == WebSocket::FRAME_ERROR || |
+ parse_result == WebSocket::FRAME_CLOSE) { |
+ Disconnect(); |
+ return; |
+ } |
+ Read(response_buffer); |
+ } |
- // AndroidWebSocket::Delegate implementation |
- void OnSocketOpened() override; |
- void OnFrameRead(const std::string& message) override; |
- void OnSocketClosed() override; |
+ void SendPendingRequests(int result) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (result < 0) { |
+ Disconnect(); |
+ return; |
+ } |
+ request_buffer_ = request_buffer_.substr(result); |
+ if (request_buffer_.empty()) |
+ return; |
+ |
+ scoped_refptr<net::StringIOBuffer> buffer = |
+ new net::StringIOBuffer(request_buffer_); |
+ result = socket_->Write(buffer.get(), buffer->size(), |
+ base::Bind(&WebSocketImpl::SendPendingRequests, |
+ base::Unretained(this))); |
+ if (result != net::ERR_IO_PENDING) |
+ SendPendingRequests(result); |
+ } |
- private: |
- void Connected(int result, scoped_ptr<net::StreamSocket> socket); |
+ void Disconnect() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ socket_.reset(); |
+ response_message_loop_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&AndroidWebSocket::OnSocketClosed, weak_socket_)); |
+ } |
- scoped_refptr<base::MessageLoopProxy> device_message_loop_; |
- scoped_refptr<Device> device_; |
- std::string socket_name_; |
- std::string url_; |
- WebSocketImpl* connection_; |
- DelegateWrapper* delegate_wrapper_; |
- AndroidWebSocket::Delegate* delegate_; |
- base::WeakPtrFactory<AndroidWebSocketImpl> weak_factory_; |
- DISALLOW_COPY_AND_ASSIGN(AndroidWebSocketImpl); |
+ scoped_refptr<base::MessageLoopProxy> response_message_loop_; |
+ base::WeakPtr<AndroidWebSocket> weak_socket_; |
+ scoped_ptr<net::StreamSocket> socket_; |
+ std::string response_buffer_; |
+ std::string request_buffer_; |
+ base::ThreadChecker thread_checker_; |
+ DISALLOW_COPY_AND_ASSIGN(WebSocketImpl); |
}; |
-AndroidWebSocketImpl::AndroidWebSocketImpl( |
- scoped_refptr<base::MessageLoopProxy> device_message_loop, |
+AndroidDeviceManager::AndroidWebSocket::AndroidWebSocket( |
scoped_refptr<Device> device, |
const std::string& socket_name, |
const std::string& url, |
- AndroidWebSocket::Delegate* delegate) |
- : device_message_loop_(device_message_loop), |
- device_(device), |
- socket_name_(socket_name), |
- url_(url), |
+ Delegate* delegate) |
+ : device_(device), |
+ socket_impl_(nullptr), |
delegate_(delegate), |
weak_factory_(this) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(delegate_); |
device_->HttpUpgrade( |
- socket_name_, url_, |
- base::Bind(&AndroidWebSocketImpl::Connected, weak_factory_.GetWeakPtr())); |
+ socket_name, url, |
+ base::Bind(&AndroidWebSocket::Connected, weak_factory_.GetWeakPtr())); |
} |
-void AndroidWebSocketImpl::SendFrame(const std::string& message) { |
+AndroidDeviceManager::AndroidWebSocket::~AndroidWebSocket() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- device_message_loop_->PostTask( |
- FROM_HERE, |
- base::Bind(&WebSocketImpl::SendFrame, |
- base::Unretained(connection_), message)); |
-} |
- |
-void WebSocketImpl::SendFrame(const std::string& message) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- if (!socket_) |
- return; |
- int mask = base::RandInt(0, 0x7FFFFFFF); |
- std::string encoded_frame = WebSocket::EncodeFrameHybi17(message, mask); |
- request_buffer_ += encoded_frame; |
- if (request_buffer_.length() == encoded_frame.length()) |
- SendPendingRequests(0); |
+ if (socket_impl_) |
+ device_->device_message_loop_->DeleteSoon(FROM_HERE, socket_impl_); |
} |
-AndroidWebSocketImpl::~AndroidWebSocketImpl() { |
+void AndroidDeviceManager::AndroidWebSocket::SendFrame( |
+ const std::string& message) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- device_message_loop_->DeleteSoon(FROM_HERE, connection_); |
- device_message_loop_->DeleteSoon(FROM_HERE, delegate_wrapper_); |
-} |
- |
-WebSocketImpl::WebSocketImpl(Delegate* delegate, |
- scoped_ptr<net::StreamSocket> socket) |
- : delegate_(delegate), |
- socket_(socket.Pass()) { |
- thread_checker_.DetachFromThread(); |
+ DCHECK(socket_impl_); |
+ device_->device_message_loop_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&WebSocketImpl::SendFrame, |
+ base::Unretained(socket_impl_), message)); |
} |
-void AndroidWebSocketImpl::Connected(int result, |
- scoped_ptr<net::StreamSocket> socket) { |
+void AndroidDeviceManager::AndroidWebSocket::Connected( |
+ int result, |
+ scoped_ptr<net::StreamSocket> socket) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (result != net::OK || socket == NULL) { |
+ if (result != net::OK || !socket.get()) { |
OnSocketClosed(); |
return; |
} |
- delegate_wrapper_ = new DelegateWrapper(weak_factory_.GetWeakPtr(), |
- base::MessageLoopProxy::current()); |
- connection_ = new WebSocketImpl(delegate_wrapper_, socket.Pass()); |
- device_message_loop_->PostTask( |
+ socket_impl_ = new WebSocketImpl(base::MessageLoopProxy::current(), |
+ weak_factory_.GetWeakPtr(), |
+ socket.Pass()); |
+ device_->device_message_loop_->PostTask( |
FROM_HERE, |
base::Bind(&WebSocketImpl::StartListening, |
- base::Unretained(connection_))); |
- OnSocketOpened(); |
-} |
- |
-void WebSocketImpl::StartListening() { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(socket_); |
- scoped_refptr<net::IOBuffer> response_buffer = |
- new net::IOBuffer(kBufferSize); |
- int result = socket_->Read( |
- response_buffer.get(), |
- kBufferSize, |
- base::Bind(&WebSocketImpl::OnBytesRead, |
- base::Unretained(this), response_buffer)); |
- if (result != net::ERR_IO_PENDING) |
- OnBytesRead(response_buffer, result); |
-} |
- |
-void WebSocketImpl::OnBytesRead(scoped_refptr<net::IOBuffer> response_buffer, |
- int result) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- if (result <= 0) { |
- Disconnect(); |
- return; |
- } |
- |
- response_buffer_.append(response_buffer->data(), result); |
- |
- int bytes_consumed; |
- std::string output; |
- WebSocket::ParseResult parse_result = WebSocket::DecodeFrameHybi17( |
- response_buffer_, false, &bytes_consumed, &output); |
- |
- while (parse_result == WebSocket::FRAME_OK) { |
- response_buffer_ = response_buffer_.substr(bytes_consumed); |
- delegate_->OnFrameRead(output); |
- parse_result = WebSocket::DecodeFrameHybi17( |
- response_buffer_, false, &bytes_consumed, &output); |
- } |
- |
- if (parse_result == WebSocket::FRAME_ERROR || |
- parse_result == WebSocket::FRAME_CLOSE) { |
- Disconnect(); |
- return; |
- } |
- |
- result = socket_->Read( |
- response_buffer.get(), |
- kBufferSize, |
- base::Bind(&WebSocketImpl::OnBytesRead, |
- base::Unretained(this), response_buffer)); |
- if (result != net::ERR_IO_PENDING) |
- OnBytesRead(response_buffer, result); |
-} |
- |
-void WebSocketImpl::SendPendingRequests(int result) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- if (result < 0) { |
- Disconnect(); |
- return; |
- } |
- request_buffer_ = request_buffer_.substr(result); |
- if (request_buffer_.empty()) |
- return; |
- |
- scoped_refptr<net::StringIOBuffer> buffer = |
- new net::StringIOBuffer(request_buffer_); |
- result = socket_->Write(buffer.get(), buffer->size(), |
- base::Bind(&WebSocketImpl::SendPendingRequests, |
- base::Unretained(this))); |
- if (result != net::ERR_IO_PENDING) |
- SendPendingRequests(result); |
-} |
- |
-void WebSocketImpl::Disconnect() { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- socket_.reset(); |
- delegate_->OnSocketClosed(); |
-} |
- |
-void AndroidWebSocketImpl::OnSocketOpened() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ base::Unretained(socket_impl_))); |
delegate_->OnSocketOpened(); |
} |
-void AndroidWebSocketImpl::OnFrameRead(const std::string& message) { |
+void AndroidDeviceManager::AndroidWebSocket::OnFrameRead( |
+ const std::string& message) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
delegate_->OnFrameRead(message); |
} |
-void AndroidWebSocketImpl::OnSocketClosed() { |
+void AndroidDeviceManager::AndroidWebSocket::OnSocketClosed() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
delegate_->OnSocketClosed(); |
} |
-} // namespace |
- |
AndroidDeviceManager::AndroidWebSocket* |
AndroidDeviceManager::Device::CreateWebSocket( |
const std::string& socket, |
const std::string& url, |
- AndroidDeviceManager::AndroidWebSocket::Delegate* delegate) { |
- return new AndroidWebSocketImpl( |
- device_message_loop_, this, socket, url, delegate); |
+ AndroidWebSocket::Delegate* delegate) { |
+ return new AndroidWebSocket(this, socket, url, delegate); |
} |