blob: b61a455f00bc011c08fd400f41cc2268f04b6295 [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)
Jeremy Roman495db682019-07-12 16:03:2469 : callback_(callback) {
skyostil02598352015-06-12 12:37:2570 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e90c5f9b2013-12-11 12:49:4471 FROM_HERE,
tzik93bf8a72017-04-24 18:53:3072 base::BindOnce(&CancelableTimer::Fire, weak_factory_.GetWeakPtr()),
73 delay);
[email protected]f30ed782014-05-16 17:52:5074 }
[email protected]e90c5f9b2013-12-11 12:49:4475
76 private:
77 void Fire() { callback_.Run(); }
78
79 base::Closure callback_;
Jeremy Roman495db682019-07-12 16:03:2480 base::WeakPtrFactory<CancelableTimer> weak_factory_{this};
[email protected]e90c5f9b2013-12-11 12:49:4481};
82
dgozmanbfb96fb2014-09-12 13:33:2983// LocalTargetsUIHandler ---------------------------------------------
84
Dmitry Gozman72b5bd92017-11-21 00:03:1885class LocalTargetsUIHandler : public DevToolsTargetsUIHandler,
86 public content::DevToolsAgentHostObserver {
[email protected]ad2246232013-11-13 18:42:3687 public:
Dmitry Gozman9e85208c72018-03-21 00:47:4388 LocalTargetsUIHandler(const Callback& callback, Profile* profile);
dcheng03748a42014-10-21 10:19:1389 ~LocalTargetsUIHandler() override;
[email protected]8ff7a292014-07-08 23:20:5390
dgozmanffe70eca2014-09-18 14:28:1191 // DevToolsTargetsUIHandler overrides.
dcheng03748a42014-10-21 10:19:1392 void ForceUpdate() override;
dgozmanffe70eca2014-09-18 14:28:1193
dgozmanbfb96fb2014-09-12 13:33:2994private:
Dmitry Gozman72b5bd92017-11-21 00:03:1895 // content::DevToolsAgentHostObserver overrides.
96 bool ShouldForceDevToolsAgentHostCreation() override;
97 void DevToolsAgentHostCreated(DevToolsAgentHost* agent_host) override;
98 void DevToolsAgentHostDestroyed(DevToolsAgentHost* agent_host) override;
[email protected]ad2246232013-11-13 18:42:3699
Dmitry Gozman72b5bd92017-11-21 00:03:18100 void ScheduleUpdate();
101 void UpdateTargets();
[email protected]ad2246232013-11-13 18:42:36102
Dmitry Gozman9e85208c72018-03-21 00:47:43103 Profile* profile_;
Dmitry Gozman72b5bd92017-11-21 00:03:18104 std::unique_ptr<CancelableTimer> timer_;
Jeremy Roman495db682019-07-12 16:03:24105 base::WeakPtrFactory<LocalTargetsUIHandler> weak_factory_{this};
[email protected]ad2246232013-11-13 18:42:36106};
107
Dmitry Gozman9e85208c72018-03-21 00:47:43108LocalTargetsUIHandler::LocalTargetsUIHandler(const Callback& callback,
109 Profile* profile)
dgozmanbfb96fb2014-09-12 13:33:29110 : DevToolsTargetsUIHandler(kTargetSourceLocal, callback),
Jeremy Roman495db682019-07-12 16:03:24111 profile_(profile) {
Dmitry Gozman72b5bd92017-11-21 00:03:18112 DevToolsAgentHost::AddObserver(this);
[email protected]ad2246232013-11-13 18:42:36113 UpdateTargets();
114}
115
dgozmanbfb96fb2014-09-12 13:33:29116LocalTargetsUIHandler::~LocalTargetsUIHandler() {
Dmitry Gozman72b5bd92017-11-21 00:03:18117 DevToolsAgentHost::RemoveObserver(this);
[email protected]ad2246232013-11-13 18:42:36118}
119
Dmitry Gozman72b5bd92017-11-21 00:03:18120bool LocalTargetsUIHandler::ShouldForceDevToolsAgentHostCreation() {
121 return true;
122}
123
124void LocalTargetsUIHandler::DevToolsAgentHostCreated(DevToolsAgentHost*) {
125 ScheduleUpdate();
126}
127
128void LocalTargetsUIHandler::DevToolsAgentHostDestroyed(DevToolsAgentHost*) {
dgozmanbfb96fb2014-09-12 13:33:29129 ScheduleUpdate();
130}
131
dgozmanffe70eca2014-09-18 14:28:11132void LocalTargetsUIHandler::ForceUpdate() {
133 ScheduleUpdate();
134}
135
dgozmanbfb96fb2014-09-12 13:33:29136void LocalTargetsUIHandler::ScheduleUpdate() {
[email protected]e90c5f9b2013-12-11 12:49:44137 const int kUpdateDelay = 100;
138 timer_.reset(
139 new CancelableTimer(
dgozmanbfb96fb2014-09-12 13:33:29140 base::Bind(&LocalTargetsUIHandler::UpdateTargets,
[email protected]e90c5f9b2013-12-11 12:49:44141 base::Unretained(this)),
142 base::TimeDelta::FromMilliseconds(kUpdateDelay)));
[email protected]ad2246232013-11-13 18:42:36143}
144
dgozmanbfb96fb2014-09-12 13:33:29145void LocalTargetsUIHandler::UpdateTargets() {
Dmitry Gozman9e85208c72018-03-21 00:47:43146 content::DevToolsAgentHost::List targets =
147 DevToolsAgentHost::GetOrCreateAll();
[email protected]ad2246232013-11-13 18:42:36148
vabr66815972017-04-20 08:27:06149 std::vector<HostDescriptionNode> hosts;
150 hosts.reserve(targets.size());
pfeldmanbc5d7882016-08-26 18:55:46151 targets_.clear();
vabr66815972017-04-20 08:27:06152 for (const scoped_refptr<DevToolsAgentHost>& host : targets) {
Dmitry Gozman9e85208c72018-03-21 00:47:43153 if (Profile::FromBrowserContext(host->GetBrowserContext()) != profile_)
154 continue;
Pavol Marko56df0272018-07-04 17:55:04155 if (!DevToolsWindow::AllowDevToolsFor(profile_, host->GetWebContents()))
156 continue;
pfeldmanbc5d7882016-08-26 18:55:46157 targets_[host->GetId()] = host;
jdoerriecc9f5732017-08-23 14:12:30158 hosts.push_back({host->GetId(), host->GetParentId(),
159 std::move(*Serialize(host.get()))});
[email protected]ad2246232013-11-13 18:42:36160 }
161
vabr66815972017-04-20 08:27:06162 SendSerializedTargets(
163 SerializeHostDescriptions(std::move(hosts), kGuestList));
[email protected]ad2246232013-11-13 18:42:36164}
165
[email protected]ad2246232013-11-13 18:42:36166// AdbTargetsUIHandler --------------------------------------------------------
167
168class AdbTargetsUIHandler
[email protected]6defd99c2014-04-30 17:22:17169 : public DevToolsTargetsUIHandler,
[email protected]96fe8582014-04-21 14:56:40170 public DevToolsAndroidBridge::DeviceListListener {
[email protected]ad2246232013-11-13 18:42:36171 public:
[email protected]8ff7a292014-07-08 23:20:53172 AdbTargetsUIHandler(const Callback& callback, Profile* profile);
dcheng03748a42014-10-21 10:19:13173 ~AdbTargetsUIHandler() override;
[email protected]ad2246232013-11-13 18:42:36174
vkuzkokovd49c9e12015-03-26 16:38:38175 void Open(const std::string& browser_id, const std::string& url) override;
[email protected]ad2246232013-11-13 18:42:36176
pfeldmanbc5d7882016-08-26 18:55:46177 scoped_refptr<DevToolsAgentHost> GetBrowserAgentHost(
mostynb01d8b10e2014-10-13 09:44:44178 const std::string& browser_id) override;
[email protected]f30ed782014-05-16 17:52:50179
[email protected]ad2246232013-11-13 18:42:36180 private:
[email protected]96fe8582014-04-21 14:56:40181 // DevToolsAndroidBridge::Listener overrides.
dcheng03748a42014-10-21 10:19:13182 void DeviceListChanged(
mostynb01d8b10e2014-10-13 09:44:44183 const DevToolsAndroidBridge::RemoteDevices& devices) override;
[email protected]ad2246232013-11-13 18:42:36184
vkuzkokovf16940a62014-10-14 17:49:05185 DevToolsAndroidBridge* GetAndroidBridge();
186
serya217cac52014-12-03 15:01:54187 Profile* const profile_;
188 DevToolsAndroidBridge* const android_bridge_;
[email protected]ad2246232013-11-13 18:42:36189
190 typedef std::map<std::string,
[email protected]96fe8582014-04-21 14:56:40191 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> > RemoteBrowsers;
[email protected]ad2246232013-11-13 18:42:36192 RemoteBrowsers remote_browsers_;
193};
194
[email protected]8ff7a292014-07-08 23:20:53195AdbTargetsUIHandler::AdbTargetsUIHandler(const Callback& callback,
196 Profile* profile)
dgozmanbfb96fb2014-09-12 13:33:29197 : DevToolsTargetsUIHandler(kTargetSourceRemote, callback),
vkuzkokovf16940a62014-10-14 17:49:05198 profile_(profile),
199 android_bridge_(
200 DevToolsAndroidBridge::Factory::GetForProfile(profile_)) {
dgozman50ef68582015-11-25 03:10:59201 if (android_bridge_)
202 android_bridge_->AddDeviceListListener(this);
[email protected]ad2246232013-11-13 18:42:36203}
204
205AdbTargetsUIHandler::~AdbTargetsUIHandler() {
dgozman50ef68582015-11-25 03:10:59206 if (android_bridge_)
207 android_bridge_->RemoveDeviceListListener(this);
[email protected]ad2246232013-11-13 18:42:36208}
209
vkuzkokovd49c9e12015-03-26 16:38:38210void AdbTargetsUIHandler::Open(const std::string& browser_id,
211 const std::string& url) {
jdoerriec6fe63e2018-10-03 20:53:40212 auto it = remote_browsers_.find(browser_id);
dgozman50ef68582015-11-25 03:10:59213 if (it != remote_browsers_.end() && android_bridge_)
vkuzkokov5c77d8d2015-03-31 11:23:58214 android_bridge_->OpenRemotePage(it->second, url);
[email protected]577d2e4ff2014-04-15 17:07:03215}
216
pfeldmanbc5d7882016-08-26 18:55:46217scoped_refptr<DevToolsAgentHost>
[email protected]f30ed782014-05-16 17:52:50218AdbTargetsUIHandler::GetBrowserAgentHost(
219 const std::string& browser_id) {
jdoerriec6fe63e2018-10-03 20:53:40220 auto it = remote_browsers_.find(browser_id);
dgozman50ef68582015-11-25 03:10:59221 if (it == remote_browsers_.end() || !android_bridge_)
222 return nullptr;
vkuzkokovf16940a62014-10-14 17:49:05223
224 return android_bridge_->GetBrowserAgentHost(it->second);
[email protected]f30ed782014-05-16 17:52:50225}
226
[email protected]3bdb22b2014-04-15 18:21:28227void AdbTargetsUIHandler::DeviceListChanged(
[email protected]96fe8582014-04-21 14:56:40228 const DevToolsAndroidBridge::RemoteDevices& devices) {
[email protected]ad2246232013-11-13 18:42:36229 remote_browsers_.clear();
pfeldmanbc5d7882016-08-26 18:55:46230 targets_.clear();
dgozman50ef68582015-11-25 03:10:59231 if (!android_bridge_)
232 return;
[email protected]ad2246232013-11-13 18:42:36233
[email protected]8ff7a292014-07-08 23:20:53234 base::ListValue device_list;
jdoerriec6fe63e2018-10-03 20:53:40235 for (auto dit = devices.begin(); dit != devices.end(); ++dit) {
[email protected]96fe8582014-04-21 14:56:40236 DevToolsAndroidBridge::RemoteDevice* device = dit->get();
dcheng98e96a72016-06-11 03:41:48237 std::unique_ptr<base::DictionaryValue> device_data(
238 new base::DictionaryValue());
[email protected]4a00a3955e2014-04-07 11:03:27239 device_data->SetString(kAdbModelField, device->model());
240 device_data->SetString(kAdbSerialField, device->serial());
241 device_data->SetBoolean(kAdbConnectedField, device->is_connected());
[email protected]ad2246232013-11-13 18:42:36242 std::string device_id = base::StringPrintf(
[email protected]def2b682014-04-15 12:59:10243 kAdbDeviceIdFormat,
[email protected]4a00a3955e2014-04-07 11:03:27244 device->serial().c_str());
[email protected]ad2246232013-11-13 18:42:36245 device_data->SetString(kTargetIdField, device_id);
Jeremy Romanec48d7a2018-03-01 17:35:09246 auto browser_list = std::make_unique<base::ListValue>();
[email protected]ad2246232013-11-13 18:42:36247
[email protected]96fe8582014-04-21 14:56:40248 DevToolsAndroidBridge::RemoteBrowsers& browsers = device->browsers();
jdoerriec6fe63e2018-10-03 20:53:40249 for (auto bit = browsers.begin(); bit != browsers.end(); ++bit) {
[email protected]96fe8582014-04-21 14:56:40250 DevToolsAndroidBridge::RemoteBrowser* browser = bit->get();
dcheng98e96a72016-06-11 03:41:48251 std::unique_ptr<base::DictionaryValue> browser_data(
252 new base::DictionaryValue());
[email protected]ad2246232013-11-13 18:42:36253 browser_data->SetString(kAdbBrowserNameField, browser->display_name());
vkuzkokov952b3472015-01-15 15:55:26254 browser_data->SetString(kAdbBrowserUserField, browser->user());
[email protected]ad2246232013-11-13 18:42:36255 browser_data->SetString(kAdbBrowserVersionField, browser->version());
[email protected]96fe8582014-04-21 14:56:40256 DevToolsAndroidBridge::RemoteBrowser::ParsedVersion parsed =
[email protected]ad2246232013-11-13 18:42:36257 browser->GetParsedVersion();
258 browser_data->SetInteger(
259 kAdbBrowserChromeVersionField,
260 browser->IsChrome() && !parsed.empty() ? parsed[0] : 0);
vkuzkokov46786fd12015-03-11 14:51:00261 std::string browser_id = browser->GetId();
[email protected]ad2246232013-11-13 18:42:36262 browser_data->SetString(kTargetIdField, browser_id);
263 browser_data->SetString(kTargetSourceField, source_id());
[email protected]daa76532014-03-17 11:32:23264
Jeremy Romanec48d7a2018-03-01 17:35:09265 auto page_list = std::make_unique<base::ListValue>();
[email protected]167206cf2014-02-17 13:16:40266 remote_browsers_[browser_id] = browser;
vkuzkokovcf47aaf2014-10-17 14:11:32267 for (const auto& page : browser->pages()) {
pfeldmane7d2e412016-09-23 16:41:51268 scoped_refptr<DevToolsAgentHost> host = page->CreateTarget();
vabr66815972017-04-20 08:27:06269 std::unique_ptr<base::DictionaryValue> target_data =
270 Serialize(host.get());
[email protected]ad2246232013-11-13 18:42:36271 // Pass the screen size in the target object to make sure that
272 // the caching logic does not prevent the target item from updating
273 // when the screen size changes.
274 gfx::Size screen_size = device->screen_size();
275 target_data->SetInteger(kAdbScreenWidthField, screen_size.width());
276 target_data->SetInteger(kAdbScreenHeightField, screen_size.height());
pfeldmanbc5d7882016-08-26 18:55:46277 targets_[host->GetId()] = host;
dcheng71bb8452016-09-17 01:30:15278 page_list->Append(std::move(target_data));
[email protected]ad2246232013-11-13 18:42:36279 }
vabr9984ea62017-04-10 11:33:49280 browser_data->Set(kAdbPagesList, std::move(page_list));
dcheng98e96a72016-06-11 03:41:48281 browser_list->Append(std::move(browser_data));
[email protected]ad2246232013-11-13 18:42:36282 }
283
vabr9984ea62017-04-10 11:33:49284 device_data->Set(kAdbBrowsersList, std::move(browser_list));
dcheng98e96a72016-06-11 03:41:48285 device_list.Append(std::move(device_data));
[email protected]ad2246232013-11-13 18:42:36286 }
[email protected]8ff7a292014-07-08 23:20:53287 SendSerializedTargets(device_list);
[email protected]ad2246232013-11-13 18:42:36288}
289
290} // namespace
291
292// DevToolsTargetsUIHandler ---------------------------------------------------
293
294DevToolsTargetsUIHandler::DevToolsTargetsUIHandler(
295 const std::string& source_id,
[email protected]8ff7a292014-07-08 23:20:53296 const Callback& callback)
[email protected]ad2246232013-11-13 18:42:36297 : source_id_(source_id),
298 callback_(callback) {
299}
300
301DevToolsTargetsUIHandler::~DevToolsTargetsUIHandler() {
[email protected]ad2246232013-11-13 18:42:36302}
303
304// static
dchengb8eac3a2016-04-13 02:03:23305std::unique_ptr<DevToolsTargetsUIHandler>
dgozmanbfb96fb2014-09-12 13:33:29306DevToolsTargetsUIHandler::CreateForLocal(
Dmitry Gozman9e85208c72018-03-21 00:47:43307 const DevToolsTargetsUIHandler::Callback& callback,
308 Profile* profile) {
dchengb8eac3a2016-04-13 02:03:23309 return std::unique_ptr<DevToolsTargetsUIHandler>(
Dmitry Gozman9e85208c72018-03-21 00:47:43310 new LocalTargetsUIHandler(callback, profile));
[email protected]ad2246232013-11-13 18:42:36311}
312
[email protected]6defd99c2014-04-30 17:22:17313// static
dchengb8eac3a2016-04-13 02:03:23314std::unique_ptr<DevToolsTargetsUIHandler>
[email protected]6defd99c2014-04-30 17:22:17315DevToolsTargetsUIHandler::CreateForAdb(
dchengb8eac3a2016-04-13 02:03:23316 const DevToolsTargetsUIHandler::Callback& callback,
317 Profile* profile) {
318 return std::unique_ptr<DevToolsTargetsUIHandler>(
[email protected]6defd99c2014-04-30 17:22:17319 new AdbTargetsUIHandler(callback, profile));
[email protected]ad2246232013-11-13 18:42:36320}
321
pfeldmanbc5d7882016-08-26 18:55:46322scoped_refptr<DevToolsAgentHost> DevToolsTargetsUIHandler::GetTarget(
[email protected]6defd99c2014-04-30 17:22:17323 const std::string& target_id) {
jdoerriec6fe63e2018-10-03 20:53:40324 auto it = targets_.find(target_id);
[email protected]ad2246232013-11-13 18:42:36325 if (it != targets_.end())
[email protected]6defd99c2014-04-30 17:22:17326 return it->second;
327 return NULL;
[email protected]ad2246232013-11-13 18:42:36328}
329
[email protected]6defd99c2014-04-30 17:22:17330void DevToolsTargetsUIHandler::Open(const std::string& browser_id,
vkuzkokovd49c9e12015-03-26 16:38:38331 const std::string& url) {
[email protected]ad2246232013-11-13 18:42:36332}
333
pfeldmanbc5d7882016-08-26 18:55:46334scoped_refptr<DevToolsAgentHost>
[email protected]f30ed782014-05-16 17:52:50335DevToolsTargetsUIHandler::GetBrowserAgentHost(const std::string& browser_id) {
336 return NULL;
337}
338
dcheng71bb8452016-09-17 01:30:15339std::unique_ptr<base::DictionaryValue> DevToolsTargetsUIHandler::Serialize(
vabr66815972017-04-20 08:27:06340 DevToolsAgentHost* host) {
Jeremy Romanec48d7a2018-03-01 17:35:09341 auto target_data = std::make_unique<base::DictionaryValue>();
[email protected]ad2246232013-11-13 18:42:36342 target_data->SetString(kTargetSourceField, source_id_);
pfeldmana9e7dda2016-08-26 14:35:17343 target_data->SetString(kTargetIdField, host->GetId());
344 target_data->SetString(kTargetTypeField, host->GetType());
345 target_data->SetBoolean(kAttachedField, host->IsAttached());
346 target_data->SetString(kUrlField, host->GetURL().spec());
347 target_data->SetString(kNameField, host->GetTitle());
348 target_data->SetString(kFaviconUrlField, host->GetFaviconURL().spec());
349 target_data->SetString(kDescriptionField, host->GetDescription());
[email protected]ad2246232013-11-13 18:42:36350 return target_data;
351}
352
353void DevToolsTargetsUIHandler::SendSerializedTargets(
[email protected]8ff7a292014-07-08 23:20:53354 const base::ListValue& list) {
355 callback_.Run(source_id_, list);
[email protected]ad2246232013-11-13 18:42:36356}
357
dgozmanffe70eca2014-09-18 14:28:11358void DevToolsTargetsUIHandler::ForceUpdate() {
359}
360
[email protected]def2b682014-04-15 12:59:10361// PortForwardingStatusSerializer ---------------------------------------------
362
363PortForwardingStatusSerializer::PortForwardingStatusSerializer(
364 const Callback& callback, Profile* profile)
365 : callback_(callback),
366 profile_(profile) {
vkuzkokov4e7c1812014-09-03 16:00:00367 DevToolsAndroidBridge* android_bridge =
368 DevToolsAndroidBridge::Factory::GetForProfile(profile_);
369 if (android_bridge)
370 android_bridge->AddPortForwardingListener(this);
[email protected]def2b682014-04-15 12:59:10371}
372
373PortForwardingStatusSerializer::~PortForwardingStatusSerializer() {
vkuzkokov4e7c1812014-09-03 16:00:00374 DevToolsAndroidBridge* android_bridge =
375 DevToolsAndroidBridge::Factory::GetForProfile(profile_);
376 if (android_bridge)
377 android_bridge->RemovePortForwardingListener(this);
[email protected]def2b682014-04-15 12:59:10378}
379
380void PortForwardingStatusSerializer::PortStatusChanged(
vkuzkokov32c0c072014-10-01 14:10:38381 const ForwardingStatus& status) {
[email protected]def2b682014-04-15 12:59:10382 base::DictionaryValue result;
jdoerriec6fe63e2018-10-03 20:53:40383 for (auto sit = status.begin(); sit != status.end(); ++sit) {
Jeremy Romanec48d7a2018-03-01 17:35:09384 auto port_status_dict = std::make_unique<base::DictionaryValue>();
vkuzkokov32c0c072014-10-01 14:10:38385 const PortStatusMap& port_status_map = sit->second;
jdoerriec6fe63e2018-10-03 20:53:40386 for (auto it = port_status_map.begin(); it != port_status_map.end(); ++it) {
Raul Tambrefff51b752019-02-04 13:09:47387 port_status_dict->SetInteger(base::NumberToString(it->first), it->second);
[email protected]def2b682014-04-15 12:59:10388 }
389
Jeremy Romanec48d7a2018-03-01 17:35:09390 auto device_status_dict = std::make_unique<base::DictionaryValue>();
vabr9984ea62017-04-10 11:33:49391 device_status_dict->Set(kPortForwardingPorts, std::move(port_status_dict));
vkuzkokov32c0c072014-10-01 14:10:38392 device_status_dict->SetString(kPortForwardingBrowserId,
vkuzkokov46786fd12015-03-11 14:51:00393 sit->first->GetId());
vkuzkokov32c0c072014-10-01 14:10:38394
[email protected]def2b682014-04-15 12:59:10395 std::string device_id = base::StringPrintf(
396 kAdbDeviceIdFormat,
vkuzkokov32c0c072014-10-01 14:10:38397 sit->first->serial().c_str());
vabr9984ea62017-04-10 11:33:49398 result.Set(device_id, std::move(device_status_dict));
[email protected]def2b682014-04-15 12:59:10399 }
400 callback_.Run(result);
401}