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

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

Powered by Google App Engine
This is Rietveld 408576698