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

Side by Side Diff: chrome/browser/devtools/device/devtools_android_bridge.cc

Issue 2361613002: DevTools: untangle device discovery request from the devtools android bridge. (Closed)
Patch Set: for landing Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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;
326 std::string GetFrontendURL() override;
322 bool Activate() override; 327 bool Activate() override;
323 bool Inspect() 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 GetFrontendURLFromValue(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);
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 ? GetFrontendURLFromValue(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
486 std::string DevToolsAndroidBridge::AgentHostDelegate::GetFrontendURL() {
487 return frontend_url_;
488 }
489
478 bool DevToolsAndroidBridge::AgentHostDelegate::Activate() { 490 bool DevToolsAndroidBridge::AgentHostDelegate::Activate() {
479 if (!bridge_)
480 return false;
481
482 std::string request = base::StringPrintf(kActivatePageRequest, 491 std::string request = base::StringPrintf(kActivatePageRequest,
483 remote_id_.c_str()); 492 remote_id_.c_str());
484 bridge_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp)); 493 device_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp));
485 return true;
486 }
487
488 bool DevToolsAndroidBridge::AgentHostDelegate::Inspect() {
489 Activate();
490 bool is_worker = remote_type_ == DevToolsAgentHost::kTypeServiceWorker ||
491 remote_type_ == DevToolsAgentHost::kTypeSharedWorker;
492 bool is_v8_only = remote_type_ == "node";
493 DevToolsWindow::OpenExternalFrontend(bridge_->profile_, frontend_url_,
494 agent_host_, is_worker, is_v8_only);
495 return true; 494 return true;
496 } 495 }
497 496
498 void DevToolsAndroidBridge::AgentHostDelegate::Reload() { 497 void DevToolsAndroidBridge::AgentHostDelegate::Reload() {
499 if (!bridge_) 498 SendProtocolCommand(target_path_, kPageReloadCommand, nullptr,
500 return; 499 base::Closure());
501
502 bridge_->SendProtocolCommand(browser_id_, target_path_, kPageReloadCommand,
503 nullptr, base::Closure());
504 } 500 }
505 501
506 bool DevToolsAndroidBridge::AgentHostDelegate::Close() { 502 bool DevToolsAndroidBridge::AgentHostDelegate::Close() {
507 if (!bridge_)
508 return false;
509
510 std::string request = base::StringPrintf(kClosePageRequest, 503 std::string request = base::StringPrintf(kClosePageRequest,
511 remote_id_.c_str()); 504 remote_id_.c_str());
512 bridge_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp)); 505 device_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp));
513 return true; 506 return true;
514 } 507 }
515 508
516 void DevToolsAndroidBridge::AgentHostDelegate::SendMessageToBackend( 509 void DevToolsAndroidBridge::AgentHostDelegate::SendMessageToBackend(
517 const std::string& message) { 510 const std::string& message) {
518 // We could have detached due to physical connection being closed. 511 // We could have detached due to physical connection being closed.
519 if (!proxy_) 512 if (!proxy_)
520 return; 513 return;
521 if (socket_opened_) 514 if (socket_opened_)
522 web_socket_->SendFrame(message); 515 web_socket_->SendFrame(message);
(...skipping 18 matching lines...) Expand all
541 534
542 void DevToolsAndroidBridge::AgentHostDelegate::OnSocketClosed() { 535 void DevToolsAndroidBridge::AgentHostDelegate::OnSocketClosed() {
543 if (proxy_) { 536 if (proxy_) {
544 std::string message = "{ \"method\": \"Inspector.detached\", " 537 std::string message = "{ \"method\": \"Inspector.detached\", "
545 "\"params\": { \"reason\": \"Connection lost.\"} }"; 538 "\"params\": { \"reason\": \"Connection lost.\"} }";
546 proxy_->DispatchOnClientHost(message); 539 proxy_->DispatchOnClientHost(message);
547 Detach(); 540 Detach();
548 } 541 }
549 } 542 }
550 543
544 void DevToolsAndroidBridge::AgentHostDelegate::SendProtocolCommand(
545 const std::string& target_path,
546 const std::string& method,
547 std::unique_ptr<base::DictionaryValue> params,
548 const base::Closure callback) {
549 DCHECK_CURRENTLY_ON(BrowserThread::UI);
550 if (target_path.empty())
551 return;
552 new ProtocolCommand(
553 device_, browser_id_, target_path,
554 DevToolsProtocol::SerializeCommand(1, method, std::move(params)),
555 callback);
556 }
557
551 // DevToolsAndroidBridge::RemotePage ------------------------------------------ 558 // DevToolsAndroidBridge::RemotePage ------------------------------------------
552 559
553 DevToolsAndroidBridge::RemotePage::RemotePage(const BrowserId& browser_id, 560 DevToolsAndroidBridge::RemotePage::RemotePage(
554 const base::DictionaryValue& dict) 561 scoped_refptr<AndroidDeviceManager::Device> device,
555 : browser_id_(browser_id), 562 const std::string& browser_id,
563 const base::DictionaryValue& dict)
564 : device_(device),
565 browser_id_(browser_id),
556 dict_(dict.DeepCopy()) { 566 dict_(dict.DeepCopy()) {
557 } 567 }
558 568
559 DevToolsAndroidBridge::RemotePage::~RemotePage() { 569 DevToolsAndroidBridge::RemotePage::~RemotePage() {
560 } 570 }
561 571
572 scoped_refptr<content::DevToolsAgentHost>
573 DevToolsAndroidBridge::RemotePage::CreateTarget() {
574 std::string local_id = BuildUniqueTargetId(device_->serial(),
575 browser_id_,
576 dict_.get());
577 std::string target_path = GetTargetPath(dict_.get());
578 std::string type = GetStringProperty(dict_.get(), "type");
579
580 return AgentHostDelegate::GetOrCreateAgentHost(
581 device_, browser_id_, local_id, target_path, type, dict_.get());
582 }
583
562 // DevToolsAndroidBridge::RemoteBrowser --------------------------------------- 584 // DevToolsAndroidBridge::RemoteBrowser ---------------------------------------
563 585
564 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser( 586 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser(
565 const std::string& serial, 587 const std::string& serial,
566 const AndroidDeviceManager::BrowserInfo& browser_info) 588 const AndroidDeviceManager::BrowserInfo& browser_info)
567 : browser_id_(std::make_pair(serial, browser_info.socket_name)), 589 : serial_(serial),
590 browser_id_(browser_info.socket_name),
568 display_name_(browser_info.display_name), 591 display_name_(browser_info.display_name),
569 user_(browser_info.user), 592 user_(browser_info.user),
570 type_(browser_info.type) { 593 type_(browser_info.type) {
571 } 594 }
572 595
573 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() { 596 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() {
574 return type_ == AndroidDeviceManager::BrowserInfo::kTypeChrome; 597 return type_ == AndroidDeviceManager::BrowserInfo::kTypeChrome;
575 } 598 }
576 599
577 std::string DevToolsAndroidBridge::RemoteBrowser::GetId() { 600 std::string DevToolsAndroidBridge::RemoteBrowser::GetId() {
578 return serial() + ":" + socket(); 601 return serial() + ":" + socket();
579 } 602 }
580 603
581 DevToolsAndroidBridge::RemoteBrowser::ParsedVersion 604 DevToolsAndroidBridge::RemoteBrowser::ParsedVersion
582 DevToolsAndroidBridge::RemoteBrowser::GetParsedVersion() { 605 DevToolsAndroidBridge::RemoteBrowser::GetParsedVersion() {
583 ParsedVersion result; 606 ParsedVersion result;
584 for (const base::StringPiece& part : 607 for (const base::StringPiece& part :
585 base::SplitStringPiece( 608 base::SplitStringPiece(
586 version_, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) { 609 version_, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) {
587 int value = 0; 610 int value = 0;
588 base::StringToInt(part, &value); 611 base::StringToInt(part, &value);
589 result.push_back(value); 612 result.push_back(value);
590 } 613 }
591 return result; 614 return result;
592 } 615 }
593 616
594 scoped_refptr<content::DevToolsAgentHost> 617 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( 618 DevToolsAndroidBridge::GetBrowserAgentHost(
638 scoped_refptr<RemoteBrowser> browser) { 619 scoped_refptr<RemoteBrowser> browser) {
620 DeviceMap::iterator it = device_map_.find(browser->serial());
621 if (it == device_map_.end())
622 return nullptr;
623
639 return AgentHostDelegate::GetOrCreateAgentHost( 624 return AgentHostDelegate::GetOrCreateAgentHost(
640 this, 625 it->second,
641 browser->browser_id_, 626 browser->browser_id_,
642 "adb:" + browser->serial() + ":" + browser->socket(), 627 "adb:" + browser->serial() + ":" + browser->socket(),
643 kBrowserTargetSocket, DevToolsAgentHost::kTypeBrowser, nullptr); 628 kBrowserTargetSocket, DevToolsAgentHost::kTypeBrowser, nullptr);
644 } 629 }
645 630
646 void DevToolsAndroidBridge::SendJsonRequest( 631 void DevToolsAndroidBridge::SendJsonRequest(
647 const std::string& browser_id_str, 632 const std::string& browser_id_str,
648 const std::string& url, 633 const std::string& url,
649 const JsonRequestCallback& callback) { 634 const JsonRequestCallback& callback) {
650 BrowserId browser_id; 635 std::string serial;
651 if (!BrowserIdFromString(browser_id_str, &browser_id)) { 636 std::string browser_id;
637 if (!BrowserIdFromString(browser_id_str, &serial, &browser_id)) {
652 callback.Run(net::ERR_FAILED, std::string()); 638 callback.Run(net::ERR_FAILED, std::string());
653 return; 639 return;
654 } 640 }
655 SendJsonRequest(browser_id, url, callback); 641 DeviceMap::iterator it = device_map_.find(serial);
656 } 642 if (it == device_map_.end()) {
657 643 callback.Run(net::ERR_FAILED, std::string());
658 AndroidDeviceManager::AndroidWebSocket* 644 return;
659 DevToolsAndroidBridge::CreateWebSocket( 645 }
660 const BrowserId& browser_id, 646 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 } 647 }
668 648
669 void DevToolsAndroidBridge::OpenRemotePage(scoped_refptr<RemoteBrowser> browser, 649 void DevToolsAndroidBridge::OpenRemotePage(scoped_refptr<RemoteBrowser> browser,
670 const std::string& input_url) { 650 const std::string& input_url) {
671 DCHECK_CURRENTLY_ON(BrowserThread::UI); 651 DCHECK_CURRENTLY_ON(BrowserThread::UI);
672 GURL gurl(input_url); 652 GURL gurl(input_url);
673 if (!gurl.is_valid()) { 653 if (!gurl.is_valid()) {
674 gurl = GURL("http://" + input_url); 654 gurl = GURL("http://" + input_url);
675 if (!gurl.is_valid()) 655 if (!gurl.is_valid())
676 return; 656 return;
677 } 657 }
678 std::string url = gurl.spec(); 658 std::string url = gurl.spec();
679 RemoteBrowser::ParsedVersion parsed_version = browser->GetParsedVersion(); 659 RemoteBrowser::ParsedVersion parsed_version = browser->GetParsedVersion();
680 660
681 std::string query = net::EscapeQueryParamValue(url, false /* use_plus */); 661 std::string query = net::EscapeQueryParamValue(url, false /* use_plus */);
682 std::string request = 662 std::string request =
683 base::StringPrintf(kNewPageRequestWithURL, query.c_str()); 663 base::StringPrintf(kNewPageRequestWithURL, query.c_str());
684 SendJsonRequest(browser->browser_id_, request, base::Bind(&NoOp)); 664 SendJsonRequest(browser->GetId(), request, base::Bind(&NoOp));
685 } 665 }
686 666
687 DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() { 667 DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() {
688 } 668 }
689 669
690 // DevToolsAndroidBridge::RemoteDevice ---------------------------------------- 670 // DevToolsAndroidBridge::RemoteDevice ----------------------------------------
691 671
692 DevToolsAndroidBridge::RemoteDevice::RemoteDevice( 672 DevToolsAndroidBridge::RemoteDevice::RemoteDevice(
693 const std::string& serial, 673 const std::string& serial,
694 const AndroidDeviceManager::DeviceInfo& device_info) 674 const AndroidDeviceManager::DeviceInfo& device_info)
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
786 PortForwardingListeners::iterator it = std::find( 766 PortForwardingListeners::iterator it = std::find(
787 port_forwarding_listeners_.begin(), 767 port_forwarding_listeners_.begin(),
788 port_forwarding_listeners_.end(), 768 port_forwarding_listeners_.end(),
789 listener); 769 listener);
790 DCHECK(it != port_forwarding_listeners_.end()); 770 DCHECK(it != port_forwarding_listeners_.end());
791 port_forwarding_listeners_.erase(it); 771 port_forwarding_listeners_.erase(it);
792 if (!NeedsDeviceListPolling()) 772 if (!NeedsDeviceListPolling())
793 StopDeviceListPolling(); 773 StopDeviceListPolling();
794 } 774 }
795 775
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() { 776 DevToolsAndroidBridge::~DevToolsAndroidBridge() {
802 DCHECK_CURRENTLY_ON(BrowserThread::UI); 777 DCHECK_CURRENTLY_ON(BrowserThread::UI);
803 DCHECK(device_list_listeners_.empty()); 778 DCHECK(device_list_listeners_.empty());
804 DCHECK(device_count_listeners_.empty()); 779 DCHECK(device_count_listeners_.empty());
805 DCHECK(port_forwarding_listeners_.empty()); 780 DCHECK(port_forwarding_listeners_.empty());
806 } 781 }
807 782
808 void DevToolsAndroidBridge::StartDeviceListPolling() { 783 void DevToolsAndroidBridge::StartDeviceListPolling() {
809 device_list_callback_.Reset( 784 device_list_callback_.Reset(
810 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, AsWeakPtr())); 785 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, AsWeakPtr()));
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 StopDeviceListPolling(); 961 StopDeviceListPolling();
987 StartDeviceListPolling(); 962 StartDeviceListPolling();
988 } 963 }
989 } 964 }
990 965
991 void DevToolsAndroidBridge::set_tcp_provider_callback_for_test( 966 void DevToolsAndroidBridge::set_tcp_provider_callback_for_test(
992 TCPProviderCallback callback) { 967 TCPProviderCallback callback) {
993 tcp_provider_callback_ = callback; 968 tcp_provider_callback_ = callback;
994 CreateDeviceProviders(); 969 CreateDeviceProviders();
995 } 970 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698