blob: f2871e4ccaa2afdba1314dec2ca6c711b0c2ece1 [file] [log] [blame]
[email protected]ad2246232013-11-13 18:42:361// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/devtools/devtools_targets_ui.h"
6
dcheng71bb8452016-09-17 01:30:157#include <memory>
dcheng98e96a72016-06-11 03:41:488#include <utility>
9
Sebastien Marchandf1349f52019-01-25 03:16:4110#include "base/bind.h"
skyostil02598352015-06-12 12:37:2511#include "base/location.h"
[email protected]e90c5f9b2013-12-11 12:49:4412#include "base/memory/weak_ptr.h"
skyostil02598352015-06-12 12:37:2513#include "base/single_thread_task_runner.h"
[email protected]ad2246232013-11-13 18:42:3614#include "base/stl_util.h"
riceaa01edead2015-07-01 15:56:5015#include "base/strings/string_number_conversions.h"
[email protected]ad2246232013-11-13 18:42:3616#include "base/strings/stringprintf.h"
gabb15e19072016-05-11 20:45:4117#include "base/threading/thread_task_runner_handle.h"
[email protected]ad2246232013-11-13 18:42:3618#include "base/values.h"
[email protected]167206cf2014-02-17 13:16:4019#include "base/version.h"
[email protected]96fe8582014-04-21 14:56:4020#include "chrome/browser/devtools/device/devtools_android_bridge.h"
Pavol Marko56df0272018-07-04 17:55:0421#include "chrome/browser/devtools/devtools_window.h"
vabr66815972017-04-20 08:27:0622#include "chrome/browser/devtools/serialize_host_descriptions.h"
[email protected]ad2246232013-11-13 18:42:3623#include "content/public/browser/browser_thread.h"
pfeldmanbc5d7882016-08-26 18:55:4624#include "content/public/browser/devtools_agent_host.h"
Dmitry Gozman72b5bd92017-11-21 00:03:1825#include "content/public/browser/devtools_agent_host_observer.h"
[email protected]ad2246232013-11-13 18:42:3626
27using content::BrowserThread;
pfeldmanbc5d7882016-08-26 18:55:4628using content::DevToolsAgentHost;
[email protected]ad2246232013-11-13 18:42:3629
30namespace {
31
32const char kTargetSourceField[] = "source";
dgozmanbfb96fb2014-09-12 13:33:2933const char kTargetSourceLocal[] = "local";
34const char kTargetSourceRemote[] = "remote";
[email protected]ad2246232013-11-13 18:42:3635
36const char kTargetIdField[] = "id";
37const char kTargetTypeField[] = "type";
38const char kAttachedField[] = "attached";
39const char kUrlField[] = "url";
40const char kNameField[] = "name";
41const char kFaviconUrlField[] = "faviconUrl";
42const char kDescriptionField[] = "description";
43
44const char kGuestList[] = "guests";
45
46const char kAdbModelField[] = "adbModel";
47const char kAdbConnectedField[] = "adbConnected";
48const char kAdbSerialField[] = "adbSerial";
[email protected]ad2246232013-11-13 18:42:3649const char kAdbBrowsersList[] = "browsers";
[email protected]def2b682014-04-15 12:59:1050const char kAdbDeviceIdFormat[] = "device:%s";
[email protected]ad2246232013-11-13 18:42:3651
52const char kAdbBrowserNameField[] = "adbBrowserName";
vkuzkokov952b3472015-01-15 15:55:2653const char kAdbBrowserUserField[] = "adbBrowserUser";
[email protected]ad2246232013-11-13 18:42:3654const char kAdbBrowserVersionField[] = "adbBrowserVersion";
55const char kAdbBrowserChromeVersionField[] = "adbBrowserChromeVersion";
56const char kAdbPagesList[] = "pages";
57
58const char kAdbScreenWidthField[] = "adbScreenWidth";
59const char kAdbScreenHeightField[] = "adbScreenHeight";
[email protected]ad2246232013-11-13 18:42:3660
vkuzkokov32c0c072014-10-01 14:10:3861const char kPortForwardingPorts[] = "ports";
62const char kPortForwardingBrowserId[] = "browserId";
63
[email protected]e90c5f9b2013-12-11 12:49:4464// CancelableTimer ------------------------------------------------------------
65
66class CancelableTimer {
67 public:
68 CancelableTimer(base::Closure callback, base::TimeDelta delay)
69 : callback_(callback),
70 weak_factory_(this) {
skyostil02598352015-06-12 12:37:2571 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e90c5f9b2013-12-11 12:49:4472 FROM_HERE,
tzik93bf8a72017-04-24 18:53:3073 base::BindOnce(&CancelableTimer::Fire, weak_factory_.GetWeakPtr()),
74 delay);
[email protected]f30ed782014-05-16 17:52:5075 }
[email protected]e90c5f9b2013-12-11 12:49:4476
77 private:
78 void Fire() { callback_.Run(); }
79
80 base::Closure callback_;
81 base::WeakPtrFactory<CancelableTimer> weak_factory_;
82};
83
dgozmanbfb96fb2014-09-12 13:33:2984// LocalTargetsUIHandler ---------------------------------------------
85
Dmitry Gozman72b5bd92017-11-21 00:03:1886class LocalTargetsUIHandler : public DevToolsTargetsUIHandler,
87 public content::DevToolsAgentHostObserver {
[email protected]ad2246232013-11-13 18:42:3688 public:
Dmitry Gozman9e85208c72018-03-21 00:47:4389 LocalTargetsUIHandler(const Callback& callback, Profile* profile);
dcheng03748a42014-10-21 10:19:1390 ~LocalTargetsUIHandler() override;
[email protected]8ff7a292014-07-08 23:20:5391
dgozmanffe70eca2014-09-18 14:28:1192 // DevToolsTargetsUIHandler overrides.
dcheng03748a42014-10-21 10:19:1393 void ForceUpdate() override;
dgozmanffe70eca2014-09-18 14:28:1194
dgozmanbfb96fb2014-09-12 13:33:2995private:
Dmitry Gozman72b5bd92017-11-21 00:03:1896 // content::DevToolsAgentHostObserver overrides.
97 bool ShouldForceDevToolsAgentHostCreation() override;
98 void DevToolsAgentHostCreated(DevToolsAgentHost* agent_host) override;
99 void DevToolsAgentHostDestroyed(DevToolsAgentHost* agent_host) override;
[email protected]ad2246232013-11-13 18:42:36100
Dmitry Gozman72b5bd92017-11-21 00:03:18101 void ScheduleUpdate();
102 void UpdateTargets();
[email protected]ad2246232013-11-13 18:42:36103
Dmitry Gozman9e85208c72018-03-21 00:47:43104 Profile* profile_;
Dmitry Gozman72b5bd92017-11-21 00:03:18105 std::unique_ptr<CancelableTimer> timer_;
106 base::WeakPtrFactory<LocalTargetsUIHandler> weak_factory_;
[email protected]ad2246232013-11-13 18:42:36107};
108
Dmitry Gozman9e85208c72018-03-21 00:47:43109LocalTargetsUIHandler::LocalTargetsUIHandler(const Callback& callback,
110 Profile* profile)
dgozmanbfb96fb2014-09-12 13:33:29111 : DevToolsTargetsUIHandler(kTargetSourceLocal, callback),
Dmitry Gozman9e85208c72018-03-21 00:47:43112 profile_(profile),
dgozmanbfb96fb2014-09-12 13:33:29113 weak_factory_(this) {
Dmitry Gozman72b5bd92017-11-21 00:03:18114 DevToolsAgentHost::AddObserver(this);
[email protected]ad2246232013-11-13 18:42:36115 UpdateTargets();
116}
117
dgozmanbfb96fb2014-09-12 13:33:29118LocalTargetsUIHandler::~LocalTargetsUIHandler() {
Dmitry Gozman72b5bd92017-11-21 00:03:18119 DevToolsAgentHost::RemoveObserver(this);
[email protected]ad2246232013-11-13 18:42:36120}
121
Dmitry Gozman72b5bd92017-11-21 00:03:18122bool LocalTargetsUIHandler::ShouldForceDevToolsAgentHostCreation() {
123 return true;
124}
125
126void LocalTargetsUIHandler::DevToolsAgentHostCreated(DevToolsAgentHost*) {
127 ScheduleUpdate();
128}
129
130void LocalTargetsUIHandler::DevToolsAgentHostDestroyed(DevToolsAgentHost*) {
dgozmanbfb96fb2014-09-12 13:33:29131 ScheduleUpdate();
132}
133
dgozmanffe70eca2014-09-18 14:28:11134void LocalTargetsUIHandler::ForceUpdate() {
135 ScheduleUpdate();
136}
137
dgozmanbfb96fb2014-09-12 13:33:29138void LocalTargetsUIHandler::ScheduleUpdate() {
[email protected]e90c5f9b2013-12-11 12:49:44139 const int kUpdateDelay = 100;
140 timer_.reset(
141 new CancelableTimer(
dgozmanbfb96fb2014-09-12 13:33:29142 base::Bind(&LocalTargetsUIHandler::UpdateTargets,
[email protected]e90c5f9b2013-12-11 12:49:44143 base::Unretained(this)),
144 base::TimeDelta::FromMilliseconds(kUpdateDelay)));
[email protected]ad2246232013-11-13 18:42:36145}
146
dgozmanbfb96fb2014-09-12 13:33:29147void LocalTargetsUIHandler::UpdateTargets() {
Dmitry Gozman9e85208c72018-03-21 00:47:43148 content::DevToolsAgentHost::List targets =
149 DevToolsAgentHost::GetOrCreateAll();
[email protected]ad2246232013-11-13 18:42:36150
vabr66815972017-04-20 08:27:06151 std::vector<HostDescriptionNode> hosts;
152 hosts.reserve(targets.size());
pfeldmanbc5d7882016-08-26 18:55:46153 targets_.clear();
vabr66815972017-04-20 08:27:06154 for (const scoped_refptr<DevToolsAgentHost>& host : targets) {
Dmitry Gozman9e85208c72018-03-21 00:47:43155 if (Profile::FromBrowserContext(host->GetBrowserContext()) != profile_)
156 continue;
Pavol Marko56df0272018-07-04 17:55:04157 if (!DevToolsWindow::AllowDevToolsFor(profile_, host->GetWebContents()))
158 continue;
pfeldmanbc5d7882016-08-26 18:55:46159 targets_[host->GetId()] = host;
jdoerriecc9f5732017-08-23 14:12:30160 hosts.push_back({host->GetId(), host->GetParentId(),
161 std::move(*Serialize(host.get()))});
[email protected]ad2246232013-11-13 18:42:36162 }
163
vabr66815972017-04-20 08:27:06164 SendSerializedTargets(
165 SerializeHostDescriptions(std::move(hosts), kGuestList));
[email protected]ad2246232013-11-13 18:42:36166}
167
[email protected]ad2246232013-11-13 18:42:36168// AdbTargetsUIHandler --------------------------------------------------------
169
170class AdbTargetsUIHandler
[email protected]6defd99c2014-04-30 17:22:17171 : public DevToolsTargetsUIHandler,
[email protected]96fe8582014-04-21 14:56:40172 public DevToolsAndroidBridge::DeviceListListener {
[email protected]ad2246232013-11-13 18:42:36173 public:
[email protected]8ff7a292014-07-08 23:20:53174 AdbTargetsUIHandler(const Callback& callback, Profile* profile);
dcheng03748a42014-10-21 10:19:13175 ~AdbTargetsUIHandler() override;
[email protected]ad2246232013-11-13 18:42:36176
vkuzkokovd49c9e12015-03-26 16:38:38177 void Open(const std::string& browser_id, const std::string& url) override;
[email protected]ad2246232013-11-13 18:42:36178
pfeldmanbc5d7882016-08-26 18:55:46179 scoped_refptr<DevToolsAgentHost> GetBrowserAgentHost(
mostynb01d8b10e2014-10-13 09:44:44180 const std::string& browser_id) override;
[email protected]f30ed782014-05-16 17:52:50181
[email protected]ad2246232013-11-13 18:42:36182 private:
[email protected]96fe8582014-04-21 14:56:40183 // DevToolsAndroidBridge::Listener overrides.
dcheng03748a42014-10-21 10:19:13184 void DeviceListChanged(
mostynb01d8b10e2014-10-13 09:44:44185 const DevToolsAndroidBridge::RemoteDevices& devices) override;
[email protected]ad2246232013-11-13 18:42:36186
vkuzkokovf16940a62014-10-14 17:49:05187 DevToolsAndroidBridge* GetAndroidBridge();
188
serya217cac52014-12-03 15:01:54189 Profile* const profile_;
190 DevToolsAndroidBridge* const android_bridge_;
[email protected]ad2246232013-11-13 18:42:36191
192 typedef std::map<std::string,
[email protected]96fe8582014-04-21 14:56:40193 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> > RemoteBrowsers;
[email protected]ad2246232013-11-13 18:42:36194 RemoteBrowsers remote_browsers_;
195};
196
[email protected]8ff7a292014-07-08 23:20:53197AdbTargetsUIHandler::AdbTargetsUIHandler(const Callback& callback,
198 Profile* profile)
dgozmanbfb96fb2014-09-12 13:33:29199 : DevToolsTargetsUIHandler(kTargetSourceRemote, callback),
vkuzkokovf16940a62014-10-14 17:49:05200 profile_(profile),
201 android_bridge_(
202 DevToolsAndroidBridge::Factory::GetForProfile(profile_)) {
dgozman50ef68582015-11-25 03:10:59203 if (android_bridge_)
204 android_bridge_->AddDeviceListListener(this);
[email protected]ad2246232013-11-13 18:42:36205}
206
207AdbTargetsUIHandler::~AdbTargetsUIHandler() {
dgozman50ef68582015-11-25 03:10:59208 if (android_bridge_)
209 android_bridge_->RemoveDeviceListListener(this);
[email protected]ad2246232013-11-13 18:42:36210}
211
vkuzkokovd49c9e12015-03-26 16:38:38212void AdbTargetsUIHandler::Open(const std::string& browser_id,
213 const std::string& url) {
jdoerriec6fe63e2018-10-03 20:53:40214 auto it = remote_browsers_.find(browser_id);
dgozman50ef68582015-11-25 03:10:59215 if (it != remote_browsers_.end() && android_bridge_)
vkuzkokov5c77d8d2015-03-31 11:23:58216 android_bridge_->OpenRemotePage(it->second, url);
[email protected]577d2e4ff2014-04-15 17:07:03217}
218
pfeldmanbc5d7882016-08-26 18:55:46219scoped_refptr<DevToolsAgentHost>
[email protected]f30ed782014-05-16 17:52:50220AdbTargetsUIHandler::GetBrowserAgentHost(
221 const std::string& browser_id) {
jdoerriec6fe63e2018-10-03 20:53:40222 auto it = remote_browsers_.find(browser_id);
dgozman50ef68582015-11-25 03:10:59223 if (it == remote_browsers_.end() || !android_bridge_)
224 return nullptr;
vkuzkokovf16940a62014-10-14 17:49:05225
226 return android_bridge_->GetBrowserAgentHost(it->second);
[email protected]f30ed782014-05-16 17:52:50227}
228
[email protected]3bdb22b2014-04-15 18:21:28229void AdbTargetsUIHandler::DeviceListChanged(
[email protected]96fe8582014-04-21 14:56:40230 const DevToolsAndroidBridge::RemoteDevices& devices) {
[email protected]ad2246232013-11-13 18:42:36231 remote_browsers_.clear();
pfeldmanbc5d7882016-08-26 18:55:46232 targets_.clear();
dgozman50ef68582015-11-25 03:10:59233 if (!android_bridge_)
234 return;
[email protected]ad2246232013-11-13 18:42:36235
[email protected]8ff7a292014-07-08 23:20:53236 base::ListValue device_list;
jdoerriec6fe63e2018-10-03 20:53:40237 for (auto dit = devices.begin(); dit != devices.end(); ++dit) {
[email protected]96fe8582014-04-21 14:56:40238 DevToolsAndroidBridge::RemoteDevice* device = dit->get();
dcheng98e96a72016-06-11 03:41:48239 std::unique_ptr<base::DictionaryValue> device_data(
240 new base::DictionaryValue());
[email protected]4a00a3955e2014-04-07 11:03:27241 device_data->SetString(kAdbModelField, device->model());
242 device_data->SetString(kAdbSerialField, device->serial());
243 device_data->SetBoolean(kAdbConnectedField, device->is_connected());
[email protected]ad2246232013-11-13 18:42:36244 std::string device_id = base::StringPrintf(
[email protected]def2b682014-04-15 12:59:10245 kAdbDeviceIdFormat,
[email protected]4a00a3955e2014-04-07 11:03:27246 device->serial().c_str());
[email protected]ad2246232013-11-13 18:42:36247 device_data->SetString(kTargetIdField, device_id);
Jeremy Romanec48d7a2018-03-01 17:35:09248 auto browser_list = std::make_unique<base::ListValue>();
[email protected]ad2246232013-11-13 18:42:36249
[email protected]96fe8582014-04-21 14:56:40250 DevToolsAndroidBridge::RemoteBrowsers& browsers = device->browsers();
jdoerriec6fe63e2018-10-03 20:53:40251 for (auto bit = browsers.begin(); bit != browsers.end(); ++bit) {
[email protected]96fe8582014-04-21 14:56:40252 DevToolsAndroidBridge::RemoteBrowser* browser = bit->get();
dcheng98e96a72016-06-11 03:41:48253 std::unique_ptr<base::DictionaryValue> browser_data(
254 new base::DictionaryValue());
[email protected]ad2246232013-11-13 18:42:36255 browser_data->SetString(kAdbBrowserNameField, browser->display_name());
vkuzkokov952b3472015-01-15 15:55:26256 browser_data->SetString(kAdbBrowserUserField, browser->user());
[email protected]ad2246232013-11-13 18:42:36257 browser_data->SetString(kAdbBrowserVersionField, browser->version());
[email protected]96fe8582014-04-21 14:56:40258 DevToolsAndroidBridge::RemoteBrowser::ParsedVersion parsed =
[email protected]ad2246232013-11-13 18:42:36259 browser->GetParsedVersion();
260 browser_data->SetInteger(
261 kAdbBrowserChromeVersionField,
262 browser->IsChrome() && !parsed.empty() ? parsed[0] : 0);
vkuzkokov46786fd12015-03-11 14:51:00263 std::string browser_id = browser->GetId();
[email protected]ad2246232013-11-13 18:42:36264 browser_data->SetString(kTargetIdField, browser_id);
265 browser_data->SetString(kTargetSourceField, source_id());
[email protected]daa76532014-03-17 11:32:23266
Jeremy Romanec48d7a2018-03-01 17:35:09267 auto page_list = std::make_unique<base::ListValue>();
[email protected]167206cf2014-02-17 13:16:40268 remote_browsers_[browser_id] = browser;
vkuzkokovcf47aaf2014-10-17 14:11:32269 for (const auto& page : browser->pages()) {
pfeldmane7d2e412016-09-23 16:41:51270 scoped_refptr<DevToolsAgentHost> host = page->CreateTarget();
vabr66815972017-04-20 08:27:06271 std::unique_ptr<base::DictionaryValue> target_data =
272 Serialize(host.get());
[email protected]ad2246232013-11-13 18:42:36273 // Pass the screen size in the target object to make sure that
274 // the caching logic does not prevent the target item from updating
275 // when the screen size changes.
276 gfx::Size screen_size = device->screen_size();
277 target_data->SetInteger(kAdbScreenWidthField, screen_size.width());
278 target_data->SetInteger(kAdbScreenHeightField, screen_size.height());
pfeldmanbc5d7882016-08-26 18:55:46279 targets_[host->GetId()] = host;
dcheng71bb8452016-09-17 01:30:15280 page_list->Append(std::move(target_data));
[email protected]ad2246232013-11-13 18:42:36281 }
vabr9984ea62017-04-10 11:33:49282 browser_data->Set(kAdbPagesList, std::move(page_list));
dcheng98e96a72016-06-11 03:41:48283 browser_list->Append(std::move(browser_data));
[email protected]ad2246232013-11-13 18:42:36284 }
285
vabr9984ea62017-04-10 11:33:49286 device_data->Set(kAdbBrowsersList, std::move(browser_list));
dcheng98e96a72016-06-11 03:41:48287 device_list.Append(std::move(device_data));
[email protected]ad2246232013-11-13 18:42:36288 }
[email protected]8ff7a292014-07-08 23:20:53289 SendSerializedTargets(device_list);
[email protected]ad2246232013-11-13 18:42:36290}
291
292} // namespace
293
294// DevToolsTargetsUIHandler ---------------------------------------------------
295
296DevToolsTargetsUIHandler::DevToolsTargetsUIHandler(
297 const std::string& source_id,
[email protected]8ff7a292014-07-08 23:20:53298 const Callback& callback)
[email protected]ad2246232013-11-13 18:42:36299 : source_id_(source_id),
300 callback_(callback) {
301}
302
303DevToolsTargetsUIHandler::~DevToolsTargetsUIHandler() {
[email protected]ad2246232013-11-13 18:42:36304}
305
306// static
dchengb8eac3a2016-04-13 02:03:23307std::unique_ptr<DevToolsTargetsUIHandler>
dgozmanbfb96fb2014-09-12 13:33:29308DevToolsTargetsUIHandler::CreateForLocal(
Dmitry Gozman9e85208c72018-03-21 00:47:43309 const DevToolsTargetsUIHandler::Callback& callback,
310 Profile* profile) {
dchengb8eac3a2016-04-13 02:03:23311 return std::unique_ptr<DevToolsTargetsUIHandler>(
Dmitry Gozman9e85208c72018-03-21 00:47:43312 new LocalTargetsUIHandler(callback, profile));
[email protected]ad2246232013-11-13 18:42:36313}
314
[email protected]6defd99c2014-04-30 17:22:17315// static
dchengb8eac3a2016-04-13 02:03:23316std::unique_ptr<DevToolsTargetsUIHandler>
[email protected]6defd99c2014-04-30 17:22:17317DevToolsTargetsUIHandler::CreateForAdb(
dchengb8eac3a2016-04-13 02:03:23318 const DevToolsTargetsUIHandler::Callback& callback,
319 Profile* profile) {
320 return std::unique_ptr<DevToolsTargetsUIHandler>(
[email protected]6defd99c2014-04-30 17:22:17321 new AdbTargetsUIHandler(callback, profile));
[email protected]ad2246232013-11-13 18:42:36322}
323
pfeldmanbc5d7882016-08-26 18:55:46324scoped_refptr<DevToolsAgentHost> DevToolsTargetsUIHandler::GetTarget(
[email protected]6defd99c2014-04-30 17:22:17325 const std::string& target_id) {
jdoerriec6fe63e2018-10-03 20:53:40326 auto it = targets_.find(target_id);
[email protected]ad2246232013-11-13 18:42:36327 if (it != targets_.end())
[email protected]6defd99c2014-04-30 17:22:17328 return it->second;
329 return NULL;
[email protected]ad2246232013-11-13 18:42:36330}
331
[email protected]6defd99c2014-04-30 17:22:17332void DevToolsTargetsUIHandler::Open(const std::string& browser_id,
vkuzkokovd49c9e12015-03-26 16:38:38333 const std::string& url) {
[email protected]ad2246232013-11-13 18:42:36334}
335
pfeldmanbc5d7882016-08-26 18:55:46336scoped_refptr<DevToolsAgentHost>
[email protected]f30ed782014-05-16 17:52:50337DevToolsTargetsUIHandler::GetBrowserAgentHost(const std::string& browser_id) {
338 return NULL;
339}
340
dcheng71bb8452016-09-17 01:30:15341std::unique_ptr<base::DictionaryValue> DevToolsTargetsUIHandler::Serialize(
vabr66815972017-04-20 08:27:06342 DevToolsAgentHost* host) {
Jeremy Romanec48d7a2018-03-01 17:35:09343 auto target_data = std::make_unique<base::DictionaryValue>();
[email protected]ad2246232013-11-13 18:42:36344 target_data->SetString(kTargetSourceField, source_id_);
pfeldmana9e7dda2016-08-26 14:35:17345 target_data->SetString(kTargetIdField, host->GetId());
346 target_data->SetString(kTargetTypeField, host->GetType());
347 target_data->SetBoolean(kAttachedField, host->IsAttached());
348 target_data->SetString(kUrlField, host->GetURL().spec());
349 target_data->SetString(kNameField, host->GetTitle());
350 target_data->SetString(kFaviconUrlField, host->GetFaviconURL().spec());
351 target_data->SetString(kDescriptionField, host->GetDescription());
[email protected]ad2246232013-11-13 18:42:36352 return target_data;
353}
354
355void DevToolsTargetsUIHandler::SendSerializedTargets(
[email protected]8ff7a292014-07-08 23:20:53356 const base::ListValue& list) {
357 callback_.Run(source_id_, list);
[email protected]ad2246232013-11-13 18:42:36358}
359
dgozmanffe70eca2014-09-18 14:28:11360void DevToolsTargetsUIHandler::ForceUpdate() {
361}
362
[email protected]def2b682014-04-15 12:59:10363// PortForwardingStatusSerializer ---------------------------------------------
364
365PortForwardingStatusSerializer::PortForwardingStatusSerializer(
366 const Callback& callback, Profile* profile)
367 : callback_(callback),
368 profile_(profile) {
vkuzkokov4e7c1812014-09-03 16:00:00369 DevToolsAndroidBridge* android_bridge =
370 DevToolsAndroidBridge::Factory::GetForProfile(profile_);
371 if (android_bridge)
372 android_bridge->AddPortForwardingListener(this);
[email protected]def2b682014-04-15 12:59:10373}
374
375PortForwardingStatusSerializer::~PortForwardingStatusSerializer() {
vkuzkokov4e7c1812014-09-03 16:00:00376 DevToolsAndroidBridge* android_bridge =
377 DevToolsAndroidBridge::Factory::GetForProfile(profile_);
378 if (android_bridge)
379 android_bridge->RemovePortForwardingListener(this);
[email protected]def2b682014-04-15 12:59:10380}
381
382void PortForwardingStatusSerializer::PortStatusChanged(
vkuzkokov32c0c072014-10-01 14:10:38383 const ForwardingStatus& status) {
[email protected]def2b682014-04-15 12:59:10384 base::DictionaryValue result;
jdoerriec6fe63e2018-10-03 20:53:40385 for (auto sit = status.begin(); sit != status.end(); ++sit) {
Jeremy Romanec48d7a2018-03-01 17:35:09386 auto port_status_dict = std::make_unique<base::DictionaryValue>();
vkuzkokov32c0c072014-10-01 14:10:38387 const PortStatusMap& port_status_map = sit->second;
jdoerriec6fe63e2018-10-03 20:53:40388 for (auto it = port_status_map.begin(); it != port_status_map.end(); ++it) {
riceaa01edead2015-07-01 15:56:50389 port_status_dict->SetInteger(base::IntToString(it->first), it->second);
[email protected]def2b682014-04-15 12:59:10390 }
391
Jeremy Romanec48d7a2018-03-01 17:35:09392 auto device_status_dict = std::make_unique<base::DictionaryValue>();
vabr9984ea62017-04-10 11:33:49393 device_status_dict->Set(kPortForwardingPorts, std::move(port_status_dict));
vkuzkokov32c0c072014-10-01 14:10:38394 device_status_dict->SetString(kPortForwardingBrowserId,
vkuzkokov46786fd12015-03-11 14:51:00395 sit->first->GetId());
vkuzkokov32c0c072014-10-01 14:10:38396
[email protected]def2b682014-04-15 12:59:10397 std::string device_id = base::StringPrintf(
398 kAdbDeviceIdFormat,
vkuzkokov32c0c072014-10-01 14:10:38399 sit->first->serial().c_str());
vabr9984ea62017-04-10 11:33:49400 result.Set(device_id, std::move(device_status_dict));
[email protected]def2b682014-04-15 12:59:10401 }
402 callback_.Run(result);
403}