OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "webkit/tools/test_shell/simple_socket_stream_bridge.h" | 7 #include "webkit/tools/test_shell/simple_socket_stream_bridge.h" |
8 | 8 |
9 #include "base/atomicops.h" | 9 #include "base/atomicops.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
12 #include "base/message_loop.h" | 12 #include "base/message_loop.h" |
13 #include "base/utf_string_conversions.h" | |
14 #include "googleurl/src/gurl.h" | 13 #include "googleurl/src/gurl.h" |
15 #include "net/socket_stream/socket_stream_job.h" | 14 #include "net/socket_stream/socket_stream_job.h" |
16 #include "net/websockets/websocket_job.h" | 15 #include "net/websockets/websocket_job.h" |
17 #include "net/url_request/url_request_context.h" | 16 #include "net/url_request/url_request_context.h" |
18 #include "third_party/WebKit/Source/Platform/chromium/public/WebSocketStreamHand
le.h" | 17 #include "third_party/WebKit/Source/Platform/chromium/public/WebSocketStreamHand
le.h" |
19 #include "webkit/glue/websocketstreamhandle_bridge.h" | 18 #include "webkit/glue/websocketstreamhandle_bridge.h" |
20 #include "webkit/glue/websocketstreamhandle_delegate.h" | 19 #include "webkit/glue/websocketstreamhandle_delegate.h" |
21 | 20 |
22 using webkit_glue::WebSocketStreamHandleBridge; | 21 using webkit_glue::WebSocketStreamHandleBridge; |
23 | 22 |
(...skipping 18 matching lines...) Expand all Loading... |
42 virtual void Close() OVERRIDE; | 41 virtual void Close() OVERRIDE; |
43 | 42 |
44 // net::SocketStream::Delegate methods. | 43 // net::SocketStream::Delegate methods. |
45 virtual void OnConnected(net::SocketStream* req, | 44 virtual void OnConnected(net::SocketStream* req, |
46 int max_pending_send_allowed) OVERRIDE; | 45 int max_pending_send_allowed) OVERRIDE; |
47 virtual void OnSentData(net::SocketStream* req, | 46 virtual void OnSentData(net::SocketStream* req, |
48 int amount_sent) OVERRIDE; | 47 int amount_sent) OVERRIDE; |
49 virtual void OnReceivedData(net::SocketStream* req, | 48 virtual void OnReceivedData(net::SocketStream* req, |
50 const char* data, int len) OVERRIDE; | 49 const char* data, int len) OVERRIDE; |
51 virtual void OnClose(net::SocketStream* req) OVERRIDE; | 50 virtual void OnClose(net::SocketStream* req) OVERRIDE; |
52 virtual void OnError(const net::SocketStream* req, int error_code) OVERRIDE; | |
53 | 51 |
54 private: | 52 private: |
55 virtual ~WebSocketStreamHandleBridgeImpl(); | 53 virtual ~WebSocketStreamHandleBridgeImpl(); |
56 | 54 |
57 // Runs on |g_io_thread|; | 55 // Runs on |g_io_thread|; |
58 void DoConnect(const GURL& url); | 56 void DoConnect(const GURL& url); |
59 void DoSend(std::vector<char>* data); | 57 void DoSend(std::vector<char>* data); |
60 void DoClose(); | 58 void DoClose(); |
61 | 59 |
62 // Runs on |message_loop_|; | 60 // Runs on |message_loop_|; |
63 void DoOnConnected(int max_amount_send_allowed); | 61 void DoOnConnected(int max_amount_send_allowed); |
64 void DoOnSentData(int amount_sent); | 62 void DoOnSentData(int amount_sent); |
65 void DoOnReceivedData(std::vector<char>* data); | 63 void DoOnReceivedData(std::vector<char>* data); |
66 void DoOnClose(); | 64 void DoOnClose(); |
67 void DoOnError(int error_code, const char* error_msg); | |
68 | 65 |
69 int socket_id_; | 66 int socket_id_; |
70 MessageLoop* message_loop_; | 67 MessageLoop* message_loop_; |
71 WebKit::WebSocketStreamHandle* handle_; | 68 WebKit::WebSocketStreamHandle* handle_; |
72 webkit_glue::WebSocketStreamHandleDelegate* delegate_; | 69 webkit_glue::WebSocketStreamHandleDelegate* delegate_; |
73 | 70 |
74 scoped_refptr<net::SocketStreamJob> socket_; | 71 scoped_refptr<net::SocketStreamJob> socket_; |
75 // Number of pending tasks to handle net::SocketStream::Delegate methods. | 72 // Number of pending tasks to handle net::SocketStream::Delegate methods. |
76 base::subtle::Atomic32 num_pending_tasks_; | 73 base::subtle::Atomic32 num_pending_tasks_; |
77 | 74 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 void WebSocketStreamHandleBridgeImpl::OnClose(net::SocketStream* socket) { | 147 void WebSocketStreamHandleBridgeImpl::OnClose(net::SocketStream* socket) { |
151 base::subtle::NoBarrier_AtomicIncrement(&num_pending_tasks_, 1); | 148 base::subtle::NoBarrier_AtomicIncrement(&num_pending_tasks_, 1); |
152 // Release socket_ on IO thread. | 149 // Release socket_ on IO thread. |
153 socket_ = NULL; | 150 socket_ = NULL; |
154 socket_id_ = kNoSocketId; | 151 socket_id_ = kNoSocketId; |
155 message_loop_->PostTask( | 152 message_loop_->PostTask( |
156 FROM_HERE, | 153 FROM_HERE, |
157 base::Bind(&WebSocketStreamHandleBridgeImpl::DoOnClose, this)); | 154 base::Bind(&WebSocketStreamHandleBridgeImpl::DoOnClose, this)); |
158 } | 155 } |
159 | 156 |
160 void WebSocketStreamHandleBridgeImpl::OnError( | |
161 const net::SocketStream* socket, int error_code) { | |
162 base::subtle::NoBarrier_AtomicIncrement(&num_pending_tasks_, 1); | |
163 message_loop_->PostTask( | |
164 FROM_HERE, | |
165 base::Bind(&WebSocketStreamHandleBridgeImpl::DoOnError, this, | |
166 error_code, net::ErrorToString(error_code))); | |
167 } | |
168 | |
169 void WebSocketStreamHandleBridgeImpl::DoConnect(const GURL& url) { | 157 void WebSocketStreamHandleBridgeImpl::DoConnect(const GURL& url) { |
170 DCHECK(MessageLoop::current() == g_io_thread); | 158 DCHECK(MessageLoop::current() == g_io_thread); |
171 socket_ = net::SocketStreamJob::CreateSocketStreamJob( | 159 socket_ = net::SocketStreamJob::CreateSocketStreamJob( |
172 url, this, g_request_context->transport_security_state(), | 160 url, this, g_request_context->transport_security_state(), |
173 g_request_context->ssl_config_service()); | 161 g_request_context->ssl_config_service()); |
174 socket_->set_context(g_request_context); | 162 socket_->set_context(g_request_context); |
175 socket_->Connect(); | 163 socket_->Connect(); |
176 } | 164 } |
177 | 165 |
178 void WebSocketStreamHandleBridgeImpl::DoSend(std::vector<char>* data) { | 166 void WebSocketStreamHandleBridgeImpl::DoSend(std::vector<char>* data) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 DCHECK_EQ(num_pending_tasks_, 0); | 210 DCHECK_EQ(num_pending_tasks_, 0); |
223 DCHECK(!socket_); | 211 DCHECK(!socket_); |
224 DCHECK_EQ(socket_id_, kNoSocketId); | 212 DCHECK_EQ(socket_id_, kNoSocketId); |
225 webkit_glue::WebSocketStreamHandleDelegate* delegate = delegate_; | 213 webkit_glue::WebSocketStreamHandleDelegate* delegate = delegate_; |
226 delegate_ = NULL; | 214 delegate_ = NULL; |
227 if (delegate) | 215 if (delegate) |
228 delegate->DidClose(handle_); | 216 delegate->DidClose(handle_); |
229 Release(); | 217 Release(); |
230 } | 218 } |
231 | 219 |
232 void WebSocketStreamHandleBridgeImpl::DoOnError( | |
233 int error_code, const char* error_msg) { | |
234 DCHECK(MessageLoop::current() == message_loop_); | |
235 base::subtle::NoBarrier_AtomicIncrement(&num_pending_tasks_, -1); | |
236 if (delegate_) | |
237 delegate_->DidFail(handle_, error_code, ASCIIToUTF16(error_msg)); | |
238 } | |
239 | |
240 } // namespace | 220 } // namespace |
241 | 221 |
242 /* static */ | 222 /* static */ |
243 void SimpleSocketStreamBridge::InitializeOnIOThread( | 223 void SimpleSocketStreamBridge::InitializeOnIOThread( |
244 net::URLRequestContext* request_context) { | 224 net::URLRequestContext* request_context) { |
245 g_io_thread = MessageLoop::current(); | 225 g_io_thread = MessageLoop::current(); |
246 g_request_context = request_context; | 226 g_request_context = request_context; |
247 } | 227 } |
248 | 228 |
249 void SimpleSocketStreamBridge::Cleanup() { | 229 void SimpleSocketStreamBridge::Cleanup() { |
250 g_io_thread = NULL; | 230 g_io_thread = NULL; |
251 g_request_context = NULL; | 231 g_request_context = NULL; |
252 } | 232 } |
253 | 233 |
254 /* static */ | 234 /* static */ |
255 webkit_glue::WebSocketStreamHandleBridge* SimpleSocketStreamBridge::Create( | 235 webkit_glue::WebSocketStreamHandleBridge* SimpleSocketStreamBridge::Create( |
256 WebKit::WebSocketStreamHandle* handle, | 236 WebKit::WebSocketStreamHandle* handle, |
257 webkit_glue::WebSocketStreamHandleDelegate* delegate) { | 237 webkit_glue::WebSocketStreamHandleDelegate* delegate) { |
258 return new WebSocketStreamHandleBridgeImpl(handle, delegate); | 238 return new WebSocketStreamHandleBridgeImpl(handle, delegate); |
259 } | 239 } |
OLD | NEW |