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

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: Removed unused constants, thus fixed compile errors. Created 7 years, 1 month 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;
60 const int kBufferSize = 16 * 1024;
61 const int kAdbPollingIntervalMs = 1000; 55 const int kAdbPollingIntervalMs = 1000;
62 56
63 const char kUrlParam[] = "url"; 57 const char kUrlParam[] = "url";
64 const char kPageReloadCommand[] = "Page.reload"; 58 const char kPageReloadCommand[] = "Page.reload";
65 const char kPageNavigateCommand[] = "Page.navigate"; 59 const char kPageNavigateCommand[] = "Page.navigate";
66 60
67 #if defined(DEBUG_DEVTOOLS) 61 #if defined(DEBUG_DEVTOOLS)
68 const char kChrome[] = "Chrome"; 62 const char kChrome[] = "Chrome";
69 const char kLocalChrome[] = "Local Chrome"; 63 const char kLocalChrome[] = "Local Chrome";
70 #endif // defined(DEBUG_DEVTOOLS) 64 #endif // defined(DEBUG_DEVTOOLS)
71 65
72 typedef DevToolsAdbBridge::Callback Callback; 66 typedef DevToolsAdbBridge::Callback Callback;
73 typedef std::vector<scoped_refptr<DevToolsAdbBridge::AndroidDevice> > 67 typedef std::vector<scoped_refptr<AndroidDevice> >
74 AndroidDevices; 68 AndroidDevices;
75 typedef base::Callback<void(const AndroidDevices&)> AndroidDevicesCallback; 69 typedef base::Callback<void(const AndroidDevices&)> AndroidDevicesCallback;
76 70
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 ------------------------------------------------------------ 71 // AdbPagesCommand ------------------------------------------------------------
268 72
269 class AdbPagesCommand : public base::RefCountedThreadSafe< 73 class AdbPagesCommand : public base::RefCountedThreadSafe<
270 AdbPagesCommand, 74 AdbPagesCommand,
271 content::BrowserThread::DeleteOnUIThread> { 75 BrowserThread::DeleteOnUIThread> {
272 public: 76 public:
273 typedef base::Callback<void(DevToolsAdbBridge::RemoteDevices*)> Callback; 77 typedef base::Callback<void(DevToolsAdbBridge::RemoteDevices*)> Callback;
274 78
275 AdbPagesCommand( 79 AdbPagesCommand(
276 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 80 scoped_refptr<RefCountedAdbThread> adb_thread,
277 crypto::RSAPrivateKey* rsa_key, bool discover_usb, 81 const DevToolsAdbBridge::DeviceProviders& device_providers,
278 const Callback& callback); 82 const Callback& callback);
279 83
280 private: 84 private:
281 friend struct content::BrowserThread::DeleteOnThread< 85 friend struct BrowserThread::DeleteOnThread<
282 content::BrowserThread::UI>; 86 BrowserThread::UI>;
283 friend class base::DeleteHelper<AdbPagesCommand>; 87 friend class base::DeleteHelper<AdbPagesCommand>;
284 88
285 virtual ~AdbPagesCommand(); 89 virtual ~AdbPagesCommand();
286 void ReceivedUsbDevices(const AndroidUsbDevices& usb_devices); 90 void ProcessDeviceProviders();
287 void WrapUsbDevices(const AndroidUsbDevices& usb_devices); 91 void ReceivedDevices(const AndroidDevices& devices);
288 92
289 void ReceivedAdbDevices(int result, const std::string& response);
290 void ProcessSerials(); 93 void ProcessSerials();
291 void ReceivedModel(int result, const std::string& response); 94 void ReceivedModel(int result, const std::string& response);
292 void ReceivedSockets(int result, const std::string& response); 95 void ReceivedSockets(int result, const std::string& response);
293 void ReceivedDumpsys(int result, const std::string& response); 96 void ReceivedDumpsys(int result, const std::string& response);
294 void ReceivedProcesses(int result, const std::string& response); 97 void ReceivedProcesses(int result, const std::string& response);
295 void ProcessSockets(); 98 void ProcessSockets();
296 void ReceivedVersion(int result, const std::string& response); 99 void ReceivedVersion(int result, const std::string& response);
297 void ReceivedPages(int result, const std::string& response); 100 void ReceivedPages(int result, const std::string& response);
298 void Respond(); 101 void Respond();
299 void ParseSocketsList(const std::string& response); 102 void ParseSocketsList(const std::string& response);
300 void ParseProcessList(const std::string& response); 103 void ParseProcessList(const std::string& response);
301 void ParseDumpsysResponse(const std::string& response); 104 void ParseDumpsysResponse(const std::string& response);
302 void ParseScreenSize(const std::string& str); 105 void ParseScreenSize(const std::string& str);
303 106
304 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread_; 107 scoped_refptr<RefCountedAdbThread> adb_thread_;
305 Callback callback_; 108 Callback callback_;
306 AndroidDevices devices_; 109 AndroidDevices devices_;
307 DevToolsAdbBridge::RemoteBrowsers browsers_; 110 DevToolsAdbBridge::RemoteBrowsers browsers_;
308 scoped_ptr<DevToolsAdbBridge::RemoteDevices> remote_devices_; 111 scoped_ptr<DevToolsAdbBridge::RemoteDevices> remote_devices_;
112 DevToolsAdbBridge::DeviceProviders device_providers_;
309 }; 113 };
310 114
311 AdbPagesCommand::AdbPagesCommand( 115 AdbPagesCommand::AdbPagesCommand(
312 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 116 scoped_refptr<RefCountedAdbThread> adb_thread,
313 crypto::RSAPrivateKey* rsa_key, bool discover_usb, 117 const DevToolsAdbBridge::DeviceProviders& device_providers,
314 const Callback& callback) 118 const Callback& callback)
315 : adb_thread_(adb_thread), 119 : adb_thread_(adb_thread),
316 callback_(callback) { 120 callback_(callback),
121 device_providers_(device_providers){
317 remote_devices_.reset(new DevToolsAdbBridge::RemoteDevices()); 122 remote_devices_.reset(new DevToolsAdbBridge::RemoteDevices());
318 123
319 if (discover_usb) { 124 ProcessDeviceProviders();
320 AndroidUsbDevice::Enumerate(rsa_key,
321 base::Bind(&AdbPagesCommand::ReceivedUsbDevices, this));
322 } else {
323 ReceivedUsbDevices(AndroidUsbDevices());
324 }
325 } 125 }
326 126
327 AdbPagesCommand::~AdbPagesCommand() { 127 AdbPagesCommand::~AdbPagesCommand() {
328 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 128 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
329 } 129 }
330 130
331 void AdbPagesCommand::ReceivedUsbDevices(const AndroidUsbDevices& usb_devices) { 131 void AdbPagesCommand::ProcessDeviceProviders() {
332 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 132 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
333 adb_thread_->message_loop()->PostTask( 133 if (device_providers_.empty()) {
334 FROM_HERE, base::Bind(&AdbPagesCommand::WrapUsbDevices, this, 134 adb_thread_->message_loop()->PostTask(
335 usb_devices)); 135 FROM_HERE, base::Bind(&AdbPagesCommand::ProcessSerials, this));
136 return;
137 }
138
139 const scoped_refptr<AndroidDeviceProvider>& device_provider =
140 device_providers_.back();
141
142 device_provider->QueryDevices(
143 base::Bind(&AdbPagesCommand::ReceivedDevices, this));
336 } 144 }
337 145
338 void AdbPagesCommand::WrapUsbDevices(const AndroidUsbDevices& usb_devices) { 146 void AdbPagesCommand::ReceivedDevices(const AndroidDevices& devices) {
339 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 147 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
148 DCHECK(!device_providers_.empty());
149 device_providers_.pop_back();
340 150
341 #if defined(DEBUG_DEVTOOLS) 151 devices_.insert(devices_.end(), devices.begin(), devices.end());
342 devices_.push_back(new AdbDeviceImpl("", true)); // For desktop debugging.
343 #endif // defined(DEBUG_DEVTOOLS)
344 152
345 for (AndroidUsbDevices::const_iterator it = usb_devices.begin(); 153 if (!device_providers_.empty()) {
346 it != usb_devices.end(); ++it) { 154 ProcessDeviceProviders();
347 devices_.push_back(new UsbDeviceImpl(*it)); 155 } else {
156 adb_thread_->message_loop()->PostTask(
157 FROM_HERE, base::Bind(&AdbPagesCommand::ProcessSerials, this));
348 } 158 }
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 } 159 }
369 160
370 void AdbPagesCommand::ProcessSerials() { 161 void AdbPagesCommand::ProcessSerials() {
371 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 162 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
372 if (devices_.size() == 0) { 163 if (devices_.size() == 0) {
373 BrowserThread::PostTask( 164 BrowserThread::PostTask(
374 BrowserThread::UI, FROM_HERE, 165 BrowserThread::UI, FROM_HERE,
375 base::Bind(&AdbPagesCommand::Respond, this)); 166 base::Bind(&AdbPagesCommand::Respond, this));
376 return; 167 return;
377 } 168 }
378 169
379 #if defined(DEBUG_DEVTOOLS) 170 #if defined(DEBUG_DEVTOOLS)
380 // For desktop remote debugging. 171 // For desktop remote debugging.
381 if (devices_.back()->serial().empty()) { 172 if (devices_.back()->serial().empty()) {
382 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = 173 scoped_refptr<AndroidDevice> device =
383 devices_.back(); 174 devices_.back();
384 device->set_model(kLocalChrome); 175 device->set_model(kLocalChrome);
385 remote_devices_->push_back( 176 remote_devices_->push_back(
386 new DevToolsAdbBridge::RemoteDevice(device)); 177 new DevToolsAdbBridge::RemoteDevice(device));
387 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> remote_browser = 178 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> remote_browser =
388 new DevToolsAdbBridge::RemoteBrowser( 179 new DevToolsAdbBridge::RemoteBrowser(
389 adb_thread_, device, std::string()); 180 adb_thread_, device, std::string());
390 remote_browser->set_product(kChrome); 181 remote_browser->set_product(kChrome);
391 remote_devices_->back()->AddBrowser(remote_browser); 182 remote_devices_->back()->AddBrowser(remote_browser);
392 browsers_.push_back(remote_browser); 183 browsers_.push_back(remote_browser);
393 device->HttpQuery( 184 device->HttpQuery(
394 std::string(), kVersionRequest, 185 std::string(), kVersionRequest,
395 base::Bind(&AdbPagesCommand::ReceivedVersion, this)); 186 base::Bind(&AdbPagesCommand::ReceivedVersion, this));
396 return; 187 return;
397 } 188 }
398 #endif // defined(DEBUG_DEVTOOLS) 189 #endif // defined(DEBUG_DEVTOOLS)
399 190
400 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 191 scoped_refptr<AndroidDevice> device = devices_.back();
401 if (device->is_connected()) { 192 if (device->is_connected()) {
402 device->RunCommand(kDeviceModelCommand, 193 device->RunCommand(kDeviceModelCommand,
403 base::Bind(&AdbPagesCommand::ReceivedModel, this)); 194 base::Bind(&AdbPagesCommand::ReceivedModel, this));
404 } else { 195 } else {
405 remote_devices_->push_back(new DevToolsAdbBridge::RemoteDevice(device)); 196 remote_devices_->push_back(new DevToolsAdbBridge::RemoteDevice(device));
406 devices_.pop_back(); 197 devices_.pop_back();
407 ProcessSerials(); 198 ProcessSerials();
408 } 199 }
409 } 200 }
410 201
411 void AdbPagesCommand::ReceivedModel(int result, const std::string& response) { 202 void AdbPagesCommand::ReceivedModel(int result, const std::string& response) {
412 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 203 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
413 if (result < 0) { 204 if (result < 0) {
414 devices_.pop_back(); 205 devices_.pop_back();
415 ProcessSerials(); 206 ProcessSerials();
416 return; 207 return;
417 } 208 }
418 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 209 scoped_refptr<AndroidDevice> device = devices_.back();
419 device->set_model(response); 210 device->set_model(response);
420 remote_devices_->push_back( 211 remote_devices_->push_back(
421 new DevToolsAdbBridge::RemoteDevice(device)); 212 new DevToolsAdbBridge::RemoteDevice(device));
422 device->RunCommand(kOpenedUnixSocketsCommand, 213 device->RunCommand(kOpenedUnixSocketsCommand,
423 base::Bind(&AdbPagesCommand::ReceivedSockets, this)); 214 base::Bind(&AdbPagesCommand::ReceivedSockets, this));
424 } 215 }
425 216
426 void AdbPagesCommand::ReceivedSockets(int result, 217 void AdbPagesCommand::ReceivedSockets(int result,
427 const std::string& response) { 218 const std::string& response) {
428 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 219 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
429 if (result < 0) { 220 if (result < 0) {
430 devices_.pop_back(); 221 devices_.pop_back();
431 ProcessSerials(); 222 ProcessSerials();
432 return; 223 return;
433 } 224 }
434 225
435 ParseSocketsList(response); 226 ParseSocketsList(response);
436 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 227 scoped_refptr<AndroidDevice> device = devices_.back();
437 device->RunCommand(kDumpsysCommand, 228 device->RunCommand(kDumpsysCommand,
438 base::Bind(&AdbPagesCommand::ReceivedDumpsys, this)); 229 base::Bind(&AdbPagesCommand::ReceivedDumpsys, this));
439 } 230 }
440 231
441 void AdbPagesCommand::ReceivedDumpsys(int result, 232 void AdbPagesCommand::ReceivedDumpsys(int result,
442 const std::string& response) { 233 const std::string& response) {
443 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 234 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
444 if (result >= 0) 235 if (result >= 0)
445 ParseDumpsysResponse(response); 236 ParseDumpsysResponse(response);
446 237
447 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 238 scoped_refptr<AndroidDevice> device = devices_.back();
448 device->RunCommand(kListProcessesCommand, 239 device->RunCommand(kListProcessesCommand,
449 base::Bind(&AdbPagesCommand::ReceivedProcesses, this)); 240 base::Bind(&AdbPagesCommand::ReceivedProcesses, this));
450 } 241 }
451 242
452 void AdbPagesCommand::ReceivedProcesses(int result, 243 void AdbPagesCommand::ReceivedProcesses(int result,
453 const std::string& response) { 244 const std::string& response) {
454 if (result >= 0) 245 if (result >= 0)
455 ParseProcessList(response); 246 ParseProcessList(response);
456 247
457 if (browsers_.size() == 0) { 248 if (browsers_.size() == 0) {
458 devices_.pop_back(); 249 devices_.pop_back();
459 ProcessSerials(); 250 ProcessSerials();
460 } else { 251 } else {
461 ProcessSockets(); 252 ProcessSockets();
462 } 253 }
463 } 254 }
464 255
465 void AdbPagesCommand::ProcessSockets() { 256 void AdbPagesCommand::ProcessSockets() {
466 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 257 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
467 if (browsers_.size() == 0) { 258 if (browsers_.size() == 0) {
468 devices_.pop_back(); 259 devices_.pop_back();
469 ProcessSerials(); 260 ProcessSerials();
470 } else { 261 } else {
471 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 262 scoped_refptr<AndroidDevice> device = devices_.back();
472 device->HttpQuery(browsers_.back()->socket(), kVersionRequest, 263 device->HttpQuery(browsers_.back()->socket(), kVersionRequest,
473 base::Bind(&AdbPagesCommand::ReceivedVersion, this)); 264 base::Bind(&AdbPagesCommand::ReceivedVersion, this));
474 } 265 }
475 } 266 }
476 267
477 void AdbPagesCommand::ReceivedVersion(int result, 268 void AdbPagesCommand::ReceivedVersion(int result,
478 const std::string& response) { 269 const std::string& response) {
479 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 270 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
480 if (result < 0) { 271 if (result < 0) {
481 browsers_.pop_back(); 272 browsers_.pop_back();
(...skipping 12 matching lines...) Expand all
494 if (parts.size() == 2) { 285 if (parts.size() == 2) {
495 if (parts[0] != "Version") // WebView has this for legacy reasons. 286 if (parts[0] != "Version") // WebView has this for legacy reasons.
496 browsers_.back()->set_product(parts[0]); 287 browsers_.back()->set_product(parts[0]);
497 browsers_.back()->set_version(parts[1]); 288 browsers_.back()->set_version(parts[1]);
498 } else { 289 } else {
499 browsers_.back()->set_version(browser); 290 browsers_.back()->set_version(browser);
500 } 291 }
501 } 292 }
502 } 293 }
503 294
504 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); 295 scoped_refptr<AndroidDevice> device = devices_.back();
505 device->HttpQuery(browsers_.back()->socket(), kPageListRequest, 296 device->HttpQuery(browsers_.back()->socket(), kPageListRequest,
506 base::Bind(&AdbPagesCommand::ReceivedPages, this)); 297 base::Bind(&AdbPagesCommand::ReceivedPages, this));
507 } 298 }
508 299
509 void AdbPagesCommand::ReceivedPages(int result, 300 void AdbPagesCommand::ReceivedPages(int result,
510 const std::string& response) { 301 const std::string& response) {
511 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); 302 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current());
512 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> browser = browsers_.back(); 303 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> browser = browsers_.back();
513 browsers_.pop_back(); 304 browsers_.pop_back();
514 if (result < 0) { 305 if (result < 0) {
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 438
648 remote_devices_->back()->set_screen_size(gfx::Size(width, height)); 439 remote_devices_->back()->set_screen_size(gfx::Size(width, height));
649 } 440 }
650 441
651 442
652 // AdbProtocolCommand --------------------------------------------------------- 443 // AdbProtocolCommand ---------------------------------------------------------
653 444
654 class AdbProtocolCommand : public AdbWebSocket::Delegate { 445 class AdbProtocolCommand : public AdbWebSocket::Delegate {
655 public: 446 public:
656 AdbProtocolCommand( 447 AdbProtocolCommand(
657 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 448 scoped_refptr<RefCountedAdbThread> adb_thread,
658 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, 449 scoped_refptr<AndroidDevice> device,
659 const std::string& socket_name, 450 const std::string& socket_name,
660 const std::string& debug_url, 451 const std::string& debug_url,
661 const std::string& command); 452 const std::string& command);
662 453
663 private: 454 private:
664 virtual void OnSocketOpened() OVERRIDE; 455 virtual void OnSocketOpened() OVERRIDE;
665 virtual void OnFrameRead(const std::string& message) OVERRIDE; 456 virtual void OnFrameRead(const std::string& message) OVERRIDE;
666 virtual void OnSocketClosed(bool closed_by_device) OVERRIDE; 457 virtual void OnSocketClosed(bool closed_by_device) OVERRIDE;
667 virtual bool ProcessIncomingMessage(const std::string& message) OVERRIDE; 458 virtual bool ProcessIncomingMessage(const std::string& message) OVERRIDE;
668 459
669 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread_; 460 scoped_refptr<RefCountedAdbThread> adb_thread_;
670 const std::string command_; 461 const std::string command_;
671 scoped_refptr<AdbWebSocket> web_socket_; 462 scoped_refptr<AdbWebSocket> web_socket_;
672 463
673 DISALLOW_COPY_AND_ASSIGN(AdbProtocolCommand); 464 DISALLOW_COPY_AND_ASSIGN(AdbProtocolCommand);
674 }; 465 };
675 466
676 AdbProtocolCommand::AdbProtocolCommand( 467 AdbProtocolCommand::AdbProtocolCommand(
677 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 468 scoped_refptr<RefCountedAdbThread> adb_thread,
678 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, 469 scoped_refptr<AndroidDevice> device,
679 const std::string& socket_name, 470 const std::string& socket_name,
680 const std::string& debug_url, 471 const std::string& debug_url,
681 const std::string& command) 472 const std::string& command)
682 : adb_thread_(adb_thread), 473 : adb_thread_(adb_thread),
683 command_(command) { 474 command_(command) {
684 web_socket_ = new AdbWebSocket( 475 web_socket_ = new AdbWebSocket(
685 device, socket_name, debug_url, adb_thread_->message_loop(), this); 476 device, socket_name, debug_url, adb_thread_->message_loop(), this);
686 } 477 }
687 478
688 void AdbProtocolCommand::OnSocketOpened() { 479 void AdbProtocolCommand::OnSocketOpened() {
(...skipping 15 matching lines...) Expand all
704 495
705 const char kDevToolsChannelNameFormat[] = "%s_devtools_remote"; 496 const char kDevToolsChannelNameFormat[] = "%s_devtools_remote";
706 497
707 class AgentHostDelegate; 498 class AgentHostDelegate;
708 499
709 typedef std::map<std::string, AgentHostDelegate*> AgentHostDelegates; 500 typedef std::map<std::string, AgentHostDelegate*> AgentHostDelegates;
710 501
711 base::LazyInstance<AgentHostDelegates>::Leaky g_host_delegates = 502 base::LazyInstance<AgentHostDelegates>::Leaky g_host_delegates =
712 LAZY_INSTANCE_INITIALIZER; 503 LAZY_INSTANCE_INITIALIZER;
713 504
714 DevToolsAdbBridge::Wrapper::Wrapper(Profile* profile) 505 DevToolsAdbBridge::Wrapper::Wrapper() {
715 : bridge_(new DevToolsAdbBridge(profile)) { 506 bridge_ = new DevToolsAdbBridge();
716 } 507 }
717 508
718 DevToolsAdbBridge::Wrapper::~Wrapper() { 509 DevToolsAdbBridge::Wrapper::~Wrapper() {
719 } 510 }
720 511
721 DevToolsAdbBridge* DevToolsAdbBridge::Wrapper::Get() { 512 DevToolsAdbBridge* DevToolsAdbBridge::Wrapper::Get() {
722 return bridge_.get(); 513 return bridge_.get();
723 } 514 }
724 515
725 // static 516 // static
(...skipping 13 matching lines...) Expand all
739 DevToolsAdbBridge::Factory::Factory() 530 DevToolsAdbBridge::Factory::Factory()
740 : BrowserContextKeyedServiceFactory( 531 : BrowserContextKeyedServiceFactory(
741 "DevToolsAdbBridge", 532 "DevToolsAdbBridge",
742 BrowserContextDependencyManager::GetInstance()) {} 533 BrowserContextDependencyManager::GetInstance()) {}
743 534
744 DevToolsAdbBridge::Factory::~Factory() {} 535 DevToolsAdbBridge::Factory::~Factory() {}
745 536
746 BrowserContextKeyedService* 537 BrowserContextKeyedService*
747 DevToolsAdbBridge::Factory::BuildServiceInstanceFor( 538 DevToolsAdbBridge::Factory::BuildServiceInstanceFor(
748 content::BrowserContext* context) const { 539 content::BrowserContext* context) const {
749 return new DevToolsAdbBridge::Wrapper(Profile::FromBrowserContext(context)); 540 return new DevToolsAdbBridge::Wrapper();
750 } 541 }
751 542
752 543
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 ---------------------------------------------------------- 544 // AgentHostDelegate ----------------------------------------------------------
806 545
807 class AgentHostDelegate : public content::DevToolsExternalAgentProxyDelegate, 546 class AgentHostDelegate : public content::DevToolsExternalAgentProxyDelegate,
808 public AdbWebSocket::Delegate { 547 public AdbWebSocket::Delegate {
809 public: 548 public:
810 AgentHostDelegate( 549 AgentHostDelegate(
811 const std::string& id, 550 const std::string& id,
812 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, 551 scoped_refptr<AndroidDevice> device,
813 const std::string& socket_name, 552 const std::string& socket_name,
814 const std::string& debug_url, 553 const std::string& debug_url,
815 const std::string& frontend_url, 554 const std::string& frontend_url,
816 base::MessageLoop* adb_message_loop, 555 base::MessageLoop* adb_message_loop,
817 Profile* profile) 556 Profile* profile)
818 : id_(id), 557 : id_(id),
819 serial_(device->serial()), 558 serial_(device->serial()),
820 frontend_url_(frontend_url), 559 frontend_url_(frontend_url),
821 adb_message_loop_(adb_message_loop), 560 adb_message_loop_(adb_message_loop),
822 profile_(profile) { 561 profile_(profile) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 613
875 scoped_ptr<content::DevToolsExternalAgentProxy> proxy_; 614 scoped_ptr<content::DevToolsExternalAgentProxy> proxy_;
876 scoped_refptr<AdbWebSocket> web_socket_; 615 scoped_refptr<AdbWebSocket> web_socket_;
877 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate); 616 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate);
878 }; 617 };
879 618
880 619
881 // DevToolsAdbBridge::RemotePage ---------------------------------------------- 620 // DevToolsAdbBridge::RemotePage ----------------------------------------------
882 621
883 DevToolsAdbBridge::RemotePage::RemotePage( 622 DevToolsAdbBridge::RemotePage::RemotePage(
884 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 623 scoped_refptr<RefCountedAdbThread> adb_thread,
885 scoped_refptr<AndroidDevice> device, 624 scoped_refptr<AndroidDevice> device,
886 const std::string& socket, 625 const std::string& socket,
887 const base::DictionaryValue& value) 626 const base::DictionaryValue& value)
888 : adb_thread_(adb_thread), 627 : adb_thread_(adb_thread),
889 device_(device), 628 device_(device),
890 socket_(socket) { 629 socket_(socket) {
891 value.GetString("id", &id_); 630 value.GetString("id", &id_);
892 value.GetString("url", &url_); 631 value.GetString("url", &url_);
893 value.GetString("title", &title_); 632 value.GetString("title", &title_);
894 value.GetString("description", &description_); 633 value.GetString("description", &description_);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
958 return; 697 return;
959 DevToolsProtocol::Command command(1, method, params); 698 DevToolsProtocol::Command command(1, method, params);
960 new AdbProtocolCommand( 699 new AdbProtocolCommand(
961 adb_thread_, device_, socket_, debug_url_, command.Serialize()); 700 adb_thread_, device_, socket_, debug_url_, command.Serialize());
962 } 701 }
963 702
964 DevToolsAdbBridge::RemotePage::~RemotePage() { 703 DevToolsAdbBridge::RemotePage::~RemotePage() {
965 } 704 }
966 705
967 void DevToolsAdbBridge::RemotePage::RequestActivate( 706 void DevToolsAdbBridge::RemotePage::RequestActivate(
968 const CommandCallback& callback) { 707 const AndroidDevice::CommandCallback& callback) {
969 std::string request = base::StringPrintf(kActivatePageRequest, id_.c_str()); 708 std::string request = base::StringPrintf(kActivatePageRequest, id_.c_str());
970 adb_thread_->message_loop()->PostTask(FROM_HERE, 709 adb_thread_->message_loop()->PostTask(FROM_HERE,
971 base::Bind(&AndroidDevice::HttpQuery, 710 base::Bind(&AndroidDevice::HttpQuery,
972 device_, socket_, request, callback)); 711 device_, socket_, request, callback));
973 } 712 }
974 713
975 void DevToolsAdbBridge::RemotePage::InspectOnHandlerThread( 714 void DevToolsAdbBridge::RemotePage::InspectOnHandlerThread(
976 Profile* profile, int result, const std::string& response) { 715 Profile* profile, int result, const std::string& response) {
977 BrowserThread::PostTask( 716 BrowserThread::PostTask(
978 BrowserThread::UI, FROM_HERE, 717 BrowserThread::UI, FROM_HERE,
(...skipping 10 matching lines...) Expand all
989 new AgentHostDelegate( 728 new AgentHostDelegate(
990 agent_id_, device_, socket_, debug_url_, 729 agent_id_, device_, socket_, debug_url_,
991 frontend_url_, adb_thread_->message_loop(), profile); 730 frontend_url_, adb_thread_->message_loop(), profile);
992 } 731 }
993 } 732 }
994 733
995 734
996 // DevToolsAdbBridge::RemoteBrowser ------------------------------------------- 735 // DevToolsAdbBridge::RemoteBrowser -------------------------------------------
997 736
998 DevToolsAdbBridge::RemoteBrowser::RemoteBrowser( 737 DevToolsAdbBridge::RemoteBrowser::RemoteBrowser(
999 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, 738 scoped_refptr<RefCountedAdbThread> adb_thread,
1000 scoped_refptr<AndroidDevice> device, 739 scoped_refptr<AndroidDevice> device,
1001 const std::string& socket) 740 const std::string& socket)
1002 : adb_thread_(adb_thread), 741 : adb_thread_(adb_thread),
1003 device_(device), 742 device_(device),
1004 socket_(socket) { 743 socket_(socket) {
1005 } 744 }
1006 745
1007 void DevToolsAdbBridge::RemoteBrowser::Open(const std::string& url) { 746 void DevToolsAdbBridge::RemoteBrowser::Open(const std::string& url) {
1008 adb_thread_->message_loop()->PostTask(FROM_HERE, 747 adb_thread_->message_loop()->PostTask(FROM_HERE,
1009 base::Bind(&AndroidDevice::HttpQuery, 748 base::Bind(&AndroidDevice::HttpQuery,
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 797
1059 void DevToolsAdbBridge::RemoteDevice::AddBrowser( 798 void DevToolsAdbBridge::RemoteDevice::AddBrowser(
1060 scoped_refptr<RemoteBrowser> browser) { 799 scoped_refptr<RemoteBrowser> browser) {
1061 browsers_.push_back(browser); 800 browsers_.push_back(browser);
1062 } 801 }
1063 802
1064 DevToolsAdbBridge::RemoteDevice::~RemoteDevice() { 803 DevToolsAdbBridge::RemoteDevice::~RemoteDevice() {
1065 } 804 }
1066 805
1067 806
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 ---------------------------------------------------------- 807 // DevToolsAdbBridge ----------------------------------------------------------
1115 808
1116 DevToolsAdbBridge::DevToolsAdbBridge(Profile* profile) 809 DevToolsAdbBridge::DevToolsAdbBridge()
1117 : adb_thread_(RefCountedAdbThread::GetInstance()), 810 : adb_thread_(RefCountedAdbThread::GetInstance()),
1118 has_message_loop_(adb_thread_->message_loop() != NULL), 811 has_message_loop_(adb_thread_->message_loop() != NULL) {
1119 discover_usb_devices_(false) {
1120 rsa_key_.reset(AndroidRSAPrivateKey(profile));
1121 } 812 }
1122 813
1123 void DevToolsAdbBridge::AddListener(Listener* listener) { 814 void DevToolsAdbBridge::AddListener(Listener* listener) {
1124 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 815 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1125 if (listeners_.empty()) 816 if (listeners_.empty())
1126 RequestRemoteDevices(); 817 RequestRemoteDevices();
1127 listeners_.push_back(listener); 818 listeners_.push_back(listener);
1128 } 819 }
1129 820
1130 void DevToolsAdbBridge::RemoveListener(Listener* listener) { 821 void DevToolsAdbBridge::RemoveListener(Listener* listener) {
1131 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 822 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1132 Listeners::iterator it = 823 Listeners::iterator it =
1133 std::find(listeners_.begin(), listeners_.end(), listener); 824 std::find(listeners_.begin(), listeners_.end(), listener);
1134 DCHECK(it != listeners_.end()); 825 DCHECK(it != listeners_.end());
1135 listeners_.erase(it); 826 listeners_.erase(it);
1136 } 827 }
1137 828
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() { 829 DevToolsAdbBridge::~DevToolsAdbBridge() {
1149 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 830 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1150 DCHECK(listeners_.empty()); 831 DCHECK(listeners_.empty());
1151 } 832 }
1152 833
1153 void DevToolsAdbBridge::RequestRemoteDevices() { 834 void DevToolsAdbBridge::RequestRemoteDevices() {
1154 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 835 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1155 if (!has_message_loop_) 836 if (!has_message_loop_)
1156 return; 837 return;
838
1157 new AdbPagesCommand( 839 new AdbPagesCommand(
1158 adb_thread_, rsa_key_.get(), discover_usb_devices_, 840 adb_thread_, device_providers_,
1159 base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this)); 841 base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this));
1160 } 842 }
1161 843
1162 void DevToolsAdbBridge::ReceivedRemoteDevices(RemoteDevices* devices_ptr) { 844 void DevToolsAdbBridge::ReceivedRemoteDevices(RemoteDevices* devices_ptr) {
1163 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 845 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1164 846
1165 scoped_ptr<RemoteDevices> devices(devices_ptr); 847 scoped_ptr<RemoteDevices> devices(devices_ptr);
1166 848
1167 Listeners copy(listeners_); 849 Listeners copy(listeners_);
1168 for (Listeners::iterator it = copy.begin(); it != copy.end(); ++it) 850 for (Listeners::iterator it = copy.begin(); it != copy.end(); ++it)
1169 (*it)->RemoteDevicesChanged(devices.get()); 851 (*it)->RemoteDevicesChanged(devices.get());
1170 852
1171 if (listeners_.empty()) 853 if (listeners_.empty())
1172 return; 854 return;
1173 855
1174 BrowserThread::PostDelayedTask( 856 BrowserThread::PostDelayedTask(
1175 BrowserThread::UI, 857 BrowserThread::UI,
1176 FROM_HERE, 858 FROM_HERE,
1177 base::Bind(&DevToolsAdbBridge::RequestRemoteDevices, this), 859 base::Bind(&DevToolsAdbBridge::RequestRemoteDevices, this),
1178 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); 860 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs));
1179 } 861 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/devtools_adb_bridge.h ('k') | chrome/browser/devtools/port_forwarding_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698