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

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: Made AndroidDevice::HttpQuery virtual for test purposes. 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 AdbDeviceImpl(const std::string& serial, bool is_connected);
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 private:
88 virtual ~AdbDeviceImpl() {}
89 };
90
91 AdbDeviceImpl::AdbDeviceImpl(const std::string& serial, bool is_connected)
92 : AndroidDevice(serial, is_connected) {
93 }
94
95 void AdbDeviceImpl::RunCommand(const std::string& command,
96 const CommandCallback& callback) {
97 std::string query = base::StringPrintf(kHostTransportCommand,
98 serial().c_str(), command.c_str());
99 AdbClientSocket::AdbQuery(kAdbPort, query, callback);
100 }
101
102 void AdbDeviceImpl::OpenSocket(const std::string& name,
103 const SocketCallback& callback) {
104 std::string socket_name =
105 base::StringPrintf(kLocalAbstractCommand, name.c_str());
106 AdbClientSocket::TransportQuery(kAdbPort, serial(), socket_name, callback);
107 }
108
109 // UsbDeviceImpl --------------------------------------------------------------
110
111 class UsbDeviceImpl : public DevToolsAdbBridge::AndroidDevice {
112 public:
113 explicit UsbDeviceImpl(AndroidUsbDevice* device);
114 virtual void RunCommand(const std::string& command,
115 const CommandCallback& callback) OVERRIDE;
116 virtual void OpenSocket(const std::string& name,
117 const SocketCallback& callback) OVERRIDE;
118
119 private:
120 void OnOpenSocket(const SocketCallback& callback,
121 net::StreamSocket* socket,
122 int result);
123 void OpenedForCommand(const CommandCallback& callback,
124 net::StreamSocket* socket,
125 int result);
126 void OnRead(net::StreamSocket* socket,
127 scoped_refptr<net::IOBuffer> buffer,
128 const std::string& data,
129 const CommandCallback& callback,
130 int result);
131
132 virtual ~UsbDeviceImpl() {}
133 scoped_refptr<AndroidUsbDevice> device_;
134 };
135
136
137 UsbDeviceImpl::UsbDeviceImpl(AndroidUsbDevice* device)
138 : AndroidDevice(device->serial(), device->is_connected()),
139 device_(device) {
140 device_->InitOnCallerThread();
141 }
142
143 void UsbDeviceImpl::RunCommand(const std::string& command,
144 const CommandCallback& callback) {
145 net::StreamSocket* socket = device_->CreateSocket(command);
146 int result = socket->Connect(base::Bind(&UsbDeviceImpl::OpenedForCommand,
147 this, callback, socket));
148 if (result != net::ERR_IO_PENDING)
149 callback.Run(result, std::string());
150 }
151
152 void UsbDeviceImpl::OpenSocket(const std::string& name,
153 const SocketCallback& callback) {
154 std::string socket_name =
155 base::StringPrintf(kLocalAbstractCommand, name.c_str());
156 net::StreamSocket* socket = device_->CreateSocket(socket_name);
157 int result = socket->Connect(base::Bind(&UsbDeviceImpl::OnOpenSocket, this,
158 callback, socket));
159 if (result != net::ERR_IO_PENDING)
160 callback.Run(result, NULL);
161 }
162
163 void UsbDeviceImpl::OnOpenSocket(const SocketCallback& callback,
164 net::StreamSocket* socket,
165 int result) {
166 callback.Run(result, result == net::OK ? socket : NULL);
167 }
168
169 void UsbDeviceImpl::OpenedForCommand(const CommandCallback& callback,
170 net::StreamSocket* socket,
171 int result) {
172 if (result != net::OK) {
173 callback.Run(result, std::string());
174 return;
175 }
176 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kBufferSize);
177 result = socket->Read(buffer, kBufferSize,
178 base::Bind(&UsbDeviceImpl::OnRead, this,
179 socket, buffer, std::string(), callback));
180 if (result != net::ERR_IO_PENDING)
181 OnRead(socket, buffer, std::string(), callback, result);
182 }
183
184 void UsbDeviceImpl::OnRead(net::StreamSocket* socket,
185 scoped_refptr<net::IOBuffer> buffer,
186 const std::string& data,
187 const CommandCallback& callback,
188 int result) {
189 if (result <= 0) {
190 callback.Run(result, result == 0 ? data : std::string());
191 delete socket;
192 return;
193 }
194
195 std::string new_data = data + std::string(buffer->data(), result);
196 result = socket->Read(buffer, kBufferSize,
197 base::Bind(&UsbDeviceImpl::OnRead, this,
198 socket, buffer, new_data, callback));
199 if (result != net::ERR_IO_PENDING)
200 OnRead(socket, buffer, new_data, callback, result);
201 }
202
203
204 // AdbCountDevicesCommand -----------------------------------------------------
205
206 class AdbCountDevicesCommand : public base::RefCountedThreadSafe<
207 AdbCountDevicesCommand,
208 content::BrowserThread::DeleteOnUIThread> {
209 public:
210 typedef base::Callback<void(int)> Callback;
211
212 AdbCountDevicesCommand(
213 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread,
214 const Callback& callback);
215
216 private:
217 friend struct content::BrowserThread::DeleteOnThread<
218 content::BrowserThread::UI>;
219 friend class base::DeleteHelper<AdbCountDevicesCommand>;
220
221 virtual ~AdbCountDevicesCommand();
222 void RequestAdbDeviceCount();
223 void ReceivedAdbDeviceCount(int result, const std::string& response);
224 void Respond(int count);
225
226 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread_;
227 Callback callback_;
228 };
229
230 AdbCountDevicesCommand::AdbCountDevicesCommand(
231 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread,
232 const Callback& callback)
233 : adb_thread_(adb_thread),
234 callback_(callback) {
235 adb_thread_->message_loop()->PostTask(
236 FROM_HERE, base::Bind(&AdbCountDevicesCommand::RequestAdbDeviceCount,
237 this));
238 }
239
240 AdbCountDevicesCommand::~AdbCountDevicesCommand() {
241 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
242 }
243
244 void AdbCountDevicesCommand::RequestAdbDeviceCount() {
245 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
246 AdbClientSocket::AdbQuery(
247 kAdbPort, kHostDevicesCommand,
248 base::Bind(&AdbCountDevicesCommand::ReceivedAdbDeviceCount, this));
249 }
250
251 void AdbCountDevicesCommand::ReceivedAdbDeviceCount(
252 int result,
253 const std::string& response) {
254 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
255 std::vector<std::string> serials;
256 Tokenize(response, "\n", &serials);
257 BrowserThread::PostTask(
258 BrowserThread::UI, FROM_HERE,
259 base::Bind(&AdbCountDevicesCommand::Respond, this, serials.size()));
260 }
261
262 void AdbCountDevicesCommand::Respond(int count) {
263 callback_.Run(count);
264 }
265
266
267 // AdbPagesCommand ------------------------------------------------------------ 73 // AdbPagesCommand ------------------------------------------------------------
268 74
269 class AdbPagesCommand : public base::RefCountedThreadSafe< 75 class AdbPagesCommand : public base::RefCountedThreadSafe<
270 AdbPagesCommand, 76 AdbPagesCommand,
271 content::BrowserThread::DeleteOnUIThread> { 77 BrowserThread::DeleteOnUIThread> {
272 public: 78 public:
273 typedef base::Callback<void(DevToolsAdbBridge::RemoteDevices*)> Callback; 79 typedef base::Callback<void(DevToolsAdbBridge::RemoteDevices*)> Callback;
274 80
275 AdbPagesCommand( 81 AdbPagesCommand(
276 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 82 scoped_refptr<RefCountedAdbThread> adb_thread,
277 crypto::RSAPrivateKey* rsa_key, bool discover_usb, 83 const DevToolsAdbBridge::DeviceProviders& device_providers,
278 const Callback& callback); 84 const Callback& callback);
279 85
280 private: 86 private:
281 friend struct content::BrowserThread::DeleteOnThread< 87 friend struct BrowserThread::DeleteOnThread<
282 content::BrowserThread::UI>; 88 BrowserThread::UI>;
283 friend class base::DeleteHelper<AdbPagesCommand>; 89 friend class base::DeleteHelper<AdbPagesCommand>;
284 90
285 virtual ~AdbPagesCommand(); 91 virtual ~AdbPagesCommand();
286 void ReceivedUsbDevices(const AndroidUsbDevices& usb_devices); 92 void ProcessDeviceProviders();
287 void WrapUsbDevices(const AndroidUsbDevices& usb_devices); 93 void ReceivedDevices(const AndroidDevices& devices);
288 94
289 void ReceivedAdbDevices(int result, const std::string& response);
290 void ProcessSerials(); 95 void ProcessSerials();
291 void ReceivedModel(int result, const std::string& response); 96 void ReceivedModel(int result, const std::string& response);
292 void ReceivedSockets(int result, const std::string& response); 97 void ReceivedSockets(int result, const std::string& response);
293 void ReceivedDumpsys(int result, const std::string& response); 98 void ReceivedDumpsys(int result, const std::string& response);
294 void ReceivedProcesses(int result, const std::string& response); 99 void ReceivedProcesses(int result, const std::string& response);
295 void ProcessSockets(); 100 void ProcessSockets();
296 void ReceivedVersion(int result, const std::string& response); 101 void ReceivedVersion(int result, const std::string& response);
297 void ReceivedPages(int result, const std::string& response); 102 void ReceivedPages(int result, const std::string& response);
298 void Respond(); 103 void Respond();
299 void ParseSocketsList(const std::string& response); 104 void ParseSocketsList(const std::string& response);
300 void ParseProcessList(const std::string& response); 105 void ParseProcessList(const std::string& response);
301 void ParseDumpsysResponse(const std::string& response); 106 void ParseDumpsysResponse(const std::string& response);
302 void ParseScreenSize(const std::string& str); 107 void ParseScreenSize(const std::string& str);
303 108
304 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread_; 109 scoped_refptr<RefCountedAdbThread> adb_thread_;
305 Callback callback_; 110 Callback callback_;
306 AndroidDevices devices_; 111 AndroidDevices devices_;
307 DevToolsAdbBridge::RemoteBrowsers browsers_; 112 DevToolsAdbBridge::RemoteBrowsers browsers_;
308 scoped_ptr<DevToolsAdbBridge::RemoteDevices> remote_devices_; 113 scoped_ptr<DevToolsAdbBridge::RemoteDevices> remote_devices_;
114 DevToolsAdbBridge::DeviceProviders device_providers_;
309 }; 115 };
310 116
311 AdbPagesCommand::AdbPagesCommand( 117 AdbPagesCommand::AdbPagesCommand(
312 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 118 scoped_refptr<RefCountedAdbThread> adb_thread,
313 crypto::RSAPrivateKey* rsa_key, bool discover_usb, 119 const DevToolsAdbBridge::DeviceProviders& device_providers,
314 const Callback& callback) 120 const Callback& callback)
315 : adb_thread_(adb_thread), 121 : adb_thread_(adb_thread),
316 callback_(callback) { 122 callback_(callback),
123 device_providers_(device_providers){
317 remote_devices_.reset(new DevToolsAdbBridge::RemoteDevices()); 124 remote_devices_.reset(new DevToolsAdbBridge::RemoteDevices());
318 125
319 if (discover_usb) { 126 ProcessDeviceProviders();
320 AndroidUsbDevice::Enumerate(rsa_key,
321 base::Bind(&AdbPagesCommand::ReceivedUsbDevices, this));
322 } else {
323 ReceivedUsbDevices(AndroidUsbDevices());
324 }
325 } 127 }
326 128
327 AdbPagesCommand::~AdbPagesCommand() { 129 AdbPagesCommand::~AdbPagesCommand() {
328 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 130 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
329 } 131 }
330 132
331 void AdbPagesCommand::ReceivedUsbDevices(const AndroidUsbDevices& usb_devices) { 133 void AdbPagesCommand::ProcessDeviceProviders() {
332 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 134 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
333 adb_thread_->message_loop()->PostTask( 135 if (device_providers_.empty()) {
334 FROM_HERE, base::Bind(&AdbPagesCommand::WrapUsbDevices, this, 136 adb_thread_->message_loop()->PostTask(
335 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));
336 } 146 }
337 147
338 void AdbPagesCommand::WrapUsbDevices(const AndroidUsbDevices& usb_devices) { 148 void AdbPagesCommand::ReceivedDevices(const AndroidDevices& devices) {
339 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();
340 152
341 #if defined(DEBUG_DEVTOOLS) 153 devices_.insert(devices_.end(), devices.begin(), devices.end());
342 devices_.push_back(new AdbDeviceImpl("", true)); // For desktop debugging.
343 #endif // defined(DEBUG_DEVTOOLS)
344 154
345 for (AndroidUsbDevices::const_iterator it = usb_devices.begin(); 155 if (!device_providers_.empty()) {
346 it != usb_devices.end(); ++it) { 156 ProcessDeviceProviders();
347 devices_.push_back(new UsbDeviceImpl(*it)); 157 } else {
158 adb_thread_->message_loop()->PostTask(
159 FROM_HERE, base::Bind(&AdbPagesCommand::ProcessSerials, this));
348 } 160 }
349
350 AdbClientSocket::AdbQuery(
351 kAdbPort, kHostDevicesCommand,
352 base::Bind(&AdbPagesCommand::ReceivedAdbDevices, this));
353 }
354
355 void AdbPagesCommand::ReceivedAdbDevices(
356 int result,
357 const std::string& response) {
358 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
359 std::vector<std::string> serials;
360 Tokenize(response, "\n", &serials);
361 for (size_t i = 0; i < serials.size(); ++i) {
362 std::vector<std::string> tokens;
363 Tokenize(serials[i], "\t ", &tokens);
364 bool offline = tokens.size() > 1 && tokens[1] == "offline";
365 devices_.push_back(new AdbDeviceImpl(tokens[0], !offline));
366 }
367 ProcessSerials();
368 } 161 }
369 162
370 void AdbPagesCommand::ProcessSerials() { 163 void AdbPagesCommand::ProcessSerials() {
371 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 164 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
372 if (devices_.size() == 0) { 165 if (devices_.size() == 0) {
373 BrowserThread::PostTask( 166 BrowserThread::PostTask(
374 BrowserThread::UI, FROM_HERE, 167 BrowserThread::UI, FROM_HERE,
375 base::Bind(&AdbPagesCommand::Respond, this)); 168 base::Bind(&AdbPagesCommand::Respond, this));
376 return; 169 return;
377 } 170 }
378 171
379 #if defined(DEBUG_DEVTOOLS) 172 #if defined(DEBUG_DEVTOOLS)
380 // For desktop remote debugging. 173 // For desktop remote debugging.
381 if (devices_.back()->serial().empty()) { 174 if (devices_.back()->serial().empty()) {
382 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = 175 scoped_refptr<AndroidDevice> device =
383 devices_.back(); 176 devices_.back();
384 device->set_model(kLocalChrome); 177 device->set_model(kLocalChrome);
385 remote_devices_->push_back( 178 remote_devices_->push_back(
386 new DevToolsAdbBridge::RemoteDevice(device)); 179 new DevToolsAdbBridge::RemoteDevice(device));
387 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> remote_browser = 180 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> remote_browser =
388 new DevToolsAdbBridge::RemoteBrowser( 181 new DevToolsAdbBridge::RemoteBrowser(
389 adb_thread_, device, std::string()); 182 adb_thread_, device, std::string());
390 remote_browser->set_product(kChrome); 183 remote_browser->set_product(kChrome);
391 remote_devices_->back()->AddBrowser(remote_browser); 184 remote_devices_->back()->AddBrowser(remote_browser);
392 browsers_.push_back(remote_browser); 185 browsers_.push_back(remote_browser);
393 device->HttpQuery( 186 device->HttpQuery(
394 std::string(), kVersionRequest, 187 std::string(), kVersionRequest,
395 base::Bind(&AdbPagesCommand::ReceivedVersion, this)); 188 base::Bind(&AdbPagesCommand::ReceivedVersion, this));
396 return; 189 return;
397 } 190 }
398 #endif // defined(DEBUG_DEVTOOLS) 191 #endif // defined(DEBUG_DEVTOOLS)
399 192
400 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 193 scoped_refptr<AndroidDevice> device = devices_.back();
401 if (device->is_connected()) { 194 if (device->is_connected()) {
402 device->RunCommand(kDeviceModelCommand, 195 device->RunCommand(kDeviceModelCommand,
403 base::Bind(&AdbPagesCommand::ReceivedModel, this)); 196 base::Bind(&AdbPagesCommand::ReceivedModel, this));
404 } else { 197 } else {
405 remote_devices_->push_back(new DevToolsAdbBridge::RemoteDevice(device)); 198 remote_devices_->push_back(new DevToolsAdbBridge::RemoteDevice(device));
406 devices_.pop_back(); 199 devices_.pop_back();
407 ProcessSerials(); 200 ProcessSerials();
408 } 201 }
409 } 202 }
410 203
411 void AdbPagesCommand::ReceivedModel(int result, const std::string& response) { 204 void AdbPagesCommand::ReceivedModel(int result, const std::string& response) {
412 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 205 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
413 if (result < 0) { 206 if (result < 0) {
414 devices_.pop_back(); 207 devices_.pop_back();
415 ProcessSerials(); 208 ProcessSerials();
416 return; 209 return;
417 } 210 }
418 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 211 scoped_refptr<AndroidDevice> device = devices_.back();
419 device->set_model(response); 212 device->set_model(response);
420 remote_devices_->push_back( 213 remote_devices_->push_back(
421 new DevToolsAdbBridge::RemoteDevice(device)); 214 new DevToolsAdbBridge::RemoteDevice(device));
422 device->RunCommand(kOpenedUnixSocketsCommand, 215 device->RunCommand(kOpenedUnixSocketsCommand,
423 base::Bind(&AdbPagesCommand::ReceivedSockets, this)); 216 base::Bind(&AdbPagesCommand::ReceivedSockets, this));
424 } 217 }
425 218
426 void AdbPagesCommand::ReceivedSockets(int result, 219 void AdbPagesCommand::ReceivedSockets(int result,
427 const std::string& response) { 220 const std::string& response) {
428 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 221 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
429 if (result < 0) { 222 if (result < 0) {
430 devices_.pop_back(); 223 devices_.pop_back();
431 ProcessSerials(); 224 ProcessSerials();
432 return; 225 return;
433 } 226 }
434 227
435 ParseSocketsList(response); 228 ParseSocketsList(response);
436 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 229 scoped_refptr<AndroidDevice> device = devices_.back();
437 device->RunCommand(kDumpsysCommand, 230 device->RunCommand(kDumpsysCommand,
438 base::Bind(&AdbPagesCommand::ReceivedDumpsys, this)); 231 base::Bind(&AdbPagesCommand::ReceivedDumpsys, this));
439 } 232 }
440 233
441 void AdbPagesCommand::ReceivedDumpsys(int result, 234 void AdbPagesCommand::ReceivedDumpsys(int result,
442 const std::string& response) { 235 const std::string& response) {
443 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 236 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
444 if (result >= 0) 237 if (result >= 0)
445 ParseDumpsysResponse(response); 238 ParseDumpsysResponse(response);
446 239
447 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 240 scoped_refptr<AndroidDevice> device = devices_.back();
448 device->RunCommand(kListProcessesCommand, 241 device->RunCommand(kListProcessesCommand,
449 base::Bind(&AdbPagesCommand::ReceivedProcesses, this)); 242 base::Bind(&AdbPagesCommand::ReceivedProcesses, this));
450 } 243 }
451 244
452 void AdbPagesCommand::ReceivedProcesses(int result, 245 void AdbPagesCommand::ReceivedProcesses(int result,
453 const std::string& response) { 246 const std::string& response) {
454 if (result >= 0) 247 if (result >= 0)
455 ParseProcessList(response); 248 ParseProcessList(response);
456 249
457 if (browsers_.size() == 0) { 250 if (browsers_.size() == 0) {
458 devices_.pop_back(); 251 devices_.pop_back();
459 ProcessSerials(); 252 ProcessSerials();
460 } else { 253 } else {
461 ProcessSockets(); 254 ProcessSockets();
462 } 255 }
463 } 256 }
464 257
465 void AdbPagesCommand::ProcessSockets() { 258 void AdbPagesCommand::ProcessSockets() {
466 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 259 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
467 if (browsers_.size() == 0) { 260 if (browsers_.size() == 0) {
468 devices_.pop_back(); 261 devices_.pop_back();
469 ProcessSerials(); 262 ProcessSerials();
470 } else { 263 } else {
471 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 264 scoped_refptr<AndroidDevice> device = devices_.back();
472 device->HttpQuery(browsers_.back()->socket(), kVersionRequest, 265 device->HttpQuery(browsers_.back()->socket(), kVersionRequest,
473 base::Bind(&AdbPagesCommand::ReceivedVersion, this)); 266 base::Bind(&AdbPagesCommand::ReceivedVersion, this));
474 } 267 }
475 } 268 }
476 269
477 void AdbPagesCommand::ReceivedVersion(int result, 270 void AdbPagesCommand::ReceivedVersion(int result,
478 const std::string& response) { 271 const std::string& response) {
479 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 272 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
480 if (result < 0) { 273 if (result < 0) {
481 browsers_.pop_back(); 274 browsers_.pop_back();
(...skipping 12 matching lines...) Expand all
494 if (parts.size() == 2) { 287 if (parts.size() == 2) {
495 if (parts[0] != "Version") // WebView has this for legacy reasons. 288 if (parts[0] != "Version") // WebView has this for legacy reasons.
496 browsers_.back()->set_product(parts[0]); 289 browsers_.back()->set_product(parts[0]);
497 browsers_.back()->set_version(parts[1]); 290 browsers_.back()->set_version(parts[1]);
498 } else { 291 } else {
499 browsers_.back()->set_version(browser); 292 browsers_.back()->set_version(browser);
500 } 293 }
501 } 294 }
502 } 295 }
503 296
504 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 297 scoped_refptr<AndroidDevice> device = devices_.back();
505 device->HttpQuery(browsers_.back()->socket(), kPageListRequest, 298 device->HttpQuery(browsers_.back()->socket(), kPageListRequest,
506 base::Bind(&AdbPagesCommand::ReceivedPages, this)); 299 base::Bind(&AdbPagesCommand::ReceivedPages, this));
507 } 300 }
508 301
509 void AdbPagesCommand::ReceivedPages(int result, 302 void AdbPagesCommand::ReceivedPages(int result,
510 const std::string& response) { 303 const std::string& response) {
511 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 304 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
512 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> browser = browsers_.back(); 305 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> browser = browsers_.back();
513 browsers_.pop_back(); 306 browsers_.pop_back();
514 if (result < 0) { 307 if (result < 0) {
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 440
648 remote_devices_->back()->set_screen_size(gfx::Size(width, height)); 441 remote_devices_->back()->set_screen_size(gfx::Size(width, height));
649 } 442 }
650 443
651 444
652 // AdbProtocolCommand --------------------------------------------------------- 445 // AdbProtocolCommand ---------------------------------------------------------
653 446
654 class AdbProtocolCommand : public AdbWebSocket::Delegate { 447 class AdbProtocolCommand : public AdbWebSocket::Delegate {
655 public: 448 public:
656 AdbProtocolCommand( 449 AdbProtocolCommand(
657 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 450 scoped_refptr<RefCountedAdbThread> adb_thread,
658 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, 451 scoped_refptr<AndroidDevice> device,
659 const std::string& socket_name, 452 const std::string& socket_name,
660 const std::string& debug_url, 453 const std::string& debug_url,
661 const std::string& command); 454 const std::string& command);
662 455
663 private: 456 private:
664 virtual void OnSocketOpened() OVERRIDE; 457 virtual void OnSocketOpened() OVERRIDE;
665 virtual void OnFrameRead(const std::string& message) OVERRIDE; 458 virtual void OnFrameRead(const std::string& message) OVERRIDE;
666 virtual void OnSocketClosed(bool closed_by_device) OVERRIDE; 459 virtual void OnSocketClosed(bool closed_by_device) OVERRIDE;
667 virtual bool ProcessIncomingMessage(const std::string& message) OVERRIDE; 460 virtual bool ProcessIncomingMessage(const std::string& message) OVERRIDE;
668 461
669 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread_; 462 scoped_refptr<RefCountedAdbThread> adb_thread_;
670 const std::string command_; 463 const std::string command_;
671 scoped_refptr<AdbWebSocket> web_socket_; 464 scoped_refptr<AdbWebSocket> web_socket_;
672 465
673 DISALLOW_COPY_AND_ASSIGN(AdbProtocolCommand); 466 DISALLOW_COPY_AND_ASSIGN(AdbProtocolCommand);
674 }; 467 };
675 468
676 AdbProtocolCommand::AdbProtocolCommand( 469 AdbProtocolCommand::AdbProtocolCommand(
677 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 470 scoped_refptr<RefCountedAdbThread> adb_thread,
678 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, 471 scoped_refptr<AndroidDevice> device,
679 const std::string& socket_name, 472 const std::string& socket_name,
680 const std::string& debug_url, 473 const std::string& debug_url,
681 const std::string& command) 474 const std::string& command)
682 : adb_thread_(adb_thread), 475 : adb_thread_(adb_thread),
683 command_(command) { 476 command_(command) {
684 web_socket_ = new AdbWebSocket( 477 web_socket_ = new AdbWebSocket(
685 device, socket_name, debug_url, adb_thread_->message_loop(), this); 478 device, socket_name, debug_url, adb_thread_->message_loop(), this);
686 } 479 }
687 480
688 void AdbProtocolCommand::OnSocketOpened() { 481 void AdbProtocolCommand::OnSocketOpened() {
(...skipping 15 matching lines...) Expand all
704 497
705 const char kDevToolsChannelNameFormat[] = "%s_devtools_remote"; 498 const char kDevToolsChannelNameFormat[] = "%s_devtools_remote";
706 499
707 class AgentHostDelegate; 500 class AgentHostDelegate;
708 501
709 typedef std::map<std::string, AgentHostDelegate*> AgentHostDelegates; 502 typedef std::map<std::string, AgentHostDelegate*> AgentHostDelegates;
710 503
711 base::LazyInstance<AgentHostDelegates>::Leaky g_host_delegates = 504 base::LazyInstance<AgentHostDelegates>::Leaky g_host_delegates =
712 LAZY_INSTANCE_INITIALIZER; 505 LAZY_INSTANCE_INITIALIZER;
713 506
714 DevToolsAdbBridge::Wrapper::Wrapper(Profile* profile) 507 DevToolsAdbBridge::Wrapper::Wrapper() {
715 : bridge_(new DevToolsAdbBridge(profile)) { 508 bridge_ = new DevToolsAdbBridge();
716 } 509 }
717 510
718 DevToolsAdbBridge::Wrapper::~Wrapper() { 511 DevToolsAdbBridge::Wrapper::~Wrapper() {
719 } 512 }
720 513
721 DevToolsAdbBridge* DevToolsAdbBridge::Wrapper::Get() { 514 DevToolsAdbBridge* DevToolsAdbBridge::Wrapper::Get() {
722 return bridge_.get(); 515 return bridge_.get();
723 } 516 }
724 517
725 // static 518 // static
(...skipping 13 matching lines...) Expand all
739 DevToolsAdbBridge::Factory::Factory() 532 DevToolsAdbBridge::Factory::Factory()
740 : BrowserContextKeyedServiceFactory( 533 : BrowserContextKeyedServiceFactory(
741 "DevToolsAdbBridge", 534 "DevToolsAdbBridge",
742 BrowserContextDependencyManager::GetInstance()) {} 535 BrowserContextDependencyManager::GetInstance()) {}
743 536
744 DevToolsAdbBridge::Factory::~Factory() {} 537 DevToolsAdbBridge::Factory::~Factory() {}
745 538
746 BrowserContextKeyedService* 539 BrowserContextKeyedService*
747 DevToolsAdbBridge::Factory::BuildServiceInstanceFor( 540 DevToolsAdbBridge::Factory::BuildServiceInstanceFor(
748 content::BrowserContext* context) const { 541 content::BrowserContext* context) const {
749 return new DevToolsAdbBridge::Wrapper(Profile::FromBrowserContext(context)); 542 return new DevToolsAdbBridge::Wrapper();
750 } 543 }
751 544
752 545
753 // DevToolsAdbBridge::AndroidDevice -------------------------------------------
754
755 DevToolsAdbBridge::AndroidDevice::AndroidDevice(const std::string& serial,
756 bool is_connected)
757 : serial_(serial),
758 is_connected_(is_connected) {
759 }
760
761 void DevToolsAdbBridge::AndroidDevice::HttpQuery(
762 const std::string& la_name,
763 const std::string& request,
764 const CommandCallback& callback) {
765 OpenSocket(la_name, base::Bind(&AndroidDevice::OnHttpSocketOpened, this,
766 request, callback));
767 }
768
769 void DevToolsAdbBridge::AndroidDevice::HttpUpgrade(
770 const std::string& la_name,
771 const std::string& request,
772 const SocketCallback& callback) {
773 OpenSocket(la_name, base::Bind(&AndroidDevice::OnHttpSocketOpened2, this,
774 request, callback));
775 }
776
777 DevToolsAdbBridge::AndroidDevice::~AndroidDevice() {
778 }
779
780 void DevToolsAdbBridge::AndroidDevice::OnHttpSocketOpened(
781 const std::string& request,
782 const CommandCallback& callback,
783 int result,
784 net::StreamSocket* socket) {
785 if (result != net::OK) {
786 callback.Run(result, std::string());
787 return;
788 }
789 AdbClientSocket::HttpQuery(socket, request, callback);
790 }
791
792 void DevToolsAdbBridge::AndroidDevice::OnHttpSocketOpened2(
793 const std::string& request,
794 const SocketCallback& callback,
795 int result,
796 net::StreamSocket* socket) {
797 if (result != net::OK) {
798 callback.Run(result, NULL);
799 return;
800 }
801 AdbClientSocket::HttpQuery(socket, request, callback);
802 }
803
804
805 // AgentHostDelegate ---------------------------------------------------------- 546 // AgentHostDelegate ----------------------------------------------------------
806 547
807 class AgentHostDelegate : public content::DevToolsExternalAgentProxyDelegate, 548 class AgentHostDelegate : public content::DevToolsExternalAgentProxyDelegate,
808 public AdbWebSocket::Delegate { 549 public AdbWebSocket::Delegate {
809 public: 550 public:
810 AgentHostDelegate( 551 AgentHostDelegate(
811 const std::string& id, 552 const std::string& id,
812 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, 553 scoped_refptr<AndroidDevice> device,
813 const std::string& socket_name, 554 const std::string& socket_name,
814 const std::string& debug_url, 555 const std::string& debug_url,
815 const std::string& frontend_url, 556 const std::string& frontend_url,
816 base::MessageLoop* adb_message_loop, 557 base::MessageLoop* adb_message_loop,
817 Profile* profile) 558 Profile* profile)
818 : id_(id), 559 : id_(id),
819 serial_(device->serial()), 560 serial_(device->serial()),
820 frontend_url_(frontend_url), 561 frontend_url_(frontend_url),
821 adb_message_loop_(adb_message_loop), 562 adb_message_loop_(adb_message_loop),
822 profile_(profile) { 563 profile_(profile) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 615
875 scoped_ptr<content::DevToolsExternalAgentProxy> proxy_; 616 scoped_ptr<content::DevToolsExternalAgentProxy> proxy_;
876 scoped_refptr<AdbWebSocket> web_socket_; 617 scoped_refptr<AdbWebSocket> web_socket_;
877 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate); 618 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate);
878 }; 619 };
879 620
880 621
881 // DevToolsAdbBridge::RemotePage ---------------------------------------------- 622 // DevToolsAdbBridge::RemotePage ----------------------------------------------
882 623
883 DevToolsAdbBridge::RemotePage::RemotePage( 624 DevToolsAdbBridge::RemotePage::RemotePage(
884 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 625 scoped_refptr<RefCountedAdbThread> adb_thread,
885 scoped_refptr<AndroidDevice> device, 626 scoped_refptr<AndroidDevice> device,
886 const std::string& socket, 627 const std::string& socket,
887 const base::DictionaryValue& value) 628 const base::DictionaryValue& value)
888 : adb_thread_(adb_thread), 629 : adb_thread_(adb_thread),
889 device_(device), 630 device_(device),
890 socket_(socket) { 631 socket_(socket) {
891 value.GetString("id", &id_); 632 value.GetString("id", &id_);
892 value.GetString("url", &url_); 633 value.GetString("url", &url_);
893 value.GetString("title", &title_); 634 value.GetString("title", &title_);
894 value.GetString("description", &description_); 635 value.GetString("description", &description_);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
958 return; 699 return;
959 DevToolsProtocol::Command command(1, method, params); 700 DevToolsProtocol::Command command(1, method, params);
960 new AdbProtocolCommand( 701 new AdbProtocolCommand(
961 adb_thread_, device_, socket_, debug_url_, command.Serialize()); 702 adb_thread_, device_, socket_, debug_url_, command.Serialize());
962 } 703 }
963 704
964 DevToolsAdbBridge::RemotePage::~RemotePage() { 705 DevToolsAdbBridge::RemotePage::~RemotePage() {
965 } 706 }
966 707
967 void DevToolsAdbBridge::RemotePage::RequestActivate( 708 void DevToolsAdbBridge::RemotePage::RequestActivate(
968 const CommandCallback& callback) { 709 const AndroidDevice::CommandCallback& callback) {
969 std::string request = base::StringPrintf(kActivatePageRequest, id_.c_str()); 710 std::string request = base::StringPrintf(kActivatePageRequest, id_.c_str());
970 adb_thread_->message_loop()->PostTask(FROM_HERE, 711 adb_thread_->message_loop()->PostTask(FROM_HERE,
971 base::Bind(&AndroidDevice::HttpQuery, 712 base::Bind(&AndroidDevice::HttpQuery,
972 device_, socket_, request, callback)); 713 device_, socket_, request, callback));
973 } 714 }
974 715
975 void DevToolsAdbBridge::RemotePage::InspectOnHandlerThread( 716 void DevToolsAdbBridge::RemotePage::InspectOnHandlerThread(
976 Profile* profile, int result, const std::string& response) { 717 Profile* profile, int result, const std::string& response) {
977 BrowserThread::PostTask( 718 BrowserThread::PostTask(
978 BrowserThread::UI, FROM_HERE, 719 BrowserThread::UI, FROM_HERE,
(...skipping 10 matching lines...) Expand all
989 new AgentHostDelegate( 730 new AgentHostDelegate(
990 agent_id_, device_, socket_, debug_url_, 731 agent_id_, device_, socket_, debug_url_,
991 frontend_url_, adb_thread_->message_loop(), profile); 732 frontend_url_, adb_thread_->message_loop(), profile);
992 } 733 }
993 } 734 }
994 735
995 736
996 // DevToolsAdbBridge::RemoteBrowser ------------------------------------------- 737 // DevToolsAdbBridge::RemoteBrowser -------------------------------------------
997 738
998 DevToolsAdbBridge::RemoteBrowser::RemoteBrowser( 739 DevToolsAdbBridge::RemoteBrowser::RemoteBrowser(
999 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 740 scoped_refptr<RefCountedAdbThread> adb_thread,
1000 scoped_refptr<AndroidDevice> device, 741 scoped_refptr<AndroidDevice> device,
1001 const std::string& socket) 742 const std::string& socket)
1002 : adb_thread_(adb_thread), 743 : adb_thread_(adb_thread),
1003 device_(device), 744 device_(device),
1004 socket_(socket) { 745 socket_(socket) {
1005 } 746 }
1006 747
1007 void DevToolsAdbBridge::RemoteBrowser::Open(const std::string& url) { 748 void DevToolsAdbBridge::RemoteBrowser::Open(const std::string& url) {
1008 adb_thread_->message_loop()->PostTask(FROM_HERE, 749 adb_thread_->message_loop()->PostTask(FROM_HERE,
1009 base::Bind(&AndroidDevice::HttpQuery, 750 base::Bind(&AndroidDevice::HttpQuery,
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 799
1059 void DevToolsAdbBridge::RemoteDevice::AddBrowser( 800 void DevToolsAdbBridge::RemoteDevice::AddBrowser(
1060 scoped_refptr<RemoteBrowser> browser) { 801 scoped_refptr<RemoteBrowser> browser) {
1061 browsers_.push_back(browser); 802 browsers_.push_back(browser);
1062 } 803 }
1063 804
1064 DevToolsAdbBridge::RemoteDevice::~RemoteDevice() { 805 DevToolsAdbBridge::RemoteDevice::~RemoteDevice() {
1065 } 806 }
1066 807
1067 808
1068 // DevToolsAdbBridge::RefCountedAdbThread -------------------------------------
1069
1070 DevToolsAdbBridge::RefCountedAdbThread*
1071 DevToolsAdbBridge::RefCountedAdbThread::instance_ = NULL;
1072
1073 // static
1074 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread>
1075 DevToolsAdbBridge::RefCountedAdbThread::GetInstance() {
1076 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1077 if (!instance_)
1078 new RefCountedAdbThread();
1079 return instance_;
1080 }
1081
1082 DevToolsAdbBridge::RefCountedAdbThread::RefCountedAdbThread() {
1083 instance_ = this;
1084 thread_ = new base::Thread(kDevToolsAdbBridgeThreadName);
1085 base::Thread::Options options;
1086 options.message_loop_type = base::MessageLoop::TYPE_IO;
1087 if (!thread_->StartWithOptions(options)) {
1088 delete thread_;
1089 thread_ = NULL;
1090 }
1091 }
1092
1093 base::MessageLoop* DevToolsAdbBridge::RefCountedAdbThread::message_loop() {
1094 return thread_ ? thread_->message_loop() : NULL;
1095 }
1096
1097 // static
1098 void DevToolsAdbBridge::RefCountedAdbThread::StopThread(base::Thread* thread) {
1099 thread->Stop();
1100 }
1101
1102 DevToolsAdbBridge::RefCountedAdbThread::~RefCountedAdbThread() {
1103 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1104 instance_ = NULL;
1105 if (!thread_)
1106 return;
1107 // Shut down thread on FILE thread to join into IO.
1108 BrowserThread::PostTask(
1109 BrowserThread::FILE, FROM_HERE,
1110 base::Bind(&RefCountedAdbThread::StopThread, thread_));
1111 }
1112
1113
1114 // DevToolsAdbBridge ---------------------------------------------------------- 809 // DevToolsAdbBridge ----------------------------------------------------------
1115 810
1116 DevToolsAdbBridge::DevToolsAdbBridge(Profile* profile) 811 DevToolsAdbBridge::DevToolsAdbBridge()
1117 : adb_thread_(RefCountedAdbThread::GetInstance()), 812 : adb_thread_(RefCountedAdbThread::GetInstance()),
1118 has_message_loop_(adb_thread_->message_loop() != NULL), 813 has_message_loop_(adb_thread_->message_loop() != NULL) {
1119 discover_usb_devices_(false) {
1120 rsa_key_.reset(AndroidRSAPrivateKey(profile));
1121 } 814 }
1122 815
1123 void DevToolsAdbBridge::AddListener(Listener* listener) { 816 void DevToolsAdbBridge::AddListener(Listener* listener) {
1124 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 817 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1125 if (listeners_.empty()) 818 if (listeners_.empty())
1126 RequestRemoteDevices(); 819 RequestRemoteDevices();
1127 listeners_.push_back(listener); 820 listeners_.push_back(listener);
1128 } 821 }
1129 822
1130 void DevToolsAdbBridge::RemoveListener(Listener* listener) { 823 void DevToolsAdbBridge::RemoveListener(Listener* listener) {
1131 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 824 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1132 Listeners::iterator it = 825 Listeners::iterator it =
1133 std::find(listeners_.begin(), listeners_.end(), listener); 826 std::find(listeners_.begin(), listeners_.end(), listener);
1134 DCHECK(it != listeners_.end()); 827 DCHECK(it != listeners_.end());
1135 listeners_.erase(it); 828 listeners_.erase(it);
1136 } 829 }
1137 830
1138 void DevToolsAdbBridge::CountDevices(
1139 const base::Callback<void(int)>& callback) {
1140 if (discover_usb_devices_) {
1141 // Count raw devices, adb included.
1142 AndroidUsbDevice::CountDevices(callback);
1143 return;
1144 }
1145 new AdbCountDevicesCommand(adb_thread_, callback);
1146 }
1147
1148 DevToolsAdbBridge::~DevToolsAdbBridge() { 831 DevToolsAdbBridge::~DevToolsAdbBridge() {
1149 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 832 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1150 DCHECK(listeners_.empty()); 833 DCHECK(listeners_.empty());
1151 } 834 }
1152 835
1153 void DevToolsAdbBridge::RequestRemoteDevices() { 836 void DevToolsAdbBridge::RequestRemoteDevices() {
1154 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 837 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1155 if (!has_message_loop_) 838 if (!has_message_loop_)
1156 return; 839 return;
840
1157 new AdbPagesCommand( 841 new AdbPagesCommand(
1158 adb_thread_, rsa_key_.get(), discover_usb_devices_, 842 adb_thread_, device_providers_,
1159 base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this)); 843 base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this));
1160 } 844 }
1161 845
1162 void DevToolsAdbBridge::ReceivedRemoteDevices(RemoteDevices* devices_ptr) { 846 void DevToolsAdbBridge::ReceivedRemoteDevices(RemoteDevices* devices_ptr) {
1163 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 847 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1164 848
1165 scoped_ptr<RemoteDevices> devices(devices_ptr); 849 scoped_ptr<RemoteDevices> devices(devices_ptr);
1166 850
1167 Listeners copy(listeners_); 851 Listeners copy(listeners_);
1168 for (Listeners::iterator it = copy.begin(); it != copy.end(); ++it) 852 for (Listeners::iterator it = copy.begin(); it != copy.end(); ++it)
1169 (*it)->RemoteDevicesChanged(devices.get()); 853 (*it)->RemoteDevicesChanged(devices.get());
1170 854
1171 if (listeners_.empty()) 855 if (listeners_.empty())
1172 return; 856 return;
1173 857
1174 BrowserThread::PostDelayedTask( 858 BrowserThread::PostDelayedTask(
1175 BrowserThread::UI, 859 BrowserThread::UI,
1176 FROM_HERE, 860 FROM_HERE,
1177 base::Bind(&DevToolsAdbBridge::RequestRemoteDevices, this), 861 base::Bind(&DevToolsAdbBridge::RequestRemoteDevices, this),
1178 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); 862 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs));
1179 } 863 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698