OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/devtools/device/devtools_android_bridge.h" | 5 #include "chrome/browser/devtools/device/devtools_android_bridge.h" |
6 | 6 |
7 #include <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 Loading... |
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 Loading... |
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 Loading... |
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 ¶ms, callback); | 539 ¶ms, 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 Loading... |
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 Loading... |
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 } |
OLD | NEW |