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 |