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

Unified Diff: chrome/browser/devtools/chrome_devtools_manager_delegate.cc

Issue 2563443002: [DevTools] Allow multiple clients to request remote locations. (Closed)
Patch Set: fixed dcheck Created 4 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/devtools/chrome_devtools_manager_delegate.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 58103af11f956044768f64111ca29d69de269348..eb4b9fb1468d394df65f856d41ba1cd3a0707c6f 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -26,7 +26,6 @@
#include "extensions/browser/extension_host.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/process_manager.h"
-#include "net/base/host_port_pair.h"
#include "ui/base/resource/resource_bundle.h"
using content::DevToolsAgentHost;
@@ -39,9 +38,23 @@ char kLocationsParam[] = "locations";
char kHostParam[] = "host";
char kPortParam[] = "port";
+class ChromeDevToolsManagerDelegate::HostData {
+ public:
+ HostData() {}
+ ~HostData() {}
+
+ RemoteLocations& remote_locations() { return remote_locations_; }
+
+ void set_remote_locations(RemoteLocations& locations) {
+ remote_locations_.swap(locations);
+ }
+
+ private:
+ RemoteLocations remote_locations_;
+};
+
ChromeDevToolsManagerDelegate::ChromeDevToolsManagerDelegate()
- : network_protocol_handler_(new DevToolsNetworkProtocolHandler()),
- remote_locations_requester_(nullptr) {
+ : network_protocol_handler_(new DevToolsNetworkProtocolHandler()) {
content::DevToolsAgentHost::AddObserver(this);
}
@@ -54,18 +67,6 @@ void ChromeDevToolsManagerDelegate::Inspect(
DevToolsWindow::OpenDevToolsWindow(agent_host, nullptr);
}
-void ChromeDevToolsManagerDelegate::DevicesAvailable(
- const DevToolsDeviceDiscovery::CompleteDevices& devices) {
- DevToolsAgentHost::List remote_targets;
- for (const auto& complete : devices) {
- for (const auto& browser : complete.second->browsers()) {
- for (const auto& page : browser->pages())
- remote_targets.push_back(page->CreateTarget());
- }
- }
- remote_agent_hosts_.swap(remote_targets);
-}
-
base::DictionaryValue* ChromeDevToolsManagerDelegate::HandleCommand(
DevToolsAgentHost* agent_host,
base::DictionaryValue* command_dict) {
@@ -169,16 +170,73 @@ std::string ChromeDevToolsManagerDelegate::GetFrontendResource(
void ChromeDevToolsManagerDelegate::DevToolsAgentHostAttached(
content::DevToolsAgentHost* agent_host) {
network_protocol_handler_->DevToolsAgentStateChanged(agent_host, true);
+
+ DCHECK(host_data_.find(agent_host) == host_data_.end());
+ host_data_[agent_host].reset(new ChromeDevToolsManagerDelegate::HostData());
}
void ChromeDevToolsManagerDelegate::DevToolsAgentHostDetached(
content::DevToolsAgentHost* agent_host) {
- if (agent_host == remote_locations_requester_) {
- remote_locations_requester_ = nullptr;
+ network_protocol_handler_->DevToolsAgentStateChanged(agent_host, false);
+ // This class is created lazily, so it may not know about some attached hosts.
+ if (host_data_.find(agent_host) != host_data_.end()) {
+ host_data_.erase(agent_host);
+ UpdateDeviceDiscovery();
+ }
+}
+
+void ChromeDevToolsManagerDelegate::DevicesAvailable(
+ const DevToolsDeviceDiscovery::CompleteDevices& devices) {
+ DevToolsAgentHost::List remote_targets;
+ for (const auto& complete : devices) {
+ for (const auto& browser : complete.second->browsers()) {
+ for (const auto& page : browser->pages())
+ remote_targets.push_back(page->CreateTarget());
+ }
+ }
+ remote_agent_hosts_.swap(remote_targets);
+}
+
+void ChromeDevToolsManagerDelegate::UpdateDeviceDiscovery() {
+ RemoteLocations remote_locations;
+ for (const auto& pair : host_data_) {
+ RemoteLocations& locations = pair.second->remote_locations();
+ remote_locations.insert(locations.begin(), locations.end());
+ }
+
+ bool equals = remote_locations.size() == remote_locations_.size();
+ if (equals) {
+ RemoteLocations::iterator it1 = remote_locations.begin();
+ RemoteLocations::iterator it2 = remote_locations_.begin();
+ while (it1 != remote_locations.end()) {
+ DCHECK(it2 != remote_locations_.end());
+ if (!(*it1).Equals(*it2))
+ equals = false;
+ ++it1;
+ ++it2;
+ }
+ DCHECK(it2 == remote_locations_.end());
+ }
+
+ if (equals)
+ return;
+
+ if (remote_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(remote_locations));
+ device_manager_->SetDeviceProviders(providers);
+
+ device_discovery_.reset(new DevToolsDeviceDiscovery(device_manager_.get(),
+ base::Bind(&ChromeDevToolsManagerDelegate::DevicesAvailable,
+ base::Unretained(this))));
}
- network_protocol_handler_->DevToolsAgentStateChanged(agent_host, false);
+ remote_locations_.swap(remote_locations);
}
std::unique_ptr<base::DictionaryValue>
@@ -186,13 +244,11 @@ ChromeDevToolsManagerDelegate::SetRemoteLocations(
content::DevToolsAgentHost* agent_host,
int command_id,
base::DictionaryValue* params) {
- if (remote_locations_requester_) {
+ if (host_data_.find(agent_host) == host_data_.end()) {
return DevToolsProtocol::CreateInvalidParamsResponse(
- command_id,
- "Remote locations are already in use by another client.");
+ command_id, "Cannot find agent host");
}
- remote_locations_requester_ = agent_host;
std::set<net::HostPortPair> tcp_locations;
base::ListValue* locations;
if (!params->GetList(kLocationsParam, &locations))
@@ -218,21 +274,8 @@ ChromeDevToolsManagerDelegate::SetRemoteLocations(
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))));
- }
+ host_data_[agent_host]->set_remote_locations(tcp_locations);
+ UpdateDeviceDiscovery();
std::unique_ptr<base::DictionaryValue> result(
base::MakeUnique<base::DictionaryValue>());
« no previous file with comments | « chrome/browser/devtools/chrome_devtools_manager_delegate.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698