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

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
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
216 // AdbCountDevicesCommand -----------------------------------------------------
217
218 class AdbCountDevicesCommand : public base::RefCountedThreadSafe<
219 AdbCountDevicesCommand,
220 content::BrowserThread::DeleteOnUIThread> {
221 public:
222 typedef base::Callback<void(int)> Callback;
223
224 AdbCountDevicesCommand(
225 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread,
226 const Callback& callback);
227
228 private:
229 friend struct content::BrowserThread::DeleteOnThread<
230 content::BrowserThread::UI>;
231 friend class base::DeleteHelper<AdbCountDevicesCommand>;
232
233 virtual ~AdbCountDevicesCommand();
234 void RequestAdbDeviceCount();
235 void ReceivedAdbDeviceCount(int result, const std::string& response);
236 void Respond(int count);
237
238 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread_;
239 Callback callback_;
240 };
241
242 AdbCountDevicesCommand::AdbCountDevicesCommand(
243 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread,
244 const Callback& callback)
245 : adb_thread_(adb_thread),
246 callback_(callback) {
247 adb_thread_->message_loop()->PostTask(
248 FROM_HERE, base::Bind(&AdbCountDevicesCommand::RequestAdbDeviceCount,
249 this));
250 }
251
252 AdbCountDevicesCommand::~AdbCountDevicesCommand() {
253 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
254 }
255
256 void AdbCountDevicesCommand::RequestAdbDeviceCount() {
257 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
258 AdbClientSocket::AdbQuery(
259 kAdbPort, kHostDevicesCommand,
260 base::Bind(&AdbCountDevicesCommand::ReceivedAdbDeviceCount, this));
261 }
262
263 void AdbCountDevicesCommand::ReceivedAdbDeviceCount(
264 int result,
265 const std::string& response) {
266 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
267 std::vector<std::string> serials;
268 Tokenize(response, "\n", &serials);
269 BrowserThread::PostTask(
270 BrowserThread::UI, FROM_HERE,
271 base::Bind(&AdbCountDevicesCommand::Respond, this, serials.size()));
272 }
273
274 void AdbCountDevicesCommand::Respond(int count) {
275 callback_.Run(count);
276 }
277
278
279 // AdbPagesCommand ------------------------------------------------------------ 76 // AdbPagesCommand ------------------------------------------------------------
280 77
281 class AdbPagesCommand : public base::RefCountedThreadSafe< 78 class AdbPagesCommand : public base::RefCountedThreadSafe<
282 AdbPagesCommand, 79 AdbPagesCommand,
283 content::BrowserThread::DeleteOnUIThread> { 80 BrowserThread::DeleteOnUIThread> {
284 public: 81 public:
285 typedef base::Callback<void(DevToolsAdbBridge::RemoteDevices*)> Callback; 82 typedef base::Callback<void(DevToolsAdbBridge::RemoteDevices*)> Callback;
286 83
287 AdbPagesCommand( 84 AdbPagesCommand(
288 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 85 scoped_refptr<RefCountedAdbThread> adb_thread,
289 crypto::RSAPrivateKey* rsa_key, bool discover_usb, 86 const DevToolsAdbBridge::DeviceProviders& device_providers,
290 const Callback& callback); 87 const Callback& callback);
291 88
292 private: 89 private:
293 friend struct content::BrowserThread::DeleteOnThread< 90 friend struct BrowserThread::DeleteOnThread<
294 content::BrowserThread::UI>; 91 BrowserThread::UI>;
295 friend class base::DeleteHelper<AdbPagesCommand>; 92 friend class base::DeleteHelper<AdbPagesCommand>;
296 93
297 virtual ~AdbPagesCommand(); 94 virtual ~AdbPagesCommand();
298 void ReceivedUsbDevices(const AndroidUsbDevices& usb_devices); 95 void ProcessDeviceProviders();
299 void WrapUsbDevices(const AndroidUsbDevices& usb_devices); 96 void ReceivedDevices(const AndroidDevices& devices);
300 97
301 void ReceivedAdbDevices(int result, const std::string& response);
302 void ProcessSerials(); 98 void ProcessSerials();
303 void ReceivedModel(int result, const std::string& response); 99 void ReceivedModel(int result, const std::string& response);
304 void ReceivedSockets(int result, const std::string& response); 100 void ReceivedSockets(int result, const std::string& response);
305 void ReceivedDumpsys(int result, const std::string& response); 101 void ReceivedDumpsys(int result, const std::string& response);
306 void ReceivedProcesses(int result, const std::string& response); 102 void ReceivedProcesses(int result, const std::string& response);
307 void ProcessSockets(); 103 void ProcessSockets();
308 void ReceivedVersion(int result, const std::string& response); 104 void ReceivedVersion(int result, const std::string& response);
309 void ReceivedPages(int result, const std::string& response); 105 void ReceivedPages(int result, const std::string& response);
310 void Respond(); 106 void Respond();
311 void ParseSocketsList(const std::string& response); 107 void ParseSocketsList(const std::string& response);
312 void ParseProcessList(const std::string& response); 108 void ParseProcessList(const std::string& response);
313 void ParseDumpsysResponse(const std::string& response); 109 void ParseDumpsysResponse(const std::string& response);
314 void ParseScreenSize(const std::string& str); 110 void ParseScreenSize(const std::string& str);
315 111
316 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread_; 112 scoped_refptr<RefCountedAdbThread> adb_thread_;
317 Callback callback_; 113 Callback callback_;
318 AndroidDevices devices_; 114 AndroidDevices devices_;
319 DevToolsAdbBridge::RemoteBrowsers browsers_; 115 DevToolsAdbBridge::RemoteBrowsers browsers_;
320 scoped_ptr<DevToolsAdbBridge::RemoteDevices> remote_devices_; 116 scoped_ptr<DevToolsAdbBridge::RemoteDevices> remote_devices_;
117 DevToolsAdbBridge::DeviceProviders device_providers_;
321 }; 118 };
322 119
323 AdbPagesCommand::AdbPagesCommand( 120 AdbPagesCommand::AdbPagesCommand(
324 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 121 scoped_refptr<RefCountedAdbThread> adb_thread,
325 crypto::RSAPrivateKey* rsa_key, bool discover_usb, 122 const DevToolsAdbBridge::DeviceProviders& device_providers,
326 const Callback& callback) 123 const Callback& callback)
327 : adb_thread_(adb_thread), 124 : adb_thread_(adb_thread),
328 callback_(callback) { 125 callback_(callback),
126 device_providers_(device_providers){
329 remote_devices_.reset(new DevToolsAdbBridge::RemoteDevices()); 127 remote_devices_.reset(new DevToolsAdbBridge::RemoteDevices());
330 128
331 if (discover_usb) { 129 ProcessDeviceProviders();
332 AndroidUsbDevice::Enumerate(rsa_key,
333 base::Bind(&AdbPagesCommand::ReceivedUsbDevices, this));
334 } else {
335 ReceivedUsbDevices(AndroidUsbDevices());
336 }
337 } 130 }
338 131
339 AdbPagesCommand::~AdbPagesCommand() { 132 AdbPagesCommand::~AdbPagesCommand() {
340 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 133 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
341 } 134 }
342 135
343 void AdbPagesCommand::ReceivedUsbDevices(const AndroidUsbDevices& usb_devices) { 136 void AdbPagesCommand::ProcessDeviceProviders() {
344 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
345 adb_thread_->message_loop()->PostTask( 138 if (device_providers_.empty()) {
346 FROM_HERE, base::Bind(&AdbPagesCommand::WrapUsbDevices, this, 139 adb_thread_->message_loop()->PostTask(
347 usb_devices)); 140 FROM_HERE, base::Bind(&AdbPagesCommand::ProcessSerials, this));
141 return;
142 }
143
144 const scoped_refptr<AndroidDeviceProvider>& device_provider =
145 device_providers_.back();
146
147 device_provider->QueryDevices(
148 base::Bind(&AdbPagesCommand::ReceivedDevices, this));
348 } 149 }
349 150
350 void AdbPagesCommand::WrapUsbDevices(const AndroidUsbDevices& usb_devices) { 151 void AdbPagesCommand::ReceivedDevices(const AndroidDevices& devices) {
351 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 152 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
153 DCHECK(!device_providers_.empty());
154 device_providers_.pop_back();
352 155
353 #if defined(DEBUG_DEVTOOLS) 156 devices_.insert(devices_.end(), devices.begin(), devices.end());
354 devices_.push_back(new AdbDeviceImpl("")); // For desktop remote debugging.
355 #endif // defined(DEBUG_DEVTOOLS)
356 157
357 for (AndroidUsbDevices::const_iterator it = usb_devices.begin(); 158 if (!device_providers_.empty()) {
358 it != usb_devices.end(); ++it) { 159 ProcessDeviceProviders();
359 devices_.push_back(new UsbDeviceImpl(*it)); 160 } else {
161 adb_thread_->message_loop()->PostTask(
162 FROM_HERE, base::Bind(&AdbPagesCommand::ProcessSerials, this));
360 } 163 }
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 } 164 }
380 165
381 void AdbPagesCommand::ProcessSerials() { 166 void AdbPagesCommand::ProcessSerials() {
382 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 167 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
383 if (devices_.size() == 0) { 168 if (devices_.size() == 0) {
384 BrowserThread::PostTask( 169 BrowserThread::PostTask(
385 BrowserThread::UI, FROM_HERE, 170 BrowserThread::UI, FROM_HERE,
386 base::Bind(&AdbPagesCommand::Respond, this)); 171 base::Bind(&AdbPagesCommand::Respond, this));
387 return; 172 return;
388 } 173 }
389 174
390 #if defined(DEBUG_DEVTOOLS) 175 #if defined(DEBUG_DEVTOOLS)
391 // For desktop remote debugging. 176 // For desktop remote debugging.
392 if (devices_.back()->serial().empty()) { 177 if (devices_.back()->serial().empty()) {
393 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = 178 scoped_refptr<AndroidDevice> device =
394 devices_.back(); 179 devices_.back();
395 device->set_model(kLocalChrome); 180 device->set_model(kLocalChrome);
396 remote_devices_->push_back( 181 remote_devices_->push_back(
397 new DevToolsAdbBridge::RemoteDevice(device)); 182 new DevToolsAdbBridge::RemoteDevice(device));
398 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> remote_browser = 183 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> remote_browser =
399 new DevToolsAdbBridge::RemoteBrowser( 184 new DevToolsAdbBridge::RemoteBrowser(
400 adb_thread_, device, std::string()); 185 adb_thread_, device, std::string());
401 remote_browser->set_product(kChrome); 186 remote_browser->set_product(kChrome);
402 remote_devices_->back()->AddBrowser(remote_browser); 187 remote_devices_->back()->AddBrowser(remote_browser);
403 browsers_.push_back(remote_browser); 188 browsers_.push_back(remote_browser);
404 device->HttpQuery( 189 device->HttpQuery(
405 std::string(), kVersionRequest, 190 std::string(), kVersionRequest,
406 base::Bind(&AdbPagesCommand::ReceivedVersion, this)); 191 base::Bind(&AdbPagesCommand::ReceivedVersion, this));
407 return; 192 return;
408 } 193 }
409 #endif // defined(DEBUG_DEVTOOLS) 194 #endif // defined(DEBUG_DEVTOOLS)
410 195
411 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 196 scoped_refptr<AndroidDevice> device = devices_.back();
412 if (device->IsConnected()) { 197 if (device->IsConnected()) {
413 device->RunCommand(kDeviceModelCommand, 198 device->RunCommand(kDeviceModelCommand,
414 base::Bind(&AdbPagesCommand::ReceivedModel, this)); 199 base::Bind(&AdbPagesCommand::ReceivedModel, this));
415 } else { 200 } else {
416 remote_devices_->push_back(new DevToolsAdbBridge::RemoteDevice(device)); 201 remote_devices_->push_back(new DevToolsAdbBridge::RemoteDevice(device));
417 devices_.pop_back(); 202 devices_.pop_back();
418 ProcessSerials(); 203 ProcessSerials();
419 } 204 }
420 } 205 }
421 206
422 void AdbPagesCommand::ReceivedModel(int result, const std::string& response) { 207 void AdbPagesCommand::ReceivedModel(int result, const std::string& response) {
423 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 208 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
424 if (result < 0) { 209 if (result < 0) {
425 devices_.pop_back(); 210 devices_.pop_back();
426 ProcessSerials(); 211 ProcessSerials();
427 return; 212 return;
428 } 213 }
429 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 214 scoped_refptr<AndroidDevice> device = devices_.back();
430 device->set_model(response); 215 device->set_model(response);
431 remote_devices_->push_back( 216 remote_devices_->push_back(
432 new DevToolsAdbBridge::RemoteDevice(device)); 217 new DevToolsAdbBridge::RemoteDevice(device));
433 device->RunCommand(kOpenedUnixSocketsCommand, 218 device->RunCommand(kOpenedUnixSocketsCommand,
434 base::Bind(&AdbPagesCommand::ReceivedSockets, this)); 219 base::Bind(&AdbPagesCommand::ReceivedSockets, this));
435 } 220 }
436 221
437 void AdbPagesCommand::ReceivedSockets(int result, 222 void AdbPagesCommand::ReceivedSockets(int result,
438 const std::string& response) { 223 const std::string& response) {
439 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 224 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
440 if (result < 0) { 225 if (result < 0) {
441 devices_.pop_back(); 226 devices_.pop_back();
442 ProcessSerials(); 227 ProcessSerials();
443 return; 228 return;
444 } 229 }
445 230
446 ParseSocketsList(response); 231 ParseSocketsList(response);
447 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 232 scoped_refptr<AndroidDevice> device = devices_.back();
448 device->RunCommand(kDumpsysCommand, 233 device->RunCommand(kDumpsysCommand,
449 base::Bind(&AdbPagesCommand::ReceivedDumpsys, this)); 234 base::Bind(&AdbPagesCommand::ReceivedDumpsys, this));
450 } 235 }
451 236
452 void AdbPagesCommand::ReceivedDumpsys(int result, 237 void AdbPagesCommand::ReceivedDumpsys(int result,
453 const std::string& response) { 238 const std::string& response) {
454 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 239 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
455 if (result >= 0) 240 if (result >= 0)
456 ParseDumpsysResponse(response); 241 ParseDumpsysResponse(response);
457 242
458 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 243 scoped_refptr<AndroidDevice> device = devices_.back();
459 device->RunCommand(kListProcessesCommand, 244 device->RunCommand(kListProcessesCommand,
460 base::Bind(&AdbPagesCommand::ReceivedProcesses, this)); 245 base::Bind(&AdbPagesCommand::ReceivedProcesses, this));
461 } 246 }
462 247
463 void AdbPagesCommand::ReceivedProcesses(int result, 248 void AdbPagesCommand::ReceivedProcesses(int result,
464 const std::string& response) { 249 const std::string& response) {
465 if (result >= 0) 250 if (result >= 0)
466 ParseProcessList(response); 251 ParseProcessList(response);
467 252
468 if (browsers_.size() == 0) { 253 if (browsers_.size() == 0) {
469 devices_.pop_back(); 254 devices_.pop_back();
470 ProcessSerials(); 255 ProcessSerials();
471 } else { 256 } else {
472 ProcessSockets(); 257 ProcessSockets();
473 } 258 }
474 } 259 }
475 260
476 void AdbPagesCommand::ProcessSockets() { 261 void AdbPagesCommand::ProcessSockets() {
477 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 262 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
478 if (browsers_.size() == 0) { 263 if (browsers_.size() == 0) {
479 devices_.pop_back(); 264 devices_.pop_back();
480 ProcessSerials(); 265 ProcessSerials();
481 } else { 266 } else {
482 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 267 scoped_refptr<AndroidDevice> device = devices_.back();
483 device->HttpQuery(browsers_.back()->socket(), kVersionRequest, 268 device->HttpQuery(browsers_.back()->socket(), kVersionRequest,
484 base::Bind(&AdbPagesCommand::ReceivedVersion, this)); 269 base::Bind(&AdbPagesCommand::ReceivedVersion, this));
485 } 270 }
486 } 271 }
487 272
488 void AdbPagesCommand::ReceivedVersion(int result, 273 void AdbPagesCommand::ReceivedVersion(int result,
489 const std::string& response) { 274 const std::string& response) {
490 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 275 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
491 if (result < 0) { 276 if (result < 0) {
492 browsers_.pop_back(); 277 browsers_.pop_back();
(...skipping 12 matching lines...) Expand all
505 if (parts.size() == 2) { 290 if (parts.size() == 2) {
506 if (parts[0] != "Version") // WebView has this for legacy reasons. 291 if (parts[0] != "Version") // WebView has this for legacy reasons.
507 browsers_.back()->set_product(parts[0]); 292 browsers_.back()->set_product(parts[0]);
508 browsers_.back()->set_version(parts[1]); 293 browsers_.back()->set_version(parts[1]);
509 } else { 294 } else {
510 browsers_.back()->set_version(browser); 295 browsers_.back()->set_version(browser);
511 } 296 }
512 } 297 }
513 } 298 }
514 299
515 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 300 scoped_refptr<AndroidDevice> device = devices_.back();
516 device->HttpQuery(browsers_.back()->socket(), kPageListRequest, 301 device->HttpQuery(browsers_.back()->socket(), kPageListRequest,
517 base::Bind(&AdbPagesCommand::ReceivedPages, this)); 302 base::Bind(&AdbPagesCommand::ReceivedPages, this));
518 } 303 }
519 304
520 void AdbPagesCommand::ReceivedPages(int result, 305 void AdbPagesCommand::ReceivedPages(int result,
521 const std::string& response) { 306 const std::string& response) {
522 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 307 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
523 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> browser = browsers_.back(); 308 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> browser = browsers_.back();
524 browsers_.pop_back(); 309 browsers_.pop_back();
525 if (result < 0) { 310 if (result < 0) {
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 443
659 remote_devices_->back()->set_screen_size(gfx::Size(width, height)); 444 remote_devices_->back()->set_screen_size(gfx::Size(width, height));
660 } 445 }
661 446
662 447
663 // AdbProtocolCommand --------------------------------------------------------- 448 // AdbProtocolCommand ---------------------------------------------------------
664 449
665 class AdbProtocolCommand : public AdbWebSocket::Delegate { 450 class AdbProtocolCommand : public AdbWebSocket::Delegate {
666 public: 451 public:
667 AdbProtocolCommand( 452 AdbProtocolCommand(
668 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 453 scoped_refptr<RefCountedAdbThread> adb_thread,
669 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, 454 scoped_refptr<AndroidDevice> device,
670 const std::string& socket_name, 455 const std::string& socket_name,
671 const std::string& debug_url, 456 const std::string& debug_url,
672 const std::string& command); 457 const std::string& command);
673 458
674 private: 459 private:
675 virtual void OnSocketOpened() OVERRIDE; 460 virtual void OnSocketOpened() OVERRIDE;
676 virtual void OnFrameRead(const std::string& message) OVERRIDE; 461 virtual void OnFrameRead(const std::string& message) OVERRIDE;
677 virtual void OnSocketClosed(bool closed_by_device) OVERRIDE; 462 virtual void OnSocketClosed(bool closed_by_device) OVERRIDE;
678 virtual bool ProcessIncomingMessage(const std::string& message) OVERRIDE; 463 virtual bool ProcessIncomingMessage(const std::string& message) OVERRIDE;
679 464
680 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread_; 465 scoped_refptr<RefCountedAdbThread> adb_thread_;
681 const std::string command_; 466 const std::string command_;
682 scoped_refptr<AdbWebSocket> web_socket_; 467 scoped_refptr<AdbWebSocket> web_socket_;
683 468
684 DISALLOW_COPY_AND_ASSIGN(AdbProtocolCommand); 469 DISALLOW_COPY_AND_ASSIGN(AdbProtocolCommand);
685 }; 470 };
686 471
687 AdbProtocolCommand::AdbProtocolCommand( 472 AdbProtocolCommand::AdbProtocolCommand(
688 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 473 scoped_refptr<RefCountedAdbThread> adb_thread,
689 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, 474 scoped_refptr<AndroidDevice> device,
690 const std::string& socket_name, 475 const std::string& socket_name,
691 const std::string& debug_url, 476 const std::string& debug_url,
692 const std::string& command) 477 const std::string& command)
693 : adb_thread_(adb_thread), 478 : adb_thread_(adb_thread),
694 command_(command) { 479 command_(command) {
695 web_socket_ = new AdbWebSocket( 480 web_socket_ = new AdbWebSocket(
696 device, socket_name, debug_url, adb_thread_->message_loop(), this); 481 device, socket_name, debug_url, adb_thread_->message_loop(), this);
697 } 482 }
698 483
699 void AdbProtocolCommand::OnSocketOpened() { 484 void AdbProtocolCommand::OnSocketOpened() {
(...skipping 15 matching lines...) Expand all
715 500
716 const char kDevToolsChannelNameFormat[] = "%s_devtools_remote"; 501 const char kDevToolsChannelNameFormat[] = "%s_devtools_remote";
717 502
718 class AgentHostDelegate; 503 class AgentHostDelegate;
719 504
720 typedef std::map<std::string, AgentHostDelegate*> AgentHostDelegates; 505 typedef std::map<std::string, AgentHostDelegate*> AgentHostDelegates;
721 506
722 base::LazyInstance<AgentHostDelegates>::Leaky g_host_delegates = 507 base::LazyInstance<AgentHostDelegates>::Leaky g_host_delegates =
723 LAZY_INSTANCE_INITIALIZER; 508 LAZY_INSTANCE_INITIALIZER;
724 509
725 DevToolsAdbBridge::Wrapper::Wrapper(Profile* profile) 510 DevToolsAdbBridge::Wrapper::Wrapper() {
726 : bridge_(new DevToolsAdbBridge(profile)) { 511 bridge_ = new DevToolsAdbBridge(DevToolsAdbBridge::DeviceProviders());
727 } 512 }
728 513
729 DevToolsAdbBridge::Wrapper::~Wrapper() { 514 DevToolsAdbBridge::Wrapper::~Wrapper() {
730 } 515 }
731 516
732 DevToolsAdbBridge* DevToolsAdbBridge::Wrapper::Get() { 517 DevToolsAdbBridge* DevToolsAdbBridge::Wrapper::Get() {
733 return bridge_.get(); 518 return bridge_.get();
734 } 519 }
735 520
736 // static 521 // static
(...skipping 13 matching lines...) Expand all
750 DevToolsAdbBridge::Factory::Factory() 535 DevToolsAdbBridge::Factory::Factory()
751 : BrowserContextKeyedServiceFactory( 536 : BrowserContextKeyedServiceFactory(
752 "DevToolsAdbBridge", 537 "DevToolsAdbBridge",
753 BrowserContextDependencyManager::GetInstance()) {} 538 BrowserContextDependencyManager::GetInstance()) {}
754 539
755 DevToolsAdbBridge::Factory::~Factory() {} 540 DevToolsAdbBridge::Factory::~Factory() {}
756 541
757 BrowserContextKeyedService* 542 BrowserContextKeyedService*
758 DevToolsAdbBridge::Factory::BuildServiceInstanceFor( 543 DevToolsAdbBridge::Factory::BuildServiceInstanceFor(
759 content::BrowserContext* context) const { 544 content::BrowserContext* context) const {
760 return new DevToolsAdbBridge::Wrapper(Profile::FromBrowserContext(context)); 545 return new DevToolsAdbBridge::Wrapper();
761 } 546 }
762 547
763 548
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 ---------------------------------------------------------- 549 // AgentHostDelegate ----------------------------------------------------------
815 550
816 class AgentHostDelegate : public content::DevToolsExternalAgentProxyDelegate, 551 class AgentHostDelegate : public content::DevToolsExternalAgentProxyDelegate,
817 public AdbWebSocket::Delegate { 552 public AdbWebSocket::Delegate {
818 public: 553 public:
819 AgentHostDelegate( 554 AgentHostDelegate(
820 const std::string& id, 555 const std::string& id,
821 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, 556 scoped_refptr<AndroidDevice> device,
822 const std::string& socket_name, 557 const std::string& socket_name,
823 const std::string& debug_url, 558 const std::string& debug_url,
824 const std::string& frontend_url, 559 const std::string& frontend_url,
825 base::MessageLoop* adb_message_loop, 560 base::MessageLoop* adb_message_loop,
826 Profile* profile) 561 Profile* profile)
827 : id_(id), 562 : id_(id),
828 serial_(device->serial()), 563 serial_(device->serial()),
829 frontend_url_(frontend_url), 564 frontend_url_(frontend_url),
830 adb_message_loop_(adb_message_loop), 565 adb_message_loop_(adb_message_loop),
831 profile_(profile) { 566 profile_(profile) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 618
884 scoped_ptr<content::DevToolsExternalAgentProxy> proxy_; 619 scoped_ptr<content::DevToolsExternalAgentProxy> proxy_;
885 scoped_refptr<AdbWebSocket> web_socket_; 620 scoped_refptr<AdbWebSocket> web_socket_;
886 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate); 621 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate);
887 }; 622 };
888 623
889 624
890 // DevToolsAdbBridge::RemotePage ---------------------------------------------- 625 // DevToolsAdbBridge::RemotePage ----------------------------------------------
891 626
892 DevToolsAdbBridge::RemotePage::RemotePage( 627 DevToolsAdbBridge::RemotePage::RemotePage(
893 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 628 scoped_refptr<RefCountedAdbThread> adb_thread,
894 scoped_refptr<AndroidDevice> device, 629 scoped_refptr<AndroidDevice> device,
895 const std::string& socket, 630 const std::string& socket,
896 const base::DictionaryValue& value) 631 const base::DictionaryValue& value)
897 : adb_thread_(adb_thread), 632 : adb_thread_(adb_thread),
898 device_(device), 633 device_(device),
899 socket_(socket) { 634 socket_(socket) {
900 value.GetString("id", &id_); 635 value.GetString("id", &id_);
901 value.GetString("url", &url_); 636 value.GetString("url", &url_);
902 value.GetString("title", &title_); 637 value.GetString("title", &title_);
903 value.GetString("description", &description_); 638 value.GetString("description", &description_);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 return; 702 return;
968 DevToolsProtocol::Command command(1, method, params); 703 DevToolsProtocol::Command command(1, method, params);
969 new AdbProtocolCommand( 704 new AdbProtocolCommand(
970 adb_thread_, device_, socket_, debug_url_, command.Serialize()); 705 adb_thread_, device_, socket_, debug_url_, command.Serialize());
971 } 706 }
972 707
973 DevToolsAdbBridge::RemotePage::~RemotePage() { 708 DevToolsAdbBridge::RemotePage::~RemotePage() {
974 } 709 }
975 710
976 void DevToolsAdbBridge::RemotePage::RequestActivate( 711 void DevToolsAdbBridge::RemotePage::RequestActivate(
977 const CommandCallback& callback) { 712 const AndroidDevice::CommandCallback& callback) {
978 std::string request = base::StringPrintf(kActivatePageRequest, id_.c_str()); 713 std::string request = base::StringPrintf(kActivatePageRequest, id_.c_str());
979 adb_thread_->message_loop()->PostTask(FROM_HERE, 714 adb_thread_->message_loop()->PostTask(FROM_HERE,
980 base::Bind(&AndroidDevice::HttpQuery, 715 base::Bind(&AndroidDevice::HttpQuery,
981 device_, socket_, request, callback)); 716 device_, socket_, request, callback));
982 } 717 }
983 718
984 void DevToolsAdbBridge::RemotePage::InspectOnHandlerThread( 719 void DevToolsAdbBridge::RemotePage::InspectOnHandlerThread(
985 Profile* profile, int result, const std::string& response) { 720 Profile* profile, int result, const std::string& response) {
986 BrowserThread::PostTask( 721 BrowserThread::PostTask(
987 BrowserThread::UI, FROM_HERE, 722 BrowserThread::UI, FROM_HERE,
(...skipping 10 matching lines...) Expand all
998 new AgentHostDelegate( 733 new AgentHostDelegate(
999 agent_id_, device_, socket_, debug_url_, 734 agent_id_, device_, socket_, debug_url_,
1000 frontend_url_, adb_thread_->message_loop(), profile); 735 frontend_url_, adb_thread_->message_loop(), profile);
1001 } 736 }
1002 } 737 }
1003 738
1004 739
1005 // DevToolsAdbBridge::RemoteBrowser ------------------------------------------- 740 // DevToolsAdbBridge::RemoteBrowser -------------------------------------------
1006 741
1007 DevToolsAdbBridge::RemoteBrowser::RemoteBrowser( 742 DevToolsAdbBridge::RemoteBrowser::RemoteBrowser(
1008 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 743 scoped_refptr<RefCountedAdbThread> adb_thread,
1009 scoped_refptr<AndroidDevice> device, 744 scoped_refptr<AndroidDevice> device,
1010 const std::string& socket) 745 const std::string& socket)
1011 : adb_thread_(adb_thread), 746 : adb_thread_(adb_thread),
1012 device_(device), 747 device_(device),
1013 socket_(socket) { 748 socket_(socket) {
1014 } 749 }
1015 750
1016 void DevToolsAdbBridge::RemoteBrowser::Open(const std::string& url) { 751 void DevToolsAdbBridge::RemoteBrowser::Open(const std::string& url) {
1017 adb_thread_->message_loop()->PostTask(FROM_HERE, 752 adb_thread_->message_loop()->PostTask(FROM_HERE,
1018 base::Bind(&AndroidDevice::HttpQuery, 753 base::Bind(&AndroidDevice::HttpQuery,
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1067 802
1068 void DevToolsAdbBridge::RemoteDevice::AddBrowser( 803 void DevToolsAdbBridge::RemoteDevice::AddBrowser(
1069 scoped_refptr<RemoteBrowser> browser) { 804 scoped_refptr<RemoteBrowser> browser) {
1070 browsers_.push_back(browser); 805 browsers_.push_back(browser);
1071 } 806 }
1072 807
1073 DevToolsAdbBridge::RemoteDevice::~RemoteDevice() { 808 DevToolsAdbBridge::RemoteDevice::~RemoteDevice() {
1074 } 809 }
1075 810
1076 811
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 ---------------------------------------------------------- 812 // DevToolsAdbBridge ----------------------------------------------------------
1124 813
1125 DevToolsAdbBridge::DevToolsAdbBridge(Profile* profile) 814 DevToolsAdbBridge::DevToolsAdbBridge(
815 DevToolsAdbBridge::DeviceProviders device_providers)
1126 : adb_thread_(RefCountedAdbThread::GetInstance()), 816 : adb_thread_(RefCountedAdbThread::GetInstance()),
1127 has_message_loop_(adb_thread_->message_loop() != NULL), 817 has_message_loop_(adb_thread_->message_loop() != NULL),
1128 discover_usb_devices_(false) { 818 device_providers_(device_providers) {
1129 rsa_key_.reset(AndroidRSAPrivateKey(profile));
1130 } 819 }
1131 820
1132 void DevToolsAdbBridge::AddListener(Listener* listener) { 821 void DevToolsAdbBridge::AddListener(Listener* listener) {
1133 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 822 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1134 if (listeners_.empty()) 823 if (listeners_.empty())
1135 RequestRemoteDevices(); 824 RequestRemoteDevices();
1136 listeners_.push_back(listener); 825 listeners_.push_back(listener);
1137 } 826 }
1138 827
1139 void DevToolsAdbBridge::RemoveListener(Listener* listener) { 828 void DevToolsAdbBridge::RemoveListener(Listener* listener) {
1140 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 829 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1141 Listeners::iterator it = 830 Listeners::iterator it =
1142 std::find(listeners_.begin(), listeners_.end(), listener); 831 std::find(listeners_.begin(), listeners_.end(), listener);
1143 DCHECK(it != listeners_.end()); 832 DCHECK(it != listeners_.end());
1144 listeners_.erase(it); 833 listeners_.erase(it);
1145 } 834 }
1146 835
1147 void DevToolsAdbBridge::CountDevices(
1148 const base::Callback<void(int)>& callback) {
1149 if (discover_usb_devices_) {
1150 // Count raw devices, adb included.
1151 AndroidUsbDevice::CountDevices(callback);
1152 return;
1153 }
1154 new AdbCountDevicesCommand(adb_thread_, callback);
1155 }
1156
1157 DevToolsAdbBridge::~DevToolsAdbBridge() { 836 DevToolsAdbBridge::~DevToolsAdbBridge() {
1158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 837 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1159 DCHECK(listeners_.empty()); 838 DCHECK(listeners_.empty());
1160 } 839 }
1161 840
1162 void DevToolsAdbBridge::RequestRemoteDevices() { 841 void DevToolsAdbBridge::RequestRemoteDevices() {
1163 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 842 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1164 if (!has_message_loop_) 843 if (!has_message_loop_)
1165 return; 844 return;
845
1166 new AdbPagesCommand( 846 new AdbPagesCommand(
1167 adb_thread_, rsa_key_.get(), discover_usb_devices_, 847 adb_thread_, device_providers_,
1168 base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this)); 848 base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this));
1169 } 849 }
1170 850
1171 void DevToolsAdbBridge::ReceivedRemoteDevices(RemoteDevices* devices_ptr) { 851 void DevToolsAdbBridge::ReceivedRemoteDevices(RemoteDevices* devices_ptr) {
1172 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 852 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1173 853
1174 scoped_ptr<RemoteDevices> devices(devices_ptr); 854 scoped_ptr<RemoteDevices> devices(devices_ptr);
1175 855
1176 Listeners copy(listeners_); 856 Listeners copy(listeners_);
1177 for (Listeners::iterator it = copy.begin(); it != copy.end(); ++it) 857 for (Listeners::iterator it = copy.begin(); it != copy.end(); ++it)
1178 (*it)->RemoteDevicesChanged(devices.get()); 858 (*it)->RemoteDevicesChanged(devices.get());
1179 859
1180 if (listeners_.empty()) 860 if (listeners_.empty())
1181 return; 861 return;
1182 862
1183 BrowserThread::PostDelayedTask( 863 BrowserThread::PostDelayedTask(
1184 BrowserThread::UI, 864 BrowserThread::UI,
1185 FROM_HERE, 865 FROM_HERE,
1186 base::Bind(&DevToolsAdbBridge::RequestRemoteDevices, this), 866 base::Bind(&DevToolsAdbBridge::RequestRemoteDevices, this),
1187 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); 867 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs));
1188 } 868 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698