OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "base/location.h" |
5 #include "base/memory/weak_ptr.h" | 6 #include "base/memory/weak_ptr.h" |
6 #include "base/message_loop/message_loop.h" | |
7 #include "base/rand_util.h" | 7 #include "base/rand_util.h" |
| 8 #include "base/single_thread_task_runner.h" |
| 9 #include "base/thread_task_runner_handle.h" |
8 #include "chrome/browser/devtools/device/android_device_manager.h" | 10 #include "chrome/browser/devtools/device/android_device_manager.h" |
9 #include "content/public/browser/browser_thread.h" | 11 #include "content/public/browser/browser_thread.h" |
10 #include "net/base/io_buffer.h" | 12 #include "net/base/io_buffer.h" |
11 #include "net/base/net_errors.h" | 13 #include "net/base/net_errors.h" |
12 #include "net/server/web_socket_encoder.h" | 14 #include "net/server/web_socket_encoder.h" |
13 #include "net/socket/stream_socket.h" | 15 #include "net/socket/stream_socket.h" |
14 | 16 |
15 using content::BrowserThread; | 17 using content::BrowserThread; |
16 using net::WebSocket; | 18 using net::WebSocket; |
17 | 19 |
18 namespace { | 20 namespace { |
19 | 21 |
20 const int kBufferSize = 16 * 1024; | 22 const int kBufferSize = 16 * 1024; |
21 | 23 |
22 } // namespace | 24 } // namespace |
23 | 25 |
24 class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { | 26 class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { |
25 public: | 27 public: |
26 WebSocketImpl(scoped_refptr<base::MessageLoopProxy> response_message_loop, | 28 WebSocketImpl( |
27 base::WeakPtr<AndroidWebSocket> weak_socket, | 29 scoped_refptr<base::SingleThreadTaskRunner> response_task_runner, |
28 const std::string& extensions, | 30 base::WeakPtr<AndroidWebSocket> weak_socket, |
29 const std::string& body_head, | 31 const std::string& extensions, |
30 scoped_ptr<net::StreamSocket> socket) | 32 const std::string& body_head, |
31 : response_message_loop_(response_message_loop), | 33 scoped_ptr<net::StreamSocket> socket) |
32 weak_socket_(weak_socket), | 34 : response_task_runner_(response_task_runner), |
33 socket_(socket.Pass()), | 35 weak_socket_(weak_socket), |
34 encoder_(net::WebSocketEncoder::CreateClient(extensions)), | 36 socket_(socket.Pass()), |
35 response_buffer_(body_head) { | 37 encoder_(net::WebSocketEncoder::CreateClient(extensions)), |
| 38 response_buffer_(body_head) { |
36 thread_checker_.DetachFromThread(); | 39 thread_checker_.DetachFromThread(); |
37 } | 40 } |
38 | 41 |
39 void StartListening() { | 42 void StartListening() { |
40 DCHECK(thread_checker_.CalledOnValidThread()); | 43 DCHECK(thread_checker_.CalledOnValidThread()); |
41 DCHECK(socket_); | 44 DCHECK(socket_); |
42 | 45 |
43 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); | 46 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); |
44 | 47 |
45 if (response_buffer_.size() > 0) | 48 if (response_buffer_.size() > 0) |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 } | 86 } |
84 | 87 |
85 void ProcessResponseBuffer(scoped_refptr<net::IOBuffer> io_buffer) { | 88 void ProcessResponseBuffer(scoped_refptr<net::IOBuffer> io_buffer) { |
86 int bytes_consumed; | 89 int bytes_consumed; |
87 std::string output; | 90 std::string output; |
88 WebSocket::ParseResult parse_result = encoder_->DecodeFrame( | 91 WebSocket::ParseResult parse_result = encoder_->DecodeFrame( |
89 response_buffer_, &bytes_consumed, &output); | 92 response_buffer_, &bytes_consumed, &output); |
90 | 93 |
91 while (parse_result == WebSocket::FRAME_OK) { | 94 while (parse_result == WebSocket::FRAME_OK) { |
92 response_buffer_ = response_buffer_.substr(bytes_consumed); | 95 response_buffer_ = response_buffer_.substr(bytes_consumed); |
93 response_message_loop_->PostTask( | 96 response_task_runner_->PostTask( |
94 FROM_HERE, | 97 FROM_HERE, |
95 base::Bind(&AndroidWebSocket::OnFrameRead, weak_socket_, output)); | 98 base::Bind(&AndroidWebSocket::OnFrameRead, weak_socket_, output)); |
96 parse_result = encoder_->DecodeFrame( | 99 parse_result = encoder_->DecodeFrame( |
97 response_buffer_, &bytes_consumed, &output); | 100 response_buffer_, &bytes_consumed, &output); |
98 } | 101 } |
99 | 102 |
100 if (parse_result == WebSocket::FRAME_ERROR || | 103 if (parse_result == WebSocket::FRAME_ERROR || |
101 parse_result == WebSocket::FRAME_CLOSE) { | 104 parse_result == WebSocket::FRAME_CLOSE) { |
102 Disconnect(); | 105 Disconnect(); |
103 return; | 106 return; |
(...skipping 16 matching lines...) Expand all Loading... |
120 result = socket_->Write(buffer.get(), buffer->size(), | 123 result = socket_->Write(buffer.get(), buffer->size(), |
121 base::Bind(&WebSocketImpl::SendPendingRequests, | 124 base::Bind(&WebSocketImpl::SendPendingRequests, |
122 base::Unretained(this))); | 125 base::Unretained(this))); |
123 if (result != net::ERR_IO_PENDING) | 126 if (result != net::ERR_IO_PENDING) |
124 SendPendingRequests(result); | 127 SendPendingRequests(result); |
125 } | 128 } |
126 | 129 |
127 void Disconnect() { | 130 void Disconnect() { |
128 DCHECK(thread_checker_.CalledOnValidThread()); | 131 DCHECK(thread_checker_.CalledOnValidThread()); |
129 socket_.reset(); | 132 socket_.reset(); |
130 response_message_loop_->PostTask( | 133 response_task_runner_->PostTask( |
131 FROM_HERE, | 134 FROM_HERE, base::Bind(&AndroidWebSocket::OnSocketClosed, weak_socket_)); |
132 base::Bind(&AndroidWebSocket::OnSocketClosed, weak_socket_)); | |
133 } | 135 } |
134 | 136 |
135 scoped_refptr<base::MessageLoopProxy> response_message_loop_; | 137 scoped_refptr<base::SingleThreadTaskRunner> response_task_runner_; |
136 base::WeakPtr<AndroidWebSocket> weak_socket_; | 138 base::WeakPtr<AndroidWebSocket> weak_socket_; |
137 scoped_ptr<net::StreamSocket> socket_; | 139 scoped_ptr<net::StreamSocket> socket_; |
138 scoped_ptr<net::WebSocketEncoder> encoder_; | 140 scoped_ptr<net::WebSocketEncoder> encoder_; |
139 std::string response_buffer_; | 141 std::string response_buffer_; |
140 std::string request_buffer_; | 142 std::string request_buffer_; |
141 base::ThreadChecker thread_checker_; | 143 base::ThreadChecker thread_checker_; |
142 DISALLOW_COPY_AND_ASSIGN(WebSocketImpl); | 144 DISALLOW_COPY_AND_ASSIGN(WebSocketImpl); |
143 }; | 145 }; |
144 | 146 |
145 AndroidDeviceManager::AndroidWebSocket::AndroidWebSocket( | 147 AndroidDeviceManager::AndroidWebSocket::AndroidWebSocket( |
(...skipping 17 matching lines...) Expand all Loading... |
163 AndroidDeviceManager::AndroidWebSocket::~AndroidWebSocket() { | 165 AndroidDeviceManager::AndroidWebSocket::~AndroidWebSocket() { |
164 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 166 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
165 Terminate(); | 167 Terminate(); |
166 } | 168 } |
167 | 169 |
168 void AndroidDeviceManager::AndroidWebSocket::SendFrame( | 170 void AndroidDeviceManager::AndroidWebSocket::SendFrame( |
169 const std::string& message) { | 171 const std::string& message) { |
170 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 172 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
171 DCHECK(socket_impl_); | 173 DCHECK(socket_impl_); |
172 DCHECK(device_); | 174 DCHECK(device_); |
173 device_->message_loop_proxy_->PostTask( | 175 device_->task_runner_->PostTask( |
174 FROM_HERE, | 176 FROM_HERE, base::Bind(&WebSocketImpl::SendFrame, |
175 base::Bind(&WebSocketImpl::SendFrame, | 177 base::Unretained(socket_impl_), message)); |
176 base::Unretained(socket_impl_), message)); | |
177 } | 178 } |
178 | 179 |
179 void AndroidDeviceManager::AndroidWebSocket::Connected( | 180 void AndroidDeviceManager::AndroidWebSocket::Connected( |
180 int result, | 181 int result, |
181 const std::string& extensions, | 182 const std::string& extensions, |
182 const std::string& body_head, | 183 const std::string& body_head, |
183 scoped_ptr<net::StreamSocket> socket) { | 184 scoped_ptr<net::StreamSocket> socket) { |
184 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 185 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
185 if (result != net::OK || !socket.get()) { | 186 if (result != net::OK || !socket.get()) { |
186 OnSocketClosed(); | 187 OnSocketClosed(); |
187 return; | 188 return; |
188 } | 189 } |
189 socket_impl_ = new WebSocketImpl(base::MessageLoopProxy::current(), | 190 socket_impl_ = new WebSocketImpl(base::ThreadTaskRunnerHandle::Get(), |
190 weak_factory_.GetWeakPtr(), | 191 weak_factory_.GetWeakPtr(), extensions, |
191 extensions, | 192 body_head, socket.Pass()); |
192 body_head, | 193 device_->task_runner_->PostTask(FROM_HERE, |
193 socket.Pass()); | 194 base::Bind(&WebSocketImpl::StartListening, |
194 device_->message_loop_proxy_->PostTask( | 195 base::Unretained(socket_impl_))); |
195 FROM_HERE, | |
196 base::Bind(&WebSocketImpl::StartListening, | |
197 base::Unretained(socket_impl_))); | |
198 delegate_->OnSocketOpened(); | 196 delegate_->OnSocketOpened(); |
199 } | 197 } |
200 | 198 |
201 void AndroidDeviceManager::AndroidWebSocket::OnFrameRead( | 199 void AndroidDeviceManager::AndroidWebSocket::OnFrameRead( |
202 const std::string& message) { | 200 const std::string& message) { |
203 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 201 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
204 delegate_->OnFrameRead(message); | 202 delegate_->OnFrameRead(message); |
205 } | 203 } |
206 | 204 |
207 void AndroidDeviceManager::AndroidWebSocket::OnSocketClosed() { | 205 void AndroidDeviceManager::AndroidWebSocket::OnSocketClosed() { |
208 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 206 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
209 Terminate(); | 207 Terminate(); |
210 delegate_->OnSocketClosed(); | 208 delegate_->OnSocketClosed(); |
211 } | 209 } |
212 | 210 |
213 void AndroidDeviceManager::AndroidWebSocket::Terminate() { | 211 void AndroidDeviceManager::AndroidWebSocket::Terminate() { |
214 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 212 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
215 if (socket_impl_) { | 213 if (socket_impl_) { |
216 DCHECK(device_); | 214 DCHECK(device_); |
217 device_->message_loop_proxy_->DeleteSoon(FROM_HERE, socket_impl_); | 215 device_->task_runner_->DeleteSoon(FROM_HERE, socket_impl_); |
218 socket_impl_ = nullptr; | 216 socket_impl_ = nullptr; |
219 } | 217 } |
220 if (device_) { | 218 if (device_) { |
221 device_->sockets_.erase(this); | 219 device_->sockets_.erase(this); |
222 device_ = nullptr; | 220 device_ = nullptr; |
223 } | 221 } |
224 } | 222 } |
225 | 223 |
226 AndroidDeviceManager::AndroidWebSocket* | 224 AndroidDeviceManager::AndroidWebSocket* |
227 AndroidDeviceManager::Device::CreateWebSocket( | 225 AndroidDeviceManager::Device::CreateWebSocket( |
228 const std::string& socket_name, | 226 const std::string& socket_name, |
229 const std::string& url, | 227 const std::string& url, |
230 AndroidWebSocket::Delegate* delegate) { | 228 AndroidWebSocket::Delegate* delegate) { |
231 return new AndroidWebSocket(this, socket_name, url, delegate); | 229 return new AndroidWebSocket(this, socket_name, url, delegate); |
232 } | 230 } |
OLD | NEW |