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

Side by Side Diff: chrome/browser/devtools/devtools_adb_bridge.cc

Issue 26568004: Introduced AndroidDeviceProvider to simplify testing. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed all the comments. Created 7 years, 2 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 "chrome/browser/devtools/devtools_adb_bridge.h" 5 #include "chrome/browser/devtools/devtools_adb_bridge.h"
6 6
7 #include <map> 7 #include <map>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/base64.h" 10 #include "base/base64.h"
(...skipping 22 matching lines...) Expand all
33 #include "content/public/browser/devtools_external_agent_proxy.h" 33 #include "content/public/browser/devtools_external_agent_proxy.h"
34 #include "content/public/browser/devtools_external_agent_proxy_delegate.h" 34 #include "content/public/browser/devtools_external_agent_proxy_delegate.h"
35 #include "content/public/browser/devtools_manager.h" 35 #include "content/public/browser/devtools_manager.h"
36 #include "crypto/rsa_private_key.h" 36 #include "crypto/rsa_private_key.h"
37 #include "net/base/net_errors.h" 37 #include "net/base/net_errors.h"
38 38
39 using content::BrowserThread; 39 using content::BrowserThread;
40 40
41 namespace { 41 namespace {
42 42
43 const char kDevToolsAdbBridgeThreadName[] = "Chrome_DevToolsADBThread";
44 const char kHostDevicesCommand[] = "host:devices"; 43 const char kHostDevicesCommand[] = "host:devices";
45 const char kHostTransportCommand[] = "host:transport:%s|%s"; 44 const char kHostTransportCommand[] = "host:transport:%s|%s";
46 const char kLocalAbstractCommand[] = "localabstract:%s"; 45 const char kLocalAbstractCommand[] = "localabstract:%s";
47 const char kDeviceModelCommand[] = "shell:getprop ro.product.model"; 46 const char kDeviceModelCommand[] = "shell:getprop ro.product.model";
48 const char kOpenedUnixSocketsCommand[] = "shell:cat /proc/net/unix"; 47 const char kOpenedUnixSocketsCommand[] = "shell:cat /proc/net/unix";
49 const char kListProcessesCommand[] = "shell:ps"; 48 const char kListProcessesCommand[] = "shell:ps";
50 const char kDumpsysCommand[] = "shell:dumpsys window policy"; 49 const char kDumpsysCommand[] = "shell:dumpsys window policy";
51 const char kDumpsysScreenSizePrefix[] = "mStable="; 50 const char kDumpsysScreenSizePrefix[] = "mStable=";
52 51
53 const char kPageListRequest[] = "GET /json HTTP/1.1\r\n\r\n"; 52 const char kPageListRequest[] = "GET /json HTTP/1.1\r\n\r\n";
54 const char kVersionRequest[] = "GET /json/version HTTP/1.1\r\n\r\n"; 53 const char kVersionRequest[] = "GET /json/version HTTP/1.1\r\n\r\n";
55 const char kClosePageRequest[] = "GET /json/close/%s HTTP/1.1\r\n\r\n"; 54 const char kClosePageRequest[] = "GET /json/close/%s HTTP/1.1\r\n\r\n";
56 const char kNewPageRequest[] = "GET /json/new HTTP/1.1\r\n\r\n"; 55 const char kNewPageRequest[] = "GET /json/new HTTP/1.1\r\n\r\n";
57 const char kActivatePageRequest[] = 56 const char kActivatePageRequest[] =
58 "GET /json/activate/%s HTTP/1.1\r\n\r\n"; 57 "GET /json/activate/%s HTTP/1.1\r\n\r\n";
59 const int kAdbPort = 5037; 58 const int kAdbPort = 5037;
60 const int kBufferSize = 16 * 1024; 59 const int kBufferSize = 16 * 1024;
61 const int kAdbPollingIntervalMs = 1000; 60 const int kAdbPollingIntervalMs = 1000;
62 61
63 const char kUrlParam[] = "url"; 62 const char kUrlParam[] = "url";
64 const char kPageReloadCommand[] = "Page.reload"; 63 const char kPageReloadCommand[] = "Page.reload";
65 const char kPageNavigateCommand[] = "Page.navigate"; 64 const char kPageNavigateCommand[] = "Page.navigate";
66 65
67 #if defined(DEBUG_DEVTOOLS) 66 #if defined(DEBUG_DEVTOOLS)
68 const char kChrome[] = "Chrome"; 67 const char kChrome[] = "Chrome";
69 const char kLocalChrome[] = "Local Chrome"; 68 const char kLocalChrome[] = "Local Chrome";
70 #endif // defined(DEBUG_DEVTOOLS) 69 #endif // defined(DEBUG_DEVTOOLS)
71 70
72 typedef DevToolsAdbBridge::Callback Callback; 71 typedef DevToolsAdbBridge::Callback Callback;
73 typedef std::vector<scoped_refptr<DevToolsAdbBridge::AndroidDevice> > 72 typedef std::vector<scoped_refptr<AndroidDevice> >
74 AndroidDevices; 73 AndroidDevices;
75 typedef base::Callback<void(const AndroidDevices&)> AndroidDevicesCallback; 74 typedef base::Callback<void(const AndroidDevices&)> AndroidDevicesCallback;
76 75
77 76
78 // AdbDeviceImpl --------------------------------------------------------------
79
80 class AdbDeviceImpl : public DevToolsAdbBridge::AndroidDevice {
81 public:
82 explicit AdbDeviceImpl(const std::string& serial);
83 virtual void RunCommand(const std::string& command,
84 const CommandCallback& callback) OVERRIDE;
85 virtual void OpenSocket(const std::string& name,
86 const SocketCallback& callback) OVERRIDE;
87 virtual bool IsConnected() OVERRIDE;
88
89 private:
90 virtual ~AdbDeviceImpl() {}
91 };
92
93 AdbDeviceImpl::AdbDeviceImpl(const std::string& serial)
94 : AndroidDevice(serial) {
95 }
96
97 void AdbDeviceImpl::RunCommand(const std::string& command,
98 const CommandCallback& callback) {
99 std::string query = base::StringPrintf(kHostTransportCommand,
100 serial().c_str(), command.c_str());
101 AdbClientSocket::AdbQuery(kAdbPort, query, callback);
102 }
103
104 void AdbDeviceImpl::OpenSocket(const std::string& name,
105 const SocketCallback& callback) {
106 std::string socket_name =
107 base::StringPrintf(kLocalAbstractCommand, name.c_str());
108 AdbClientSocket::TransportQuery(kAdbPort, serial(), socket_name, callback);
109 }
110
111 bool AdbDeviceImpl::IsConnected() {
112 return true;
113 }
114
115
116 // UsbDeviceImpl --------------------------------------------------------------
117
118 class UsbDeviceImpl : public DevToolsAdbBridge::AndroidDevice {
119 public:
120 explicit UsbDeviceImpl(AndroidUsbDevice* device);
121 virtual void RunCommand(const std::string& command,
122 const CommandCallback& callback) OVERRIDE;
123 virtual void OpenSocket(const std::string& name,
124 const SocketCallback& callback) OVERRIDE;
125 virtual bool IsConnected() OVERRIDE;
126
127 private:
128 void OnOpenSocket(const SocketCallback& callback,
129 net::StreamSocket* socket,
130 int result);
131 void OpenedForCommand(const CommandCallback& callback,
132 net::StreamSocket* socket,
133 int result);
134 void OnRead(net::StreamSocket* socket,
135 scoped_refptr<net::IOBuffer> buffer,
136 const std::string& data,
137 const CommandCallback& callback,
138 int result);
139
140 virtual ~UsbDeviceImpl() {}
141 scoped_refptr<AndroidUsbDevice> device_;
142 };
143
144
145 UsbDeviceImpl::UsbDeviceImpl(AndroidUsbDevice* device)
146 : AndroidDevice(device->serial()),
147 device_(device) {
148 device_->InitOnCallerThread();
149 }
150
151 void UsbDeviceImpl::RunCommand(const std::string& command,
152 const CommandCallback& callback) {
153 net::StreamSocket* socket = device_->CreateSocket(command);
154 int result = socket->Connect(base::Bind(&UsbDeviceImpl::OpenedForCommand,
155 this, callback, socket));
156 if (result != net::ERR_IO_PENDING)
157 callback.Run(result, std::string());
158 }
159
160 void UsbDeviceImpl::OpenSocket(const std::string& name,
161 const SocketCallback& callback) {
162 std::string socket_name =
163 base::StringPrintf(kLocalAbstractCommand, name.c_str());
164 net::StreamSocket* socket = device_->CreateSocket(socket_name);
165 int result = socket->Connect(base::Bind(&UsbDeviceImpl::OnOpenSocket, this,
166 callback, socket));
167 if (result != net::ERR_IO_PENDING)
168 callback.Run(result, NULL);
169 }
170
171 void UsbDeviceImpl::OnOpenSocket(const SocketCallback& callback,
172 net::StreamSocket* socket,
173 int result) {
174 callback.Run(result, result == net::OK ? socket : NULL);
175 }
176
177 void UsbDeviceImpl::OpenedForCommand(const CommandCallback& callback,
178 net::StreamSocket* socket,
179 int result) {
180 if (result != net::OK) {
181 callback.Run(result, std::string());
182 return;
183 }
184 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kBufferSize);
185 result = socket->Read(buffer, kBufferSize,
186 base::Bind(&UsbDeviceImpl::OnRead, this,
187 socket, buffer, std::string(), callback));
188 if (result != net::ERR_IO_PENDING)
189 OnRead(socket, buffer, std::string(), callback, result);
190 }
191
192 void UsbDeviceImpl::OnRead(net::StreamSocket* socket,
193 scoped_refptr<net::IOBuffer> buffer,
194 const std::string& data,
195 const CommandCallback& callback,
196 int result) {
197 if (result <= 0) {
198 callback.Run(result, result == 0 ? data : std::string());
199 delete socket;
200 return;
201 }
202
203 std::string new_data = data + std::string(buffer->data(), result);
204 result = socket->Read(buffer, kBufferSize,
205 base::Bind(&UsbDeviceImpl::OnRead, this,
206 socket, buffer, new_data, callback));
207 if (result != net::ERR_IO_PENDING)
208 OnRead(socket, buffer, new_data, callback, result);
209 }
210
211 bool UsbDeviceImpl::IsConnected() {
212 return device_->is_connected();
213 }
214
215 77
216 // AdbCountDevicesCommand ----------------------------------------------------- 78 // AdbCountDevicesCommand -----------------------------------------------------
217 79
218 class AdbCountDevicesCommand : public base::RefCountedThreadSafe< 80 class AdbCountDevicesCommand : public base::RefCountedThreadSafe<
219 AdbCountDevicesCommand, 81 AdbCountDevicesCommand,
220 content::BrowserThread::DeleteOnUIThread> { 82 BrowserThread::DeleteOnUIThread> {
221 public: 83 public:
222 typedef base::Callback<void(int)> Callback; 84 typedef base::Callback<void(int)> Callback;
223 85
224 AdbCountDevicesCommand( 86 AdbCountDevicesCommand(
225 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 87 scoped_refptr<RefCountedAdbThread> adb_thread,
226 const Callback& callback); 88 const Callback& callback);
227 89
228 private: 90 private:
229 friend struct content::BrowserThread::DeleteOnThread< 91 friend struct BrowserThread::DeleteOnThread<
230 content::BrowserThread::UI>; 92 BrowserThread::UI>;
231 friend class base::DeleteHelper<AdbCountDevicesCommand>; 93 friend class base::DeleteHelper<AdbCountDevicesCommand>;
232 94
233 virtual ~AdbCountDevicesCommand(); 95 virtual ~AdbCountDevicesCommand();
234 void RequestAdbDeviceCount(); 96 void RequestAdbDeviceCount();
235 void ReceivedAdbDeviceCount(int result, const std::string& response); 97 void ReceivedAdbDeviceCount(int result, const std::string& response);
236 void Respond(int count); 98 void Respond(int count);
237 99
238 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread_; 100 scoped_refptr<RefCountedAdbThread> adb_thread_;
239 Callback callback_; 101 Callback callback_;
240 }; 102 };
241 103
242 AdbCountDevicesCommand::AdbCountDevicesCommand( 104 AdbCountDevicesCommand::AdbCountDevicesCommand(
243 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 105 scoped_refptr<RefCountedAdbThread> adb_thread,
244 const Callback& callback) 106 const Callback& callback)
245 : adb_thread_(adb_thread), 107 : adb_thread_(adb_thread),
246 callback_(callback) { 108 callback_(callback) {
247 adb_thread_->message_loop()->PostTask( 109 adb_thread_->message_loop()->PostTask(
248 FROM_HERE, base::Bind(&AdbCountDevicesCommand::RequestAdbDeviceCount, 110 FROM_HERE, base::Bind(&AdbCountDevicesCommand::RequestAdbDeviceCount,
249 this)); 111 this));
250 } 112 }
251 113
252 AdbCountDevicesCommand::~AdbCountDevicesCommand() { 114 AdbCountDevicesCommand::~AdbCountDevicesCommand() {
253 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 115 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
(...skipping 19 matching lines...) Expand all
273 135
274 void AdbCountDevicesCommand::Respond(int count) { 136 void AdbCountDevicesCommand::Respond(int count) {
275 callback_.Run(count); 137 callback_.Run(count);
276 } 138 }
277 139
278 140
279 // AdbPagesCommand ------------------------------------------------------------ 141 // AdbPagesCommand ------------------------------------------------------------
280 142
281 class AdbPagesCommand : public base::RefCountedThreadSafe< 143 class AdbPagesCommand : public base::RefCountedThreadSafe<
282 AdbPagesCommand, 144 AdbPagesCommand,
283 content::BrowserThread::DeleteOnUIThread> { 145 BrowserThread::DeleteOnUIThread> {
284 public: 146 public:
285 typedef base::Callback<void(DevToolsAdbBridge::RemoteDevices*)> Callback; 147 typedef base::Callback<void(DevToolsAdbBridge::RemoteDevices*)> Callback;
286 148
287 AdbPagesCommand( 149 AdbPagesCommand(
288 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 150 scoped_refptr<RefCountedAdbThread> adb_thread,
289 crypto::RSAPrivateKey* rsa_key, bool discover_usb, 151 const DevToolsAdbBridge::DeviceProviders& device_providers,
290 const Callback& callback); 152 const Callback& callback);
291 153
292 private: 154 private:
293 friend struct content::BrowserThread::DeleteOnThread< 155 friend struct BrowserThread::DeleteOnThread<
294 content::BrowserThread::UI>; 156 BrowserThread::UI>;
295 friend class base::DeleteHelper<AdbPagesCommand>; 157 friend class base::DeleteHelper<AdbPagesCommand>;
296 158
297 virtual ~AdbPagesCommand(); 159 virtual ~AdbPagesCommand();
298 void ReceivedUsbDevices(const AndroidUsbDevices& usb_devices); 160 void ProcessDeviceProviders();
299 void WrapUsbDevices(const AndroidUsbDevices& usb_devices); 161 void ReceivedDevices(const AndroidDevices& devices);
300 162
301 void ReceivedAdbDevices(int result, const std::string& response);
302 void ProcessSerials(); 163 void ProcessSerials();
303 void ReceivedModel(int result, const std::string& response); 164 void ReceivedModel(int result, const std::string& response);
304 void ReceivedSockets(int result, const std::string& response); 165 void ReceivedSockets(int result, const std::string& response);
305 void ReceivedDumpsys(int result, const std::string& response); 166 void ReceivedDumpsys(int result, const std::string& response);
306 void ReceivedProcesses(int result, const std::string& response); 167 void ReceivedProcesses(int result, const std::string& response);
307 void ProcessSockets(); 168 void ProcessSockets();
308 void ReceivedVersion(int result, const std::string& response); 169 void ReceivedVersion(int result, const std::string& response);
309 void ReceivedPages(int result, const std::string& response); 170 void ReceivedPages(int result, const std::string& response);
310 void Respond(); 171 void Respond();
311 void ParseSocketsList(const std::string& response); 172 void ParseSocketsList(const std::string& response);
312 void ParseProcessList(const std::string& response); 173 void ParseProcessList(const std::string& response);
313 void ParseDumpsysResponse(const std::string& response); 174 void ParseDumpsysResponse(const std::string& response);
314 void ParseScreenSize(const std::string& str); 175 void ParseScreenSize(const std::string& str);
315 176
316 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread_; 177 scoped_refptr<RefCountedAdbThread> adb_thread_;
317 Callback callback_; 178 Callback callback_;
318 AndroidDevices devices_; 179 AndroidDevices devices_;
319 DevToolsAdbBridge::RemoteBrowsers browsers_; 180 DevToolsAdbBridge::RemoteBrowsers browsers_;
320 scoped_ptr<DevToolsAdbBridge::RemoteDevices> remote_devices_; 181 scoped_ptr<DevToolsAdbBridge::RemoteDevices> remote_devices_;
182 DevToolsAdbBridge::DeviceProviders device_providers_;
321 }; 183 };
322 184
323 AdbPagesCommand::AdbPagesCommand( 185 AdbPagesCommand::AdbPagesCommand(
324 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 186 scoped_refptr<RefCountedAdbThread> adb_thread,
325 crypto::RSAPrivateKey* rsa_key, bool discover_usb, 187 const DevToolsAdbBridge::DeviceProviders& device_providers,
326 const Callback& callback) 188 const Callback& callback)
327 : adb_thread_(adb_thread), 189 : adb_thread_(adb_thread),
328 callback_(callback) { 190 callback_(callback),
191 device_providers_(device_providers){
329 remote_devices_.reset(new DevToolsAdbBridge::RemoteDevices()); 192 remote_devices_.reset(new DevToolsAdbBridge::RemoteDevices());
330 193
331 if (discover_usb) { 194 DCHECK(!device_providers_.empty());
332 AndroidUsbDevice::Enumerate(rsa_key, 195
333 base::Bind(&AdbPagesCommand::ReceivedUsbDevices, this)); 196 ProcessDeviceProviders();
334 } else {
335 ReceivedUsbDevices(AndroidUsbDevices());
336 }
337 } 197 }
338 198
339 AdbPagesCommand::~AdbPagesCommand() { 199 AdbPagesCommand::~AdbPagesCommand() {
340 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 200 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
341 } 201 }
342 202
343 void AdbPagesCommand::ReceivedUsbDevices(const AndroidUsbDevices& usb_devices) { 203 void AdbPagesCommand::ProcessDeviceProviders() {
344 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 204 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
345 adb_thread_->message_loop()->PostTask( 205 if (device_providers_.empty()) {
346 FROM_HERE, base::Bind(&AdbPagesCommand::WrapUsbDevices, this, 206 ProcessSerials();
347 usb_devices)); 207 return;
208 }
209
210 const scoped_refptr<DevToolsDeviceProvider>& device_provider =
211 device_providers_.back();
212
213 device_provider->QueryDevices(
214 base::Bind(&AdbPagesCommand::ReceivedDevices, this));
348 } 215 }
349 216
350 void AdbPagesCommand::WrapUsbDevices(const AndroidUsbDevices& usb_devices) { 217 void AdbPagesCommand::ReceivedDevices(const AndroidDevices& devices) {
351 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 218 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
219 DCHECK(!device_providers_.empty());
220 device_providers_.pop_back();
352 221
353 #if defined(DEBUG_DEVTOOLS) 222 devices_.insert(devices_.end(), devices.begin(), devices.end());
354 devices_.push_back(new AdbDeviceImpl("")); // For desktop remote debugging.
355 #endif // defined(DEBUG_DEVTOOLS)
356 223
357 for (AndroidUsbDevices::const_iterator it = usb_devices.begin(); 224 if (!device_providers_.empty()) {
358 it != usb_devices.end(); ++it) { 225 ProcessDeviceProviders();
359 devices_.push_back(new UsbDeviceImpl(*it)); 226 } else {
227 adb_thread_->message_loop()->PostTask(
228 FROM_HERE, base::Bind(&AdbPagesCommand::ProcessSerials,
229 this));
360 } 230 }
361
362 AdbClientSocket::AdbQuery(
363 kAdbPort, kHostDevicesCommand,
364 base::Bind(&AdbPagesCommand::ReceivedAdbDevices, this));
365 }
366
367 void AdbPagesCommand::ReceivedAdbDevices(
368 int result,
369 const std::string& response) {
370 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
371 std::vector<std::string> serials;
372 Tokenize(response, "\n", &serials);
373 for (size_t i = 0; i < serials.size(); ++i) {
374 std::vector<std::string> tokens;
375 Tokenize(serials[i], "\t ", &tokens);
376 devices_.push_back(new AdbDeviceImpl(tokens[0]));
377 }
378 ProcessSerials();
379 } 231 }
380 232
381 void AdbPagesCommand::ProcessSerials() { 233 void AdbPagesCommand::ProcessSerials() {
382 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 234 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
383 if (devices_.size() == 0) { 235 if (devices_.size() == 0) {
384 BrowserThread::PostTask( 236 BrowserThread::PostTask(
385 BrowserThread::UI, FROM_HERE, 237 BrowserThread::UI, FROM_HERE,
386 base::Bind(&AdbPagesCommand::Respond, this)); 238 base::Bind(&AdbPagesCommand::Respond, this));
387 return; 239 return;
388 } 240 }
389 241
390 #if defined(DEBUG_DEVTOOLS) 242 #if defined(DEBUG_DEVTOOLS)
391 // For desktop remote debugging. 243 // For desktop remote debugging.
392 if (devices_.back()->serial().empty()) { 244 if (devices_.back()->serial().empty()) {
393 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = 245 scoped_refptr<AndroidDevice> device =
394 devices_.back(); 246 devices_.back();
395 device->set_model(kLocalChrome); 247 device->set_model(kLocalChrome);
396 remote_devices_->push_back( 248 remote_devices_->push_back(
397 new DevToolsAdbBridge::RemoteDevice(device)); 249 new DevToolsAdbBridge::RemoteDevice(device));
398 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> remote_browser = 250 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> remote_browser =
399 new DevToolsAdbBridge::RemoteBrowser( 251 new DevToolsAdbBridge::RemoteBrowser(
400 adb_thread_, device, std::string()); 252 adb_thread_, device, std::string());
401 remote_browser->set_product(kChrome); 253 remote_browser->set_product(kChrome);
402 remote_devices_->back()->AddBrowser(remote_browser); 254 remote_devices_->back()->AddBrowser(remote_browser);
403 browsers_.push_back(remote_browser); 255 browsers_.push_back(remote_browser);
404 device->HttpQuery( 256 device->HttpQuery(
405 std::string(), kVersionRequest, 257 std::string(), kVersionRequest,
406 base::Bind(&AdbPagesCommand::ReceivedVersion, this)); 258 base::Bind(&AdbPagesCommand::ReceivedVersion, this));
407 return; 259 return;
408 } 260 }
409 #endif // defined(DEBUG_DEVTOOLS) 261 #endif // defined(DEBUG_DEVTOOLS)
410 262
411 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 263 scoped_refptr<AndroidDevice> device = devices_.back();
412 if (device->IsConnected()) { 264 if (device->IsConnected()) {
413 device->RunCommand(kDeviceModelCommand, 265 device->RunCommand(kDeviceModelCommand,
414 base::Bind(&AdbPagesCommand::ReceivedModel, this)); 266 base::Bind(&AdbPagesCommand::ReceivedModel, this));
415 } else { 267 } else {
416 remote_devices_->push_back(new DevToolsAdbBridge::RemoteDevice(device)); 268 remote_devices_->push_back(new DevToolsAdbBridge::RemoteDevice(device));
417 devices_.pop_back(); 269 devices_.pop_back();
418 ProcessSerials(); 270 ProcessSerials();
419 } 271 }
420 } 272 }
421 273
422 void AdbPagesCommand::ReceivedModel(int result, const std::string& response) { 274 void AdbPagesCommand::ReceivedModel(int result, const std::string& response) {
423 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 275 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
424 if (result < 0) { 276 if (result < 0) {
425 devices_.pop_back(); 277 devices_.pop_back();
426 ProcessSerials(); 278 ProcessSerials();
427 return; 279 return;
428 } 280 }
429 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 281 scoped_refptr<AndroidDevice> device = devices_.back();
430 device->set_model(response); 282 device->set_model(response);
431 remote_devices_->push_back( 283 remote_devices_->push_back(
432 new DevToolsAdbBridge::RemoteDevice(device)); 284 new DevToolsAdbBridge::RemoteDevice(device));
433 device->RunCommand(kOpenedUnixSocketsCommand, 285 device->RunCommand(kOpenedUnixSocketsCommand,
434 base::Bind(&AdbPagesCommand::ReceivedSockets, this)); 286 base::Bind(&AdbPagesCommand::ReceivedSockets, this));
435 } 287 }
436 288
437 void AdbPagesCommand::ReceivedSockets(int result, 289 void AdbPagesCommand::ReceivedSockets(int result,
438 const std::string& response) { 290 const std::string& response) {
439 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 291 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
440 if (result < 0) { 292 if (result < 0) {
441 devices_.pop_back(); 293 devices_.pop_back();
442 ProcessSerials(); 294 ProcessSerials();
443 return; 295 return;
444 } 296 }
445 297
446 ParseSocketsList(response); 298 ParseSocketsList(response);
447 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 299 scoped_refptr<AndroidDevice> device = devices_.back();
448 device->RunCommand(kDumpsysCommand, 300 device->RunCommand(kDumpsysCommand,
449 base::Bind(&AdbPagesCommand::ReceivedDumpsys, this)); 301 base::Bind(&AdbPagesCommand::ReceivedDumpsys, this));
450 } 302 }
451 303
452 void AdbPagesCommand::ReceivedDumpsys(int result, 304 void AdbPagesCommand::ReceivedDumpsys(int result,
453 const std::string& response) { 305 const std::string& response) {
454 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 306 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
455 if (result >= 0) 307 if (result >= 0)
456 ParseDumpsysResponse(response); 308 ParseDumpsysResponse(response);
457 309
458 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 310 scoped_refptr<AndroidDevice> device = devices_.back();
459 device->RunCommand(kListProcessesCommand, 311 device->RunCommand(kListProcessesCommand,
460 base::Bind(&AdbPagesCommand::ReceivedProcesses, this)); 312 base::Bind(&AdbPagesCommand::ReceivedProcesses, this));
461 } 313 }
462 314
463 void AdbPagesCommand::ReceivedProcesses(int result, 315 void AdbPagesCommand::ReceivedProcesses(int result,
464 const std::string& response) { 316 const std::string& response) {
465 if (result >= 0) 317 if (result >= 0)
466 ParseProcessList(response); 318 ParseProcessList(response);
467 319
468 if (browsers_.size() == 0) { 320 if (browsers_.size() == 0) {
469 devices_.pop_back(); 321 devices_.pop_back();
470 ProcessSerials(); 322 ProcessSerials();
471 } else { 323 } else {
472 ProcessSockets(); 324 ProcessSockets();
473 } 325 }
474 } 326 }
475 327
476 void AdbPagesCommand::ProcessSockets() { 328 void AdbPagesCommand::ProcessSockets() {
477 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 329 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
478 if (browsers_.size() == 0) { 330 if (browsers_.size() == 0) {
479 devices_.pop_back(); 331 devices_.pop_back();
480 ProcessSerials(); 332 ProcessSerials();
481 } else { 333 } else {
482 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 334 scoped_refptr<AndroidDevice> device = devices_.back();
483 device->HttpQuery(browsers_.back()->socket(), kVersionRequest, 335 device->HttpQuery(browsers_.back()->socket(), kVersionRequest,
484 base::Bind(&AdbPagesCommand::ReceivedVersion, this)); 336 base::Bind(&AdbPagesCommand::ReceivedVersion, this));
485 } 337 }
486 } 338 }
487 339
488 void AdbPagesCommand::ReceivedVersion(int result, 340 void AdbPagesCommand::ReceivedVersion(int result,
489 const std::string& response) { 341 const std::string& response) {
490 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 342 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
491 if (result < 0) { 343 if (result < 0) {
492 browsers_.pop_back(); 344 browsers_.pop_back();
(...skipping 12 matching lines...) Expand all
505 if (parts.size() == 2) { 357 if (parts.size() == 2) {
506 if (parts[0] != "Version") // WebView has this for legacy reasons. 358 if (parts[0] != "Version") // WebView has this for legacy reasons.
507 browsers_.back()->set_product(parts[0]); 359 browsers_.back()->set_product(parts[0]);
508 browsers_.back()->set_version(parts[1]); 360 browsers_.back()->set_version(parts[1]);
509 } else { 361 } else {
510 browsers_.back()->set_version(browser); 362 browsers_.back()->set_version(browser);
511 } 363 }
512 } 364 }
513 } 365 }
514 366
515 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 367 scoped_refptr<AndroidDevice> device = devices_.back();
516 device->HttpQuery(browsers_.back()->socket(), kPageListRequest, 368 device->HttpQuery(browsers_.back()->socket(), kPageListRequest,
517 base::Bind(&AdbPagesCommand::ReceivedPages, this)); 369 base::Bind(&AdbPagesCommand::ReceivedPages, this));
518 } 370 }
519 371
520 void AdbPagesCommand::ReceivedPages(int result, 372 void AdbPagesCommand::ReceivedPages(int result,
521 const std::string& response) { 373 const std::string& response) {
522 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 374 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
523 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> browser = browsers_.back(); 375 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> browser = browsers_.back();
524 browsers_.pop_back(); 376 browsers_.pop_back();
525 if (result < 0) { 377 if (result < 0) {
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 510
659 remote_devices_->back()->set_screen_size(gfx::Size(width, height)); 511 remote_devices_->back()->set_screen_size(gfx::Size(width, height));
660 } 512 }
661 513
662 514
663 // AdbProtocolCommand --------------------------------------------------------- 515 // AdbProtocolCommand ---------------------------------------------------------
664 516
665 class AdbProtocolCommand : public AdbWebSocket::Delegate { 517 class AdbProtocolCommand : public AdbWebSocket::Delegate {
666 public: 518 public:
667 AdbProtocolCommand( 519 AdbProtocolCommand(
668 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 520 scoped_refptr<RefCountedAdbThread> adb_thread,
669 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, 521 scoped_refptr<AndroidDevice> device,
670 const std::string& socket_name, 522 const std::string& socket_name,
671 const std::string& debug_url, 523 const std::string& debug_url,
672 const std::string& command); 524 const std::string& command);
673 525
674 private: 526 private:
675 virtual void OnSocketOpened() OVERRIDE; 527 virtual void OnSocketOpened() OVERRIDE;
676 virtual void OnFrameRead(const std::string& message) OVERRIDE; 528 virtual void OnFrameRead(const std::string& message) OVERRIDE;
677 virtual void OnSocketClosed(bool closed_by_device) OVERRIDE; 529 virtual void OnSocketClosed(bool closed_by_device) OVERRIDE;
678 virtual bool ProcessIncomingMessage(const std::string& message) OVERRIDE; 530 virtual bool ProcessIncomingMessage(const std::string& message) OVERRIDE;
679 531
680 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread_; 532 scoped_refptr<RefCountedAdbThread> adb_thread_;
681 const std::string command_; 533 const std::string command_;
682 scoped_refptr<AdbWebSocket> web_socket_; 534 scoped_refptr<AdbWebSocket> web_socket_;
683 535
684 DISALLOW_COPY_AND_ASSIGN(AdbProtocolCommand); 536 DISALLOW_COPY_AND_ASSIGN(AdbProtocolCommand);
685 }; 537 };
686 538
687 AdbProtocolCommand::AdbProtocolCommand( 539 AdbProtocolCommand::AdbProtocolCommand(
688 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 540 scoped_refptr<RefCountedAdbThread> adb_thread,
689 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, 541 scoped_refptr<AndroidDevice> device,
690 const std::string& socket_name, 542 const std::string& socket_name,
691 const std::string& debug_url, 543 const std::string& debug_url,
692 const std::string& command) 544 const std::string& command)
693 : adb_thread_(adb_thread), 545 : adb_thread_(adb_thread),
694 command_(command) { 546 command_(command) {
695 web_socket_ = new AdbWebSocket( 547 web_socket_ = new AdbWebSocket(
696 device, socket_name, debug_url, adb_thread_->message_loop(), this); 548 device, socket_name, debug_url, adb_thread_->message_loop(), this);
697 } 549 }
698 550
699 void AdbProtocolCommand::OnSocketOpened() { 551 void AdbProtocolCommand::OnSocketOpened() {
(...skipping 15 matching lines...) Expand all
715 567
716 const char kDevToolsChannelNameFormat[] = "%s_devtools_remote"; 568 const char kDevToolsChannelNameFormat[] = "%s_devtools_remote";
717 569
718 class AgentHostDelegate; 570 class AgentHostDelegate;
719 571
720 typedef std::map<std::string, AgentHostDelegate*> AgentHostDelegates; 572 typedef std::map<std::string, AgentHostDelegate*> AgentHostDelegates;
721 573
722 base::LazyInstance<AgentHostDelegates>::Leaky g_host_delegates = 574 base::LazyInstance<AgentHostDelegates>::Leaky g_host_delegates =
723 LAZY_INSTANCE_INITIALIZER; 575 LAZY_INSTANCE_INITIALIZER;
724 576
725 DevToolsAdbBridge::Wrapper::Wrapper(Profile* profile) 577 DevToolsAdbBridge::Wrapper::Wrapper(Profile* profile) {
726 : bridge_(new DevToolsAdbBridge(profile)) { 578 bridge_ = new DevToolsAdbBridge(profile);
727 } 579 }
728 580
729 DevToolsAdbBridge::Wrapper::~Wrapper() { 581 DevToolsAdbBridge::Wrapper::~Wrapper() {
730 } 582 }
731 583
732 DevToolsAdbBridge* DevToolsAdbBridge::Wrapper::Get() { 584 DevToolsAdbBridge* DevToolsAdbBridge::Wrapper::Get() {
733 return bridge_.get(); 585 return bridge_.get();
734 } 586 }
735 587
736 // static 588 // static
(...skipping 17 matching lines...) Expand all
754 606
755 DevToolsAdbBridge::Factory::~Factory() {} 607 DevToolsAdbBridge::Factory::~Factory() {}
756 608
757 BrowserContextKeyedService* 609 BrowserContextKeyedService*
758 DevToolsAdbBridge::Factory::BuildServiceInstanceFor( 610 DevToolsAdbBridge::Factory::BuildServiceInstanceFor(
759 content::BrowserContext* context) const { 611 content::BrowserContext* context) const {
760 return new DevToolsAdbBridge::Wrapper(Profile::FromBrowserContext(context)); 612 return new DevToolsAdbBridge::Wrapper(Profile::FromBrowserContext(context));
761 } 613 }
762 614
763 615
764 // DevToolsAdbBridge::AndroidDevice -------------------------------------------
765
766 DevToolsAdbBridge::AndroidDevice::AndroidDevice(const std::string& serial)
767 : serial_(serial) {
768 }
769
770 void DevToolsAdbBridge::AndroidDevice::HttpQuery(
771 const std::string& la_name,
772 const std::string& request,
773 const CommandCallback& callback) {
774 OpenSocket(la_name, base::Bind(&AndroidDevice::OnHttpSocketOpened, this,
775 request, callback));
776 }
777
778 void DevToolsAdbBridge::AndroidDevice::HttpUpgrade(
779 const std::string& la_name,
780 const std::string& request,
781 const SocketCallback& callback) {
782 OpenSocket(la_name, base::Bind(&AndroidDevice::OnHttpSocketOpened2, this,
783 request, callback));
784 }
785
786 DevToolsAdbBridge::AndroidDevice::~AndroidDevice() {
787 }
788
789 void DevToolsAdbBridge::AndroidDevice::OnHttpSocketOpened(
790 const std::string& request,
791 const CommandCallback& callback,
792 int result,
793 net::StreamSocket* socket) {
794 if (result != net::OK) {
795 callback.Run(result, std::string());
796 return;
797 }
798 AdbClientSocket::HttpQuery(socket, request, callback);
799 }
800
801 void DevToolsAdbBridge::AndroidDevice::OnHttpSocketOpened2(
802 const std::string& request,
803 const SocketCallback& callback,
804 int result,
805 net::StreamSocket* socket) {
806 if (result != net::OK) {
807 callback.Run(result, NULL);
808 return;
809 }
810 AdbClientSocket::HttpQuery(socket, request, callback);
811 }
812
813
814 // AgentHostDelegate ---------------------------------------------------------- 616 // AgentHostDelegate ----------------------------------------------------------
815 617
816 class AgentHostDelegate : public content::DevToolsExternalAgentProxyDelegate, 618 class AgentHostDelegate : public content::DevToolsExternalAgentProxyDelegate,
817 public AdbWebSocket::Delegate { 619 public AdbWebSocket::Delegate {
818 public: 620 public:
819 AgentHostDelegate( 621 AgentHostDelegate(
820 const std::string& id, 622 const std::string& id,
821 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, 623 scoped_refptr<AndroidDevice> device,
822 const std::string& socket_name, 624 const std::string& socket_name,
823 const std::string& debug_url, 625 const std::string& debug_url,
824 const std::string& frontend_url, 626 const std::string& frontend_url,
825 base::MessageLoop* adb_message_loop, 627 base::MessageLoop* adb_message_loop,
826 Profile* profile) 628 Profile* profile)
827 : id_(id), 629 : id_(id),
828 serial_(device->serial()), 630 serial_(device->serial()),
829 frontend_url_(frontend_url), 631 frontend_url_(frontend_url),
830 adb_message_loop_(adb_message_loop), 632 adb_message_loop_(adb_message_loop),
831 profile_(profile) { 633 profile_(profile) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 685
884 scoped_ptr<content::DevToolsExternalAgentProxy> proxy_; 686 scoped_ptr<content::DevToolsExternalAgentProxy> proxy_;
885 scoped_refptr<AdbWebSocket> web_socket_; 687 scoped_refptr<AdbWebSocket> web_socket_;
886 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate); 688 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate);
887 }; 689 };
888 690
889 691
890 // DevToolsAdbBridge::RemotePage ---------------------------------------------- 692 // DevToolsAdbBridge::RemotePage ----------------------------------------------
891 693
892 DevToolsAdbBridge::RemotePage::RemotePage( 694 DevToolsAdbBridge::RemotePage::RemotePage(
893 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 695 scoped_refptr<RefCountedAdbThread> adb_thread,
894 scoped_refptr<AndroidDevice> device, 696 scoped_refptr<AndroidDevice> device,
895 const std::string& socket, 697 const std::string& socket,
896 const base::DictionaryValue& value) 698 const base::DictionaryValue& value)
897 : adb_thread_(adb_thread), 699 : adb_thread_(adb_thread),
898 device_(device), 700 device_(device),
899 socket_(socket) { 701 socket_(socket) {
900 value.GetString("id", &id_); 702 value.GetString("id", &id_);
901 value.GetString("url", &url_); 703 value.GetString("url", &url_);
902 value.GetString("title", &title_); 704 value.GetString("title", &title_);
903 value.GetString("description", &description_); 705 value.GetString("description", &description_);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 return; 769 return;
968 DevToolsProtocol::Command command(1, method, params); 770 DevToolsProtocol::Command command(1, method, params);
969 new AdbProtocolCommand( 771 new AdbProtocolCommand(
970 adb_thread_, device_, socket_, debug_url_, command.Serialize()); 772 adb_thread_, device_, socket_, debug_url_, command.Serialize());
971 } 773 }
972 774
973 DevToolsAdbBridge::RemotePage::~RemotePage() { 775 DevToolsAdbBridge::RemotePage::~RemotePage() {
974 } 776 }
975 777
976 void DevToolsAdbBridge::RemotePage::RequestActivate( 778 void DevToolsAdbBridge::RemotePage::RequestActivate(
977 const CommandCallback& callback) { 779 const AndroidDevice::CommandCallback& callback) {
978 std::string request = base::StringPrintf(kActivatePageRequest, id_.c_str()); 780 std::string request = base::StringPrintf(kActivatePageRequest, id_.c_str());
979 adb_thread_->message_loop()->PostTask(FROM_HERE, 781 adb_thread_->message_loop()->PostTask(FROM_HERE,
980 base::Bind(&AndroidDevice::HttpQuery, 782 base::Bind(&AndroidDevice::HttpQuery,
981 device_, socket_, request, callback)); 783 device_, socket_, request, callback));
982 } 784 }
983 785
984 void DevToolsAdbBridge::RemotePage::InspectOnHandlerThread( 786 void DevToolsAdbBridge::RemotePage::InspectOnHandlerThread(
985 Profile* profile, int result, const std::string& response) { 787 Profile* profile, int result, const std::string& response) {
986 BrowserThread::PostTask( 788 BrowserThread::PostTask(
987 BrowserThread::UI, FROM_HERE, 789 BrowserThread::UI, FROM_HERE,
(...skipping 10 matching lines...) Expand all
998 new AgentHostDelegate( 800 new AgentHostDelegate(
999 agent_id_, device_, socket_, debug_url_, 801 agent_id_, device_, socket_, debug_url_,
1000 frontend_url_, adb_thread_->message_loop(), profile); 802 frontend_url_, adb_thread_->message_loop(), profile);
1001 } 803 }
1002 } 804 }
1003 805
1004 806
1005 // DevToolsAdbBridge::RemoteBrowser ------------------------------------------- 807 // DevToolsAdbBridge::RemoteBrowser -------------------------------------------
1006 808
1007 DevToolsAdbBridge::RemoteBrowser::RemoteBrowser( 809 DevToolsAdbBridge::RemoteBrowser::RemoteBrowser(
1008 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 810 scoped_refptr<RefCountedAdbThread> adb_thread,
1009 scoped_refptr<AndroidDevice> device, 811 scoped_refptr<AndroidDevice> device,
1010 const std::string& socket) 812 const std::string& socket)
1011 : adb_thread_(adb_thread), 813 : adb_thread_(adb_thread),
1012 device_(device), 814 device_(device),
1013 socket_(socket) { 815 socket_(socket) {
1014 } 816 }
1015 817
1016 void DevToolsAdbBridge::RemoteBrowser::Open(const std::string& url) { 818 void DevToolsAdbBridge::RemoteBrowser::Open(const std::string& url) {
1017 adb_thread_->message_loop()->PostTask(FROM_HERE, 819 adb_thread_->message_loop()->PostTask(FROM_HERE,
1018 base::Bind(&AndroidDevice::HttpQuery, 820 base::Bind(&AndroidDevice::HttpQuery,
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1067 869
1068 void DevToolsAdbBridge::RemoteDevice::AddBrowser( 870 void DevToolsAdbBridge::RemoteDevice::AddBrowser(
1069 scoped_refptr<RemoteBrowser> browser) { 871 scoped_refptr<RemoteBrowser> browser) {
1070 browsers_.push_back(browser); 872 browsers_.push_back(browser);
1071 } 873 }
1072 874
1073 DevToolsAdbBridge::RemoteDevice::~RemoteDevice() { 875 DevToolsAdbBridge::RemoteDevice::~RemoteDevice() {
1074 } 876 }
1075 877
1076 878
1077 // DevToolsAdbBridge::RefCountedAdbThread -------------------------------------
1078
1079 DevToolsAdbBridge::RefCountedAdbThread*
1080 DevToolsAdbBridge::RefCountedAdbThread::instance_ = NULL;
1081
1082 // static
1083 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread>
1084 DevToolsAdbBridge::RefCountedAdbThread::GetInstance() {
1085 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1086 if (!instance_)
1087 new RefCountedAdbThread();
1088 return instance_;
1089 }
1090
1091 DevToolsAdbBridge::RefCountedAdbThread::RefCountedAdbThread() {
1092 instance_ = this;
1093 thread_ = new base::Thread(kDevToolsAdbBridgeThreadName);
1094 base::Thread::Options options;
1095 options.message_loop_type = base::MessageLoop::TYPE_IO;
1096 if (!thread_->StartWithOptions(options)) {
1097 delete thread_;
1098 thread_ = NULL;
1099 }
1100 }
1101
1102 base::MessageLoop* DevToolsAdbBridge::RefCountedAdbThread::message_loop() {
1103 return thread_ ? thread_->message_loop() : NULL;
1104 }
1105
1106 // static
1107 void DevToolsAdbBridge::RefCountedAdbThread::StopThread(base::Thread* thread) {
1108 thread->Stop();
1109 }
1110
1111 DevToolsAdbBridge::RefCountedAdbThread::~RefCountedAdbThread() {
1112 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1113 instance_ = NULL;
1114 if (!thread_)
1115 return;
1116 // Shut down thread on FILE thread to join into IO.
1117 BrowserThread::PostTask(
1118 BrowserThread::FILE, FROM_HERE,
1119 base::Bind(&RefCountedAdbThread::StopThread, thread_));
1120 }
1121
1122
1123 // DevToolsAdbBridge ---------------------------------------------------------- 879 // DevToolsAdbBridge ----------------------------------------------------------
1124 880
1125 DevToolsAdbBridge::DevToolsAdbBridge(Profile* profile) 881 DevToolsAdbBridge::DevToolsAdbBridge(Profile* profile)
1126 : adb_thread_(RefCountedAdbThread::GetInstance()), 882 : profile_(profile),
883 adb_thread_(RefCountedAdbThread::GetInstance()),
1127 has_message_loop_(adb_thread_->message_loop() != NULL), 884 has_message_loop_(adb_thread_->message_loop() != NULL),
1128 discover_usb_devices_(false) { 885 discover_usb_devices_(false) {
1129 rsa_key_.reset(AndroidRSAPrivateKey(profile));
1130 } 886 }
1131 887
1132 void DevToolsAdbBridge::AddListener(Listener* listener) { 888 void DevToolsAdbBridge::AddListener(Listener* listener) {
1133 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 889 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1134 if (listeners_.empty()) 890 if (listeners_.empty())
1135 RequestRemoteDevices(); 891 RequestRemoteDevices();
1136 listeners_.push_back(listener); 892 listeners_.push_back(listener);
1137 } 893 }
1138 894
1139 void DevToolsAdbBridge::RemoveListener(Listener* listener) { 895 void DevToolsAdbBridge::RemoveListener(Listener* listener) {
(...skipping 16 matching lines...) Expand all
1156 912
1157 DevToolsAdbBridge::~DevToolsAdbBridge() { 913 DevToolsAdbBridge::~DevToolsAdbBridge() {
1158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 914 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1159 DCHECK(listeners_.empty()); 915 DCHECK(listeners_.empty());
1160 } 916 }
1161 917
1162 void DevToolsAdbBridge::RequestRemoteDevices() { 918 void DevToolsAdbBridge::RequestRemoteDevices() {
1163 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 919 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1164 if (!has_message_loop_) 920 if (!has_message_loop_)
1165 return; 921 return;
922
923 DeviceProviders device_providers;
Vladislav Kaznacheev 2013/10/17 20:17:37 Here is what I do not understand: The whole point
Dmitry Zvorygin 2013/10/21 07:40:29 Done. Overengineered a little. Earlier devices we
924
925 if (discover_usb_devices_)
926 device_providers.push_back(
927 new UsbDeviceProvider(profile_, RefCountedAdbThread::GetInstance()));
Vladislav Kaznacheev 2013/10/17 20:17:37 It's OK to call RefCountedAdbThread::GetInstance()
Dmitry Zvorygin 2013/10/21 07:40:29 Done.
928
929 device_providers.push_back(
930 new AdbDeviceProvider(RefCountedAdbThread::GetInstance()));
Vladislav Kaznacheev 2013/10/17 20:17:37 Same here.
Dmitry Zvorygin 2013/10/21 07:40:29 Done.
931
1166 new AdbPagesCommand( 932 new AdbPagesCommand(
1167 adb_thread_, rsa_key_.get(), discover_usb_devices_, 933 adb_thread_, device_providers,
1168 base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this)); 934 base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this));
1169 } 935 }
1170 936
1171 void DevToolsAdbBridge::ReceivedRemoteDevices(RemoteDevices* devices_ptr) { 937 void DevToolsAdbBridge::ReceivedRemoteDevices(RemoteDevices* devices_ptr) {
1172 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 938 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1173 939
1174 scoped_ptr<RemoteDevices> devices(devices_ptr); 940 scoped_ptr<RemoteDevices> devices(devices_ptr);
1175 941
1176 Listeners copy(listeners_); 942 Listeners copy(listeners_);
1177 for (Listeners::iterator it = copy.begin(); it != copy.end(); ++it) 943 for (Listeners::iterator it = copy.begin(); it != copy.end(); ++it)
1178 (*it)->RemoteDevicesChanged(devices.get()); 944 (*it)->RemoteDevicesChanged(devices.get());
1179 945
1180 if (listeners_.empty()) 946 if (listeners_.empty())
1181 return; 947 return;
1182 948
1183 BrowserThread::PostDelayedTask( 949 BrowserThread::PostDelayedTask(
1184 BrowserThread::UI, 950 BrowserThread::UI,
1185 FROM_HERE, 951 FROM_HERE,
1186 base::Bind(&DevToolsAdbBridge::RequestRemoteDevices, this), 952 base::Bind(&DevToolsAdbBridge::RequestRemoteDevices, this),
1187 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); 953 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs));
1188 } 954 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698