Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(409)

Side by Side Diff: chrome/browser/devtools/device/android_web_socket.cc

Issue 1071843003: Fix bug in AndroidDeviceManager::DeviceProvider::HttpUpgrade() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/devtools/device/android_device_manager.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/memory/weak_ptr.h" 5 #include "base/memory/weak_ptr.h"
6 #include "base/message_loop/message_loop.h" 6 #include "base/message_loop/message_loop.h"
7 #include "base/rand_util.h" 7 #include "base/rand_util.h"
8 #include "chrome/browser/devtools/device/android_device_manager.h" 8 #include "chrome/browser/devtools/device/android_device_manager.h"
9 #include "content/public/browser/browser_thread.h" 9 #include "content/public/browser/browser_thread.h"
10 #include "net/base/io_buffer.h" 10 #include "net/base/io_buffer.h"
11 #include "net/base/net_errors.h" 11 #include "net/base/net_errors.h"
12 #include "net/server/web_socket_encoder.h" 12 #include "net/server/web_socket_encoder.h"
13 #include "net/socket/stream_socket.h" 13 #include "net/socket/stream_socket.h"
14 14
15 using content::BrowserThread; 15 using content::BrowserThread;
16 using net::WebSocket; 16 using net::WebSocket;
17 17
18 namespace { 18 namespace {
19 19
20 const int kBufferSize = 16 * 1024; 20 const int kBufferSize = 16 * 1024;
21 21
22 } // namespace 22 } // namespace
23 23
24 class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl { 24 class AndroidDeviceManager::AndroidWebSocket::WebSocketImpl {
25 public: 25 public:
26 WebSocketImpl(scoped_refptr<base::MessageLoopProxy> response_message_loop, 26 WebSocketImpl(scoped_refptr<base::MessageLoopProxy> response_message_loop,
27 base::WeakPtr<AndroidWebSocket> weak_socket, 27 base::WeakPtr<AndroidWebSocket> weak_socket,
28 const std::string& extensions, 28 const std::string& extensions,
29 scoped_ptr<net::StreamSocket> socket) 29 const std::string& leading_bytes,
30 : response_message_loop_(response_message_loop), 30 scoped_ptr<net::StreamSocket> socket)
31 weak_socket_(weak_socket), 31 : response_message_loop_(response_message_loop),
32 socket_(socket.Pass()), 32 weak_socket_(weak_socket),
33 encoder_(net::WebSocketEncoder::CreateClient(extensions)) { 33 socket_(socket.Pass()),
34 encoder_(net::WebSocketEncoder::CreateClient(extensions)),
35 leading_bytes_(leading_bytes) {
34 thread_checker_.DetachFromThread(); 36 thread_checker_.DetachFromThread();
35 } 37 }
36 38
37 void StartListening() { 39 void StartListening() {
38 DCHECK(thread_checker_.CalledOnValidThread()); 40 DCHECK(thread_checker_.CalledOnValidThread());
39 DCHECK(socket_); 41 DCHECK(socket_);
40 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize)); 42 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize));
41 Read(buffer); 43 if (leading_bytes_.length()) {
44 leading_bytes_.swap(response_buffer_);
45 ConsumeResponse(buffer);
46 } else {
47 Read(buffer);
48 }
42 } 49 }
43 50
44 void SendFrame(const std::string& message) { 51 void SendFrame(const std::string& message) {
45 DCHECK(thread_checker_.CalledOnValidThread()); 52 DCHECK(thread_checker_.CalledOnValidThread());
46 if (!socket_) 53 if (!socket_)
47 return; 54 return;
48 int mask = base::RandInt(0, 0x7FFFFFFF); 55 int mask = base::RandInt(0, 0x7FFFFFFF);
49 std::string encoded_frame; 56 std::string encoded_frame;
50 encoder_->EncodeFrame(message, mask, &encoded_frame); 57 encoder_->EncodeFrame(message, mask, &encoded_frame);
51 request_buffer_ += encoded_frame; 58 request_buffer_ += encoded_frame;
(...skipping 12 matching lines...) Expand all
64 OnBytesRead(response_buffer, result); 71 OnBytesRead(response_buffer, result);
65 } 72 }
66 73
67 void OnBytesRead(scoped_refptr<net::IOBuffer> response_buffer, int result) { 74 void OnBytesRead(scoped_refptr<net::IOBuffer> response_buffer, int result) {
68 DCHECK(thread_checker_.CalledOnValidThread()); 75 DCHECK(thread_checker_.CalledOnValidThread());
69 if (result <= 0) { 76 if (result <= 0) {
70 Disconnect(); 77 Disconnect();
71 return; 78 return;
72 } 79 }
73 response_buffer_.append(response_buffer->data(), result); 80 response_buffer_.append(response_buffer->data(), result);
81 ConsumeResponse(response_buffer);
82 }
74 83
84 void ConsumeResponse(scoped_refptr<net::IOBuffer> response_buffer) {
75 int bytes_consumed; 85 int bytes_consumed;
76 std::string output; 86 std::string output;
77 WebSocket::ParseResult parse_result = encoder_->DecodeFrame( 87 WebSocket::ParseResult parse_result = encoder_->DecodeFrame(
78 response_buffer_, &bytes_consumed, &output); 88 response_buffer_, &bytes_consumed, &output);
79 89
80 while (parse_result == WebSocket::FRAME_OK) { 90 while (parse_result == WebSocket::FRAME_OK) {
81 response_buffer_ = response_buffer_.substr(bytes_consumed); 91 response_buffer_ = response_buffer_.substr(bytes_consumed);
82 response_message_loop_->PostTask( 92 response_message_loop_->PostTask(
83 FROM_HERE, 93 FROM_HERE,
84 base::Bind(&AndroidWebSocket::OnFrameRead, weak_socket_, output)); 94 base::Bind(&AndroidWebSocket::OnFrameRead, weak_socket_, output));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 FROM_HERE, 130 FROM_HERE,
121 base::Bind(&AndroidWebSocket::OnSocketClosed, weak_socket_)); 131 base::Bind(&AndroidWebSocket::OnSocketClosed, weak_socket_));
122 } 132 }
123 133
124 scoped_refptr<base::MessageLoopProxy> response_message_loop_; 134 scoped_refptr<base::MessageLoopProxy> response_message_loop_;
125 base::WeakPtr<AndroidWebSocket> weak_socket_; 135 base::WeakPtr<AndroidWebSocket> weak_socket_;
126 scoped_ptr<net::StreamSocket> socket_; 136 scoped_ptr<net::StreamSocket> socket_;
127 scoped_ptr<net::WebSocketEncoder> encoder_; 137 scoped_ptr<net::WebSocketEncoder> encoder_;
128 std::string response_buffer_; 138 std::string response_buffer_;
129 std::string request_buffer_; 139 std::string request_buffer_;
140 std::string leading_bytes_;
130 base::ThreadChecker thread_checker_; 141 base::ThreadChecker thread_checker_;
131 DISALLOW_COPY_AND_ASSIGN(WebSocketImpl); 142 DISALLOW_COPY_AND_ASSIGN(WebSocketImpl);
132 }; 143 };
133 144
134 AndroidDeviceManager::AndroidWebSocket::AndroidWebSocket( 145 AndroidDeviceManager::AndroidWebSocket::AndroidWebSocket(
135 scoped_refptr<Device> device, 146 scoped_refptr<Device> device,
136 const std::string& socket_name, 147 const std::string& socket_name,
137 const std::string& url, 148 const std::string& url,
138 Delegate* delegate) 149 Delegate* delegate)
139 : device_(device.get()), 150 : device_(device.get()),
(...skipping 21 matching lines...) Expand all
161 DCHECK(device_); 172 DCHECK(device_);
162 device_->message_loop_proxy_->PostTask( 173 device_->message_loop_proxy_->PostTask(
163 FROM_HERE, 174 FROM_HERE,
164 base::Bind(&WebSocketImpl::SendFrame, 175 base::Bind(&WebSocketImpl::SendFrame,
165 base::Unretained(socket_impl_), message)); 176 base::Unretained(socket_impl_), message));
166 } 177 }
167 178
168 void AndroidDeviceManager::AndroidWebSocket::Connected( 179 void AndroidDeviceManager::AndroidWebSocket::Connected(
169 int result, 180 int result,
170 const std::string& extensions, 181 const std::string& extensions,
182 const std::string& leading_bytes,
171 scoped_ptr<net::StreamSocket> socket) { 183 scoped_ptr<net::StreamSocket> socket) {
172 DCHECK_CURRENTLY_ON(BrowserThread::UI); 184 DCHECK_CURRENTLY_ON(BrowserThread::UI);
173 if (result != net::OK || !socket.get()) { 185 if (result != net::OK || !socket.get()) {
174 OnSocketClosed(); 186 OnSocketClosed();
175 return; 187 return;
176 } 188 }
177 socket_impl_ = new WebSocketImpl(base::MessageLoopProxy::current(), 189 socket_impl_ = new WebSocketImpl(base::MessageLoopProxy::current(),
178 weak_factory_.GetWeakPtr(), 190 weak_factory_.GetWeakPtr(), extensions,
179 extensions, 191 leading_bytes, socket.Pass());
180 socket.Pass());
181 device_->message_loop_proxy_->PostTask( 192 device_->message_loop_proxy_->PostTask(
182 FROM_HERE, 193 FROM_HERE,
183 base::Bind(&WebSocketImpl::StartListening, 194 base::Bind(&WebSocketImpl::StartListening,
184 base::Unretained(socket_impl_))); 195 base::Unretained(socket_impl_)));
185 delegate_->OnSocketOpened(); 196 delegate_->OnSocketOpened();
186 } 197 }
187 198
188 void AndroidDeviceManager::AndroidWebSocket::OnFrameRead( 199 void AndroidDeviceManager::AndroidWebSocket::OnFrameRead(
189 const std::string& message) { 200 const std::string& message) {
190 DCHECK_CURRENTLY_ON(BrowserThread::UI); 201 DCHECK_CURRENTLY_ON(BrowserThread::UI);
(...skipping 19 matching lines...) Expand all
210 } 221 }
211 } 222 }
212 223
213 AndroidDeviceManager::AndroidWebSocket* 224 AndroidDeviceManager::AndroidWebSocket*
214 AndroidDeviceManager::Device::CreateWebSocket( 225 AndroidDeviceManager::Device::CreateWebSocket(
215 const std::string& socket_name, 226 const std::string& socket_name,
216 const std::string& url, 227 const std::string& url,
217 AndroidWebSocket::Delegate* delegate) { 228 AndroidWebSocket::Delegate* delegate) {
218 return new AndroidWebSocket(this, socket_name, url, delegate); 229 return new AndroidWebSocket(this, socket_name, url, delegate);
219 } 230 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/device/android_device_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698