| 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 const base::DictionaryValue& DevToolsAndroidBridge::RemotePage::dict() { |
| 545 return *dict_; |
| 546 } |
| 547 |
| 548 DevToolsAndroidBridge::RemotePage::RemotePage( |
| 549 const BrowserId& browser_id, |
| 550 const base::DictionaryValue& dict, |
| 551 bool is_web_view) |
| 552 : browser_id_(browser_id), |
| 553 frontend_url_(GetFrontendURL(dict)), |
| 554 is_web_view_(is_web_view), |
| 555 dict_(dict.DeepCopy()) { |
| 556 } |
| 557 |
| 558 DevToolsAndroidBridge::RemotePage::~RemotePage() { |
| 559 } |
| 560 |
| 538 // DevToolsAndroidBridge::RemoteBrowser --------------------------------------- | 561 // DevToolsAndroidBridge::RemoteBrowser --------------------------------------- |
| 539 | 562 |
| 540 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser( | 563 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser( |
| 541 const std::string& serial, | 564 const std::string& serial, |
| 542 const AndroidDeviceManager::BrowserInfo& browser_info) | 565 const AndroidDeviceManager::BrowserInfo& browser_info) |
| 543 : serial_(serial), | 566 : browser_id_(std::make_pair(serial, browser_info.socket_name)), |
| 544 socket_(browser_info.socket_name), | |
| 545 display_name_(browser_info.display_name), | 567 display_name_(browser_info.display_name), |
| 546 type_(browser_info.type), | 568 type_(browser_info.type) { |
| 547 page_descriptors_(new base::ListValue()) { | |
| 548 } | 569 } |
| 549 | 570 |
| 550 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() { | 571 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() { |
| 551 return type_ == AndroidDeviceManager::BrowserInfo::kTypeChrome; | 572 return type_ == AndroidDeviceManager::BrowserInfo::kTypeChrome; |
| 552 } | 573 } |
| 553 | 574 |
| 554 bool DevToolsAndroidBridge::RemoteBrowser::IsWebView() { | 575 bool DevToolsAndroidBridge::RemoteBrowser::IsWebView() { |
| 555 return type_ == AndroidDeviceManager::BrowserInfo::kTypeWebView; | 576 return type_ == AndroidDeviceManager::BrowserInfo::kTypeWebView; |
| 556 } | 577 } |
| 557 | 578 |
| 558 DevToolsAndroidBridge::RemoteBrowser::ParsedVersion | 579 DevToolsAndroidBridge::RemoteBrowser::ParsedVersion |
| 559 DevToolsAndroidBridge::RemoteBrowser::GetParsedVersion() { | 580 DevToolsAndroidBridge::RemoteBrowser::GetParsedVersion() { |
| 560 ParsedVersion result; | 581 ParsedVersion result; |
| 561 std::vector<std::string> parts; | 582 std::vector<std::string> parts; |
| 562 Tokenize(version_, ".", &parts); | 583 Tokenize(version_, ".", &parts); |
| 563 for (size_t i = 0; i != parts.size(); ++i) { | 584 for (size_t i = 0; i != parts.size(); ++i) { |
| 564 int value = 0; | 585 int value = 0; |
| 565 base::StringToInt(parts[i], &value); | 586 base::StringToInt(parts[i], &value); |
| 566 result.push_back(value); | 587 result.push_back(value); |
| 567 } | 588 } |
| 568 return result; | 589 return result; |
| 569 } | 590 } |
| 570 | 591 |
| 571 std::vector<DevToolsAndroidBridge::RemotePage*> | 592 DevToolsTargetImpl* |
| 572 DevToolsAndroidBridge::CreatePages(scoped_refptr<RemoteBrowser> browser) { | 593 DevToolsAndroidBridge::CreatePageTarget(scoped_refptr<RemotePage> page) { |
| 573 std::vector<RemotePage*> result; | 594 return new RemotePageTarget(this, page->browser_id_, page->dict(), |
| 574 for (const auto& value : browser->page_descriptors()) { | 595 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 } | 596 } |
| 586 | 597 |
| 587 void DevToolsAndroidBridge::SendJsonRequest( | 598 void DevToolsAndroidBridge::SendJsonRequest( |
| 588 scoped_refptr<RemoteBrowser> browser, | 599 const BrowserId& browser_id, |
| 589 const std::string& request, | 600 const std::string& request, |
| 590 const JsonRequestCallback& callback) { | 601 const JsonRequestCallback& callback) { |
| 591 DeviceMap::iterator it = device_map_.find(browser->serial()); | 602 DeviceMap::iterator it = device_map_.find(browser_id.first); |
| 592 if (it == device_map_.end()) { | 603 if (it == device_map_.end()) { |
| 593 callback.Run(net::ERR_FAILED, std::string()); | 604 callback.Run(net::ERR_FAILED, std::string()); |
| 594 return; | 605 return; |
| 595 } | 606 } |
| 596 it->second->SendJsonRequest(browser->socket(), request, callback); | 607 it->second->SendJsonRequest(browser_id.second, request, callback); |
| 597 } | 608 } |
| 598 | 609 |
| 599 void DevToolsAndroidBridge::SendProtocolCommand( | 610 void DevToolsAndroidBridge::SendProtocolCommand( |
| 600 scoped_refptr<RemoteBrowser> browser, | 611 const BrowserId& browser_id, |
| 601 const std::string& debug_url, | 612 const std::string& debug_url, |
| 602 const std::string& method, | 613 const std::string& method, |
| 603 base::DictionaryValue* params, | 614 base::DictionaryValue* params, |
| 604 const base::Closure callback) { | 615 const base::Closure callback) { |
| 605 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 616 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 606 if (debug_url.empty()) | 617 if (debug_url.empty()) |
| 607 return; | 618 return; |
| 608 DeviceMap::iterator it = device_map_.find(browser->serial()); | 619 DeviceMap::iterator it = device_map_.find(browser_id.first); |
| 609 if (it == device_map_.end()) { | 620 if (it == device_map_.end()) { |
| 610 callback.Run(); | 621 callback.Run(); |
| 611 return; | 622 return; |
| 612 } | 623 } |
| 613 DevToolsProtocol::Command command(1, method, params); | 624 DevToolsProtocol::Command command(1, method, params); |
| 614 new ProtocolCommand(it->second, browser->socket(), debug_url, | 625 new ProtocolCommand(it->second, browser_id.second, debug_url, |
| 615 command.Serialize(), callback); | 626 command.Serialize(), callback); |
| 616 } | 627 } |
| 617 | 628 |
| 618 scoped_refptr<content::DevToolsAgentHost> | 629 scoped_refptr<content::DevToolsAgentHost> |
| 619 DevToolsAndroidBridge::GetBrowserAgentHost( | 630 DevToolsAndroidBridge::GetBrowserAgentHost( |
| 620 scoped_refptr<RemoteBrowser> browser) { | 631 scoped_refptr<RemoteBrowser> browser) { |
| 621 return AgentHostDelegate::GetOrCreateAgentHost( | 632 return AgentHostDelegate::GetOrCreateAgentHost( |
| 622 this, | 633 this, |
| 623 "adb:" + browser->serial() + ":" + browser->socket(), | 634 "adb:" + browser->serial() + ":" + browser->socket(), |
| 624 browser, | 635 browser->browser_id_, |
| 625 kBrowserTargetSocket); | 636 kBrowserTargetSocket, |
| 637 browser->IsWebView()); |
| 626 } | 638 } |
| 627 | 639 |
| 628 AndroidDeviceManager::AndroidWebSocket* | 640 AndroidDeviceManager::AndroidWebSocket* |
| 629 DevToolsAndroidBridge::CreateWebSocket( | 641 DevToolsAndroidBridge::CreateWebSocket( |
| 630 scoped_refptr<RemoteBrowser> browser, | 642 const BrowserId& browser_id, |
| 631 const std::string& url, | 643 const std::string& url, |
| 632 AndroidDeviceManager::AndroidWebSocket::Delegate* delegate) { | 644 AndroidDeviceManager::AndroidWebSocket::Delegate* delegate) { |
| 633 DeviceMap::iterator it = device_map_.find(browser->serial()); | 645 DeviceMap::iterator it = device_map_.find(browser_id.first); |
| 634 if (it == device_map_.end()) | 646 if (it == device_map_.end()) |
| 635 return NULL; | 647 return NULL; |
| 636 | 648 |
| 637 return it->second->CreateWebSocket(browser->socket(), url, delegate); | 649 return it->second->CreateWebSocket(browser_id.second, url, delegate); |
| 638 } | 650 } |
| 639 | 651 |
| 640 void DevToolsAndroidBridge::RespondToOpenOnUIThread( | 652 void DevToolsAndroidBridge::RespondToOpenOnUIThread( |
| 641 scoped_refptr<RemoteBrowser> browser, | 653 scoped_refptr<RemoteBrowser> browser, |
| 642 const RemotePageCallback& callback, | 654 const RemotePageCallback& callback, |
| 643 int result, | 655 int result, |
| 644 const std::string& response) { | 656 const std::string& response) { |
| 645 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 657 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 646 if (result < 0) { | 658 if (result < 0) { |
| 647 callback.Run(NULL); | 659 callback.Run(NULL); |
| 648 return; | 660 return; |
| 649 } | 661 } |
| 650 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); | 662 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); |
| 651 base::DictionaryValue* dict; | 663 base::DictionaryValue* dict; |
| 652 if (value && value->GetAsDictionary(&dict)) { | 664 if (value && value->GetAsDictionary(&dict)) { |
| 653 RemotePageTarget* new_page = new RemotePageTarget(this, browser, *dict); | 665 scoped_refptr<RemotePage> new_page( |
| 666 new RemotePage(browser->browser_id_, *dict, browser->IsWebView())); |
| 654 callback.Run(new_page); | 667 callback.Run(new_page); |
| 655 } | 668 } |
| 656 } | 669 } |
| 657 | 670 |
| 658 void DevToolsAndroidBridge::OpenRemotePage( | 671 void DevToolsAndroidBridge::OpenRemotePage( |
| 659 scoped_refptr<RemoteBrowser> browser, | 672 scoped_refptr<RemoteBrowser> browser, |
| 660 const std::string& input_url, | 673 const std::string& input_url, |
| 661 const DevToolsAndroidBridge::RemotePageCallback& callback) { | 674 const DevToolsAndroidBridge::RemotePageCallback& callback) { |
| 662 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 675 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 663 GURL gurl(input_url); | 676 GURL gurl(input_url); |
| 664 if (!gurl.is_valid()) { | 677 if (!gurl.is_valid()) { |
| 665 gurl = GURL("http://" + input_url); | 678 gurl = GURL("http://" + input_url); |
| 666 if (!gurl.is_valid()) | 679 if (!gurl.is_valid()) |
| 667 return; | 680 return; |
| 668 } | 681 } |
| 669 std::string url = gurl.spec(); | 682 std::string url = gurl.spec(); |
| 670 RemoteBrowser::ParsedVersion parsed_version = browser->GetParsedVersion(); | 683 RemoteBrowser::ParsedVersion parsed_version = browser->GetParsedVersion(); |
| 671 | 684 |
| 672 if (browser->IsChrome() && | 685 if (browser->IsChrome() && |
| 673 !parsed_version.empty() && | 686 !parsed_version.empty() && |
| 674 parsed_version[0] >= kMinVersionNewWithURL) { | 687 parsed_version[0] >= kMinVersionNewWithURL) { |
| 675 std::string query = net::EscapeQueryParamValue(url, false /* use_plus */); | 688 std::string query = net::EscapeQueryParamValue(url, false /* use_plus */); |
| 676 std::string request = | 689 std::string request = |
| 677 base::StringPrintf(kNewPageRequestWithURL, query.c_str()); | 690 base::StringPrintf(kNewPageRequestWithURL, query.c_str()); |
| 678 SendJsonRequest(browser, request, | 691 SendJsonRequest(browser->browser_id_, request, |
| 679 base::Bind(&DevToolsAndroidBridge::RespondToOpenOnUIThread, | 692 base::Bind(&DevToolsAndroidBridge::RespondToOpenOnUIThread, |
| 680 this, browser, callback)); | 693 this, browser, callback)); |
| 681 } else { | 694 } else { |
| 682 SendJsonRequest(browser, kNewPageRequest, | 695 SendJsonRequest(browser->browser_id_, kNewPageRequest, |
| 683 base::Bind(&DevToolsAndroidBridge::PageCreatedOnUIThread, | 696 base::Bind(&DevToolsAndroidBridge::PageCreatedOnUIThread, |
| 684 this, browser, callback, url)); | 697 this, browser, callback, url)); |
| 685 } | 698 } |
| 686 } | 699 } |
| 687 | 700 |
| 688 void DevToolsAndroidBridge::PageCreatedOnUIThread( | 701 void DevToolsAndroidBridge::PageCreatedOnUIThread( |
| 689 scoped_refptr<RemoteBrowser> browser, | 702 scoped_refptr<RemoteBrowser> browser, |
| 690 const RemotePageCallback& callback, | 703 const RemotePageCallback& callback, |
| 691 const std::string& url, | 704 const std::string& url, |
| 692 int result, | 705 int result, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 708 scoped_refptr<RemoteBrowser> browser, | 721 scoped_refptr<RemoteBrowser> browser, |
| 709 const RemotePageCallback& callback, | 722 const RemotePageCallback& callback, |
| 710 int result, | 723 int result, |
| 711 const std::string& response, | 724 const std::string& response, |
| 712 const std::string& url) { | 725 const std::string& url) { |
| 713 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 726 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 714 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); | 727 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); |
| 715 base::DictionaryValue* dict; | 728 base::DictionaryValue* dict; |
| 716 | 729 |
| 717 if (value && value->GetAsDictionary(&dict)) { | 730 if (value && value->GetAsDictionary(&dict)) { |
| 718 RemotePageTarget new_page(this, browser, *dict); | 731 RemotePageTarget new_page(this, browser->browser_id_, *dict, |
| 732 browser->IsWebView()); |
| 719 new_page.Navigate(url, | 733 new_page.Navigate(url, |
| 720 base::Bind(&DevToolsAndroidBridge::RespondToOpenOnUIThread, | 734 base::Bind(&DevToolsAndroidBridge::RespondToOpenOnUIThread, |
| 721 this, browser, callback, result, response)); | 735 this, browser, callback, result, response)); |
| 722 } | 736 } |
| 723 } | 737 } |
| 724 | 738 |
| 725 DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() { | 739 DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() { |
| 726 } | 740 } |
| 727 | 741 |
| 728 // DevToolsAndroidBridge::RemoteDevice ---------------------------------------- | 742 // DevToolsAndroidBridge::RemoteDevice ---------------------------------------- |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 951 bool enabled; | 965 bool enabled; |
| 952 if (pref_value->GetAsBoolean(&enabled) && enabled) { | 966 if (pref_value->GetAsBoolean(&enabled) && enabled) { |
| 953 device_providers.push_back(new UsbDeviceProvider(profile_)); | 967 device_providers.push_back(new UsbDeviceProvider(profile_)); |
| 954 } | 968 } |
| 955 device_manager_->SetDeviceProviders(device_providers); | 969 device_manager_->SetDeviceProviders(device_providers); |
| 956 if (NeedsDeviceListPolling()) { | 970 if (NeedsDeviceListPolling()) { |
| 957 StopDeviceListPolling(); | 971 StopDeviceListPolling(); |
| 958 StartDeviceListPolling(); | 972 StartDeviceListPolling(); |
| 959 } | 973 } |
| 960 } | 974 } |
| OLD | NEW |