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