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

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

Issue 612913002: DevTools: Split RemotePage and RemotePageTarget (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@values
Patch Set: Created 6 years, 2 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 <map> 7 #include <map>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/base64.h" 10 #include "base/base64.h"
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 167
168 void DevToolsAndroidBridge::DiscoveryRequest::ReceivedPages( 168 void DevToolsAndroidBridge::DiscoveryRequest::ReceivedPages(
169 scoped_refptr<RemoteBrowser> browser, 169 scoped_refptr<RemoteBrowser> browser,
170 int result, 170 int result,
171 const std::string& response) { 171 const std::string& response) {
172 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 172 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
173 if (result < 0) 173 if (result < 0)
174 return; 174 return;
175 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); 175 scoped_ptr<base::Value> value(base::JSONReader::Read(response));
176 base::ListValue* list_value; 176 base::ListValue* list_value;
177 if (value && value->GetAsList(&list_value)) 177 if (value && value->GetAsList(&list_value)) {
178 browser->page_descriptors_.reset(list_value->DeepCopy()); 178 for (base::ListValue::iterator it = list_value->begin();
179 it != list_value->end(); ++it) {
180 base::DictionaryValue* dict;
181 if ((*it)->GetAsDictionary(&dict)) {
182 browser->pages_.push_back(
183 new RemotePage(browser->browser_id_, *dict, browser->IsWebView()));
dgozman 2014/09/30 09:23:48 dict->DeepCopy()
vkuzkokov 2014/10/01 09:05:17 DeepCopy is already called from RemotePage::Remote
184 }
185 }
186 }
179 } 187 }
180 188
181 // ProtocolCommand ------------------------------------------------------------ 189 // ProtocolCommand ------------------------------------------------------------
182 190
183 namespace { 191 namespace {
184 192
185 class ProtocolCommand 193 class ProtocolCommand
186 : public AndroidDeviceManager::AndroidWebSocket::Delegate { 194 : public AndroidDeviceManager::AndroidWebSocket::Delegate {
187 public: 195 public:
188 ProtocolCommand( 196 ProtocolCommand(
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 282
275 // AgentHostDelegate ---------------------------------------------------------- 283 // AgentHostDelegate ----------------------------------------------------------
276 284
277 class DevToolsAndroidBridge::AgentHostDelegate 285 class DevToolsAndroidBridge::AgentHostDelegate
278 : public content::DevToolsExternalAgentProxyDelegate, 286 : public content::DevToolsExternalAgentProxyDelegate,
279 public AndroidDeviceManager::AndroidWebSocket::Delegate { 287 public AndroidDeviceManager::AndroidWebSocket::Delegate {
280 public: 288 public:
281 static scoped_refptr<content::DevToolsAgentHost> GetOrCreateAgentHost( 289 static scoped_refptr<content::DevToolsAgentHost> GetOrCreateAgentHost(
282 scoped_refptr<DevToolsAndroidBridge> bridge, 290 scoped_refptr<DevToolsAndroidBridge> bridge,
283 const std::string& id, 291 const std::string& id,
284 scoped_refptr<RemoteBrowser> browser, 292 const BrowserId& browser_id,
285 const std::string& debug_url); 293 const std::string& debug_url,
294 bool is_web_view);
286 295
287 private: 296 private:
288 AgentHostDelegate( 297 AgentHostDelegate(
289 scoped_refptr<DevToolsAndroidBridge> bridge, 298 scoped_refptr<DevToolsAndroidBridge> bridge,
290 const std::string& id, 299 const std::string& id,
291 scoped_refptr<RemoteBrowser> browser, 300 const BrowserId& browser_id,
292 const std::string& debug_url); 301 const std::string& debug_url,
302 bool is_web_view);
293 virtual ~AgentHostDelegate(); 303 virtual ~AgentHostDelegate();
294 virtual void Attach(content::DevToolsExternalAgentProxy* proxy) OVERRIDE; 304 virtual void Attach(content::DevToolsExternalAgentProxy* proxy) OVERRIDE;
295 virtual void Detach() OVERRIDE; 305 virtual void Detach() OVERRIDE;
296 virtual void SendMessageToBackend( 306 virtual void SendMessageToBackend(
297 const std::string& message) OVERRIDE; 307 const std::string& message) OVERRIDE;
298 virtual void OnSocketOpened() OVERRIDE; 308 virtual void OnSocketOpened() OVERRIDE;
299 virtual void OnFrameRead(const std::string& message) OVERRIDE; 309 virtual void OnFrameRead(const std::string& message) OVERRIDE;
300 virtual void OnSocketClosed() OVERRIDE; 310 virtual void OnSocketClosed() OVERRIDE;
301 311
302 std::string id_; 312 std::string id_;
303 scoped_refptr<DevToolsAndroidBridge> bridge_; 313 scoped_refptr<DevToolsAndroidBridge> bridge_;
304 scoped_refptr<RemoteBrowser> browser_; 314 BrowserId browser_id_;
305 std::string debug_url_; 315 std::string debug_url_;
306 bool socket_opened_; 316 bool socket_opened_;
307 bool is_web_view_; 317 bool is_web_view_;
308 std::vector<std::string> pending_messages_; 318 std::vector<std::string> pending_messages_;
309 scoped_ptr<AndroidDeviceManager::AndroidWebSocket> web_socket_; 319 scoped_ptr<AndroidDeviceManager::AndroidWebSocket> web_socket_;
310 content::DevToolsAgentHost* agent_host_; 320 content::DevToolsAgentHost* agent_host_;
311 content::DevToolsExternalAgentProxy* proxy_; 321 content::DevToolsExternalAgentProxy* proxy_;
312 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate); 322 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate);
313 }; 323 };
314 324
315 // static 325 // static
316 scoped_refptr<content::DevToolsAgentHost> 326 scoped_refptr<content::DevToolsAgentHost>
317 DevToolsAndroidBridge::AgentHostDelegate::GetOrCreateAgentHost( 327 DevToolsAndroidBridge::AgentHostDelegate::GetOrCreateAgentHost(
318 scoped_refptr<DevToolsAndroidBridge> bridge, 328 scoped_refptr<DevToolsAndroidBridge> bridge,
319 const std::string& id, 329 const std::string& id,
320 scoped_refptr<RemoteBrowser> browser, 330 const BrowserId& browser_id,
321 const std::string& debug_url) { 331 const std::string& debug_url,
332 bool is_web_view) {
322 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 333 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
323 AgentHostDelegates::iterator it = bridge->host_delegates_.find(id); 334 AgentHostDelegates::iterator it = bridge->host_delegates_.find(id);
324 if (it != bridge->host_delegates_.end()) 335 if (it != bridge->host_delegates_.end())
325 return it->second->agent_host_; 336 return it->second->agent_host_;
326 337
327 AgentHostDelegate* delegate = 338 AgentHostDelegate* delegate =
328 new AgentHostDelegate(bridge, id, browser, debug_url); 339 new AgentHostDelegate(bridge, id, browser_id, debug_url, is_web_view);
329 scoped_refptr<content::DevToolsAgentHost> result = 340 scoped_refptr<content::DevToolsAgentHost> result =
330 content::DevToolsAgentHost::Create(delegate); 341 content::DevToolsAgentHost::Create(delegate);
331 delegate->agent_host_ = result.get(); 342 delegate->agent_host_ = result.get();
332 return result; 343 return result;
333 } 344 }
334 345
335 DevToolsAndroidBridge::AgentHostDelegate::AgentHostDelegate( 346 DevToolsAndroidBridge::AgentHostDelegate::AgentHostDelegate(
336 scoped_refptr<DevToolsAndroidBridge> bridge, 347 scoped_refptr<DevToolsAndroidBridge> bridge,
337 const std::string& id, 348 const std::string& id,
338 scoped_refptr<RemoteBrowser> browser, 349 const BrowserId& browser_id,
339 const std::string& debug_url) 350 const std::string& debug_url,
351 bool is_web_view)
340 : id_(id), 352 : id_(id),
341 bridge_(bridge), 353 bridge_(bridge),
342 browser_(browser), 354 browser_id_(browser_id),
343 debug_url_(debug_url), 355 debug_url_(debug_url),
344 socket_opened_(false), 356 socket_opened_(false),
345 is_web_view_(browser->IsWebView()), 357 is_web_view_(is_web_view),
346 agent_host_(NULL), 358 agent_host_(NULL),
347 proxy_(NULL) { 359 proxy_(NULL) {
348 bridge_->host_delegates_[id] = this; 360 bridge_->host_delegates_[id] = this;
349 } 361 }
350 362
351 DevToolsAndroidBridge::AgentHostDelegate::~AgentHostDelegate() { 363 DevToolsAndroidBridge::AgentHostDelegate::~AgentHostDelegate() {
352 bridge_->host_delegates_.erase(id_); 364 bridge_->host_delegates_.erase(id_);
353 } 365 }
354 366
355 void DevToolsAndroidBridge::AgentHostDelegate::Attach( 367 void DevToolsAndroidBridge::AgentHostDelegate::Attach(
356 content::DevToolsExternalAgentProxy* proxy) { 368 content::DevToolsExternalAgentProxy* proxy) {
357 proxy_ = proxy; 369 proxy_ = proxy;
358 content::RecordAction(base::UserMetricsAction(is_web_view_ ? 370 content::RecordAction(base::UserMetricsAction(is_web_view_ ?
359 "DevTools_InspectAndroidWebView" : "DevTools_InspectAndroidPage")); 371 "DevTools_InspectAndroidWebView" : "DevTools_InspectAndroidPage"));
360 web_socket_.reset( 372 web_socket_.reset(
361 bridge_->CreateWebSocket(browser_, debug_url_, this)); 373 bridge_->CreateWebSocket(browser_id_, debug_url_, this));
362 } 374 }
363 375
364 void DevToolsAndroidBridge::AgentHostDelegate::Detach() { 376 void DevToolsAndroidBridge::AgentHostDelegate::Detach() {
365 web_socket_.reset(); 377 web_socket_.reset();
366 } 378 }
367 379
368 void DevToolsAndroidBridge::AgentHostDelegate::SendMessageToBackend( 380 void DevToolsAndroidBridge::AgentHostDelegate::SendMessageToBackend(
369 const std::string& message) { 381 const std::string& message) {
370 if (socket_opened_) 382 if (socket_opened_)
371 web_socket_->SendFrame(message); 383 web_socket_->SendFrame(message);
(...skipping 16 matching lines...) Expand all
388 proxy_->DispatchOnClientHost(message); 400 proxy_->DispatchOnClientHost(message);
389 } 401 }
390 402
391 void DevToolsAndroidBridge::AgentHostDelegate::OnSocketClosed() { 403 void DevToolsAndroidBridge::AgentHostDelegate::OnSocketClosed() {
392 if (proxy_) 404 if (proxy_)
393 proxy_->ConnectionClosed(); 405 proxy_->ConnectionClosed();
394 } 406 }
395 407
396 //// RemotePageTarget ---------------------------------------------- 408 //// RemotePageTarget ----------------------------------------------
397 409
398 class DevToolsAndroidBridge::RemotePageTarget 410 class DevToolsAndroidBridge::RemotePageTarget : public DevToolsTargetImpl {
399 : public DevToolsTargetImpl,
400 public DevToolsAndroidBridge::RemotePage {
401 public: 411 public:
402 RemotePageTarget(scoped_refptr<DevToolsAndroidBridge> bridge, 412 RemotePageTarget(scoped_refptr<DevToolsAndroidBridge> bridge,
403 scoped_refptr<RemoteBrowser> browser, 413 const BrowserId& browser_id,
404 const base::DictionaryValue& value); 414 const base::DictionaryValue& value,
415 bool is_web_view_);
405 virtual ~RemotePageTarget(); 416 virtual ~RemotePageTarget();
406 417
407 // DevToolsAndroidBridge::RemotePage implementation.
408 virtual DevToolsTargetImpl* GetTarget() OVERRIDE;
409 virtual std::string GetFrontendURL() OVERRIDE;
410
411 // DevToolsTargetImpl overrides. 418 // DevToolsTargetImpl overrides.
412 virtual std::string GetId() const OVERRIDE; 419 virtual std::string GetId() const OVERRIDE;
413 virtual bool IsAttached() const OVERRIDE; 420 virtual bool IsAttached() const OVERRIDE;
414 virtual bool Activate() const OVERRIDE; 421 virtual bool Activate() const OVERRIDE;
415 virtual bool Close() const OVERRIDE; 422 virtual bool Close() const OVERRIDE;
416 virtual void Inspect(Profile* profile) const OVERRIDE; 423 virtual void Inspect(Profile* profile) const OVERRIDE;
417 virtual void Reload() const OVERRIDE; 424 virtual void Reload() const OVERRIDE;
418 425
419 void Navigate(const std::string& url, base::Closure callback) const; 426 void Navigate(const std::string& url, base::Closure callback) const;
420 427
421 private: 428 private:
422 scoped_refptr<DevToolsAndroidBridge> bridge_; 429 scoped_refptr<DevToolsAndroidBridge> bridge_;
423 scoped_refptr<RemoteBrowser> browser_; 430 BrowserId browser_id_;
424 std::string debug_url_; 431 std::string debug_url_;
425 std::string frontend_url_; 432 std::string frontend_url_;
426 std::string remote_id_; 433 std::string remote_id_;
427 std::string remote_type_; 434 std::string remote_type_;
428 std::string local_id_; 435 std::string local_id_;
429 DISALLOW_COPY_AND_ASSIGN(RemotePageTarget); 436 DISALLOW_COPY_AND_ASSIGN(RemotePageTarget);
430 }; 437 };
431 438
432 static std::string GetStringProperty(const base::DictionaryValue& value, 439 static std::string GetStringProperty(const base::DictionaryValue& value,
433 const std::string& name) { 440 const std::string& name) {
434 std::string result; 441 std::string result;
435 value.GetString(name, &result); 442 value.GetString(name, &result);
436 return result; 443 return result;
437 } 444 }
438 445
439 static std::string BuildUniqueTargetId( 446 static std::string BuildUniqueTargetId(
440 DevToolsAndroidBridge::RemoteBrowser* browser, 447 const DevToolsAndroidBridge::BrowserId& browser_id,
441 const base::DictionaryValue& value) { 448 const base::DictionaryValue& value) {
442 return base::StringPrintf("%s:%s:%s", browser->serial().c_str(), 449 return base::StringPrintf("%s:%s:%s", browser_id.first.c_str(),
443 browser->socket().c_str(), GetStringProperty(value, "id").c_str()); 450 browser_id.second.c_str(), GetStringProperty(value, "id").c_str());
451 }
452
453 static std::string GetFrontendURL(const base::DictionaryValue& value) {
454 std::string frontend_url = GetStringProperty(value, "devtoolsFrontendUrl");
455 size_t ws_param = frontend_url.find("?ws");
456 if (ws_param != std::string::npos)
457 frontend_url = frontend_url.substr(0, ws_param);
458 if (frontend_url.find("http:") == 0)
459 frontend_url = "https:" + frontend_url.substr(5);
460 return frontend_url;
444 } 461 }
445 462
446 static std::string GetDebugURL(const base::DictionaryValue& value) { 463 static std::string GetDebugURL(const base::DictionaryValue& value) {
447 std::string debug_url = GetStringProperty(value, "webSocketDebuggerUrl"); 464 std::string debug_url = GetStringProperty(value, "webSocketDebuggerUrl");
448 465
449 if (debug_url.find("ws://") == 0) 466 if (debug_url.find("ws://") == 0)
450 debug_url = debug_url.substr(5); 467 debug_url = debug_url.substr(5);
451 else 468 else
452 debug_url = std::string(); 469 debug_url = std::string();
453 return debug_url; 470 return debug_url;
454 } 471 }
455 472
456 DevToolsAndroidBridge::RemotePageTarget::RemotePageTarget( 473 DevToolsAndroidBridge::RemotePageTarget::RemotePageTarget(
457 scoped_refptr<DevToolsAndroidBridge> bridge, 474 scoped_refptr<DevToolsAndroidBridge> bridge,
458 scoped_refptr<RemoteBrowser> browser, 475 const BrowserId& browser_id,
459 const base::DictionaryValue& value) 476 const base::DictionaryValue& value,
477 bool is_web_view)
460 : DevToolsTargetImpl(AgentHostDelegate::GetOrCreateAgentHost( 478 : DevToolsTargetImpl(AgentHostDelegate::GetOrCreateAgentHost(
461 bridge, 479 bridge,
462 BuildUniqueTargetId(browser.get(), value), 480 BuildUniqueTargetId(browser_id, value),
463 browser, 481 browser_id,
464 GetDebugURL(value))), 482 GetDebugURL(value),
483 is_web_view)),
465 bridge_(bridge), 484 bridge_(bridge),
466 browser_(browser), 485 browser_id_(browser_id),
467 debug_url_(GetDebugURL(value)), 486 debug_url_(GetDebugURL(value)),
487 frontend_url_(GetFrontendURL(value)),
468 remote_id_(GetStringProperty(value, "id")), 488 remote_id_(GetStringProperty(value, "id")),
469 remote_type_(GetStringProperty(value, "type")), 489 remote_type_(GetStringProperty(value, "type")),
470 local_id_(BuildUniqueTargetId(browser.get(), value)) { 490 local_id_(BuildUniqueTargetId(browser_id, value)) {
471 set_type("adb_page"); 491 set_type("adb_page");
472 set_url(GURL(GetStringProperty(value, "url"))); 492 set_url(GURL(GetStringProperty(value, "url")));
473 set_title(base::UTF16ToUTF8(net::UnescapeForHTML(base::UTF8ToUTF16( 493 set_title(base::UTF16ToUTF8(net::UnescapeForHTML(base::UTF8ToUTF16(
474 GetStringProperty(value, "title"))))); 494 GetStringProperty(value, "title")))));
475 set_description(GetStringProperty(value, "description")); 495 set_description(GetStringProperty(value, "description"));
476 set_favicon_url(GURL(GetStringProperty(value, "faviconUrl"))); 496 set_favicon_url(GURL(GetStringProperty(value, "faviconUrl")));
477 debug_url_ = GetDebugURL(value); 497 debug_url_ = GetDebugURL(value);
478 frontend_url_ = GetStringProperty(value, "devtoolsFrontendUrl");
479
480 size_t ws_param = frontend_url_.find("?ws");
481 if (ws_param != std::string::npos)
482 frontend_url_ = frontend_url_.substr(0, ws_param);
483 if (frontend_url_.find("http:") == 0)
484 frontend_url_ = "https:" + frontend_url_.substr(5);
485 } 498 }
486 499
487 DevToolsAndroidBridge::RemotePageTarget::~RemotePageTarget() { 500 DevToolsAndroidBridge::RemotePageTarget::~RemotePageTarget() {
488 } 501 }
489 502
490 DevToolsTargetImpl* DevToolsAndroidBridge::RemotePageTarget::GetTarget() {
491 return this;
492 }
493
494 std::string DevToolsAndroidBridge::RemotePageTarget::GetFrontendURL() {
495 return frontend_url_;
496 }
497
498 std::string DevToolsAndroidBridge::RemotePageTarget::GetId() const { 503 std::string DevToolsAndroidBridge::RemotePageTarget::GetId() const {
499 return local_id_; 504 return local_id_;
500 } 505 }
501 506
502 bool DevToolsAndroidBridge::RemotePageTarget::IsAttached() const { 507 bool DevToolsAndroidBridge::RemotePageTarget::IsAttached() const {
503 return debug_url_.empty(); 508 return debug_url_.empty();
504 } 509 }
505 510
506 static void NoOp(int, const std::string&) {} 511 static void NoOp(int, const std::string&) {}
507 512
508 void DevToolsAndroidBridge::RemotePageTarget::Inspect(Profile* profile) const { 513 void DevToolsAndroidBridge::RemotePageTarget::Inspect(Profile* profile) const {
509 Activate(); 514 Activate();
510 bool isWorker = remote_type_ == kTargetTypeWorker || 515 bool isWorker = remote_type_ == kTargetTypeWorker ||
511 remote_type_ == kTargetTypeServiceWorker; 516 remote_type_ == kTargetTypeServiceWorker;
512 DevToolsWindow::OpenExternalFrontend(profile, frontend_url_, GetAgentHost(), 517 DevToolsWindow::OpenExternalFrontend(profile, frontend_url_, GetAgentHost(),
513 isWorker); 518 isWorker);
514 } 519 }
515 520
516 bool DevToolsAndroidBridge::RemotePageTarget::Activate() const { 521 bool DevToolsAndroidBridge::RemotePageTarget::Activate() const {
517 std::string request = base::StringPrintf(kActivatePageRequest, 522 std::string request = base::StringPrintf(kActivatePageRequest,
518 remote_id_.c_str()); 523 remote_id_.c_str());
519 bridge_->SendJsonRequest(browser_, request, base::Bind(&NoOp)); 524 bridge_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp));
520 return true; 525 return true;
521 } 526 }
522 527
523 bool DevToolsAndroidBridge::RemotePageTarget::Close() const { 528 bool DevToolsAndroidBridge::RemotePageTarget::Close() const {
524 std::string request = base::StringPrintf(kClosePageRequest, 529 std::string request = base::StringPrintf(kClosePageRequest,
525 remote_id_.c_str()); 530 remote_id_.c_str());
526 bridge_->SendJsonRequest(browser_, request, base::Bind(&NoOp)); 531 bridge_->SendJsonRequest(browser_id_, request, base::Bind(&NoOp));
527 return true; 532 return true;
528 } 533 }
529 534
530 void DevToolsAndroidBridge::RemotePageTarget::Reload() const { 535 void DevToolsAndroidBridge::RemotePageTarget::Reload() const {
531 bridge_->SendProtocolCommand(browser_, debug_url_, kPageReloadCommand, 536 bridge_->SendProtocolCommand(browser_id_, debug_url_, kPageReloadCommand,
532 NULL, base::Closure()); 537 NULL, base::Closure());
533 } 538 }
534 539
535 void DevToolsAndroidBridge::RemotePageTarget::Navigate( 540 void DevToolsAndroidBridge::RemotePageTarget::Navigate(
536 const std::string& url, 541 const std::string& url,
537 base::Closure callback) const { 542 base::Closure callback) const {
538 base::DictionaryValue params; 543 base::DictionaryValue params;
539 params.SetString(kUrlParam, url); 544 params.SetString(kUrlParam, url);
540 bridge_->SendProtocolCommand(browser_, debug_url_, kPageNavigateCommand, 545 bridge_->SendProtocolCommand(browser_id_, debug_url_, kPageNavigateCommand,
541 &params, callback); 546 &params, callback);
542 } 547 }
543 548
549 // DevToolsAndroidBridge::RemotePage ------------------------------------------
550
551 const base::DictionaryValue& DevToolsAndroidBridge::RemotePage::dict() {
552 return *dict_;
553 }
554
555 DevToolsAndroidBridge::RemotePage::RemotePage(
556 const BrowserId& browser_id,
557 const base::DictionaryValue& dict,
558 bool is_web_view)
559 : browser_id_(browser_id),
560 frontend_url_(GetFrontendURL(dict)),
561 is_web_view_(is_web_view),
562 dict_(dict.DeepCopy()) {
563 }
564
565 DevToolsAndroidBridge::RemotePage::~RemotePage() {
566 }
567
544 // DevToolsAndroidBridge::RemoteBrowser --------------------------------------- 568 // DevToolsAndroidBridge::RemoteBrowser ---------------------------------------
545 569
546 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser( 570 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser(
547 const std::string& serial, 571 const std::string& serial,
548 const AndroidDeviceManager::BrowserInfo& browser_info) 572 const AndroidDeviceManager::BrowserInfo& browser_info)
549 : serial_(serial), 573 : browser_id_(std::make_pair(serial,browser_info.socket_name)),
dgozman 2014/09/30 09:23:48 nit: space after comma
vkuzkokov 2014/10/01 09:05:17 Done.
550 socket_(browser_info.socket_name),
551 display_name_(browser_info.display_name), 574 display_name_(browser_info.display_name),
552 type_(browser_info.type), 575 type_(browser_info.type) {
553 page_descriptors_(new base::ListValue()) {
554 } 576 }
555 577
556 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() { 578 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() {
557 return type_ == AndroidDeviceManager::BrowserInfo::kTypeChrome; 579 return type_ == AndroidDeviceManager::BrowserInfo::kTypeChrome;
558 } 580 }
559 581
560 bool DevToolsAndroidBridge::RemoteBrowser::IsWebView() { 582 bool DevToolsAndroidBridge::RemoteBrowser::IsWebView() {
561 return type_ == AndroidDeviceManager::BrowserInfo::kTypeWebView; 583 return type_ == AndroidDeviceManager::BrowserInfo::kTypeWebView;
562 } 584 }
563 585
564 DevToolsAndroidBridge::RemoteBrowser::ParsedVersion 586 DevToolsAndroidBridge::RemoteBrowser::ParsedVersion
565 DevToolsAndroidBridge::RemoteBrowser::GetParsedVersion() { 587 DevToolsAndroidBridge::RemoteBrowser::GetParsedVersion() {
566 ParsedVersion result; 588 ParsedVersion result;
567 std::vector<std::string> parts; 589 std::vector<std::string> parts;
568 Tokenize(version_, ".", &parts); 590 Tokenize(version_, ".", &parts);
569 for (size_t i = 0; i != parts.size(); ++i) { 591 for (size_t i = 0; i != parts.size(); ++i) {
570 int value = 0; 592 int value = 0;
571 base::StringToInt(parts[i], &value); 593 base::StringToInt(parts[i], &value);
572 result.push_back(value); 594 result.push_back(value);
573 } 595 }
574 return result; 596 return result;
575 } 597 }
576 598
577 std::vector<DevToolsAndroidBridge::RemotePage*> 599 DevToolsTargetImpl*
578 DevToolsAndroidBridge::CreatePages(scoped_refptr<RemoteBrowser> browser) { 600 DevToolsAndroidBridge::CreatePageTarget(scoped_refptr<RemotePage> page) {
579 std::vector<RemotePage*> result; 601 return new RemotePageTarget(this, page->browser_id_, page->dict(),
580 for (base::ListValue::const_iterator it = browser->page_descriptors().begin(); 602 page->is_web_view_);
581 it != browser->page_descriptors().end(); ++it) {
582 base::DictionaryValue* dict;
583 if (*it && (*it)->GetAsDictionary(&dict))
584 result.push_back(new RemotePageTarget(this, browser, *dict));
585 }
586 return result;
587 }
588
589 const base::ListValue&
590 DevToolsAndroidBridge::RemoteBrowser::page_descriptors() {
591 return *page_descriptors_;
592 } 603 }
593 604
594 void DevToolsAndroidBridge::SendJsonRequest( 605 void DevToolsAndroidBridge::SendJsonRequest(
595 scoped_refptr<RemoteBrowser> browser, 606 const BrowserId& browser_id,
596 const std::string& request, 607 const std::string& request,
597 const JsonRequestCallback& callback) { 608 const JsonRequestCallback& callback) {
598 DeviceMap::iterator it = device_map_.find(browser->serial()); 609 DeviceMap::iterator it = device_map_.find(browser_id.first);
599 if (it == device_map_.end()) { 610 if (it == device_map_.end()) {
600 callback.Run(net::ERR_FAILED, std::string()); 611 callback.Run(net::ERR_FAILED, std::string());
601 return; 612 return;
602 } 613 }
603 it->second->SendJsonRequest(browser->socket(), request, callback); 614 it->second->SendJsonRequest(browser_id.second, request, callback);
604 } 615 }
605 616
606 void DevToolsAndroidBridge::SendProtocolCommand( 617 void DevToolsAndroidBridge::SendProtocolCommand(
607 scoped_refptr<RemoteBrowser> browser, 618 const BrowserId& browser_id,
608 const std::string& debug_url, 619 const std::string& debug_url,
609 const std::string& method, 620 const std::string& method,
610 base::DictionaryValue* params, 621 base::DictionaryValue* params,
611 const base::Closure callback) { 622 const base::Closure callback) {
612 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 623 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
613 if (debug_url.empty()) 624 if (debug_url.empty())
614 return; 625 return;
615 DeviceMap::iterator it = device_map_.find(browser->serial()); 626 DeviceMap::iterator it = device_map_.find(browser_id.first);
616 if (it == device_map_.end()) { 627 if (it == device_map_.end()) {
617 callback.Run(); 628 callback.Run();
618 return; 629 return;
619 } 630 }
620 DevToolsProtocol::Command command(1, method, params); 631 DevToolsProtocol::Command command(1, method, params);
621 new ProtocolCommand(it->second, browser->socket(), debug_url, 632 new ProtocolCommand(it->second, browser_id.second, debug_url,
622 command.Serialize(), callback); 633 command.Serialize(), callback);
623 } 634 }
624 635
625 scoped_refptr<content::DevToolsAgentHost> 636 scoped_refptr<content::DevToolsAgentHost>
626 DevToolsAndroidBridge::GetBrowserAgentHost( 637 DevToolsAndroidBridge::GetBrowserAgentHost(
627 scoped_refptr<RemoteBrowser> browser) { 638 scoped_refptr<RemoteBrowser> browser) {
628 return AgentHostDelegate::GetOrCreateAgentHost( 639 return AgentHostDelegate::GetOrCreateAgentHost(
629 this, 640 this,
630 "adb:" + browser->serial() + ":" + browser->socket(), 641 "adb:" + browser->serial() + ":" + browser->socket(),
631 browser, 642 browser->browser_id_,
632 kBrowserTargetSocket); 643 kBrowserTargetSocket,
644 browser->IsWebView());
633 } 645 }
634 646
635 AndroidDeviceManager::AndroidWebSocket* 647 AndroidDeviceManager::AndroidWebSocket*
636 DevToolsAndroidBridge::CreateWebSocket( 648 DevToolsAndroidBridge::CreateWebSocket(
637 scoped_refptr<RemoteBrowser> browser, 649 const BrowserId& browser_id,
638 const std::string& url, 650 const std::string& url,
639 AndroidDeviceManager::AndroidWebSocket::Delegate* delegate) { 651 AndroidDeviceManager::AndroidWebSocket::Delegate* delegate) {
640 DeviceMap::iterator it = device_map_.find(browser->serial()); 652 DeviceMap::iterator it = device_map_.find(browser_id.first);
641 if (it == device_map_.end()) 653 if (it == device_map_.end())
642 return NULL; 654 return NULL;
643 655
644 return it->second->CreateWebSocket(browser->socket(), url, delegate); 656 return it->second->CreateWebSocket(browser_id.second, url, delegate);
645 } 657 }
646 658
647 void DevToolsAndroidBridge::RespondToOpenOnUIThread( 659 void DevToolsAndroidBridge::RespondToOpenOnUIThread(
648 scoped_refptr<RemoteBrowser> browser, 660 scoped_refptr<RemoteBrowser> browser,
649 const RemotePageCallback& callback, 661 const RemotePageCallback& callback,
650 int result, 662 int result,
651 const std::string& response) { 663 const std::string& response) {
652 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 664 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
653 if (result < 0) { 665 if (result < 0) {
654 callback.Run(NULL); 666 callback.Run(NULL);
655 return; 667 return;
656 } 668 }
657 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); 669 scoped_ptr<base::Value> value(base::JSONReader::Read(response));
658 base::DictionaryValue* dict; 670 base::DictionaryValue* dict;
659 if (value && value->GetAsDictionary(&dict)) { 671 if (value && value->GetAsDictionary(&dict)) {
660 RemotePageTarget* new_page = new RemotePageTarget(this, browser, *dict); 672 RemotePage* new_page =
673 new RemotePage(browser->browser_id_, *dict, browser->IsWebView());
661 callback.Run(new_page); 674 callback.Run(new_page);
662 } 675 }
663 } 676 }
664 677
665 void DevToolsAndroidBridge::Open( 678 void DevToolsAndroidBridge::Open(
666 scoped_refptr<RemoteBrowser> browser, 679 scoped_refptr<RemoteBrowser> browser,
667 const std::string& input_url, 680 const std::string& input_url,
668 const DevToolsAndroidBridge::RemotePageCallback& callback) { 681 const DevToolsAndroidBridge::RemotePageCallback& callback) {
669 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 682 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
670 GURL gurl(input_url); 683 GURL gurl(input_url);
671 if (!gurl.is_valid()) { 684 if (!gurl.is_valid()) {
672 gurl = GURL("http://" + input_url); 685 gurl = GURL("http://" + input_url);
673 if (!gurl.is_valid()) 686 if (!gurl.is_valid())
674 return; 687 return;
675 } 688 }
676 std::string url = gurl.spec(); 689 std::string url = gurl.spec();
677 RemoteBrowser::ParsedVersion parsed_version = browser->GetParsedVersion(); 690 RemoteBrowser::ParsedVersion parsed_version = browser->GetParsedVersion();
678 691
679 if (browser->IsChrome() && 692 if (browser->IsChrome() &&
680 !parsed_version.empty() && 693 !parsed_version.empty() &&
681 parsed_version[0] >= kMinVersionNewWithURL) { 694 parsed_version[0] >= kMinVersionNewWithURL) {
682 std::string query = net::EscapeQueryParamValue(url, false /* use_plus */); 695 std::string query = net::EscapeQueryParamValue(url, false /* use_plus */);
683 std::string request = 696 std::string request =
684 base::StringPrintf(kNewPageRequestWithURL, query.c_str()); 697 base::StringPrintf(kNewPageRequestWithURL, query.c_str());
685 SendJsonRequest(browser, request, 698 SendJsonRequest(browser->browser_id_, request,
686 base::Bind(&DevToolsAndroidBridge::RespondToOpenOnUIThread, 699 base::Bind(&DevToolsAndroidBridge::RespondToOpenOnUIThread,
687 this, browser, callback)); 700 this, browser, callback));
688 } else { 701 } else {
689 SendJsonRequest(browser, kNewPageRequest, 702 SendJsonRequest(browser->browser_id_, kNewPageRequest,
690 base::Bind(&DevToolsAndroidBridge::PageCreatedOnUIThread, 703 base::Bind(&DevToolsAndroidBridge::PageCreatedOnUIThread,
691 this, browser, callback, url)); 704 this, browser, callback, url));
692 } 705 }
693 } 706 }
694 707
695 void DevToolsAndroidBridge::PageCreatedOnUIThread( 708 void DevToolsAndroidBridge::PageCreatedOnUIThread(
696 scoped_refptr<RemoteBrowser> browser, 709 scoped_refptr<RemoteBrowser> browser,
697 const RemotePageCallback& callback, 710 const RemotePageCallback& callback,
698 const std::string& url, 711 const std::string& url,
699 int result, 712 int result,
(...skipping 15 matching lines...) Expand all
715 scoped_refptr<RemoteBrowser> browser, 728 scoped_refptr<RemoteBrowser> browser,
716 const RemotePageCallback& callback, 729 const RemotePageCallback& callback,
717 int result, 730 int result,
718 const std::string& response, 731 const std::string& response,
719 const std::string& url) { 732 const std::string& url) {
720 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 733 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
721 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); 734 scoped_ptr<base::Value> value(base::JSONReader::Read(response));
722 base::DictionaryValue* dict; 735 base::DictionaryValue* dict;
723 736
724 if (value && value->GetAsDictionary(&dict)) { 737 if (value && value->GetAsDictionary(&dict)) {
725 RemotePageTarget new_page(this, browser, *dict); 738 RemotePageTarget new_page(this, browser->browser_id_, *dict,
739 browser->IsWebView());
726 new_page.Navigate(url, 740 new_page.Navigate(url,
727 base::Bind(&DevToolsAndroidBridge::RespondToOpenOnUIThread, 741 base::Bind(&DevToolsAndroidBridge::RespondToOpenOnUIThread,
728 this, browser, callback, result, response)); 742 this, browser, callback, result, response));
729 } 743 }
730 } 744 }
731 745
732 DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() { 746 DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() {
733 } 747 }
734 748
735 // DevToolsAndroidBridge::RemoteDevice ---------------------------------------- 749 // DevToolsAndroidBridge::RemoteDevice ----------------------------------------
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
959 bool enabled; 973 bool enabled;
960 if (pref_value->GetAsBoolean(&enabled) && enabled) { 974 if (pref_value->GetAsBoolean(&enabled) && enabled) {
961 device_providers.push_back(new UsbDeviceProvider(profile_)); 975 device_providers.push_back(new UsbDeviceProvider(profile_));
962 } 976 }
963 device_manager_->SetDeviceProviders(device_providers); 977 device_manager_->SetDeviceProviders(device_providers);
964 if (NeedsDeviceListPolling()) { 978 if (NeedsDeviceListPolling()) {
965 StopDeviceListPolling(); 979 StopDeviceListPolling();
966 StartDeviceListPolling(); 980 StartDeviceListPolling();
967 } 981 }
968 } 982 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698