| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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_targets_ui.h" | 5 #include "chrome/browser/devtools/devtools_targets_ui.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
| 11 #include "base/single_thread_task_runner.h" | 11 #include "base/single_thread_task_runner.h" |
| 12 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
| 13 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
| 14 #include "base/strings/stringprintf.h" | 14 #include "base/strings/stringprintf.h" |
| 15 #include "base/threading/thread_task_runner_handle.h" | 15 #include "base/threading/thread_task_runner_handle.h" |
| 16 #include "base/values.h" | 16 #include "base/values.h" |
| 17 #include "base/version.h" | 17 #include "base/version.h" |
| 18 #include "chrome/browser/devtools/device/devtools_android_bridge.h" | 18 #include "chrome/browser/devtools/device/devtools_android_bridge.h" |
| 19 #include "chrome/browser/devtools/devtools_target_impl.h" | |
| 20 #include "content/public/browser/browser_child_process_observer.h" | 19 #include "content/public/browser/browser_child_process_observer.h" |
| 21 #include "content/public/browser/browser_thread.h" | 20 #include "content/public/browser/browser_thread.h" |
| 22 #include "content/public/browser/child_process_data.h" | 21 #include "content/public/browser/child_process_data.h" |
| 22 #include "content/public/browser/devtools_agent_host.h" |
| 23 #include "content/public/browser/notification_observer.h" | 23 #include "content/public/browser/notification_observer.h" |
| 24 #include "content/public/browser/notification_registrar.h" | 24 #include "content/public/browser/notification_registrar.h" |
| 25 #include "content/public/browser/notification_service.h" | 25 #include "content/public/browser/notification_service.h" |
| 26 #include "content/public/browser/notification_source.h" | 26 #include "content/public/browser/notification_source.h" |
| 27 #include "content/public/browser/notification_types.h" | 27 #include "content/public/browser/notification_types.h" |
| 28 #include "content/public/browser/worker_service.h" | 28 #include "content/public/browser/worker_service.h" |
| 29 #include "content/public/browser/worker_service_observer.h" | 29 #include "content/public/browser/worker_service_observer.h" |
| 30 #include "content/public/common/process_type.h" | 30 #include "content/public/common/process_type.h" |
| 31 #include "net/base/escape.h" | 31 #include "net/base/escape.h" |
| 32 | 32 |
| 33 using content::BrowserThread; | 33 using content::BrowserThread; |
| 34 using content::DevToolsAgentHost; |
| 34 | 35 |
| 35 namespace { | 36 namespace { |
| 36 | 37 |
| 37 const char kTargetSourceField[] = "source"; | 38 const char kTargetSourceField[] = "source"; |
| 38 const char kTargetSourceLocal[] = "local"; | 39 const char kTargetSourceLocal[] = "local"; |
| 39 const char kTargetSourceRemote[] = "remote"; | 40 const char kTargetSourceRemote[] = "remote"; |
| 40 | 41 |
| 41 const char kTargetIdField[] = "id"; | 42 const char kTargetIdField[] = "id"; |
| 42 const char kTargetTypeField[] = "type"; | 43 const char kTargetTypeField[] = "type"; |
| 43 const char kAttachedField[] = "attached"; | 44 const char kAttachedField[] = "attached"; |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 void ForceUpdate() override; | 167 void ForceUpdate() override; |
| 167 | 168 |
| 168 private: | 169 private: |
| 169 // content::NotificationObserver overrides. | 170 // content::NotificationObserver overrides. |
| 170 void Observe(int type, | 171 void Observe(int type, |
| 171 const content::NotificationSource& source, | 172 const content::NotificationSource& source, |
| 172 const content::NotificationDetails& details) override; | 173 const content::NotificationDetails& details) override; |
| 173 | 174 |
| 174 void ScheduleUpdate(); | 175 void ScheduleUpdate(); |
| 175 void UpdateTargets(); | 176 void UpdateTargets(); |
| 176 void SendTargets(const std::vector<DevToolsTargetImpl*>& targets); | 177 void SendTargets(const DevToolsAgentHost::List& targets); |
| 177 | 178 |
| 178 content::NotificationRegistrar notification_registrar_; | 179 content::NotificationRegistrar notification_registrar_; |
| 179 std::unique_ptr<CancelableTimer> timer_; | 180 std::unique_ptr<CancelableTimer> timer_; |
| 180 scoped_refptr<WorkerObserver> observer_; | 181 scoped_refptr<WorkerObserver> observer_; |
| 181 base::WeakPtrFactory<LocalTargetsUIHandler> weak_factory_; | 182 base::WeakPtrFactory<LocalTargetsUIHandler> weak_factory_; |
| 182 }; | 183 }; |
| 183 | 184 |
| 184 LocalTargetsUIHandler::LocalTargetsUIHandler( | 185 LocalTargetsUIHandler::LocalTargetsUIHandler( |
| 185 const Callback& callback) | 186 const Callback& callback) |
| 186 : DevToolsTargetsUIHandler(kTargetSourceLocal, callback), | 187 : DevToolsTargetsUIHandler(kTargetSourceLocal, callback), |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 void LocalTargetsUIHandler::ScheduleUpdate() { | 220 void LocalTargetsUIHandler::ScheduleUpdate() { |
| 220 const int kUpdateDelay = 100; | 221 const int kUpdateDelay = 100; |
| 221 timer_.reset( | 222 timer_.reset( |
| 222 new CancelableTimer( | 223 new CancelableTimer( |
| 223 base::Bind(&LocalTargetsUIHandler::UpdateTargets, | 224 base::Bind(&LocalTargetsUIHandler::UpdateTargets, |
| 224 base::Unretained(this)), | 225 base::Unretained(this)), |
| 225 base::TimeDelta::FromMilliseconds(kUpdateDelay))); | 226 base::TimeDelta::FromMilliseconds(kUpdateDelay))); |
| 226 } | 227 } |
| 227 | 228 |
| 228 void LocalTargetsUIHandler::UpdateTargets() { | 229 void LocalTargetsUIHandler::UpdateTargets() { |
| 229 SendTargets(DevToolsTargetImpl::EnumerateAll()); | 230 SendTargets(DevToolsAgentHost::GetOrCreateAll()); |
| 230 } | 231 } |
| 231 | 232 |
| 232 void LocalTargetsUIHandler::SendTargets( | 233 void LocalTargetsUIHandler::SendTargets( |
| 233 const std::vector<DevToolsTargetImpl*>& targets) { | 234 const content::DevToolsAgentHost::List& targets) { |
| 234 base::ListValue list_value; | 235 base::ListValue list_value; |
| 235 std::map<std::string, base::DictionaryValue*> id_to_descriptor; | 236 std::map<std::string, base::DictionaryValue*> id_to_descriptor; |
| 236 | 237 |
| 237 base::STLDeleteValues(&targets_); | 238 targets_.clear(); |
| 238 for (DevToolsTargetImpl* target : targets) { | 239 for (scoped_refptr<DevToolsAgentHost> host : targets) { |
| 239 scoped_refptr<content::DevToolsAgentHost> host = target->GetAgentHost(); | 240 targets_[host->GetId()] = host; |
| 240 targets_[host->GetId()] = target; | 241 id_to_descriptor[host->GetId()] = Serialize(host); |
| 241 id_to_descriptor[host->GetId()] = Serialize(*target); | |
| 242 } | 242 } |
| 243 | 243 |
| 244 for (TargetMap::iterator it(targets_.begin()); it != targets_.end(); ++it) { | 244 for (auto& it : targets_) { |
| 245 DevToolsTargetImpl* target = it->second; | 245 scoped_refptr<DevToolsAgentHost> host = it.second; |
| 246 scoped_refptr<content::DevToolsAgentHost> host = target->GetAgentHost(); | |
| 247 base::DictionaryValue* descriptor = id_to_descriptor[host->GetId()]; | 246 base::DictionaryValue* descriptor = id_to_descriptor[host->GetId()]; |
| 248 std::string parent_id = host->GetParentId(); | 247 std::string parent_id = host->GetParentId(); |
| 249 if (parent_id.empty() || id_to_descriptor.count(parent_id) == 0) { | 248 if (parent_id.empty() || id_to_descriptor.count(parent_id) == 0) { |
| 250 list_value.Append(descriptor); | 249 list_value.Append(descriptor); |
| 251 } else { | 250 } else { |
| 252 base::DictionaryValue* parent = id_to_descriptor[parent_id]; | 251 base::DictionaryValue* parent = id_to_descriptor[parent_id]; |
| 253 base::ListValue* guests = NULL; | 252 base::ListValue* guests = NULL; |
| 254 if (!parent->GetList(kGuestList, &guests)) { | 253 if (!parent->GetList(kGuestList, &guests)) { |
| 255 guests = new base::ListValue(); | 254 guests = new base::ListValue(); |
| 256 parent->Set(kGuestList, guests); | 255 parent->Set(kGuestList, guests); |
| 257 } | 256 } |
| 258 guests->Append(descriptor); | 257 guests->Append(descriptor); |
| 259 } | 258 } |
| 260 } | 259 } |
| 261 | 260 |
| 262 SendSerializedTargets(list_value); | 261 SendSerializedTargets(list_value); |
| 263 } | 262 } |
| 264 | 263 |
| 265 // AdbTargetsUIHandler -------------------------------------------------------- | 264 // AdbTargetsUIHandler -------------------------------------------------------- |
| 266 | 265 |
| 267 class AdbTargetsUIHandler | 266 class AdbTargetsUIHandler |
| 268 : public DevToolsTargetsUIHandler, | 267 : public DevToolsTargetsUIHandler, |
| 269 public DevToolsAndroidBridge::DeviceListListener { | 268 public DevToolsAndroidBridge::DeviceListListener { |
| 270 public: | 269 public: |
| 271 AdbTargetsUIHandler(const Callback& callback, Profile* profile); | 270 AdbTargetsUIHandler(const Callback& callback, Profile* profile); |
| 272 ~AdbTargetsUIHandler() override; | 271 ~AdbTargetsUIHandler() override; |
| 273 | 272 |
| 274 void Open(const std::string& browser_id, const std::string& url) override; | 273 void Open(const std::string& browser_id, const std::string& url) override; |
| 275 | 274 |
| 276 scoped_refptr<content::DevToolsAgentHost> GetBrowserAgentHost( | 275 scoped_refptr<DevToolsAgentHost> GetBrowserAgentHost( |
| 277 const std::string& browser_id) override; | 276 const std::string& browser_id) override; |
| 278 | 277 |
| 279 private: | 278 private: |
| 280 // DevToolsAndroidBridge::Listener overrides. | 279 // DevToolsAndroidBridge::Listener overrides. |
| 281 void DeviceListChanged( | 280 void DeviceListChanged( |
| 282 const DevToolsAndroidBridge::RemoteDevices& devices) override; | 281 const DevToolsAndroidBridge::RemoteDevices& devices) override; |
| 283 | 282 |
| 284 DevToolsAndroidBridge* GetAndroidBridge(); | 283 DevToolsAndroidBridge* GetAndroidBridge(); |
| 285 | 284 |
| 286 Profile* const profile_; | 285 Profile* const profile_; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 306 android_bridge_->RemoveDeviceListListener(this); | 305 android_bridge_->RemoveDeviceListListener(this); |
| 307 } | 306 } |
| 308 | 307 |
| 309 void AdbTargetsUIHandler::Open(const std::string& browser_id, | 308 void AdbTargetsUIHandler::Open(const std::string& browser_id, |
| 310 const std::string& url) { | 309 const std::string& url) { |
| 311 RemoteBrowsers::iterator it = remote_browsers_.find(browser_id); | 310 RemoteBrowsers::iterator it = remote_browsers_.find(browser_id); |
| 312 if (it != remote_browsers_.end() && android_bridge_) | 311 if (it != remote_browsers_.end() && android_bridge_) |
| 313 android_bridge_->OpenRemotePage(it->second, url); | 312 android_bridge_->OpenRemotePage(it->second, url); |
| 314 } | 313 } |
| 315 | 314 |
| 316 scoped_refptr<content::DevToolsAgentHost> | 315 scoped_refptr<DevToolsAgentHost> |
| 317 AdbTargetsUIHandler::GetBrowserAgentHost( | 316 AdbTargetsUIHandler::GetBrowserAgentHost( |
| 318 const std::string& browser_id) { | 317 const std::string& browser_id) { |
| 319 RemoteBrowsers::iterator it = remote_browsers_.find(browser_id); | 318 RemoteBrowsers::iterator it = remote_browsers_.find(browser_id); |
| 320 if (it == remote_browsers_.end() || !android_bridge_) | 319 if (it == remote_browsers_.end() || !android_bridge_) |
| 321 return nullptr; | 320 return nullptr; |
| 322 | 321 |
| 323 return android_bridge_->GetBrowserAgentHost(it->second); | 322 return android_bridge_->GetBrowserAgentHost(it->second); |
| 324 } | 323 } |
| 325 | 324 |
| 326 void AdbTargetsUIHandler::DeviceListChanged( | 325 void AdbTargetsUIHandler::DeviceListChanged( |
| 327 const DevToolsAndroidBridge::RemoteDevices& devices) { | 326 const DevToolsAndroidBridge::RemoteDevices& devices) { |
| 328 remote_browsers_.clear(); | 327 remote_browsers_.clear(); |
| 329 base::STLDeleteValues(&targets_); | 328 targets_.clear(); |
| 330 if (!android_bridge_) | 329 if (!android_bridge_) |
| 331 return; | 330 return; |
| 332 | 331 |
| 333 base::ListValue device_list; | 332 base::ListValue device_list; |
| 334 for (DevToolsAndroidBridge::RemoteDevices::const_iterator dit = | 333 for (DevToolsAndroidBridge::RemoteDevices::const_iterator dit = |
| 335 devices.begin(); dit != devices.end(); ++dit) { | 334 devices.begin(); dit != devices.end(); ++dit) { |
| 336 DevToolsAndroidBridge::RemoteDevice* device = dit->get(); | 335 DevToolsAndroidBridge::RemoteDevice* device = dit->get(); |
| 337 std::unique_ptr<base::DictionaryValue> device_data( | 336 std::unique_ptr<base::DictionaryValue> device_data( |
| 338 new base::DictionaryValue()); | 337 new base::DictionaryValue()); |
| 339 device_data->SetString(kAdbModelField, device->model()); | 338 device_data->SetString(kAdbModelField, device->model()); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 361 kAdbBrowserChromeVersionField, | 360 kAdbBrowserChromeVersionField, |
| 362 browser->IsChrome() && !parsed.empty() ? parsed[0] : 0); | 361 browser->IsChrome() && !parsed.empty() ? parsed[0] : 0); |
| 363 std::string browser_id = browser->GetId(); | 362 std::string browser_id = browser->GetId(); |
| 364 browser_data->SetString(kTargetIdField, browser_id); | 363 browser_data->SetString(kTargetIdField, browser_id); |
| 365 browser_data->SetString(kTargetSourceField, source_id()); | 364 browser_data->SetString(kTargetSourceField, source_id()); |
| 366 | 365 |
| 367 base::ListValue* page_list = new base::ListValue(); | 366 base::ListValue* page_list = new base::ListValue(); |
| 368 remote_browsers_[browser_id] = browser; | 367 remote_browsers_[browser_id] = browser; |
| 369 browser_data->Set(kAdbPagesList, page_list); | 368 browser_data->Set(kAdbPagesList, page_list); |
| 370 for (const auto& page : browser->pages()) { | 369 for (const auto& page : browser->pages()) { |
| 371 DevToolsTargetImpl* target = android_bridge_->CreatePageTarget(page); | 370 scoped_refptr<DevToolsAgentHost> host = |
| 372 scoped_refptr<content::DevToolsAgentHost> host = target->GetAgentHost(); | 371 android_bridge_->CreatePageTarget(page); |
| 373 base::DictionaryValue* target_data = Serialize(*target); | 372 base::DictionaryValue* target_data = Serialize(host); |
| 374 target_data->SetBoolean( | 373 target_data->SetBoolean( |
| 375 kAdbAttachedForeignField, | 374 kAdbAttachedForeignField, |
| 376 host->IsAttached() && | 375 host->IsAttached() && |
| 377 !android_bridge_->HasDevToolsWindow(host->GetId())); | 376 !android_bridge_->HasDevToolsWindow(host->GetId())); |
| 378 // Pass the screen size in the target object to make sure that | 377 // Pass the screen size in the target object to make sure that |
| 379 // the caching logic does not prevent the target item from updating | 378 // the caching logic does not prevent the target item from updating |
| 380 // when the screen size changes. | 379 // when the screen size changes. |
| 381 gfx::Size screen_size = device->screen_size(); | 380 gfx::Size screen_size = device->screen_size(); |
| 382 target_data->SetInteger(kAdbScreenWidthField, screen_size.width()); | 381 target_data->SetInteger(kAdbScreenWidthField, screen_size.width()); |
| 383 target_data->SetInteger(kAdbScreenHeightField, screen_size.height()); | 382 target_data->SetInteger(kAdbScreenHeightField, screen_size.height()); |
| 384 targets_[host->GetId()] = target; | 383 targets_[host->GetId()] = host; |
| 385 page_list->Append(target_data); | 384 page_list->Append(target_data); |
| 386 } | 385 } |
| 387 browser_list->Append(std::move(browser_data)); | 386 browser_list->Append(std::move(browser_data)); |
| 388 } | 387 } |
| 389 | 388 |
| 390 device_list.Append(std::move(device_data)); | 389 device_list.Append(std::move(device_data)); |
| 391 } | 390 } |
| 392 SendSerializedTargets(device_list); | 391 SendSerializedTargets(device_list); |
| 393 } | 392 } |
| 394 | 393 |
| 395 } // namespace | 394 } // namespace |
| 396 | 395 |
| 397 // DevToolsTargetsUIHandler --------------------------------------------------- | 396 // DevToolsTargetsUIHandler --------------------------------------------------- |
| 398 | 397 |
| 399 DevToolsTargetsUIHandler::DevToolsTargetsUIHandler( | 398 DevToolsTargetsUIHandler::DevToolsTargetsUIHandler( |
| 400 const std::string& source_id, | 399 const std::string& source_id, |
| 401 const Callback& callback) | 400 const Callback& callback) |
| 402 : source_id_(source_id), | 401 : source_id_(source_id), |
| 403 callback_(callback) { | 402 callback_(callback) { |
| 404 } | 403 } |
| 405 | 404 |
| 406 DevToolsTargetsUIHandler::~DevToolsTargetsUIHandler() { | 405 DevToolsTargetsUIHandler::~DevToolsTargetsUIHandler() { |
| 407 base::STLDeleteValues(&targets_); | |
| 408 } | 406 } |
| 409 | 407 |
| 410 // static | 408 // static |
| 411 std::unique_ptr<DevToolsTargetsUIHandler> | 409 std::unique_ptr<DevToolsTargetsUIHandler> |
| 412 DevToolsTargetsUIHandler::CreateForLocal( | 410 DevToolsTargetsUIHandler::CreateForLocal( |
| 413 const DevToolsTargetsUIHandler::Callback& callback) { | 411 const DevToolsTargetsUIHandler::Callback& callback) { |
| 414 return std::unique_ptr<DevToolsTargetsUIHandler>( | 412 return std::unique_ptr<DevToolsTargetsUIHandler>( |
| 415 new LocalTargetsUIHandler(callback)); | 413 new LocalTargetsUIHandler(callback)); |
| 416 } | 414 } |
| 417 | 415 |
| 418 // static | 416 // static |
| 419 std::unique_ptr<DevToolsTargetsUIHandler> | 417 std::unique_ptr<DevToolsTargetsUIHandler> |
| 420 DevToolsTargetsUIHandler::CreateForAdb( | 418 DevToolsTargetsUIHandler::CreateForAdb( |
| 421 const DevToolsTargetsUIHandler::Callback& callback, | 419 const DevToolsTargetsUIHandler::Callback& callback, |
| 422 Profile* profile) { | 420 Profile* profile) { |
| 423 return std::unique_ptr<DevToolsTargetsUIHandler>( | 421 return std::unique_ptr<DevToolsTargetsUIHandler>( |
| 424 new AdbTargetsUIHandler(callback, profile)); | 422 new AdbTargetsUIHandler(callback, profile)); |
| 425 } | 423 } |
| 426 | 424 |
| 427 DevToolsTargetImpl* DevToolsTargetsUIHandler::GetTarget( | 425 scoped_refptr<DevToolsAgentHost> DevToolsTargetsUIHandler::GetTarget( |
| 428 const std::string& target_id) { | 426 const std::string& target_id) { |
| 429 TargetMap::iterator it = targets_.find(target_id); | 427 TargetMap::iterator it = targets_.find(target_id); |
| 430 if (it != targets_.end()) | 428 if (it != targets_.end()) |
| 431 return it->second; | 429 return it->second; |
| 432 return NULL; | 430 return NULL; |
| 433 } | 431 } |
| 434 | 432 |
| 435 void DevToolsTargetsUIHandler::Open(const std::string& browser_id, | 433 void DevToolsTargetsUIHandler::Open(const std::string& browser_id, |
| 436 const std::string& url) { | 434 const std::string& url) { |
| 437 } | 435 } |
| 438 | 436 |
| 439 scoped_refptr<content::DevToolsAgentHost> | 437 scoped_refptr<DevToolsAgentHost> |
| 440 DevToolsTargetsUIHandler::GetBrowserAgentHost(const std::string& browser_id) { | 438 DevToolsTargetsUIHandler::GetBrowserAgentHost(const std::string& browser_id) { |
| 441 return NULL; | 439 return NULL; |
| 442 } | 440 } |
| 443 | 441 |
| 444 base::DictionaryValue* DevToolsTargetsUIHandler::Serialize( | 442 base::DictionaryValue* DevToolsTargetsUIHandler::Serialize( |
| 445 const DevToolsTargetImpl& target) { | 443 scoped_refptr<DevToolsAgentHost> host) { |
| 446 base::DictionaryValue* target_data = new base::DictionaryValue(); | 444 base::DictionaryValue* target_data = new base::DictionaryValue(); |
| 447 scoped_refptr<content::DevToolsAgentHost> host = target.GetAgentHost(); | |
| 448 target_data->SetString(kTargetSourceField, source_id_); | 445 target_data->SetString(kTargetSourceField, source_id_); |
| 449 target_data->SetString(kTargetIdField, host->GetId()); | 446 target_data->SetString(kTargetIdField, host->GetId()); |
| 450 target_data->SetString(kTargetTypeField, host->GetType()); | 447 target_data->SetString(kTargetTypeField, host->GetType()); |
| 451 target_data->SetBoolean(kAttachedField, host->IsAttached()); | 448 target_data->SetBoolean(kAttachedField, host->IsAttached()); |
| 452 target_data->SetString(kUrlField, host->GetURL().spec()); | 449 target_data->SetString(kUrlField, host->GetURL().spec()); |
| 453 target_data->SetString(kNameField, host->GetTitle()); | 450 target_data->SetString(kNameField, host->GetTitle()); |
| 454 target_data->SetString(kFaviconUrlField, host->GetFaviconURL().spec()); | 451 target_data->SetString(kFaviconUrlField, host->GetFaviconURL().spec()); |
| 455 target_data->SetString(kDescriptionField, host->GetDescription()); | 452 target_data->SetString(kDescriptionField, host->GetDescription()); |
| 456 return target_data; | 453 return target_data; |
| 457 } | 454 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 device_status_dict->SetString(kPortForwardingBrowserId, | 497 device_status_dict->SetString(kPortForwardingBrowserId, |
| 501 sit->first->GetId()); | 498 sit->first->GetId()); |
| 502 | 499 |
| 503 std::string device_id = base::StringPrintf( | 500 std::string device_id = base::StringPrintf( |
| 504 kAdbDeviceIdFormat, | 501 kAdbDeviceIdFormat, |
| 505 sit->first->serial().c_str()); | 502 sit->first->serial().c_str()); |
| 506 result.Set(device_id, device_status_dict); | 503 result.Set(device_id, device_status_dict); |
| 507 } | 504 } |
| 508 callback_.Run(result); | 505 callback_.Run(result); |
| 509 } | 506 } |
| OLD | NEW |