Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/devtools/device/devtools_android_bridge.h" | 5 #include "chrome/browser/devtools/device/devtools_android_bridge.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <set> | 10 #include <set> |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 68 const int kAdbPollingIntervalMs = 1000; | 68 const int kAdbPollingIntervalMs = 1000; |
| 69 | 69 |
| 70 const char kPageReloadCommand[] = "Page.reload"; | 70 const char kPageReloadCommand[] = "Page.reload"; |
| 71 | 71 |
| 72 const char kWebViewSocketPrefix[] = "webview_devtools_remote"; | 72 const char kWebViewSocketPrefix[] = "webview_devtools_remote"; |
| 73 | 73 |
| 74 const char kChromeDiscoveryURL[] = "localhost:9222"; | 74 const char kChromeDiscoveryURL[] = "localhost:9222"; |
| 75 const char kNodeDiscoveryURL[] = "localhost:9229"; | 75 const char kNodeDiscoveryURL[] = "localhost:9229"; |
| 76 | 76 |
| 77 bool BrowserIdFromString(const std::string& browser_id_str, | 77 bool BrowserIdFromString(const std::string& browser_id_str, |
| 78 DevToolsAndroidBridge::BrowserId* browser_id) { | 78 std::string* serial, |
| 79 std::string* browser_id) { | |
| 79 size_t colon_pos = browser_id_str.find(':'); | 80 size_t colon_pos = browser_id_str.find(':'); |
| 80 if (colon_pos == std::string::npos) | 81 if (colon_pos == std::string::npos) |
| 81 return false; | 82 return false; |
| 82 browser_id->first = browser_id_str.substr(0, colon_pos); | 83 *serial = browser_id_str.substr(0, colon_pos); |
| 83 browser_id->second = browser_id_str.substr(colon_pos + 1); | 84 *browser_id = browser_id_str.substr(colon_pos + 1); |
| 84 return true; | 85 return true; |
| 85 } | 86 } |
| 86 | 87 |
| 87 static void NoOp(int, const std::string&) {} | 88 static void NoOp(int, const std::string&) {} |
| 88 | 89 |
| 89 } // namespace | 90 } // namespace |
| 90 | 91 |
| 91 // DiscoveryRequest ----------------------------------------------------- | 92 // DiscoveryRequest ----------------------------------------------------- |
| 92 | 93 |
| 93 class DevToolsAndroidBridge::DiscoveryRequest | 94 class DevToolsAndroidBridge::DiscoveryRequest |
| 94 : public base::RefCountedThreadSafe<DiscoveryRequest, | 95 : public base::RefCountedThreadSafe<DiscoveryRequest, |
| 95 BrowserThread::DeleteOnUIThread> { | 96 BrowserThread::DeleteOnUIThread> { |
| 96 public: | 97 public: |
| 97 DiscoveryRequest(AndroidDeviceManager* device_manager, | 98 DiscoveryRequest(AndroidDeviceManager* device_manager, |
| 98 const DeviceListCallback& callback); | 99 const DeviceListCallback& callback); |
| 99 private: | 100 private: |
| 100 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; | 101 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; |
| 101 friend class base::DeleteHelper<DiscoveryRequest>; | 102 friend class base::DeleteHelper<DiscoveryRequest>; |
| 102 virtual ~DiscoveryRequest(); | 103 virtual ~DiscoveryRequest(); |
| 103 | 104 |
| 104 void ReceivedDevices(const AndroidDeviceManager::Devices& devices); | 105 void ReceivedDevices(const AndroidDeviceManager::Devices& devices); |
| 105 void ReceivedDeviceInfo(scoped_refptr<AndroidDeviceManager::Device> device, | 106 void ReceivedDeviceInfo(scoped_refptr<AndroidDeviceManager::Device> device, |
| 106 const AndroidDeviceManager::DeviceInfo& device_info); | 107 const AndroidDeviceManager::DeviceInfo& device_info); |
| 107 void ReceivedVersion(scoped_refptr<RemoteBrowser>, | 108 void ReceivedVersion(scoped_refptr<RemoteBrowser>, |
| 108 int result, | 109 int result, |
| 109 const std::string& response); | 110 const std::string& response); |
| 110 void ReceivedPages(scoped_refptr<RemoteBrowser>, | 111 void ReceivedPages(scoped_refptr<AndroidDeviceManager::Device> device, |
| 112 scoped_refptr<RemoteBrowser>, | |
| 111 int result, | 113 int result, |
| 112 const std::string& response); | 114 const std::string& response); |
| 113 | 115 |
| 114 DeviceListCallback callback_; | 116 DeviceListCallback callback_; |
| 115 CompleteDevices complete_devices_; | 117 CompleteDevices complete_devices_; |
| 116 }; | 118 }; |
| 117 | 119 |
| 118 DevToolsAndroidBridge::DiscoveryRequest::DiscoveryRequest( | 120 DevToolsAndroidBridge::DiscoveryRequest::DiscoveryRequest( |
| 119 AndroidDeviceManager* device_manager, | 121 AndroidDeviceManager* device_manager, |
| 120 const DeviceListCallback& callback) | 122 const DeviceListCallback& callback) |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 147 complete_devices_.push_back(std::make_pair(device, remote_device)); | 149 complete_devices_.push_back(std::make_pair(device, remote_device)); |
| 148 for (RemoteBrowsers::iterator it = remote_device->browsers().begin(); | 150 for (RemoteBrowsers::iterator it = remote_device->browsers().begin(); |
| 149 it != remote_device->browsers().end(); ++it) { | 151 it != remote_device->browsers().end(); ++it) { |
| 150 device->SendJsonRequest( | 152 device->SendJsonRequest( |
| 151 (*it)->socket(), | 153 (*it)->socket(), |
| 152 kVersionRequest, | 154 kVersionRequest, |
| 153 base::Bind(&DiscoveryRequest::ReceivedVersion, this, *it)); | 155 base::Bind(&DiscoveryRequest::ReceivedVersion, this, *it)); |
| 154 device->SendJsonRequest( | 156 device->SendJsonRequest( |
| 155 (*it)->socket(), | 157 (*it)->socket(), |
| 156 kPageListRequest, | 158 kPageListRequest, |
| 157 base::Bind(&DiscoveryRequest::ReceivedPages, this, *it)); | 159 base::Bind(&DiscoveryRequest::ReceivedPages, this, device, *it)); |
| 158 } | 160 } |
| 159 } | 161 } |
| 160 | 162 |
| 161 void DevToolsAndroidBridge::DiscoveryRequest::ReceivedVersion( | 163 void DevToolsAndroidBridge::DiscoveryRequest::ReceivedVersion( |
| 162 scoped_refptr<RemoteBrowser> browser, | 164 scoped_refptr<RemoteBrowser> browser, |
| 163 int result, | 165 int result, |
| 164 const std::string& response) { | 166 const std::string& response) { |
| 165 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 167 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 166 if (result < 0) | 168 if (result < 0) |
| 167 return; | 169 return; |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 180 } | 182 } |
| 181 std::string package; | 183 std::string package; |
| 182 if (dict->GetString("Android-Package", &package)) { | 184 if (dict->GetString("Android-Package", &package)) { |
| 183 browser->display_name_ = | 185 browser->display_name_ = |
| 184 AndroidDeviceManager::GetBrowserName(browser->socket(), package); | 186 AndroidDeviceManager::GetBrowserName(browser->socket(), package); |
| 185 } | 187 } |
| 186 } | 188 } |
| 187 } | 189 } |
| 188 | 190 |
| 189 void DevToolsAndroidBridge::DiscoveryRequest::ReceivedPages( | 191 void DevToolsAndroidBridge::DiscoveryRequest::ReceivedPages( |
| 192 scoped_refptr<AndroidDeviceManager::Device> device, | |
| 190 scoped_refptr<RemoteBrowser> browser, | 193 scoped_refptr<RemoteBrowser> browser, |
| 191 int result, | 194 int result, |
| 192 const std::string& response) { | 195 const std::string& response) { |
| 193 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 196 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 194 if (result < 0) | 197 if (result < 0) |
| 195 return; | 198 return; |
| 196 std::unique_ptr<base::Value> value = base::JSONReader::Read(response); | 199 std::unique_ptr<base::Value> value = base::JSONReader::Read(response); |
| 197 base::ListValue* list_value; | 200 base::ListValue* list_value; |
| 198 if (value && value->GetAsList(&list_value)) { | 201 if (value && value->GetAsList(&list_value)) { |
| 199 for (const auto& page_value : *list_value) { | 202 for (const auto& page_value : *list_value) { |
| 200 base::DictionaryValue* dict; | 203 base::DictionaryValue* dict; |
| 201 if (page_value->GetAsDictionary(&dict)) | 204 if (page_value->GetAsDictionary(&dict)) |
| 202 browser->pages_.push_back(new RemotePage(browser->browser_id_, *dict)); | 205 browser->pages_.push_back( |
| 206 new RemotePage(device, browser->browser_id_, *dict)); | |
| 203 } | 207 } |
| 204 } | 208 } |
| 205 } | 209 } |
| 206 | 210 |
| 207 // ProtocolCommand ------------------------------------------------------------ | 211 // ProtocolCommand ------------------------------------------------------------ |
| 208 | 212 |
| 209 namespace { | 213 namespace { |
| 210 | 214 |
| 211 class ProtocolCommand | 215 class ProtocolCommand |
| 212 : public AndroidDeviceManager::AndroidWebSocket::Delegate { | 216 : public AndroidDeviceManager::AndroidWebSocket::Delegate { |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 288 return new DevToolsAndroidBridge(profile); | 292 return new DevToolsAndroidBridge(profile); |
| 289 } | 293 } |
| 290 | 294 |
| 291 // AgentHostDelegate ---------------------------------------------------------- | 295 // AgentHostDelegate ---------------------------------------------------------- |
| 292 | 296 |
| 293 class DevToolsAndroidBridge::AgentHostDelegate | 297 class DevToolsAndroidBridge::AgentHostDelegate |
| 294 : public content::DevToolsExternalAgentProxyDelegate, | 298 : public content::DevToolsExternalAgentProxyDelegate, |
| 295 public AndroidDeviceManager::AndroidWebSocket::Delegate { | 299 public AndroidDeviceManager::AndroidWebSocket::Delegate { |
| 296 public: | 300 public: |
| 297 static scoped_refptr<content::DevToolsAgentHost> GetOrCreateAgentHost( | 301 static scoped_refptr<content::DevToolsAgentHost> GetOrCreateAgentHost( |
| 298 DevToolsAndroidBridge* bridge, | 302 scoped_refptr<AndroidDeviceManager::Device> device, |
| 299 const BrowserId& browser_id, | 303 const std::string& browser_id, |
| 300 const std::string& local_id, | 304 const std::string& local_id, |
| 301 const std::string& target_path, | 305 const std::string& target_path, |
| 302 const std::string& type, | 306 const std::string& type, |
| 303 base::DictionaryValue* value); | 307 base::DictionaryValue* value); |
| 304 ~AgentHostDelegate() override; | 308 ~AgentHostDelegate() override; |
| 305 | 309 |
| 306 private: | 310 private: |
| 307 AgentHostDelegate( | 311 AgentHostDelegate( |
| 308 DevToolsAndroidBridge* bridge, | 312 scoped_refptr<AndroidDeviceManager::Device> device, |
| 309 const BrowserId& browser_id, | 313 const std::string& browser_id, |
| 310 const std::string& local_id, | 314 const std::string& local_id, |
| 311 const std::string& target_path, | 315 const std::string& target_path, |
| 312 const std::string& type, | 316 const std::string& type, |
| 313 base::DictionaryValue* value); | 317 base::DictionaryValue* value); |
| 314 // DevToolsExternalAgentProxyDelegate overrides. | 318 // DevToolsExternalAgentProxyDelegate overrides. |
| 315 void Attach(content::DevToolsExternalAgentProxy* proxy) override; | 319 void Attach(content::DevToolsExternalAgentProxy* proxy) override; |
| 316 void Detach() override; | 320 void Detach() override; |
| 317 std::string GetType() override; | 321 std::string GetType() override; |
| 318 std::string GetTitle() override; | 322 std::string GetTitle() override; |
| 319 std::string GetDescription() override; | 323 std::string GetDescription() override; |
| 320 GURL GetURL() override; | 324 GURL GetURL() override; |
| 321 GURL GetFaviconURL() override; | 325 GURL GetFaviconURL() override; |
| 322 bool Activate() override; | 326 bool Activate() override; |
| 323 bool Inspect() override; | 327 bool Inspect(content::BrowserContext* context) override; |
| 324 void Reload() override; | 328 void Reload() override; |
| 325 bool Close() override; | 329 bool Close() override; |
| 326 void SendMessageToBackend(const std::string& message) override; | 330 void SendMessageToBackend(const std::string& message) override; |
| 327 | 331 |
| 328 void OnSocketOpened() override; | 332 void OnSocketOpened() override; |
| 329 void OnFrameRead(const std::string& message) override; | 333 void OnFrameRead(const std::string& message) override; |
| 330 void OnSocketClosed() override; | 334 void OnSocketClosed() override; |
| 331 | 335 |
| 332 base::WeakPtr<DevToolsAndroidBridge> bridge_; | 336 void SendProtocolCommand(const std::string& target_path, |
| 333 BrowserId browser_id_; | 337 const std::string& method, |
| 338 std::unique_ptr<base::DictionaryValue> params, | |
| 339 const base::Closure callback); | |
| 340 | |
| 341 scoped_refptr<AndroidDeviceManager::Device> device_; | |
| 342 std::string browser_id_; | |
| 334 std::string local_id_; | 343 std::string local_id_; |
| 335 std::string target_path_; | 344 std::string target_path_; |
| 336 std::string remote_type_; | 345 std::string remote_type_; |
| 337 std::string remote_id_; | 346 std::string remote_id_; |
| 338 std::string frontend_url_; | 347 std::string frontend_url_; |
| 339 std::string title_; | 348 std::string title_; |
| 340 std::string description_; | 349 std::string description_; |
| 341 GURL url_; | 350 GURL url_; |
| 342 GURL favicon_url_; | 351 GURL favicon_url_; |
| 343 bool socket_opened_; | 352 bool socket_opened_; |
| 344 std::vector<std::string> pending_messages_; | 353 std::vector<std::string> pending_messages_; |
| 345 std::unique_ptr<AndroidDeviceManager::AndroidWebSocket> web_socket_; | 354 std::unique_ptr<AndroidDeviceManager::AndroidWebSocket> web_socket_; |
| 346 content::DevToolsAgentHost* agent_host_; | 355 content::DevToolsAgentHost* agent_host_; |
| 347 content::DevToolsExternalAgentProxy* proxy_; | 356 content::DevToolsExternalAgentProxy* proxy_; |
| 348 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate); | 357 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate); |
| 349 }; | 358 }; |
| 350 | 359 |
| 351 static std::string GetStringProperty(base::DictionaryValue* value, | 360 static std::string GetStringProperty(base::DictionaryValue* value, |
| 352 const std::string& name) { | 361 const std::string& name) { |
| 353 std::string result; | 362 std::string result; |
| 354 value->GetString(name, &result); | 363 value->GetString(name, &result); |
| 355 return result; | 364 return result; |
| 356 } | 365 } |
| 357 | 366 |
| 358 static std::string BuildUniqueTargetId( | 367 static std::string BuildUniqueTargetId( |
| 359 const DevToolsAndroidBridge::BrowserId& browser_id, | 368 const std::string& serial, |
| 369 const std::string& browser_id, | |
| 360 base::DictionaryValue* value) { | 370 base::DictionaryValue* value) { |
| 361 return base::StringPrintf("%s:%s:%s", browser_id.first.c_str(), | 371 return base::StringPrintf("%s:%s:%s", serial.c_str(), |
| 362 browser_id.second.c_str(), GetStringProperty(value, "id").c_str()); | 372 browser_id.c_str(), GetStringProperty(value, "id").c_str()); |
| 363 } | 373 } |
| 364 | 374 |
| 365 static std::string GetFrontendURL(base::DictionaryValue* value) { | 375 static std::string GetFrontendURL(base::DictionaryValue* value) { |
| 366 std::string frontend_url = GetStringProperty(value, "devtoolsFrontendUrl"); | 376 std::string frontend_url = GetStringProperty(value, "devtoolsFrontendUrl"); |
| 367 size_t ws_param = frontend_url.find("?ws"); | 377 size_t ws_param = frontend_url.find("?ws"); |
| 368 if (ws_param != std::string::npos) | 378 if (ws_param != std::string::npos) |
| 369 frontend_url = frontend_url.substr(0, ws_param); | 379 frontend_url = frontend_url.substr(0, ws_param); |
| 370 if (base::StartsWith(frontend_url, "http:", base::CompareCase::SENSITIVE)) | 380 if (base::StartsWith(frontend_url, "http:", base::CompareCase::SENSITIVE)) |
| 371 frontend_url = "https:" + frontend_url.substr(5); | 381 frontend_url = "https:" + frontend_url.substr(5); |
| 372 return frontend_url; | 382 return frontend_url; |
| 373 } | 383 } |
| 374 | 384 |
| 375 static std::string GetTargetPath(base::DictionaryValue* value) { | 385 static std::string GetTargetPath(base::DictionaryValue* value) { |
| 376 std::string target_path = GetStringProperty(value, "webSocketDebuggerUrl"); | 386 std::string target_path = GetStringProperty(value, "webSocketDebuggerUrl"); |
| 377 | 387 |
| 378 if (base::StartsWith(target_path, "ws://", base::CompareCase::SENSITIVE)) { | 388 if (base::StartsWith(target_path, "ws://", base::CompareCase::SENSITIVE)) { |
| 379 size_t pos = target_path.find("/", 5); | 389 size_t pos = target_path.find("/", 5); |
| 380 if (pos == std::string::npos) | 390 if (pos == std::string::npos) |
| 381 pos = 5; | 391 pos = 5; |
| 382 target_path = target_path.substr(pos); | 392 target_path = target_path.substr(pos); |
| 383 } else { | 393 } else { |
| 384 target_path = std::string(); | 394 target_path = std::string(); |
| 385 } | 395 } |
| 386 return target_path; | 396 return target_path; |
| 387 } | 397 } |
| 388 | 398 |
| 389 // static | 399 // static |
| 390 scoped_refptr<content::DevToolsAgentHost> | 400 scoped_refptr<content::DevToolsAgentHost> |
| 391 DevToolsAndroidBridge::AgentHostDelegate::GetOrCreateAgentHost( | 401 DevToolsAndroidBridge::AgentHostDelegate::GetOrCreateAgentHost( |
| 392 DevToolsAndroidBridge* bridge, | 402 scoped_refptr<AndroidDeviceManager::Device> device, |
| 393 const BrowserId& browser_id, | 403 const std::string& browser_id, |
| 394 const std::string& local_id, | 404 const std::string& local_id, |
| 395 const std::string& target_path, | 405 const std::string& target_path, |
| 396 const std::string& type, | 406 const std::string& type, |
| 397 base::DictionaryValue* value) { | 407 base::DictionaryValue* value) { |
| 398 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 408 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 399 AgentHostDelegates::iterator it = bridge->host_delegates_.find(local_id); | 409 scoped_refptr<DevToolsAgentHost> result = |
| 400 if (it != bridge->host_delegates_.end()) | 410 DevToolsAgentHost::GetForId(local_id); |
|
dgozman
2016/09/22 17:13:59
This essentially makes it cross-profile.
| |
| 401 return it->second->agent_host_; | 411 if (result) |
| 412 return result; | |
| 402 | 413 |
| 403 AgentHostDelegate* delegate = new AgentHostDelegate( | 414 AgentHostDelegate* delegate = new AgentHostDelegate( |
| 404 bridge, browser_id, local_id, target_path, type, value); | 415 device, browser_id, local_id, target_path, type, value); |
| 405 scoped_refptr<content::DevToolsAgentHost> result = | 416 result = content::DevToolsAgentHost::Forward( |
| 406 content::DevToolsAgentHost::Forward(local_id, base::WrapUnique(delegate)); | 417 local_id, base::WrapUnique(delegate)); |
| 407 delegate->agent_host_ = result.get(); | 418 delegate->agent_host_ = result.get(); |
| 408 return result; | 419 return result; |
| 409 } | 420 } |
| 410 | 421 |
| 411 DevToolsAndroidBridge::AgentHostDelegate::AgentHostDelegate( | 422 DevToolsAndroidBridge::AgentHostDelegate::AgentHostDelegate( |
| 412 DevToolsAndroidBridge* bridge, | 423 scoped_refptr<AndroidDeviceManager::Device> device, |
| 413 const BrowserId& browser_id, | 424 const std::string& browser_id, |
| 414 const std::string& local_id, | 425 const std::string& local_id, |
| 415 const std::string& target_path, | 426 const std::string& target_path, |
| 416 const std::string& type, | 427 const std::string& type, |
| 417 base::DictionaryValue* value) | 428 base::DictionaryValue* value) |
| 418 : bridge_(bridge->AsWeakPtr()), | 429 : device_(device), |
| 419 browser_id_(browser_id), | 430 browser_id_(browser_id), |
| 420 local_id_(local_id), | 431 local_id_(local_id), |
| 421 target_path_(target_path), | 432 target_path_(target_path), |
| 422 remote_type_(type), | 433 remote_type_(type), |
| 423 remote_id_(value ? GetStringProperty(value, "id") : ""), | 434 remote_id_(value ? GetStringProperty(value, "id") : ""), |
| 424 frontend_url_(value ? GetFrontendURL(value) : ""), | 435 frontend_url_(value ? GetFrontendURL(value) : ""), |
| 425 title_(value ? base::UTF16ToUTF8(net::UnescapeForHTML(base::UTF8ToUTF16( | 436 title_(value ? base::UTF16ToUTF8(net::UnescapeForHTML(base::UTF8ToUTF16( |
| 426 GetStringProperty(value, "title")))) : ""), | 437 GetStringProperty(value, "title")))) : ""), |
| 427 description_(value ? GetStringProperty(value, "description") : ""), | 438 description_(value ? GetStringProperty(value, "description") : ""), |
| 428 url_(GURL(value ? GetStringProperty(value, "url") : "")), | 439 url_(GURL(value ? GetStringProperty(value, "url") : "")), |
| 429 favicon_url_(GURL(value ? GetStringProperty(value, "faviconUrl") : "")), | 440 favicon_url_(GURL(value ? GetStringProperty(value, "faviconUrl") : "")), |
| 430 socket_opened_(false), | 441 socket_opened_(false), |
| 431 agent_host_(nullptr), | 442 agent_host_(nullptr), |
| 432 proxy_(nullptr) { | 443 proxy_(nullptr) { |
| 433 bridge_->host_delegates_[local_id_] = this; | |
| 434 } | 444 } |
| 435 | 445 |
| 436 DevToolsAndroidBridge::AgentHostDelegate::~AgentHostDelegate() { | 446 DevToolsAndroidBridge::AgentHostDelegate::~AgentHostDelegate() { |
| 437 if (bridge_) | |
| 438 bridge_->host_delegates_.erase(local_id_); | |
| 439 } | 447 } |
| 440 | 448 |
| 441 void DevToolsAndroidBridge::AgentHostDelegate::Attach( | 449 void DevToolsAndroidBridge::AgentHostDelegate::Attach( |
| 442 content::DevToolsExternalAgentProxy* proxy) { | 450 content::DevToolsExternalAgentProxy* proxy) { |
| 443 proxy_ = proxy; | 451 proxy_ = proxy; |
| 444 content::RecordAction( | 452 content::RecordAction( |
| 445 base::StartsWith(browser_id_.second, kWebViewSocketPrefix, | 453 base::StartsWith(browser_id_, kWebViewSocketPrefix, |
| 446 base::CompareCase::SENSITIVE) | 454 base::CompareCase::SENSITIVE) |
| 447 ? base::UserMetricsAction("DevTools_InspectAndroidWebView") | 455 ? base::UserMetricsAction("DevTools_InspectAndroidWebView") |
| 448 : base::UserMetricsAction("DevTools_InspectAndroidPage")); | 456 : base::UserMetricsAction("DevTools_InspectAndroidPage")); |
| 449 web_socket_.reset( | 457 web_socket_.reset( |
| 450 bridge_->CreateWebSocket(browser_id_, target_path_, this)); | 458 device_->CreateWebSocket(browser_id_, target_path_, this)); |
| 451 } | 459 } |
| 452 | 460 |
| 453 void DevToolsAndroidBridge::AgentHostDelegate::Detach() { | 461 void DevToolsAndroidBridge::AgentHostDelegate::Detach() { |
| 454 web_socket_.reset(); | 462 web_socket_.reset(); |
| 455 proxy_ = nullptr; | 463 proxy_ = nullptr; |
| 456 } | 464 } |
| 457 | 465 |
| 458 std::string DevToolsAndroidBridge::AgentHostDelegate::GetType() { | 466 std::string DevToolsAndroidBridge::AgentHostDelegate::GetType() { |
| 459 return remote_type_; | 467 return remote_type_; |
| 460 } | 468 } |
| 461 | 469 |
| 462 std::string DevToolsAndroidBridge::AgentHostDelegate::GetTitle() { | 470 std::string DevToolsAndroidBridge::AgentHostDelegate::GetTitle() { |
| 463 return title_; | 471 return title_; |
| 464 } | 472 } |
| 465 | 473 |
| 466 std::string DevToolsAndroidBridge::AgentHostDelegate::GetDescription() { | 474 std::string DevToolsAndroidBridge::AgentHostDelegate::GetDescription() { |
| 467 return description_; | 475 return description_; |
| 468 } | 476 } |
| 469 | 477 |
| 470 GURL DevToolsAndroidBridge::AgentHostDelegate::GetURL() { | 478 GURL DevToolsAndroidBridge::AgentHostDelegate::GetURL() { |
| 471 return url_; | 479 return url_; |
| 472 } | 480 } |
| 473 | 481 |
| 474 GURL DevToolsAndroidBridge::AgentHostDelegate::GetFaviconURL() { | 482 GURL DevToolsAndroidBridge::AgentHostDelegate::GetFaviconURL() { |
| 475 return favicon_url_; | 483 return favicon_url_; |
| 476 } | 484 } |
| 477 | 485 |
| 478 bool DevToolsAndroidBridge::AgentHostDelegate::Activate() { | 486 bool DevToolsAndroidBridge::AgentHostDelegate::Activate() { |
| 479 if (!bridge_) | |
| 480 return false; | |
| 481 | |
| 482 std::string request = base::StringPrintf(kActivatePageRequest, | 487 std::string request = base::StringPrintf(kActivatePageRequest, |
| 483 remote_id_.c_str()); | 488 remote_id_.c_str()); |
| 484 bridge_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp)); | 489 device_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp)); |
| 485 return true; | 490 return true; |
| 486 } | 491 } |
| 487 | 492 |
| 488 bool DevToolsAndroidBridge::AgentHostDelegate::Inspect() { | 493 bool DevToolsAndroidBridge::AgentHostDelegate::Inspect( |
| 494 content::BrowserContext* context) { | |
| 489 Activate(); | 495 Activate(); |
| 490 bool is_worker = remote_type_ == DevToolsAgentHost::kTypeServiceWorker || | 496 bool is_worker = remote_type_ == DevToolsAgentHost::kTypeServiceWorker || |
| 491 remote_type_ == DevToolsAgentHost::kTypeSharedWorker; | 497 remote_type_ == DevToolsAgentHost::kTypeSharedWorker; |
| 492 bool is_v8_only = remote_type_ == "node"; | 498 bool is_v8_only = remote_type_ == "node"; |
| 493 DevToolsWindow::OpenExternalFrontend(bridge_->profile_, frontend_url_, | 499 DevToolsWindow::OpenExternalFrontend(Profile::FromBrowserContext(context), |
| 494 agent_host_, is_worker, is_v8_only); | 500 frontend_url_, agent_host_, is_worker, |
| 501 is_v8_only); | |
| 495 return true; | 502 return true; |
| 496 } | 503 } |
| 497 | 504 |
| 498 void DevToolsAndroidBridge::AgentHostDelegate::Reload() { | 505 void DevToolsAndroidBridge::AgentHostDelegate::Reload() { |
| 499 if (!bridge_) | 506 SendProtocolCommand(target_path_, kPageReloadCommand, nullptr, |
| 500 return; | 507 base::Closure()); |
| 501 | |
| 502 bridge_->SendProtocolCommand(browser_id_, target_path_, kPageReloadCommand, | |
| 503 nullptr, base::Closure()); | |
| 504 } | 508 } |
| 505 | 509 |
| 506 bool DevToolsAndroidBridge::AgentHostDelegate::Close() { | 510 bool DevToolsAndroidBridge::AgentHostDelegate::Close() { |
| 507 if (!bridge_) | |
| 508 return false; | |
| 509 | |
| 510 std::string request = base::StringPrintf(kClosePageRequest, | 511 std::string request = base::StringPrintf(kClosePageRequest, |
| 511 remote_id_.c_str()); | 512 remote_id_.c_str()); |
| 512 bridge_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp)); | 513 device_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp)); |
| 513 return true; | 514 return true; |
| 514 } | 515 } |
| 515 | 516 |
| 516 void DevToolsAndroidBridge::AgentHostDelegate::SendMessageToBackend( | 517 void DevToolsAndroidBridge::AgentHostDelegate::SendMessageToBackend( |
| 517 const std::string& message) { | 518 const std::string& message) { |
| 518 // We could have detached due to physical connection being closed. | 519 // We could have detached due to physical connection being closed. |
| 519 if (!proxy_) | 520 if (!proxy_) |
| 520 return; | 521 return; |
| 521 if (socket_opened_) | 522 if (socket_opened_) |
| 522 web_socket_->SendFrame(message); | 523 web_socket_->SendFrame(message); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 541 | 542 |
| 542 void DevToolsAndroidBridge::AgentHostDelegate::OnSocketClosed() { | 543 void DevToolsAndroidBridge::AgentHostDelegate::OnSocketClosed() { |
| 543 if (proxy_) { | 544 if (proxy_) { |
| 544 std::string message = "{ \"method\": \"Inspector.detached\", " | 545 std::string message = "{ \"method\": \"Inspector.detached\", " |
| 545 "\"params\": { \"reason\": \"Connection lost.\"} }"; | 546 "\"params\": { \"reason\": \"Connection lost.\"} }"; |
| 546 proxy_->DispatchOnClientHost(message); | 547 proxy_->DispatchOnClientHost(message); |
| 547 Detach(); | 548 Detach(); |
| 548 } | 549 } |
| 549 } | 550 } |
| 550 | 551 |
| 552 void DevToolsAndroidBridge::AgentHostDelegate::SendProtocolCommand( | |
| 553 const std::string& target_path, | |
| 554 const std::string& method, | |
| 555 std::unique_ptr<base::DictionaryValue> params, | |
| 556 const base::Closure callback) { | |
| 557 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 558 if (target_path.empty()) | |
| 559 return; | |
| 560 new ProtocolCommand( | |
| 561 device_, browser_id_, target_path, | |
| 562 DevToolsProtocol::SerializeCommand(1, method, std::move(params)), | |
| 563 callback); | |
| 564 } | |
| 565 | |
| 551 // DevToolsAndroidBridge::RemotePage ------------------------------------------ | 566 // DevToolsAndroidBridge::RemotePage ------------------------------------------ |
| 552 | 567 |
| 553 DevToolsAndroidBridge::RemotePage::RemotePage(const BrowserId& browser_id, | 568 DevToolsAndroidBridge::RemotePage::RemotePage( |
| 554 const base::DictionaryValue& dict) | 569 scoped_refptr<AndroidDeviceManager::Device> device, |
| 555 : browser_id_(browser_id), | 570 const std::string& browser_id, |
| 571 const base::DictionaryValue& dict) | |
| 572 : device_(device), | |
| 573 browser_id_(browser_id), | |
| 556 dict_(dict.DeepCopy()) { | 574 dict_(dict.DeepCopy()) { |
| 557 } | 575 } |
| 558 | 576 |
| 559 DevToolsAndroidBridge::RemotePage::~RemotePage() { | 577 DevToolsAndroidBridge::RemotePage::~RemotePage() { |
| 560 } | 578 } |
| 561 | 579 |
| 580 scoped_refptr<content::DevToolsAgentHost> | |
| 581 DevToolsAndroidBridge::RemotePage::CreateTarget() { | |
|
dgozman
2016/09/22 17:13:59
CreateAgentHost
| |
| 582 std::string local_id = BuildUniqueTargetId(device_->serial(), | |
| 583 browser_id_, | |
| 584 dict_.get()); | |
| 585 std::string target_path = GetTargetPath(dict_.get()); | |
| 586 std::string type = GetStringProperty(dict_.get(), "type"); | |
|
dgozman
2016/09/22 17:13:59
kTypeProperty
| |
| 587 | |
| 588 return AgentHostDelegate::GetOrCreateAgentHost( | |
| 589 device_, browser_id_, local_id, target_path, type, dict_.get()); | |
| 590 } | |
| 591 | |
| 562 // DevToolsAndroidBridge::RemoteBrowser --------------------------------------- | 592 // DevToolsAndroidBridge::RemoteBrowser --------------------------------------- |
| 563 | 593 |
| 564 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser( | 594 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser( |
| 565 const std::string& serial, | 595 const std::string& serial, |
| 566 const AndroidDeviceManager::BrowserInfo& browser_info) | 596 const AndroidDeviceManager::BrowserInfo& browser_info) |
| 567 : browser_id_(std::make_pair(serial, browser_info.socket_name)), | 597 : serial_(serial), |
| 598 browser_id_(browser_info.socket_name), | |
| 568 display_name_(browser_info.display_name), | 599 display_name_(browser_info.display_name), |
| 569 user_(browser_info.user), | 600 user_(browser_info.user), |
| 570 type_(browser_info.type) { | 601 type_(browser_info.type) { |
| 571 } | 602 } |
| 572 | 603 |
| 573 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() { | 604 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() { |
| 574 return type_ == AndroidDeviceManager::BrowserInfo::kTypeChrome; | 605 return type_ == AndroidDeviceManager::BrowserInfo::kTypeChrome; |
| 575 } | 606 } |
| 576 | 607 |
| 577 std::string DevToolsAndroidBridge::RemoteBrowser::GetId() { | 608 std::string DevToolsAndroidBridge::RemoteBrowser::GetId() { |
| 578 return serial() + ":" + socket(); | 609 return serial() + ":" + socket(); |
| 579 } | 610 } |
| 580 | 611 |
| 581 DevToolsAndroidBridge::RemoteBrowser::ParsedVersion | 612 DevToolsAndroidBridge::RemoteBrowser::ParsedVersion |
| 582 DevToolsAndroidBridge::RemoteBrowser::GetParsedVersion() { | 613 DevToolsAndroidBridge::RemoteBrowser::GetParsedVersion() { |
| 583 ParsedVersion result; | 614 ParsedVersion result; |
| 584 for (const base::StringPiece& part : | 615 for (const base::StringPiece& part : |
| 585 base::SplitStringPiece( | 616 base::SplitStringPiece( |
| 586 version_, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) { | 617 version_, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) { |
| 587 int value = 0; | 618 int value = 0; |
| 588 base::StringToInt(part, &value); | 619 base::StringToInt(part, &value); |
| 589 result.push_back(value); | 620 result.push_back(value); |
| 590 } | 621 } |
| 591 return result; | 622 return result; |
| 592 } | 623 } |
| 593 | 624 |
| 594 scoped_refptr<content::DevToolsAgentHost> | 625 scoped_refptr<content::DevToolsAgentHost> |
| 595 DevToolsAndroidBridge::CreatePageTarget(scoped_refptr<RemotePage> page) { | |
| 596 std::string local_id = BuildUniqueTargetId(page->browser_id_, | |
| 597 page->dict_.get()); | |
| 598 std::string target_path = GetTargetPath(page->dict_.get()); | |
| 599 std::string type = GetStringProperty(page->dict_.get(), "type"); | |
| 600 return AgentHostDelegate::GetOrCreateAgentHost( | |
| 601 this, page->browser_id_, local_id, target_path, type, page->dict_.get()); | |
| 602 } | |
| 603 | |
| 604 void DevToolsAndroidBridge::SendJsonRequest( | |
| 605 const BrowserId& browser_id, | |
| 606 const std::string& request, | |
| 607 const JsonRequestCallback& callback) { | |
| 608 DeviceMap::iterator it = device_map_.find(browser_id.first); | |
| 609 if (it == device_map_.end()) { | |
| 610 callback.Run(net::ERR_FAILED, std::string()); | |
| 611 return; | |
| 612 } | |
| 613 it->second->SendJsonRequest(browser_id.second, request, callback); | |
| 614 } | |
| 615 | |
| 616 void DevToolsAndroidBridge::SendProtocolCommand( | |
| 617 const BrowserId& browser_id, | |
| 618 const std::string& target_path, | |
| 619 const std::string& method, | |
| 620 std::unique_ptr<base::DictionaryValue> params, | |
| 621 const base::Closure callback) { | |
| 622 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 623 if (target_path.empty()) | |
| 624 return; | |
| 625 DeviceMap::iterator it = device_map_.find(browser_id.first); | |
| 626 if (it == device_map_.end()) { | |
| 627 callback.Run(); | |
| 628 return; | |
| 629 } | |
| 630 new ProtocolCommand( | |
| 631 it->second, browser_id.second, target_path, | |
| 632 DevToolsProtocol::SerializeCommand(1, method, std::move(params)), | |
| 633 callback); | |
| 634 } | |
| 635 | |
| 636 scoped_refptr<content::DevToolsAgentHost> | |
| 637 DevToolsAndroidBridge::GetBrowserAgentHost( | 626 DevToolsAndroidBridge::GetBrowserAgentHost( |
| 638 scoped_refptr<RemoteBrowser> browser) { | 627 scoped_refptr<RemoteBrowser> browser) { |
| 628 DeviceMap::iterator it = device_map_.find(browser->serial()); | |
| 629 if (it == device_map_.end()) | |
| 630 return nullptr; | |
| 631 | |
| 639 return AgentHostDelegate::GetOrCreateAgentHost( | 632 return AgentHostDelegate::GetOrCreateAgentHost( |
| 640 this, | 633 it->second, |
| 641 browser->browser_id_, | 634 browser->browser_id_, |
| 642 "adb:" + browser->serial() + ":" + browser->socket(), | 635 "adb:" + browser->serial() + ":" + browser->socket(), |
| 643 kBrowserTargetSocket, DevToolsAgentHost::kTypeBrowser, nullptr); | 636 kBrowserTargetSocket, DevToolsAgentHost::kTypeBrowser, nullptr); |
| 644 } | 637 } |
| 645 | 638 |
| 646 void DevToolsAndroidBridge::SendJsonRequest( | 639 void DevToolsAndroidBridge::SendJsonRequest( |
| 647 const std::string& browser_id_str, | 640 const std::string& browser_id_str, |
| 648 const std::string& url, | 641 const std::string& url, |
| 649 const JsonRequestCallback& callback) { | 642 const JsonRequestCallback& callback) { |
| 650 BrowserId browser_id; | 643 std::string serial; |
| 651 if (!BrowserIdFromString(browser_id_str, &browser_id)) { | 644 std::string browser_id; |
| 645 if (!BrowserIdFromString(browser_id_str, &serial, &browser_id)) { | |
| 652 callback.Run(net::ERR_FAILED, std::string()); | 646 callback.Run(net::ERR_FAILED, std::string()); |
| 653 return; | 647 return; |
| 654 } | 648 } |
| 655 SendJsonRequest(browser_id, url, callback); | 649 DeviceMap::iterator it = device_map_.find(serial); |
| 656 } | 650 if (it == device_map_.end()) { |
| 657 | 651 callback.Run(net::ERR_FAILED, std::string()); |
| 658 AndroidDeviceManager::AndroidWebSocket* | 652 return; |
| 659 DevToolsAndroidBridge::CreateWebSocket( | 653 } |
| 660 const BrowserId& browser_id, | 654 it->second->SendJsonRequest(browser_id, url, callback); |
| 661 const std::string& url, | |
| 662 AndroidDeviceManager::AndroidWebSocket::Delegate* delegate) { | |
| 663 DeviceMap::iterator it = device_map_.find(browser_id.first); | |
| 664 if (it == device_map_.end()) | |
| 665 return nullptr; | |
| 666 return it->second->CreateWebSocket(browser_id.second, url, delegate); | |
| 667 } | 655 } |
| 668 | 656 |
| 669 void DevToolsAndroidBridge::OpenRemotePage(scoped_refptr<RemoteBrowser> browser, | 657 void DevToolsAndroidBridge::OpenRemotePage(scoped_refptr<RemoteBrowser> browser, |
| 670 const std::string& input_url) { | 658 const std::string& input_url) { |
| 671 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 659 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 672 GURL gurl(input_url); | 660 GURL gurl(input_url); |
| 673 if (!gurl.is_valid()) { | 661 if (!gurl.is_valid()) { |
| 674 gurl = GURL("http://" + input_url); | 662 gurl = GURL("http://" + input_url); |
| 675 if (!gurl.is_valid()) | 663 if (!gurl.is_valid()) |
| 676 return; | 664 return; |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 786 PortForwardingListeners::iterator it = std::find( | 774 PortForwardingListeners::iterator it = std::find( |
| 787 port_forwarding_listeners_.begin(), | 775 port_forwarding_listeners_.begin(), |
| 788 port_forwarding_listeners_.end(), | 776 port_forwarding_listeners_.end(), |
| 789 listener); | 777 listener); |
| 790 DCHECK(it != port_forwarding_listeners_.end()); | 778 DCHECK(it != port_forwarding_listeners_.end()); |
| 791 port_forwarding_listeners_.erase(it); | 779 port_forwarding_listeners_.erase(it); |
| 792 if (!NeedsDeviceListPolling()) | 780 if (!NeedsDeviceListPolling()) |
| 793 StopDeviceListPolling(); | 781 StopDeviceListPolling(); |
| 794 } | 782 } |
| 795 | 783 |
| 796 bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) { | |
| 797 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 798 return host_delegates_.find(agent_id) != host_delegates_.end(); | |
| 799 } | |
| 800 | |
| 801 DevToolsAndroidBridge::~DevToolsAndroidBridge() { | 784 DevToolsAndroidBridge::~DevToolsAndroidBridge() { |
| 802 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 785 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 803 DCHECK(device_list_listeners_.empty()); | 786 DCHECK(device_list_listeners_.empty()); |
| 804 DCHECK(device_count_listeners_.empty()); | 787 DCHECK(device_count_listeners_.empty()); |
| 805 DCHECK(port_forwarding_listeners_.empty()); | 788 DCHECK(port_forwarding_listeners_.empty()); |
| 806 } | 789 } |
| 807 | 790 |
| 808 void DevToolsAndroidBridge::StartDeviceListPolling() { | 791 void DevToolsAndroidBridge::StartDeviceListPolling() { |
| 809 device_list_callback_.Reset( | 792 device_list_callback_.Reset( |
| 810 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, AsWeakPtr())); | 793 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, AsWeakPtr())); |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 986 StopDeviceListPolling(); | 969 StopDeviceListPolling(); |
| 987 StartDeviceListPolling(); | 970 StartDeviceListPolling(); |
| 988 } | 971 } |
| 989 } | 972 } |
| 990 | 973 |
| 991 void DevToolsAndroidBridge::set_tcp_provider_callback_for_test( | 974 void DevToolsAndroidBridge::set_tcp_provider_callback_for_test( |
| 992 TCPProviderCallback callback) { | 975 TCPProviderCallback callback) { |
| 993 tcp_provider_callback_ = callback; | 976 tcp_provider_callback_ = callback; |
| 994 CreateDeviceProviders(); | 977 CreateDeviceProviders(); |
| 995 } | 978 } |
| OLD | NEW |