| Index: webkit/tools/test_shell/simple_socket_stream_bridge.cc
|
| diff --git a/webkit/tools/test_shell/simple_socket_stream_bridge.cc b/webkit/tools/test_shell/simple_socket_stream_bridge.cc
|
| index 508b9439ff226483f78bdd1457c9b1ada6a6444a..223b8c1d3cafd0ac7f42498bf6e9bacd3d2fe6cd 100644
|
| --- a/webkit/tools/test_shell/simple_socket_stream_bridge.cc
|
| +++ b/webkit/tools/test_shell/simple_socket_stream_bridge.cc
|
| @@ -58,7 +58,7 @@ class WebSocketStreamHandleBridgeImpl
|
| void DoOnConnected(int max_amount_send_allowed);
|
| void DoOnSentData(int amount_sent);
|
| void DoOnReceivedData(std::vector<char>* data);
|
| - void DoOnClose(webkit_glue::WebSocketStreamHandleDelegate* delegate);
|
| + void DoOnClose();
|
|
|
| int socket_id_;
|
| MessageLoop* message_loop_;
|
| @@ -66,6 +66,8 @@ class WebSocketStreamHandleBridgeImpl
|
| webkit_glue::WebSocketStreamHandleDelegate* delegate_;
|
|
|
| scoped_refptr<net::SocketStream> socket_;
|
| + // Number of pending tasks to handle net::SocketStream::Delegate methods.
|
| + int num_pending_tasks_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(WebSocketStreamHandleBridgeImpl);
|
| };
|
| @@ -76,15 +78,16 @@ WebSocketStreamHandleBridgeImpl::WebSocketStreamHandleBridgeImpl(
|
| : socket_id_(kNoSocketId),
|
| message_loop_(MessageLoop::current()),
|
| handle_(handle),
|
| - delegate_(delegate) {
|
| + delegate_(delegate),
|
| + num_pending_tasks_(0) {
|
| }
|
|
|
| WebSocketStreamHandleBridgeImpl::~WebSocketStreamHandleBridgeImpl() {
|
| - CHECK(socket_id_ == kNoSocketId);
|
| + DCHECK_EQ(socket_id_, kNoSocketId);
|
| }
|
|
|
| void WebSocketStreamHandleBridgeImpl::Connect(const GURL& url) {
|
| - CHECK(g_io_thread);
|
| + DCHECK(g_io_thread);
|
| AddRef(); // Released in DoOnClose().
|
| g_io_thread->PostTask(
|
| FROM_HERE,
|
| @@ -96,7 +99,7 @@ void WebSocketStreamHandleBridgeImpl::Connect(const GURL& url) {
|
|
|
| bool WebSocketStreamHandleBridgeImpl::Send(
|
| const std::vector<char>& data) {
|
| - CHECK(g_io_thread);
|
| + DCHECK(g_io_thread);
|
| g_io_thread->PostTask(
|
| FROM_HERE,
|
| NewRunnableMethod(this, &WebSocketStreamHandleBridgeImpl::DoSend,
|
| @@ -105,7 +108,7 @@ bool WebSocketStreamHandleBridgeImpl::Send(
|
| }
|
|
|
| void WebSocketStreamHandleBridgeImpl::Close() {
|
| - CHECK(g_io_thread);
|
| + DCHECK(g_io_thread);
|
| g_io_thread->PostTask(
|
| FROM_HERE,
|
| NewRunnableMethod(this, &WebSocketStreamHandleBridgeImpl::DoClose));
|
| @@ -113,6 +116,7 @@ void WebSocketStreamHandleBridgeImpl::Close() {
|
|
|
| void WebSocketStreamHandleBridgeImpl::OnConnected(
|
| net::SocketStream* socket, int max_pending_send_allowed) {
|
| + ++num_pending_tasks_;
|
| message_loop_->PostTask(
|
| FROM_HERE,
|
| NewRunnableMethod(this, &WebSocketStreamHandleBridgeImpl::DoOnConnected,
|
| @@ -121,6 +125,7 @@ void WebSocketStreamHandleBridgeImpl::OnConnected(
|
|
|
| void WebSocketStreamHandleBridgeImpl::OnSentData(
|
| net::SocketStream* socket, int amount_sent) {
|
| + ++num_pending_tasks_;
|
| message_loop_->PostTask(
|
| FROM_HERE,
|
| NewRunnableMethod(this, &WebSocketStreamHandleBridgeImpl::DoOnSentData,
|
| @@ -129,6 +134,7 @@ void WebSocketStreamHandleBridgeImpl::OnSentData(
|
|
|
| void WebSocketStreamHandleBridgeImpl::OnReceivedData(
|
| net::SocketStream* socket, const char* data, int len) {
|
| + ++num_pending_tasks_;
|
| message_loop_->PostTask(
|
| FROM_HERE,
|
| NewRunnableMethod(this,
|
| @@ -137,25 +143,24 @@ void WebSocketStreamHandleBridgeImpl::OnReceivedData(
|
| }
|
|
|
| void WebSocketStreamHandleBridgeImpl::OnClose(net::SocketStream* socket) {
|
| - webkit_glue::WebSocketStreamHandleDelegate* delegate = delegate_;
|
| - delegate_ = NULL;
|
| - socket_ = 0;
|
| + ++num_pending_tasks_;
|
| + // Release socket_ on IO thread.
|
| + socket_ = NULL;
|
| socket_id_ = kNoSocketId;
|
| message_loop_->PostTask(
|
| FROM_HERE,
|
| - NewRunnableMethod(this, &WebSocketStreamHandleBridgeImpl::DoOnClose,
|
| - delegate));
|
| + NewRunnableMethod(this, &WebSocketStreamHandleBridgeImpl::DoOnClose));
|
| }
|
|
|
| void WebSocketStreamHandleBridgeImpl::DoConnect(const GURL& url) {
|
| - CHECK(MessageLoop::current() == g_io_thread);
|
| + DCHECK(MessageLoop::current() == g_io_thread);
|
| socket_ = new net::SocketStream(url, this);
|
| socket_->set_context(g_request_context);
|
| socket_->Connect();
|
| }
|
|
|
| void WebSocketStreamHandleBridgeImpl::DoSend(std::vector<char>* data) {
|
| - CHECK(MessageLoop::current() == g_io_thread);
|
| + DCHECK(MessageLoop::current() == g_io_thread);
|
| scoped_ptr<std::vector<char> > scoped_data(data);
|
| if (!socket_)
|
| return;
|
| @@ -164,7 +169,7 @@ void WebSocketStreamHandleBridgeImpl::DoSend(std::vector<char>* data) {
|
| }
|
|
|
| void WebSocketStreamHandleBridgeImpl::DoClose() {
|
| - CHECK(MessageLoop::current() == g_io_thread);
|
| + DCHECK(MessageLoop::current() == g_io_thread);
|
| if (!socket_)
|
| return;
|
| socket_->Close();
|
| @@ -172,29 +177,37 @@ void WebSocketStreamHandleBridgeImpl::DoClose() {
|
|
|
| void WebSocketStreamHandleBridgeImpl::DoOnConnected(
|
| int max_pending_send_allowed) {
|
| - CHECK(MessageLoop::current() == message_loop_);
|
| + DCHECK(MessageLoop::current() == message_loop_);
|
| + --num_pending_tasks_;
|
| if (delegate_)
|
| delegate_->DidOpenStream(handle_, max_pending_send_allowed);
|
| }
|
|
|
| void WebSocketStreamHandleBridgeImpl::DoOnSentData(int amount_sent) {
|
| - CHECK(MessageLoop::current() == message_loop_);
|
| + DCHECK(MessageLoop::current() == message_loop_);
|
| + --num_pending_tasks_;
|
| if (delegate_)
|
| delegate_->DidSendData(handle_, amount_sent);
|
| }
|
|
|
| void WebSocketStreamHandleBridgeImpl::DoOnReceivedData(
|
| std::vector<char>* data) {
|
| - CHECK(MessageLoop::current() == message_loop_);
|
| + DCHECK(MessageLoop::current() == message_loop_);
|
| + --num_pending_tasks_;
|
| scoped_ptr<std::vector<char> > scoped_data(data);
|
| if (delegate_)
|
| delegate_->DidReceiveData(handle_, &(data->at(0)), data->size());
|
| }
|
|
|
| -void WebSocketStreamHandleBridgeImpl::DoOnClose(
|
| - webkit_glue::WebSocketStreamHandleDelegate* delegate) {
|
| - CHECK(MessageLoop::current() == message_loop_);
|
| - CHECK(!socket_);
|
| +void WebSocketStreamHandleBridgeImpl::DoOnClose() {
|
| + DCHECK(MessageLoop::current() == message_loop_);
|
| + --num_pending_tasks_;
|
| + // Don't handle OnClose if there are pending tasks.
|
| + DCHECK_EQ(num_pending_tasks_, 0);
|
| + DCHECK(!socket_);
|
| + DCHECK_EQ(socket_id_, kNoSocketId);
|
| + webkit_glue::WebSocketStreamHandleDelegate* delegate = delegate_;
|
| + delegate_ = NULL;
|
| if (delegate)
|
| delegate->DidClose(handle_);
|
| Release();
|
|
|