| Index: chrome/browser/devtools/chrome_devtools_manager_delegate.cc
|
| diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
|
| index 8cb8f874b7dc6c70c89a92a0655a501e9e6c9b19..a438fc43036256e924e81a26a7cbe89cc6164807 100644
|
| --- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
|
| +++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
|
| @@ -40,10 +40,13 @@ char kHostParam[] = "host";
|
| char kPortParam[] = "port";
|
|
|
| ChromeDevToolsManagerDelegate::ChromeDevToolsManagerDelegate()
|
| - : network_protocol_handler_(new DevToolsNetworkProtocolHandler()) {
|
| + : network_protocol_handler_(new DevToolsNetworkProtocolHandler()),
|
| + remote_locations_requester_(nullptr) {
|
| + content::DevToolsAgentHost::AddObserver(this);
|
| }
|
|
|
| ChromeDevToolsManagerDelegate::~ChromeDevToolsManagerDelegate() {
|
| + content::DevToolsAgentHost::RemoveObserver(this);
|
| }
|
|
|
| void ChromeDevToolsManagerDelegate::Inspect(
|
| @@ -52,36 +55,15 @@ void ChromeDevToolsManagerDelegate::Inspect(
|
| }
|
|
|
| void ChromeDevToolsManagerDelegate::DevicesAvailable(
|
| - const DevToolsAgentHost::DiscoveryCallback& callback,
|
| const DevToolsDeviceDiscovery::CompleteDevices& devices) {
|
| - DevToolsAgentHost::List result = DevToolsAgentHost::GetOrCreateAll();
|
| + DevToolsAgentHost::List remote_targets;
|
| for (const auto& complete : devices) {
|
| for (const auto& browser : complete.second->browsers()) {
|
| for (const auto& page : browser->pages())
|
| - result.push_back(page->CreateTarget());
|
| + remote_targets.push_back(page->CreateTarget());
|
| }
|
| }
|
| - callback.Run(std::move(result));
|
| -}
|
| -
|
| -bool ChromeDevToolsManagerDelegate::DiscoverTargets(
|
| - const DevToolsAgentHost::DiscoveryCallback& callback) {
|
| - if (!tcp_locations_.size())
|
| - return false;
|
| -
|
| - if (!device_manager_)
|
| - device_manager_ = AndroidDeviceManager::Create();
|
| -
|
| - AndroidDeviceManager::DeviceProviders providers;
|
| - providers.push_back(new TCPDeviceProvider(tcp_locations_));
|
| - device_manager_->SetDeviceProviders(providers);
|
| -
|
| - DevToolsDeviceDiscovery::DiscoverOnce(
|
| - device_manager_.get(),
|
| - base::Bind(&ChromeDevToolsManagerDelegate::DevicesAvailable,
|
| - base::Unretained(this),
|
| - callback));
|
| - return true;
|
| + remote_agent_hosts_.swap(remote_targets);
|
| }
|
|
|
| base::DictionaryValue* ChromeDevToolsManagerDelegate::HandleCommand(
|
| @@ -94,7 +76,7 @@ base::DictionaryValue* ChromeDevToolsManagerDelegate::HandleCommand(
|
| if (!DevToolsProtocol::ParseCommand(command_dict, &id, &method, ¶ms))
|
| return nullptr;
|
|
|
| - if (method == chrome::devtools::Browser::setRemoteLocations::kName)
|
| + if (method == chrome::devtools::Target::setRemoteLocations::kName)
|
| return SetRemoteLocations(agent_host, id, params).release();
|
|
|
| return network_protocol_handler_->HandleCommand(agent_host, command_dict);
|
| @@ -191,6 +173,11 @@ void ChromeDevToolsManagerDelegate::DevToolsAgentHostAttached(
|
|
|
| void ChromeDevToolsManagerDelegate::DevToolsAgentHostDetached(
|
| content::DevToolsAgentHost* agent_host) {
|
| + if (agent_host == remote_locations_requester_) {
|
| + remote_locations_requester_ = nullptr;
|
| + device_discovery_.reset();
|
| + remote_agent_hosts_.clear();
|
| + }
|
| network_protocol_handler_->DevToolsAgentStateChanged(agent_host, false);
|
| }
|
|
|
| @@ -199,8 +186,14 @@ ChromeDevToolsManagerDelegate::SetRemoteLocations(
|
| content::DevToolsAgentHost* agent_host,
|
| int command_id,
|
| base::DictionaryValue* params) {
|
| - tcp_locations_.clear();
|
| + if (remote_locations_requester_) {
|
| + return DevToolsProtocol::CreateInvalidParamsResponse(
|
| + command_id,
|
| + "Remote locations are already in use by another client.");
|
| + }
|
|
|
| + remote_locations_requester_ = agent_host;
|
| + std::set<net::HostPortPair> tcp_locations;
|
| base::ListValue* locations;
|
| if (!params->GetList(kLocationsParam, &locations))
|
| return DevToolsProtocol::CreateInvalidParamsResponse(command_id,
|
| @@ -222,8 +215,25 @@ ChromeDevToolsManagerDelegate::SetRemoteLocations(
|
| return DevToolsProtocol::CreateInvalidParamsResponse(command_id,
|
| kLocationsParam);
|
| }
|
| - tcp_locations_.insert(net::HostPortPair(host, port));
|
| + tcp_locations.insert(net::HostPortPair(host, port));
|
| + }
|
| +
|
| + if (tcp_locations.empty()) {
|
| + device_discovery_.reset();
|
| + remote_agent_hosts_.clear();
|
| + } else {
|
| + if (!device_manager_)
|
| + device_manager_ = AndroidDeviceManager::Create();
|
| +
|
| + AndroidDeviceManager::DeviceProviders providers;
|
| + providers.push_back(new TCPDeviceProvider(tcp_locations));
|
| + device_manager_->SetDeviceProviders(providers);
|
| +
|
| + device_discovery_.reset(new DevToolsDeviceDiscovery(device_manager_.get(),
|
| + base::Bind(&ChromeDevToolsManagerDelegate::DevicesAvailable,
|
| + base::Unretained(this))));
|
| }
|
| +
|
| std::unique_ptr<base::DictionaryValue> result(
|
| base::MakeUnique<base::DictionaryValue>());
|
| return DevToolsProtocol::CreateSuccessResponse(command_id, std::move(result));
|
|
|