| 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 2b1b312072fad613309c8410a2638937aadc3399..97d6834ea78a13430774da404b8228dd4dbaf1ff 100644
|
| --- a/chrome/browser/devtools/device/devtools_android_bridge.cc
|
| +++ b/chrome/browser/devtools/device/devtools_android_bridge.cc
|
| @@ -168,8 +168,15 @@ void DevToolsAndroidBridge::DiscoveryRequest::ReceivedPages(
|
| return;
|
| scoped_ptr<base::Value> value(base::JSONReader::Read(response));
|
| base::ListValue* list_value;
|
| - if (value && value->GetAsList(&list_value))
|
| - browser->page_descriptors_.reset(list_value->DeepCopy());
|
| + if (value && value->GetAsList(&list_value)) {
|
| + 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->IsWebView()));
|
| + }
|
| + }
|
| + }
|
| }
|
|
|
| // ProtocolCommand ------------------------------------------------------------
|
| @@ -275,15 +282,17 @@ class DevToolsAndroidBridge::AgentHostDelegate
|
| static scoped_refptr<content::DevToolsAgentHost> GetOrCreateAgentHost(
|
| scoped_refptr<DevToolsAndroidBridge> bridge,
|
| const std::string& id,
|
| - scoped_refptr<RemoteBrowser> browser,
|
| - const std::string& debug_url);
|
| + const BrowserId& browser_id,
|
| + const std::string& debug_url,
|
| + bool is_web_view);
|
|
|
| private:
|
| AgentHostDelegate(
|
| scoped_refptr<DevToolsAndroidBridge> bridge,
|
| const std::string& id,
|
| - scoped_refptr<RemoteBrowser> browser,
|
| - const std::string& debug_url);
|
| + const BrowserId& browser_id,
|
| + const std::string& debug_url,
|
| + bool is_web_view);
|
| virtual ~AgentHostDelegate();
|
| virtual void Attach(content::DevToolsExternalAgentProxy* proxy) override;
|
| virtual void Detach() override;
|
| @@ -295,7 +304,7 @@ class DevToolsAndroidBridge::AgentHostDelegate
|
|
|
| std::string id_;
|
| scoped_refptr<DevToolsAndroidBridge> bridge_;
|
| - scoped_refptr<RemoteBrowser> browser_;
|
| + BrowserId browser_id_;
|
| std::string debug_url_;
|
| bool socket_opened_;
|
| bool is_web_view_;
|
| @@ -311,15 +320,16 @@ scoped_refptr<content::DevToolsAgentHost>
|
| DevToolsAndroidBridge::AgentHostDelegate::GetOrCreateAgentHost(
|
| scoped_refptr<DevToolsAndroidBridge> bridge,
|
| const std::string& id,
|
| - scoped_refptr<RemoteBrowser> browser,
|
| - const std::string& debug_url) {
|
| + const BrowserId& browser_id,
|
| + const std::string& debug_url,
|
| + bool is_web_view) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| AgentHostDelegates::iterator it = bridge->host_delegates_.find(id);
|
| if (it != bridge->host_delegates_.end())
|
| return it->second->agent_host_;
|
|
|
| AgentHostDelegate* delegate =
|
| - new AgentHostDelegate(bridge, id, browser, debug_url);
|
| + new AgentHostDelegate(bridge, id, browser_id, debug_url, is_web_view);
|
| scoped_refptr<content::DevToolsAgentHost> result =
|
| content::DevToolsAgentHost::Create(delegate);
|
| delegate->agent_host_ = result.get();
|
| @@ -329,14 +339,15 @@ DevToolsAndroidBridge::AgentHostDelegate::GetOrCreateAgentHost(
|
| DevToolsAndroidBridge::AgentHostDelegate::AgentHostDelegate(
|
| scoped_refptr<DevToolsAndroidBridge> bridge,
|
| const std::string& id,
|
| - scoped_refptr<RemoteBrowser> browser,
|
| - const std::string& debug_url)
|
| + const BrowserId& browser_id,
|
| + const std::string& debug_url,
|
| + bool is_web_view)
|
| : id_(id),
|
| bridge_(bridge),
|
| - browser_(browser),
|
| + browser_id_(browser_id),
|
| debug_url_(debug_url),
|
| socket_opened_(false),
|
| - is_web_view_(browser->IsWebView()),
|
| + is_web_view_(is_web_view),
|
| agent_host_(NULL),
|
| proxy_(NULL) {
|
| bridge_->host_delegates_[id] = this;
|
| @@ -352,7 +363,7 @@ void DevToolsAndroidBridge::AgentHostDelegate::Attach(
|
| content::RecordAction(base::UserMetricsAction(is_web_view_ ?
|
| "DevTools_InspectAndroidWebView" : "DevTools_InspectAndroidPage"));
|
| web_socket_.reset(
|
| - bridge_->CreateWebSocket(browser_, debug_url_, this));
|
| + bridge_->CreateWebSocket(browser_id_, debug_url_, this));
|
| }
|
|
|
| void DevToolsAndroidBridge::AgentHostDelegate::Detach() {
|
| @@ -389,19 +400,14 @@ void DevToolsAndroidBridge::AgentHostDelegate::OnSocketClosed() {
|
|
|
| //// RemotePageTarget ----------------------------------------------
|
|
|
| -class DevToolsAndroidBridge::RemotePageTarget
|
| - : public DevToolsTargetImpl,
|
| - public DevToolsAndroidBridge::RemotePage {
|
| +class DevToolsAndroidBridge::RemotePageTarget : public DevToolsTargetImpl {
|
| public:
|
| RemotePageTarget(scoped_refptr<DevToolsAndroidBridge> bridge,
|
| - scoped_refptr<RemoteBrowser> browser,
|
| - const base::DictionaryValue& value);
|
| + const BrowserId& browser_id,
|
| + const base::DictionaryValue& value,
|
| + bool is_web_view_);
|
| virtual ~RemotePageTarget();
|
|
|
| - // DevToolsAndroidBridge::RemotePage implementation.
|
| - virtual DevToolsTargetImpl* GetTarget() override;
|
| - virtual std::string GetFrontendURL() override;
|
| -
|
| // DevToolsTargetImpl overrides.
|
| virtual std::string GetId() const override;
|
| virtual bool IsAttached() const override;
|
| @@ -414,7 +420,7 @@ class DevToolsAndroidBridge::RemotePageTarget
|
|
|
| private:
|
| scoped_refptr<DevToolsAndroidBridge> bridge_;
|
| - scoped_refptr<RemoteBrowser> browser_;
|
| + BrowserId browser_id_;
|
| std::string debug_url_;
|
| std::string frontend_url_;
|
| std::string remote_id_;
|
| @@ -431,10 +437,20 @@ static std::string GetStringProperty(const base::DictionaryValue& value,
|
| }
|
|
|
| static std::string BuildUniqueTargetId(
|
| - DevToolsAndroidBridge::RemoteBrowser* browser,
|
| + const DevToolsAndroidBridge::BrowserId& browser_id,
|
| const base::DictionaryValue& value) {
|
| - return base::StringPrintf("%s:%s:%s", browser->serial().c_str(),
|
| - browser->socket().c_str(), GetStringProperty(value, "id").c_str());
|
| + return base::StringPrintf("%s:%s:%s", browser_id.first.c_str(),
|
| + browser_id.second.c_str(), GetStringProperty(value, "id").c_str());
|
| +}
|
| +
|
| +static std::string GetFrontendURL(const base::DictionaryValue& value) {
|
| + std::string frontend_url = GetStringProperty(value, "devtoolsFrontendUrl");
|
| + size_t ws_param = frontend_url.find("?ws");
|
| + if (ws_param != std::string::npos)
|
| + frontend_url = frontend_url.substr(0, ws_param);
|
| + if (frontend_url.find("http:") == 0)
|
| + frontend_url = "https:" + frontend_url.substr(5);
|
| + return frontend_url;
|
| }
|
|
|
| static std::string GetDebugURL(const base::DictionaryValue& value) {
|
| @@ -449,19 +465,22 @@ static std::string GetDebugURL(const base::DictionaryValue& value) {
|
|
|
| DevToolsAndroidBridge::RemotePageTarget::RemotePageTarget(
|
| scoped_refptr<DevToolsAndroidBridge> bridge,
|
| - scoped_refptr<RemoteBrowser> browser,
|
| - const base::DictionaryValue& value)
|
| + const BrowserId& browser_id,
|
| + const base::DictionaryValue& value,
|
| + bool is_web_view)
|
| : DevToolsTargetImpl(AgentHostDelegate::GetOrCreateAgentHost(
|
| bridge,
|
| - BuildUniqueTargetId(browser.get(), value),
|
| - browser,
|
| - GetDebugURL(value))),
|
| + BuildUniqueTargetId(browser_id, value),
|
| + browser_id,
|
| + GetDebugURL(value),
|
| + is_web_view)),
|
| bridge_(bridge),
|
| - browser_(browser),
|
| + browser_id_(browser_id),
|
| debug_url_(GetDebugURL(value)),
|
| + frontend_url_(GetFrontendURL(value)),
|
| remote_id_(GetStringProperty(value, "id")),
|
| remote_type_(GetStringProperty(value, "type")),
|
| - local_id_(BuildUniqueTargetId(browser.get(), value)) {
|
| + local_id_(BuildUniqueTargetId(browser_id, value)) {
|
| set_type("adb_page");
|
| set_url(GURL(GetStringProperty(value, "url")));
|
| set_title(base::UTF16ToUTF8(net::UnescapeForHTML(base::UTF8ToUTF16(
|
| @@ -469,26 +488,11 @@ DevToolsAndroidBridge::RemotePageTarget::RemotePageTarget(
|
| set_description(GetStringProperty(value, "description"));
|
| set_favicon_url(GURL(GetStringProperty(value, "faviconUrl")));
|
| debug_url_ = GetDebugURL(value);
|
| - frontend_url_ = GetStringProperty(value, "devtoolsFrontendUrl");
|
| -
|
| - size_t ws_param = frontend_url_.find("?ws");
|
| - if (ws_param != std::string::npos)
|
| - frontend_url_ = frontend_url_.substr(0, ws_param);
|
| - if (frontend_url_.find("http:") == 0)
|
| - frontend_url_ = "https:" + frontend_url_.substr(5);
|
| }
|
|
|
| DevToolsAndroidBridge::RemotePageTarget::~RemotePageTarget() {
|
| }
|
|
|
| -DevToolsTargetImpl* DevToolsAndroidBridge::RemotePageTarget::GetTarget() {
|
| - return this;
|
| -}
|
| -
|
| -std::string DevToolsAndroidBridge::RemotePageTarget::GetFrontendURL() {
|
| - return frontend_url_;
|
| -}
|
| -
|
| std::string DevToolsAndroidBridge::RemotePageTarget::GetId() const {
|
| return local_id_;
|
| }
|
| @@ -510,19 +514,19 @@ void DevToolsAndroidBridge::RemotePageTarget::Inspect(Profile* profile) const {
|
| bool DevToolsAndroidBridge::RemotePageTarget::Activate() const {
|
| std::string request = base::StringPrintf(kActivatePageRequest,
|
| remote_id_.c_str());
|
| - bridge_->SendJsonRequest(browser_, request, base::Bind(&NoOp));
|
| + bridge_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp));
|
| return true;
|
| }
|
|
|
| bool DevToolsAndroidBridge::RemotePageTarget::Close() const {
|
| std::string request = base::StringPrintf(kClosePageRequest,
|
| remote_id_.c_str());
|
| - bridge_->SendJsonRequest(browser_, request, base::Bind(&NoOp));
|
| + bridge_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp));
|
| return true;
|
| }
|
|
|
| void DevToolsAndroidBridge::RemotePageTarget::Reload() const {
|
| - bridge_->SendProtocolCommand(browser_, debug_url_, kPageReloadCommand,
|
| + bridge_->SendProtocolCommand(browser_id_, debug_url_, kPageReloadCommand,
|
| NULL, base::Closure());
|
| }
|
|
|
| @@ -531,20 +535,33 @@ void DevToolsAndroidBridge::RemotePageTarget::Navigate(
|
| base::Closure callback) const {
|
| base::DictionaryValue params;
|
| params.SetString(kUrlParam, url);
|
| - bridge_->SendProtocolCommand(browser_, debug_url_, kPageNavigateCommand,
|
| + bridge_->SendProtocolCommand(browser_id_, debug_url_, kPageNavigateCommand,
|
| ¶ms, callback);
|
| }
|
|
|
| +// DevToolsAndroidBridge::RemotePage ------------------------------------------
|
| +
|
| +DevToolsAndroidBridge::RemotePage::RemotePage(
|
| + const BrowserId& browser_id,
|
| + const base::DictionaryValue& dict,
|
| + bool is_web_view)
|
| + : browser_id_(browser_id),
|
| + frontend_url_(GetFrontendURL(dict)),
|
| + is_web_view_(is_web_view),
|
| + dict_(dict.DeepCopy()) {
|
| +}
|
| +
|
| +DevToolsAndroidBridge::RemotePage::~RemotePage() {
|
| +}
|
| +
|
| // DevToolsAndroidBridge::RemoteBrowser ---------------------------------------
|
|
|
| DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser(
|
| const std::string& serial,
|
| const AndroidDeviceManager::BrowserInfo& browser_info)
|
| - : serial_(serial),
|
| - socket_(browser_info.socket_name),
|
| + : browser_id_(std::make_pair(serial, browser_info.socket_name)),
|
| display_name_(browser_info.display_name),
|
| - type_(browser_info.type),
|
| - page_descriptors_(new base::ListValue()) {
|
| + type_(browser_info.type) {
|
| }
|
|
|
| bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() {
|
| @@ -568,36 +585,26 @@ DevToolsAndroidBridge::RemoteBrowser::GetParsedVersion() {
|
| return result;
|
| }
|
|
|
| -std::vector<DevToolsAndroidBridge::RemotePage*>
|
| -DevToolsAndroidBridge::CreatePages(scoped_refptr<RemoteBrowser> browser) {
|
| - std::vector<RemotePage*> result;
|
| - for (const auto& value : browser->page_descriptors()) {
|
| - base::DictionaryValue* dict;
|
| - if (value->GetAsDictionary(&dict))
|
| - result.push_back(new RemotePageTarget(this, browser, *dict));
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -const base::ListValue&
|
| -DevToolsAndroidBridge::RemoteBrowser::page_descriptors() {
|
| - return *page_descriptors_;
|
| +DevToolsTargetImpl*
|
| +DevToolsAndroidBridge::CreatePageTarget(scoped_refptr<RemotePage> page) {
|
| + return new RemotePageTarget(this, page->browser_id_, *page->dict_,
|
| + page->is_web_view_);
|
| }
|
|
|
| void DevToolsAndroidBridge::SendJsonRequest(
|
| - scoped_refptr<RemoteBrowser> browser,
|
| + const BrowserId& browser_id,
|
| const std::string& request,
|
| const JsonRequestCallback& callback) {
|
| - DeviceMap::iterator it = device_map_.find(browser->serial());
|
| + 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->socket(), request, callback);
|
| + it->second->SendJsonRequest(browser_id.second, request, callback);
|
| }
|
|
|
| void DevToolsAndroidBridge::SendProtocolCommand(
|
| - scoped_refptr<RemoteBrowser> browser,
|
| + const BrowserId& browser_id,
|
| const std::string& debug_url,
|
| const std::string& method,
|
| base::DictionaryValue* params,
|
| @@ -605,13 +612,13 @@ void DevToolsAndroidBridge::SendProtocolCommand(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| if (debug_url.empty())
|
| return;
|
| - DeviceMap::iterator it = device_map_.find(browser->serial());
|
| + DeviceMap::iterator it = device_map_.find(browser_id.first);
|
| if (it == device_map_.end()) {
|
| callback.Run();
|
| return;
|
| }
|
| DevToolsProtocol::Command command(1, method, params);
|
| - new ProtocolCommand(it->second, browser->socket(), debug_url,
|
| + new ProtocolCommand(it->second, browser_id.second, debug_url,
|
| command.Serialize(), callback);
|
| }
|
|
|
| @@ -621,20 +628,21 @@ DevToolsAndroidBridge::GetBrowserAgentHost(
|
| return AgentHostDelegate::GetOrCreateAgentHost(
|
| this,
|
| "adb:" + browser->serial() + ":" + browser->socket(),
|
| - browser,
|
| - kBrowserTargetSocket);
|
| + browser->browser_id_,
|
| + kBrowserTargetSocket,
|
| + browser->IsWebView());
|
| }
|
|
|
| AndroidDeviceManager::AndroidWebSocket*
|
| DevToolsAndroidBridge::CreateWebSocket(
|
| - scoped_refptr<RemoteBrowser> browser,
|
| + const BrowserId& browser_id,
|
| const std::string& url,
|
| AndroidDeviceManager::AndroidWebSocket::Delegate* delegate) {
|
| - DeviceMap::iterator it = device_map_.find(browser->serial());
|
| + DeviceMap::iterator it = device_map_.find(browser_id.first);
|
| if (it == device_map_.end())
|
| return NULL;
|
|
|
| - return it->second->CreateWebSocket(browser->socket(), url, delegate);
|
| + return it->second->CreateWebSocket(browser_id.second, url, delegate);
|
| }
|
|
|
| void DevToolsAndroidBridge::RespondToOpenOnUIThread(
|
| @@ -650,7 +658,8 @@ void DevToolsAndroidBridge::RespondToOpenOnUIThread(
|
| scoped_ptr<base::Value> value(base::JSONReader::Read(response));
|
| base::DictionaryValue* dict;
|
| if (value && value->GetAsDictionary(&dict)) {
|
| - RemotePageTarget* new_page = new RemotePageTarget(this, browser, *dict);
|
| + scoped_refptr<RemotePage> new_page(
|
| + new RemotePage(browser->browser_id_, *dict, browser->IsWebView()));
|
| callback.Run(new_page);
|
| }
|
| }
|
| @@ -675,11 +684,11 @@ void DevToolsAndroidBridge::OpenRemotePage(
|
| std::string query = net::EscapeQueryParamValue(url, false /* use_plus */);
|
| std::string request =
|
| base::StringPrintf(kNewPageRequestWithURL, query.c_str());
|
| - SendJsonRequest(browser, request,
|
| + SendJsonRequest(browser->browser_id_, request,
|
| base::Bind(&DevToolsAndroidBridge::RespondToOpenOnUIThread,
|
| this, browser, callback));
|
| } else {
|
| - SendJsonRequest(browser, kNewPageRequest,
|
| + SendJsonRequest(browser->browser_id_, kNewPageRequest,
|
| base::Bind(&DevToolsAndroidBridge::PageCreatedOnUIThread,
|
| this, browser, callback, url));
|
| }
|
| @@ -715,7 +724,8 @@ void DevToolsAndroidBridge::NavigatePageOnUIThread(
|
| base::DictionaryValue* dict;
|
|
|
| if (value && value->GetAsDictionary(&dict)) {
|
| - RemotePageTarget new_page(this, browser, *dict);
|
| + RemotePageTarget new_page(this, browser->browser_id_, *dict,
|
| + browser->IsWebView());
|
| new_page.Navigate(url,
|
| base::Bind(&DevToolsAndroidBridge::RespondToOpenOnUIThread,
|
| this, browser, callback, result, response));
|
|
|