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

Side by Side Diff: chrome/browser/devtools/device/devtools_android_bridge.cc

Issue 287643002: DevTools: Partially redesigned DevToolsAndroidBridge and AndroidDeviceManager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Little simplification Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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, &params, 971 browser_->SendProtocolCommand(debug_url_, kPageNavigateCommand, &params,
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698