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

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

Powered by Google App Engine
This is Rietveld 408576698