| 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());
|
|
|