OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/device/devtools_android_bridge.h" | 5 #include "chrome/browser/devtools/device/devtools_android_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 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
223 } | 223 } |
224 return socket_to_pid; | 224 return socket_to_pid; |
225 } | 225 } |
226 | 226 |
227 // DiscoveryRequest ----------------------------------------------------- | 227 // DiscoveryRequest ----------------------------------------------------- |
228 | 228 |
229 class DiscoveryRequest : public base::RefCountedThreadSafe< | 229 class DiscoveryRequest : public base::RefCountedThreadSafe< |
230 DiscoveryRequest, | 230 DiscoveryRequest, |
231 BrowserThread::DeleteOnUIThread> { | 231 BrowserThread::DeleteOnUIThread> { |
232 public: | 232 public: |
233 typedef base::Callback<void(DevToolsAndroidBridge::RemoteDevices*)> Callback; | 233 typedef base::Callback<void(DevToolsAndroidBridge::RemoteDevices*, |
234 DevToolsAndroidBridge::DeviceHandleMap*)> Callback; | |
234 | 235 |
235 DiscoveryRequest( | 236 DiscoveryRequest( |
236 scoped_refptr<DevToolsAndroidBridge> android_bridge, | 237 scoped_refptr<DevToolsAndroidBridge> android_bridge, |
238 const DevToolsAndroidBridge::DeviceHandleMap& device_handles, | |
237 AndroidDeviceManager* device_manager, | 239 AndroidDeviceManager* device_manager, |
238 base::MessageLoop* device_message_loop, | 240 base::MessageLoop* device_message_loop, |
239 const AndroidDeviceManager::DeviceProviders& device_providers, | 241 const AndroidDeviceManager::DeviceProviders& device_providers, |
240 const Callback& callback); | 242 const Callback& callback); |
241 | 243 |
242 private: | 244 private: |
243 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; | 245 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; |
244 friend class base::DeleteHelper<DiscoveryRequest>; | 246 friend class base::DeleteHelper<DiscoveryRequest>; |
245 | 247 |
246 virtual ~DiscoveryRequest(); | 248 virtual ~DiscoveryRequest(); |
(...skipping 27 matching lines...) Expand all Loading... | |
274 | 276 |
275 void Respond(); | 277 void Respond(); |
276 | 278 |
277 void CreateBrowsers(const std::string& packages_response, | 279 void CreateBrowsers(const std::string& packages_response, |
278 const std::string& processes_response, | 280 const std::string& processes_response, |
279 const std::string& sockets_response); | 281 const std::string& sockets_response); |
280 | 282 |
281 void ParseDumpsysResponse(const std::string& response); | 283 void ParseDumpsysResponse(const std::string& response); |
282 void ParseScreenSize(const std::string& str); | 284 void ParseScreenSize(const std::string& str); |
283 | 285 |
286 scoped_refptr<DevToolsAndroidBridge::DeviceHandle> | |
287 FindDeviceHandle(const std::string& serial); | |
288 | |
284 scoped_refptr<DevToolsAndroidBridge> android_bridge_; | 289 scoped_refptr<DevToolsAndroidBridge> android_bridge_; |
285 AndroidDeviceManager* device_manager_; | 290 AndroidDeviceManager* device_manager_; |
286 base::MessageLoop* device_message_loop_; | 291 base::MessageLoop* device_message_loop_; |
287 Callback callback_; | 292 Callback callback_; |
288 std::vector<std::string> serials_; | 293 std::vector<std::string> serials_; |
289 DevToolsAndroidBridge::RemoteBrowsers browsers_; | 294 DevToolsAndroidBridge::RemoteBrowsers browsers_; |
290 scoped_ptr<DevToolsAndroidBridge::RemoteDevices> remote_devices_; | 295 scoped_ptr<DevToolsAndroidBridge::RemoteDevices> remote_devices_; |
296 DevToolsAndroidBridge::DeviceHandleMap device_handles_; | |
297 scoped_ptr<DevToolsAndroidBridge::DeviceHandleMap> used_device_handles_; | |
291 }; | 298 }; |
292 | 299 |
293 DiscoveryRequest::DiscoveryRequest( | 300 DiscoveryRequest::DiscoveryRequest( |
294 scoped_refptr<DevToolsAndroidBridge> android_bridge, | 301 scoped_refptr<DevToolsAndroidBridge> android_bridge, |
302 const DevToolsAndroidBridge::DeviceHandleMap& device_handles, | |
295 AndroidDeviceManager* device_manager, | 303 AndroidDeviceManager* device_manager, |
296 base::MessageLoop* device_message_loop, | 304 base::MessageLoop* device_message_loop, |
297 const AndroidDeviceManager::DeviceProviders& device_providers, | 305 const AndroidDeviceManager::DeviceProviders& device_providers, |
298 const Callback& callback) | 306 const Callback& callback) |
299 : android_bridge_(android_bridge), | 307 : android_bridge_(android_bridge), |
300 device_manager_(device_manager), | 308 device_manager_(device_manager), |
301 device_message_loop_(device_message_loop), | 309 device_message_loop_(device_message_loop), |
302 callback_(callback) { | 310 callback_(callback), |
311 device_handles_(device_handles) { | |
Vladislav Kaznacheev
2014/05/19 10:32:11
So there is a scenario where DeviceHandle instance
vkuzkokov
2014/05/20 12:34:29
Yep. One possible solution would be to extend Disc
| |
303 remote_devices_.reset(new DevToolsAndroidBridge::RemoteDevices()); | 312 remote_devices_.reset(new DevToolsAndroidBridge::RemoteDevices()); |
313 used_device_handles_.reset(new DevToolsAndroidBridge::DeviceHandleMap()); | |
304 | 314 |
305 device_message_loop_->PostTask( | 315 device_message_loop_->PostTask( |
306 FROM_HERE, base::Bind( | 316 FROM_HERE, base::Bind( |
307 &AndroidDeviceManager::QueryDevices, | 317 &AndroidDeviceManager::QueryDevices, |
308 device_manager_, | 318 device_manager_, |
309 device_providers, | 319 device_providers, |
310 base::Bind(&DiscoveryRequest::ReceivedSerials, this))); | 320 base::Bind(&DiscoveryRequest::ReceivedSerials, this))); |
311 } | 321 } |
312 | 322 |
313 DiscoveryRequest::~DiscoveryRequest() { | 323 DiscoveryRequest::~DiscoveryRequest() { |
(...skipping 14 matching lines...) Expand all Loading... | |
328 BrowserThread::UI, FROM_HERE, | 338 BrowserThread::UI, FROM_HERE, |
329 base::Bind(&DiscoveryRequest::Respond, this)); | 339 base::Bind(&DiscoveryRequest::Respond, this)); |
330 return; | 340 return; |
331 } | 341 } |
332 | 342 |
333 if (device_manager_->IsConnected(current_serial())) { | 343 if (device_manager_->IsConnected(current_serial())) { |
334 device_manager_->RunCommand(current_serial(), kDeviceModelCommand, | 344 device_manager_->RunCommand(current_serial(), kDeviceModelCommand, |
335 base::Bind(&DiscoveryRequest::ReceivedModel, this)); | 345 base::Bind(&DiscoveryRequest::ReceivedModel, this)); |
336 } else { | 346 } else { |
337 remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice( | 347 remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice( |
338 android_bridge_, current_serial(), kUnknownModel, false)); | 348 FindDeviceHandle(current_serial()), kUnknownModel, false)); |
339 NextDevice(); | 349 NextDevice(); |
340 } | 350 } |
341 } | 351 } |
342 | 352 |
343 void DiscoveryRequest::ReceivedModel(int result, const std::string& response) { | 353 void DiscoveryRequest::ReceivedModel(int result, const std::string& response) { |
344 DCHECK_EQ(device_message_loop_, base::MessageLoop::current()); | 354 DCHECK_EQ(device_message_loop_, base::MessageLoop::current()); |
345 if (result < 0) { | 355 if (result < 0) { |
346 NextDevice(); | 356 NextDevice(); |
347 return; | 357 return; |
348 } | 358 } |
349 remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice( | 359 remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice( |
350 android_bridge_, current_serial(), response, true)); | 360 FindDeviceHandle(current_serial()), response, true)); |
351 device_manager_->RunCommand(current_serial(), kDumpsysCommand, | 361 device_manager_->RunCommand(current_serial(), kDumpsysCommand, |
352 base::Bind(&DiscoveryRequest::ReceivedDumpsys, this)); | 362 base::Bind(&DiscoveryRequest::ReceivedDumpsys, this)); |
353 } | 363 } |
354 | 364 |
355 void DiscoveryRequest::ReceivedDumpsys(int result, | 365 void DiscoveryRequest::ReceivedDumpsys(int result, |
356 const std::string& response) { | 366 const std::string& response) { |
357 DCHECK_EQ(device_message_loop_, base::MessageLoop::current()); | 367 DCHECK_EQ(device_message_loop_, base::MessageLoop::current()); |
358 if (result >= 0) | 368 if (result >= 0) |
359 ParseDumpsysResponse(response); | 369 ParseDumpsysResponse(response); |
360 | 370 |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
473 browsers_.pop_back(); | 483 browsers_.pop_back(); |
474 ProcessSockets(); | 484 ProcessSockets(); |
475 } | 485 } |
476 | 486 |
477 void DiscoveryRequest::NextDevice() { | 487 void DiscoveryRequest::NextDevice() { |
478 serials_.pop_back(); | 488 serials_.pop_back(); |
479 ProcessSerials(); | 489 ProcessSerials(); |
480 } | 490 } |
481 | 491 |
482 void DiscoveryRequest::Respond() { | 492 void DiscoveryRequest::Respond() { |
483 callback_.Run(remote_devices_.release()); | 493 callback_.Run(remote_devices_.release(), used_device_handles_.release()); |
484 } | 494 } |
485 | 495 |
486 void DiscoveryRequest::CreateBrowsers( | 496 void DiscoveryRequest::CreateBrowsers( |
487 const std::string& packages_response, | 497 const std::string& packages_response, |
488 const std::string& processes_response, | 498 const std::string& processes_response, |
489 const std::string& sockets_response) { | 499 const std::string& sockets_response) { |
490 DescriptorMap package_to_descriptor = | 500 DescriptorMap package_to_descriptor = |
491 FindInstalledBrowserPackages(packages_response); | 501 FindInstalledBrowserPackages(packages_response); |
492 | 502 |
493 StringMap pid_to_package; | 503 StringMap pid_to_package; |
(...skipping 12 matching lines...) Expand all Loading... | |
506 // Create RemoteBrowser instances. | 516 // Create RemoteBrowser instances. |
507 BrowserMap package_to_running_browser; | 517 BrowserMap package_to_running_browser; |
508 BrowserMap socket_to_unnamed_browser; | 518 BrowserMap socket_to_unnamed_browser; |
509 for (StringMap::iterator it = socket_to_pid.begin(); | 519 for (StringMap::iterator it = socket_to_pid.begin(); |
510 it != socket_to_pid.end(); ++it) { | 520 it != socket_to_pid.end(); ++it) { |
511 std::string socket = it->first; | 521 std::string socket = it->first; |
512 std::string pid = it->second; | 522 std::string pid = it->second; |
513 | 523 |
514 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser = | 524 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser = |
515 new DevToolsAndroidBridge::RemoteBrowser( | 525 new DevToolsAndroidBridge::RemoteBrowser( |
516 android_bridge_, current_serial(), socket); | 526 FindDeviceHandle(current_serial()), |
527 socket); | |
517 | 528 |
518 StringMap::iterator pit = pid_to_package.find(pid); | 529 StringMap::iterator pit = pid_to_package.find(pid); |
519 if (pit != pid_to_package.end()) { | 530 if (pit != pid_to_package.end()) { |
520 std::string package = pit->second; | 531 std::string package = pit->second; |
521 package_to_running_browser[package] = browser; | 532 package_to_running_browser[package] = browser; |
522 const BrowserDescriptor* descriptor = FindBrowserDescriptor(package); | 533 const BrowserDescriptor* descriptor = FindBrowserDescriptor(package); |
523 if (descriptor) { | 534 if (descriptor) { |
524 browser->set_display_name(descriptor->display_name); | 535 browser->set_display_name(descriptor->display_name); |
525 } else if (socket.find(kWebViewSocketPrefix) == 0) { | 536 } else if (socket.find(kWebViewSocketPrefix) == 0) { |
526 browser->set_display_name( | 537 browser->set_display_name( |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
602 std::vector<std::string> numbers; | 613 std::vector<std::string> numbers; |
603 Tokenize(pairs[1].substr(1, pairs[1].size() - 2), ",", &numbers); | 614 Tokenize(pairs[1].substr(1, pairs[1].size() - 2), ",", &numbers); |
604 if (numbers.size() != 2 || | 615 if (numbers.size() != 2 || |
605 !base::StringToInt(numbers[0], &width) || | 616 !base::StringToInt(numbers[0], &width) || |
606 !base::StringToInt(numbers[1], &height)) | 617 !base::StringToInt(numbers[1], &height)) |
607 return; | 618 return; |
608 | 619 |
609 remote_devices_->back()->set_screen_size(gfx::Size(width, height)); | 620 remote_devices_->back()->set_screen_size(gfx::Size(width, height)); |
610 } | 621 } |
611 | 622 |
623 scoped_refptr<DevToolsAndroidBridge::DeviceHandle> | |
624 DiscoveryRequest::FindDeviceHandle(const std::string& serial) { | |
625 DevToolsAndroidBridge::DeviceHandleMap::iterator it = | |
626 device_handles_.find(serial); | |
627 scoped_refptr<DevToolsAndroidBridge::DeviceHandle> device_handle; | |
628 if (it != device_handles_.end()) { | |
629 device_handle = it->second; | |
630 } else { | |
631 device_handle = new DevToolsAndroidBridge::DeviceHandle(android_bridge_, | |
632 serial); | |
633 device_handles_[serial] = device_handle; | |
634 } | |
635 (*used_device_handles_)[serial] = device_handle; | |
636 return device_handle; | |
637 } | |
612 | 638 |
613 // ProtocolCommand ------------------------------------------------------------ | 639 // ProtocolCommand ------------------------------------------------------------ |
614 | 640 |
615 class ProtocolCommand | 641 class ProtocolCommand |
616 : public DevToolsAndroidBridge::AndroidWebSocket::Delegate { | 642 : public DevToolsAndroidBridge::AndroidWebSocket::Delegate { |
617 public: | 643 public: |
618 ProtocolCommand( | 644 ProtocolCommand( |
619 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, | 645 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, |
620 const std::string& debug_url, | 646 const std::string& debug_url, |
621 const std::string& command, | 647 const std::string& command, |
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
942 base::Closure callback) const { | 968 base::Closure callback) const { |
943 base::DictionaryValue params; | 969 base::DictionaryValue params; |
944 params.SetString(kUrlParam, url); | 970 params.SetString(kUrlParam, url); |
945 browser_->SendProtocolCommand(debug_url_, kPageNavigateCommand, ¶ms, | 971 browser_->SendProtocolCommand(debug_url_, kPageNavigateCommand, ¶ms, |
946 callback); | 972 callback); |
947 } | 973 } |
948 | 974 |
949 // DevToolsAndroidBridge::RemoteBrowser --------------------------------------- | 975 // DevToolsAndroidBridge::RemoteBrowser --------------------------------------- |
950 | 976 |
951 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser( | 977 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser( |
952 scoped_refptr<DevToolsAndroidBridge> android_bridge, | 978 scoped_refptr<DeviceHandle> device_handle, |
953 const std::string& serial, | |
954 const std::string& socket) | 979 const std::string& socket) |
955 : android_bridge_(android_bridge), | 980 : device_handle_(device_handle), |
956 serial_(serial), | |
957 socket_(socket), | 981 socket_(socket), |
958 page_descriptors_(new base::ListValue()) { | 982 page_descriptors_(new base::ListValue()) { |
959 } | 983 } |
960 | 984 |
961 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() const { | 985 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() const { |
962 return socket_.find(kChromeDefaultSocket) == 0; | 986 return socket_.find(kChromeDefaultSocket) == 0; |
963 } | 987 } |
964 | 988 |
965 DevToolsAndroidBridge::RemoteBrowser::ParsedVersion | 989 DevToolsAndroidBridge::RemoteBrowser::ParsedVersion |
966 DevToolsAndroidBridge::RemoteBrowser::GetParsedVersion() const { | 990 DevToolsAndroidBridge::RemoteBrowser::GetParsedVersion() const { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1002 const std::string& response) { | 1026 const std::string& response) { |
1003 if (callback.is_null()) | 1027 if (callback.is_null()) |
1004 return; | 1028 return; |
1005 BrowserThread::PostTask( | 1029 BrowserThread::PostTask( |
1006 BrowserThread::UI, FROM_HERE, base::Bind(callback, result, response)); | 1030 BrowserThread::UI, FROM_HERE, base::Bind(callback, result, response)); |
1007 } | 1031 } |
1008 | 1032 |
1009 void DevToolsAndroidBridge::RemoteBrowser::SendJsonRequest( | 1033 void DevToolsAndroidBridge::RemoteBrowser::SendJsonRequest( |
1010 const std::string& request, const JsonRequestCallback& callback) { | 1034 const std::string& request, const JsonRequestCallback& callback) { |
1011 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1035 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1012 android_bridge_->device_message_loop()->PostTask( | 1036 device_handle_->android_bridge()->device_message_loop()->PostTask( |
Vladislav Kaznacheev
2014/05/19 10:32:11
Lets consider moving it into DeviceHandle as well.
vkuzkokov
2014/05/20 12:34:29
Done.
| |
1013 FROM_HERE, | 1037 FROM_HERE, |
1014 base::Bind(&AndroidDeviceManager::HttpQuery, | 1038 base::Bind(&AndroidDeviceManager::HttpQuery, |
1015 android_bridge_->device_manager(), serial_, socket_, request, | 1039 device_handle_->android_bridge()->device_manager(), |
1040 device_handle_->serial(), | |
1041 socket_, | |
1042 request, | |
1016 base::Bind(&RespondOnUIThread, callback))); | 1043 base::Bind(&RespondOnUIThread, callback))); |
1017 } | 1044 } |
1018 | 1045 |
1019 void DevToolsAndroidBridge::RemoteBrowser::SendProtocolCommand( | 1046 void DevToolsAndroidBridge::RemoteBrowser::SendProtocolCommand( |
1020 const std::string& debug_url, | 1047 const std::string& debug_url, |
1021 const std::string& method, | 1048 const std::string& method, |
1022 base::DictionaryValue* params, | 1049 base::DictionaryValue* params, |
1023 const base::Closure callback) { | 1050 const base::Closure callback) { |
1024 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1051 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1025 if (debug_url.empty()) | 1052 if (debug_url.empty()) |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1110 } | 1137 } |
1111 } | 1138 } |
1112 | 1139 |
1113 DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() { | 1140 DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() { |
1114 } | 1141 } |
1115 | 1142 |
1116 | 1143 |
1117 // DevToolsAndroidBridge::RemoteDevice ---------------------------------------- | 1144 // DevToolsAndroidBridge::RemoteDevice ---------------------------------------- |
1118 | 1145 |
1119 DevToolsAndroidBridge::RemoteDevice::RemoteDevice( | 1146 DevToolsAndroidBridge::RemoteDevice::RemoteDevice( |
1120 scoped_refptr<DevToolsAndroidBridge> android_bridge, | 1147 scoped_refptr<DeviceHandle> device_handle, |
1121 const std::string& serial, | |
1122 const std::string& model, | 1148 const std::string& model, |
1123 bool connected) | 1149 bool connected) |
1124 : android_bridge_(android_bridge), | 1150 : device_handle_(device_handle), |
1125 serial_(serial), | |
1126 model_(model), | 1151 model_(model), |
1127 connected_(connected) { | 1152 connected_(connected) { |
1128 } | 1153 } |
1129 | 1154 |
1130 void DevToolsAndroidBridge::RemoteDevice::AddBrowser( | 1155 void DevToolsAndroidBridge::RemoteDevice::AddBrowser( |
1131 scoped_refptr<RemoteBrowser> browser) { | 1156 scoped_refptr<RemoteBrowser> browser) { |
1132 browsers_.push_back(browser); | 1157 browsers_.push_back(browser); |
1133 } | 1158 } |
1134 | 1159 |
1135 void DevToolsAndroidBridge::RemoteDevice::OpenSocket( | 1160 void DevToolsAndroidBridge::RemoteDevice::OpenSocket( |
1136 const std::string& socket_name, | 1161 const std::string& socket_name, |
1137 const AndroidDeviceManager::SocketCallback& callback) { | 1162 const AndroidDeviceManager::SocketCallback& callback) { |
1138 android_bridge_->device_message_loop()->PostTask(FROM_HERE, | 1163 device_handle_->android_bridge()->device_message_loop()->PostTask(FROM_HERE, |
Vladislav Kaznacheev
2014/05/19 10:32:11
Ditto
vkuzkokov
2014/05/20 12:34:29
Done.
| |
1139 base::Bind(&AndroidDeviceManager::OpenSocket, | 1164 base::Bind(&AndroidDeviceManager::OpenSocket, |
1140 android_bridge_->device_manager(), | 1165 device_handle_->android_bridge()->device_manager(), |
1141 serial_, | 1166 device_handle_->serial(), |
1142 socket_name, | 1167 socket_name, |
1143 callback)); | 1168 callback)); |
1144 } | 1169 } |
1145 | 1170 |
1146 DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() { | 1171 DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() { |
1147 } | 1172 } |
1148 | 1173 |
1149 // DevToolsAndroidBridge::HandlerThread --------------------------------- | 1174 // DevToolsAndroidBridge::HandlerThread --------------------------------- |
1150 | 1175 |
1151 const char kDevToolsAdbBridgeThreadName[] = "Chrome_DevToolsADBThread"; | 1176 const char kDevToolsAdbBridgeThreadName[] = "Chrome_DevToolsADBThread"; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1187 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1212 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1188 instance_ = NULL; | 1213 instance_ = NULL; |
1189 if (!thread_) | 1214 if (!thread_) |
1190 return; | 1215 return; |
1191 // Shut down thread on FILE thread to join into IO. | 1216 // Shut down thread on FILE thread to join into IO. |
1192 BrowserThread::PostTask( | 1217 BrowserThread::PostTask( |
1193 BrowserThread::FILE, FROM_HERE, | 1218 BrowserThread::FILE, FROM_HERE, |
1194 base::Bind(&HandlerThread::StopThread, thread_)); | 1219 base::Bind(&HandlerThread::StopThread, thread_)); |
1195 } | 1220 } |
1196 | 1221 |
1222 // DevToolsAndroidBridge::DeviceHandle ---------------------------------------- | |
1223 | |
1224 DevToolsAndroidBridge::DeviceHandle::DeviceHandle( | |
1225 scoped_refptr<DevToolsAndroidBridge> android_bridge, | |
1226 const std::string& serial) | |
1227 : android_bridge_(android_bridge), | |
1228 serial_(serial) { | |
1229 } | |
1230 | |
1231 DevToolsAndroidBridge::DeviceHandle::~DeviceHandle() { | |
1232 android_bridge_->device_message_loop()->PostTask(FROM_HERE, | |
1233 base::Bind(&AndroidDeviceManager::ReleaseDevice, | |
1234 android_bridge_->device_manager(), | |
1235 serial_)); | |
1236 } | |
1237 | |
1197 // DevToolsAndroidBridge ------------------------------------------------------ | 1238 // DevToolsAndroidBridge ------------------------------------------------------ |
1198 | 1239 |
1199 DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile) | 1240 DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile) |
1200 : profile_(profile), | 1241 : profile_(profile), |
1201 handler_thread_(HandlerThread::GetInstance()) { | 1242 handler_thread_(HandlerThread::GetInstance()) { |
1202 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1243 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1203 pref_change_registrar_.Init(profile_->GetPrefs()); | 1244 pref_change_registrar_.Init(profile_->GetPrefs()); |
1204 pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled, | 1245 pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled, |
1205 base::Bind(&DevToolsAndroidBridge::CreateDeviceProviders, | 1246 base::Bind(&DevToolsAndroidBridge::CreateDeviceProviders, |
1206 base::Unretained(this))); | 1247 base::Unretained(this))); |
(...skipping 13 matching lines...) Expand all Loading... | |
1220 RequestDeviceList(); | 1261 RequestDeviceList(); |
1221 } | 1262 } |
1222 | 1263 |
1223 void DevToolsAndroidBridge::RemoveDeviceListListener( | 1264 void DevToolsAndroidBridge::RemoveDeviceListListener( |
1224 DeviceListListener* listener) { | 1265 DeviceListListener* listener) { |
1225 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1266 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1226 DeviceListListeners::iterator it = std::find( | 1267 DeviceListListeners::iterator it = std::find( |
1227 device_list_listeners_.begin(), device_list_listeners_.end(), listener); | 1268 device_list_listeners_.begin(), device_list_listeners_.end(), listener); |
1228 DCHECK(it != device_list_listeners_.end()); | 1269 DCHECK(it != device_list_listeners_.end()); |
1229 device_list_listeners_.erase(it); | 1270 device_list_listeners_.erase(it); |
1230 if (device_list_listeners_.empty() && device_manager_) { | 1271 if (device_list_listeners_.empty() && device_manager_) |
1231 device_message_loop()->PostTask(FROM_HERE, | 1272 device_handles_.clear(); |
1232 base::Bind(&AndroidDeviceManager::Stop, device_manager_)); | |
1233 } | |
1234 } | 1273 } |
1235 | 1274 |
1236 void DevToolsAndroidBridge::AddDeviceCountListener( | 1275 void DevToolsAndroidBridge::AddDeviceCountListener( |
1237 DeviceCountListener* listener) { | 1276 DeviceCountListener* listener) { |
1238 device_count_listeners_.push_back(listener); | 1277 device_count_listeners_.push_back(listener); |
1239 if (device_count_listeners_.size() == 1 && device_manager_) | 1278 if (device_count_listeners_.size() == 1 && device_manager_) |
1240 RequestDeviceCount(); | 1279 RequestDeviceCount(); |
1241 } | 1280 } |
1242 | 1281 |
1243 void DevToolsAndroidBridge::RemoveDeviceCountListener( | 1282 void DevToolsAndroidBridge::RemoveDeviceCountListener( |
1244 DeviceCountListener* listener) { | 1283 DeviceCountListener* listener) { |
1245 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1284 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1246 DeviceCountListeners::iterator it = std::find( | 1285 DeviceCountListeners::iterator it = std::find( |
1247 device_count_listeners_.begin(), device_count_listeners_.end(), listener); | 1286 device_count_listeners_.begin(), device_count_listeners_.end(), listener); |
1248 DCHECK(it != device_count_listeners_.end()); | 1287 DCHECK(it != device_count_listeners_.end()); |
1249 device_count_listeners_.erase(it); | 1288 device_count_listeners_.erase(it); |
1250 } | 1289 } |
1251 | 1290 |
1252 // static | 1291 // static |
1253 bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) { | 1292 bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) { |
1254 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1293 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1255 return g_host_delegates.Get().find(agent_id) != g_host_delegates.Get().end(); | 1294 return g_host_delegates.Get().find(agent_id) != g_host_delegates.Get().end(); |
1256 } | 1295 } |
1257 | 1296 |
1297 void DevToolsAndroidBridge::IsConnectedForTest(const std::string& serial, | |
1298 const base::Callback<void(bool)>& callback) { | |
1299 base::PostTaskAndReplyWithResult( | |
1300 device_message_loop()->message_loop_proxy(), | |
1301 FROM_HERE, | |
1302 base::Bind(&AndroidDeviceManager::IsConnected, device_manager_, serial), | |
1303 callback); | |
1304 } | |
1305 | |
1258 DevToolsAndroidBridge::~DevToolsAndroidBridge() { | 1306 DevToolsAndroidBridge::~DevToolsAndroidBridge() { |
1259 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1307 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1260 DCHECK(device_list_listeners_.empty()); | 1308 DCHECK(device_list_listeners_.empty()); |
1261 DCHECK(device_count_listeners_.empty()); | 1309 DCHECK(device_count_listeners_.empty()); |
1262 if (device_manager_) | |
1263 device_message_loop()->PostTask(FROM_HERE, | |
1264 base::Bind(&AndroidDeviceManager::Stop, device_manager_)); | |
1265 } | 1310 } |
1266 | 1311 |
1267 void DevToolsAndroidBridge::RequestDeviceList() { | 1312 void DevToolsAndroidBridge::RequestDeviceList() { |
1268 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1313 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1269 DCHECK(device_manager_); | 1314 DCHECK(device_manager_); |
1270 | 1315 |
1271 if (device_list_listeners_.empty()) | 1316 if (device_list_listeners_.empty()) |
1272 return; | 1317 return; |
1273 | 1318 |
1274 new DiscoveryRequest( | 1319 new DiscoveryRequest( |
1275 this, | 1320 this, |
1321 device_handles_, | |
1276 device_manager(), | 1322 device_manager(), |
1277 device_message_loop(), | 1323 device_message_loop(), |
1278 device_providers_, | 1324 device_providers_, |
1279 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this)); | 1325 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this)); |
1280 } | 1326 } |
1281 | 1327 |
1282 void DevToolsAndroidBridge::CreatedDeviceManager( | 1328 void DevToolsAndroidBridge::CreatedDeviceManager( |
1283 scoped_refptr<AndroidDeviceManager> device_manager) { | 1329 scoped_refptr<AndroidDeviceManager> device_manager) { |
1284 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1330 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1285 device_manager_ = device_manager; | 1331 device_manager_ = device_manager; |
1286 if (!device_list_listeners_.empty()) | 1332 if (!device_list_listeners_.empty()) |
1287 RequestDeviceList(); | 1333 RequestDeviceList(); |
1288 if (!device_count_listeners_.empty()) | 1334 if (!device_count_listeners_.empty()) |
1289 RequestDeviceCount(); | 1335 RequestDeviceCount(); |
1290 } | 1336 } |
1291 | 1337 |
1292 void DevToolsAndroidBridge::ReceivedDeviceList(RemoteDevices* devices_ptr) { | 1338 void DevToolsAndroidBridge::ReceivedDeviceList(RemoteDevices* devices_ptr, |
1339 DeviceHandleMap* device_handles_ptr) { | |
1293 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1340 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1294 | 1341 |
1295 scoped_ptr<RemoteDevices> devices(devices_ptr); | 1342 scoped_ptr<RemoteDevices> devices(devices_ptr); |
1343 scoped_ptr<DeviceHandleMap> device_handles(device_handles_ptr); | |
1296 | 1344 |
1297 if (device_list_listeners_.empty()) | 1345 if (device_list_listeners_.empty()) |
1298 return; | 1346 return; |
1299 | 1347 |
1348 device_handles_ = *device_handles.get(); | |
1349 | |
1300 DeviceListListeners copy(device_list_listeners_); | 1350 DeviceListListeners copy(device_list_listeners_); |
1301 for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it) | 1351 for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it) |
1302 (*it)->DeviceListChanged(*devices.get()); | 1352 (*it)->DeviceListChanged(*devices.get()); |
1303 | 1353 |
1304 BrowserThread::PostDelayedTask( | 1354 BrowserThread::PostDelayedTask( |
1305 BrowserThread::UI, | 1355 BrowserThread::UI, |
1306 FROM_HERE, | 1356 FROM_HERE, |
1307 base::Bind(&DevToolsAndroidBridge::RequestDeviceList, this), | 1357 base::Bind(&DevToolsAndroidBridge::RequestDeviceList, this), |
1308 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); | 1358 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); |
1309 } | 1359 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1350 PrefService* service = profile_->GetPrefs(); | 1400 PrefService* service = profile_->GetPrefs(); |
1351 const PrefService::Preference* pref = | 1401 const PrefService::Preference* pref = |
1352 service->FindPreference(prefs::kDevToolsDiscoverUsbDevicesEnabled); | 1402 service->FindPreference(prefs::kDevToolsDiscoverUsbDevicesEnabled); |
1353 const base::Value* pref_value = pref->GetValue(); | 1403 const base::Value* pref_value = pref->GetValue(); |
1354 | 1404 |
1355 bool enabled; | 1405 bool enabled; |
1356 if (pref_value->GetAsBoolean(&enabled) && enabled) { | 1406 if (pref_value->GetAsBoolean(&enabled) && enabled) { |
1357 device_providers_.push_back(new UsbDeviceProvider(profile_)); | 1407 device_providers_.push_back(new UsbDeviceProvider(profile_)); |
1358 } | 1408 } |
1359 } | 1409 } |
OLD | NEW |