OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |