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

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: make device hosts profile-independent, plump browser context for inspect. 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;
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698