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

Unified Diff: chrome/browser/devtools/device/devtools_android_bridge.cc

Issue 2361613002: DevTools: untangle device discovery request from the devtools android bridge. (Closed)
Patch Set: for landing Created 4 years, 3 months 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
Index: chrome/browser/devtools/device/devtools_android_bridge.cc
diff --git a/chrome/browser/devtools/device/devtools_android_bridge.cc b/chrome/browser/devtools/device/devtools_android_bridge.cc
index fe358332c39531110f5b4accadd7010f792028fe..d04a21458369ba6852ab504c9eaf0fcb91cc7adc 100644
--- a/chrome/browser/devtools/device/devtools_android_bridge.cc
+++ b/chrome/browser/devtools/device/devtools_android_bridge.cc
@@ -75,12 +75,13 @@ const char kChromeDiscoveryURL[] = "localhost:9222";
const char kNodeDiscoveryURL[] = "localhost:9229";
bool BrowserIdFromString(const std::string& browser_id_str,
- DevToolsAndroidBridge::BrowserId* browser_id) {
+ std::string* serial,
+ std::string* browser_id) {
size_t colon_pos = browser_id_str.find(':');
if (colon_pos == std::string::npos)
return false;
- browser_id->first = browser_id_str.substr(0, colon_pos);
- browser_id->second = browser_id_str.substr(colon_pos + 1);
+ *serial = browser_id_str.substr(0, colon_pos);
+ *browser_id = browser_id_str.substr(colon_pos + 1);
return true;
}
@@ -107,7 +108,8 @@ class DevToolsAndroidBridge::DiscoveryRequest
void ReceivedVersion(scoped_refptr<RemoteBrowser>,
int result,
const std::string& response);
- void ReceivedPages(scoped_refptr<RemoteBrowser>,
+ void ReceivedPages(scoped_refptr<AndroidDeviceManager::Device> device,
+ scoped_refptr<RemoteBrowser>,
int result,
const std::string& response);
@@ -154,7 +156,7 @@ void DevToolsAndroidBridge::DiscoveryRequest::ReceivedDeviceInfo(
device->SendJsonRequest(
(*it)->socket(),
kPageListRequest,
- base::Bind(&DiscoveryRequest::ReceivedPages, this, *it));
+ base::Bind(&DiscoveryRequest::ReceivedPages, this, device, *it));
}
}
@@ -187,6 +189,7 @@ void DevToolsAndroidBridge::DiscoveryRequest::ReceivedVersion(
}
void DevToolsAndroidBridge::DiscoveryRequest::ReceivedPages(
+ scoped_refptr<AndroidDeviceManager::Device> device,
scoped_refptr<RemoteBrowser> browser,
int result,
const std::string& response) {
@@ -199,7 +202,8 @@ void DevToolsAndroidBridge::DiscoveryRequest::ReceivedPages(
for (const auto& page_value : *list_value) {
base::DictionaryValue* dict;
if (page_value->GetAsDictionary(&dict))
- browser->pages_.push_back(new RemotePage(browser->browser_id_, *dict));
+ browser->pages_.push_back(
+ new RemotePage(device, browser->browser_id_, *dict));
}
}
}
@@ -295,8 +299,8 @@ class DevToolsAndroidBridge::AgentHostDelegate
public AndroidDeviceManager::AndroidWebSocket::Delegate {
public:
static scoped_refptr<content::DevToolsAgentHost> GetOrCreateAgentHost(
- DevToolsAndroidBridge* bridge,
- const BrowserId& browser_id,
+ scoped_refptr<AndroidDeviceManager::Device> device,
+ const std::string& browser_id,
const std::string& local_id,
const std::string& target_path,
const std::string& type,
@@ -305,8 +309,8 @@ class DevToolsAndroidBridge::AgentHostDelegate
private:
AgentHostDelegate(
- DevToolsAndroidBridge* bridge,
- const BrowserId& browser_id,
+ scoped_refptr<AndroidDeviceManager::Device> device,
+ const std::string& browser_id,
const std::string& local_id,
const std::string& target_path,
const std::string& type,
@@ -319,8 +323,8 @@ class DevToolsAndroidBridge::AgentHostDelegate
std::string GetDescription() override;
GURL GetURL() override;
GURL GetFaviconURL() override;
+ std::string GetFrontendURL() override;
bool Activate() override;
- bool Inspect() override;
void Reload() override;
bool Close() override;
void SendMessageToBackend(const std::string& message) override;
@@ -329,8 +333,13 @@ class DevToolsAndroidBridge::AgentHostDelegate
void OnFrameRead(const std::string& message) override;
void OnSocketClosed() override;
- base::WeakPtr<DevToolsAndroidBridge> bridge_;
- BrowserId browser_id_;
+ void SendProtocolCommand(const std::string& target_path,
+ const std::string& method,
+ std::unique_ptr<base::DictionaryValue> params,
+ const base::Closure callback);
+
+ scoped_refptr<AndroidDeviceManager::Device> device_;
+ std::string browser_id_;
std::string local_id_;
std::string target_path_;
std::string remote_type_;
@@ -356,13 +365,14 @@ static std::string GetStringProperty(base::DictionaryValue* value,
}
static std::string BuildUniqueTargetId(
- const DevToolsAndroidBridge::BrowserId& browser_id,
+ const std::string& serial,
+ const std::string& browser_id,
base::DictionaryValue* value) {
- return base::StringPrintf("%s:%s:%s", browser_id.first.c_str(),
- browser_id.second.c_str(), GetStringProperty(value, "id").c_str());
+ return base::StringPrintf("%s:%s:%s", serial.c_str(),
+ browser_id.c_str(), GetStringProperty(value, "id").c_str());
}
-static std::string GetFrontendURL(base::DictionaryValue* value) {
+static std::string GetFrontendURLFromValue(base::DictionaryValue* value) {
std::string frontend_url = GetStringProperty(value, "devtoolsFrontendUrl");
size_t ws_param = frontend_url.find("?ws");
if (ws_param != std::string::npos)
@@ -389,39 +399,40 @@ static std::string GetTargetPath(base::DictionaryValue* value) {
// static
scoped_refptr<content::DevToolsAgentHost>
DevToolsAndroidBridge::AgentHostDelegate::GetOrCreateAgentHost(
- DevToolsAndroidBridge* bridge,
- const BrowserId& browser_id,
+ scoped_refptr<AndroidDeviceManager::Device> device,
+ const std::string& browser_id,
const std::string& local_id,
const std::string& target_path,
const std::string& type,
base::DictionaryValue* value) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- AgentHostDelegates::iterator it = bridge->host_delegates_.find(local_id);
- if (it != bridge->host_delegates_.end())
- return it->second->agent_host_;
+ scoped_refptr<DevToolsAgentHost> result =
+ DevToolsAgentHost::GetForId(local_id);
+ if (result)
+ return result;
AgentHostDelegate* delegate = new AgentHostDelegate(
- bridge, browser_id, local_id, target_path, type, value);
- scoped_refptr<content::DevToolsAgentHost> result =
- content::DevToolsAgentHost::Forward(local_id, base::WrapUnique(delegate));
+ device, browser_id, local_id, target_path, type, value);
+ result = content::DevToolsAgentHost::Forward(
+ local_id, base::WrapUnique(delegate));
delegate->agent_host_ = result.get();
return result;
}
DevToolsAndroidBridge::AgentHostDelegate::AgentHostDelegate(
- DevToolsAndroidBridge* bridge,
- const BrowserId& browser_id,
+ scoped_refptr<AndroidDeviceManager::Device> device,
+ const std::string& browser_id,
const std::string& local_id,
const std::string& target_path,
const std::string& type,
base::DictionaryValue* value)
- : bridge_(bridge->AsWeakPtr()),
+ : device_(device),
browser_id_(browser_id),
local_id_(local_id),
target_path_(target_path),
remote_type_(type),
remote_id_(value ? GetStringProperty(value, "id") : ""),
- frontend_url_(value ? GetFrontendURL(value) : ""),
+ frontend_url_(value ? GetFrontendURLFromValue(value) : ""),
title_(value ? base::UTF16ToUTF8(net::UnescapeForHTML(base::UTF8ToUTF16(
GetStringProperty(value, "title")))) : ""),
description_(value ? GetStringProperty(value, "description") : ""),
@@ -430,24 +441,21 @@ DevToolsAndroidBridge::AgentHostDelegate::AgentHostDelegate(
socket_opened_(false),
agent_host_(nullptr),
proxy_(nullptr) {
- bridge_->host_delegates_[local_id_] = this;
}
DevToolsAndroidBridge::AgentHostDelegate::~AgentHostDelegate() {
- if (bridge_)
- bridge_->host_delegates_.erase(local_id_);
}
void DevToolsAndroidBridge::AgentHostDelegate::Attach(
content::DevToolsExternalAgentProxy* proxy) {
proxy_ = proxy;
content::RecordAction(
- base::StartsWith(browser_id_.second, kWebViewSocketPrefix,
+ base::StartsWith(browser_id_, kWebViewSocketPrefix,
base::CompareCase::SENSITIVE)
? base::UserMetricsAction("DevTools_InspectAndroidWebView")
: base::UserMetricsAction("DevTools_InspectAndroidPage"));
web_socket_.reset(
- bridge_->CreateWebSocket(browser_id_, target_path_, this));
+ device_->CreateWebSocket(browser_id_, target_path_, this));
}
void DevToolsAndroidBridge::AgentHostDelegate::Detach() {
@@ -475,41 +483,26 @@ GURL DevToolsAndroidBridge::AgentHostDelegate::GetFaviconURL() {
return favicon_url_;
}
-bool DevToolsAndroidBridge::AgentHostDelegate::Activate() {
- if (!bridge_)
- return false;
+std::string DevToolsAndroidBridge::AgentHostDelegate::GetFrontendURL() {
+ return frontend_url_;
+}
+bool DevToolsAndroidBridge::AgentHostDelegate::Activate() {
std::string request = base::StringPrintf(kActivatePageRequest,
remote_id_.c_str());
- bridge_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp));
- return true;
-}
-
-bool DevToolsAndroidBridge::AgentHostDelegate::Inspect() {
- Activate();
- bool is_worker = remote_type_ == DevToolsAgentHost::kTypeServiceWorker ||
- remote_type_ == DevToolsAgentHost::kTypeSharedWorker;
- bool is_v8_only = remote_type_ == "node";
- DevToolsWindow::OpenExternalFrontend(bridge_->profile_, frontend_url_,
- agent_host_, is_worker, is_v8_only);
+ device_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp));
return true;
}
void DevToolsAndroidBridge::AgentHostDelegate::Reload() {
- if (!bridge_)
- return;
-
- bridge_->SendProtocolCommand(browser_id_, target_path_, kPageReloadCommand,
- nullptr, base::Closure());
+ SendProtocolCommand(target_path_, kPageReloadCommand, nullptr,
+ base::Closure());
}
bool DevToolsAndroidBridge::AgentHostDelegate::Close() {
- if (!bridge_)
- return false;
-
std::string request = base::StringPrintf(kClosePageRequest,
remote_id_.c_str());
- bridge_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp));
+ device_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp));
return true;
}
@@ -548,23 +541,53 @@ void DevToolsAndroidBridge::AgentHostDelegate::OnSocketClosed() {
}
}
+void DevToolsAndroidBridge::AgentHostDelegate::SendProtocolCommand(
+ const std::string& target_path,
+ const std::string& method,
+ std::unique_ptr<base::DictionaryValue> params,
+ const base::Closure callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ if (target_path.empty())
+ return;
+ new ProtocolCommand(
+ device_, browser_id_, target_path,
+ DevToolsProtocol::SerializeCommand(1, method, std::move(params)),
+ callback);
+}
+
// DevToolsAndroidBridge::RemotePage ------------------------------------------
-DevToolsAndroidBridge::RemotePage::RemotePage(const BrowserId& browser_id,
- const base::DictionaryValue& dict)
- : browser_id_(browser_id),
+DevToolsAndroidBridge::RemotePage::RemotePage(
+ scoped_refptr<AndroidDeviceManager::Device> device,
+ const std::string& browser_id,
+ const base::DictionaryValue& dict)
+ : device_(device),
+ browser_id_(browser_id),
dict_(dict.DeepCopy()) {
}
DevToolsAndroidBridge::RemotePage::~RemotePage() {
}
+scoped_refptr<content::DevToolsAgentHost>
+DevToolsAndroidBridge::RemotePage::CreateTarget() {
+ std::string local_id = BuildUniqueTargetId(device_->serial(),
+ browser_id_,
+ dict_.get());
+ std::string target_path = GetTargetPath(dict_.get());
+ std::string type = GetStringProperty(dict_.get(), "type");
+
+ return AgentHostDelegate::GetOrCreateAgentHost(
+ device_, browser_id_, local_id, target_path, type, dict_.get());
+}
+
// DevToolsAndroidBridge::RemoteBrowser ---------------------------------------
DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser(
const std::string& serial,
const AndroidDeviceManager::BrowserInfo& browser_info)
- : browser_id_(std::make_pair(serial, browser_info.socket_name)),
+ : serial_(serial),
+ browser_id_(browser_info.socket_name),
display_name_(browser_info.display_name),
user_(browser_info.user),
type_(browser_info.type) {
@@ -592,52 +615,14 @@ DevToolsAndroidBridge::RemoteBrowser::GetParsedVersion() {
}
scoped_refptr<content::DevToolsAgentHost>
-DevToolsAndroidBridge::CreatePageTarget(scoped_refptr<RemotePage> page) {
- std::string local_id = BuildUniqueTargetId(page->browser_id_,
- page->dict_.get());
- std::string target_path = GetTargetPath(page->dict_.get());
- std::string type = GetStringProperty(page->dict_.get(), "type");
- return AgentHostDelegate::GetOrCreateAgentHost(
- this, page->browser_id_, local_id, target_path, type, page->dict_.get());
-}
-
-void DevToolsAndroidBridge::SendJsonRequest(
- const BrowserId& browser_id,
- const std::string& request,
- const JsonRequestCallback& callback) {
- DeviceMap::iterator it = device_map_.find(browser_id.first);
- if (it == device_map_.end()) {
- callback.Run(net::ERR_FAILED, std::string());
- return;
- }
- it->second->SendJsonRequest(browser_id.second, request, callback);
-}
-
-void DevToolsAndroidBridge::SendProtocolCommand(
- const BrowserId& browser_id,
- const std::string& target_path,
- const std::string& method,
- std::unique_ptr<base::DictionaryValue> params,
- const base::Closure callback) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- if (target_path.empty())
- return;
- DeviceMap::iterator it = device_map_.find(browser_id.first);
- if (it == device_map_.end()) {
- callback.Run();
- return;
- }
- new ProtocolCommand(
- it->second, browser_id.second, target_path,
- DevToolsProtocol::SerializeCommand(1, method, std::move(params)),
- callback);
-}
-
-scoped_refptr<content::DevToolsAgentHost>
DevToolsAndroidBridge::GetBrowserAgentHost(
scoped_refptr<RemoteBrowser> browser) {
+ DeviceMap::iterator it = device_map_.find(browser->serial());
+ if (it == device_map_.end())
+ return nullptr;
+
return AgentHostDelegate::GetOrCreateAgentHost(
- this,
+ it->second,
browser->browser_id_,
"adb:" + browser->serial() + ":" + browser->socket(),
kBrowserTargetSocket, DevToolsAgentHost::kTypeBrowser, nullptr);
@@ -647,23 +632,18 @@ void DevToolsAndroidBridge::SendJsonRequest(
const std::string& browser_id_str,
const std::string& url,
const JsonRequestCallback& callback) {
- BrowserId browser_id;
- if (!BrowserIdFromString(browser_id_str, &browser_id)) {
+ std::string serial;
+ std::string browser_id;
+ if (!BrowserIdFromString(browser_id_str, &serial, &browser_id)) {
callback.Run(net::ERR_FAILED, std::string());
return;
}
- SendJsonRequest(browser_id, url, callback);
-}
-
-AndroidDeviceManager::AndroidWebSocket*
-DevToolsAndroidBridge::CreateWebSocket(
- const BrowserId& browser_id,
- const std::string& url,
- AndroidDeviceManager::AndroidWebSocket::Delegate* delegate) {
- DeviceMap::iterator it = device_map_.find(browser_id.first);
- if (it == device_map_.end())
- return nullptr;
- return it->second->CreateWebSocket(browser_id.second, url, delegate);
+ DeviceMap::iterator it = device_map_.find(serial);
+ if (it == device_map_.end()) {
+ callback.Run(net::ERR_FAILED, std::string());
+ return;
+ }
+ it->second->SendJsonRequest(browser_id, url, callback);
}
void DevToolsAndroidBridge::OpenRemotePage(scoped_refptr<RemoteBrowser> browser,
@@ -681,7 +661,7 @@ void DevToolsAndroidBridge::OpenRemotePage(scoped_refptr<RemoteBrowser> browser,
std::string query = net::EscapeQueryParamValue(url, false /* use_plus */);
std::string request =
base::StringPrintf(kNewPageRequestWithURL, query.c_str());
- SendJsonRequest(browser->browser_id_, request, base::Bind(&NoOp));
+ SendJsonRequest(browser->GetId(), request, base::Bind(&NoOp));
}
DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() {
@@ -793,11 +773,6 @@ void DevToolsAndroidBridge::RemovePortForwardingListener(
StopDeviceListPolling();
}
-bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- return host_delegates_.find(agent_id) != host_delegates_.end();
-}
-
DevToolsAndroidBridge::~DevToolsAndroidBridge() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK(device_list_listeners_.empty());

Powered by Google App Engine
This is Rietveld 408576698