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

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

Issue 287643002: DevTools: Partially redesigned DevToolsAndroidBridge and AndroidDeviceManager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased. Encapsulated DeviceHandle::android_bridge_ Created 6 years, 7 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
« no previous file with comments | « chrome/browser/devtools/device/devtools_android_bridge.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 58
59 const int kMinVersionNewWithURL = 32; 59 const int kMinVersionNewWithURL = 32;
60 const int kNewPageNavigateDelayMs = 500; 60 const int kNewPageNavigateDelayMs = 500;
61 61
62 // DiscoveryRequest ----------------------------------------------------- 62 // DiscoveryRequest -----------------------------------------------------
63 63
64 class DiscoveryRequest : public base::RefCountedThreadSafe< 64 class DiscoveryRequest : public base::RefCountedThreadSafe<
65 DiscoveryRequest, 65 DiscoveryRequest,
66 BrowserThread::DeleteOnUIThread> { 66 BrowserThread::DeleteOnUIThread> {
67 public: 67 public:
68 typedef base::Callback<void(DevToolsAndroidBridge::RemoteDevices*)> Callback; 68 typedef base::Callback<void(DevToolsAndroidBridge::RemoteDevices*,
Vladislav Kaznacheev 2014/05/20 13:06:12 While we are at it lets change the types of both p
vkuzkokov 2014/05/20 14:25:50 Done.
69 DevToolsAndroidBridge::DeviceHandleMap*)> Callback;
69 70
70 DiscoveryRequest( 71 DiscoveryRequest(
71 scoped_refptr<DevToolsAndroidBridge> android_bridge, 72 scoped_refptr<DevToolsAndroidBridge> android_bridge,
73 const DevToolsAndroidBridge::DeviceHandleMap& device_handles,
72 AndroidDeviceManager* device_manager, 74 AndroidDeviceManager* device_manager,
73 base::MessageLoop* device_message_loop, 75 base::MessageLoop* device_message_loop,
74 const AndroidDeviceManager::DeviceProviders& device_providers, 76 const AndroidDeviceManager::DeviceProviders& device_providers,
75 const Callback& callback); 77 const Callback& callback);
76 78
77 private: 79 private:
78 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; 80 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
79 friend class base::DeleteHelper<DiscoveryRequest>; 81 friend class base::DeleteHelper<DiscoveryRequest>;
80 82
81 virtual ~DiscoveryRequest(); 83 virtual ~DiscoveryRequest();
82 84
83 void ReceivedSerials(const std::vector<std::string>& serials); 85 void ReceivedSerials(const std::vector<std::string>& serials);
84 void ProcessSerials(); 86 void ProcessSerials();
85 void ReceivedDeviceInfo(const AndroidDeviceManager::DeviceInfo& device_info); 87 void ReceivedDeviceInfo(const AndroidDeviceManager::DeviceInfo& device_info);
86 void ProcessSockets(); 88 void ProcessSockets();
87 void ReceivedVersion(int result, const std::string& response); 89 void ReceivedVersion(int result, const std::string& response);
88 void ReceivedPages(int result, const std::string& response); 90 void ReceivedPages(int result, const std::string& response);
89 91
90 std::string current_serial() const { return serials_.back(); } 92 std::string current_serial() const { return serials_.back(); }
91 93
92 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> current_browser() const { 94 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> current_browser() const {
93 return browsers_.back(); 95 return browsers_.back();
94 } 96 }
95 97
96 void NextBrowser(); 98 void NextBrowser();
97 void NextDevice(); 99 void NextDevice();
98 100
99 void Respond(); 101 void Respond();
100 102
103 scoped_refptr<DevToolsAndroidBridge::DeviceHandle>
104 FindDeviceHandle(const std::string& serial);
105
101 scoped_refptr<DevToolsAndroidBridge> android_bridge_; 106 scoped_refptr<DevToolsAndroidBridge> android_bridge_;
102 AndroidDeviceManager* device_manager_; 107 AndroidDeviceManager* device_manager_;
103 base::MessageLoop* device_message_loop_; 108 base::MessageLoop* device_message_loop_;
104 Callback callback_; 109 Callback callback_;
105 std::vector<std::string> serials_; 110 std::vector<std::string> serials_;
106 DevToolsAndroidBridge::RemoteBrowsers browsers_; 111 DevToolsAndroidBridge::RemoteBrowsers browsers_;
107 scoped_ptr<DevToolsAndroidBridge::RemoteDevices> remote_devices_; 112 scoped_ptr<DevToolsAndroidBridge::RemoteDevices> remote_devices_;
113 DevToolsAndroidBridge::DeviceHandleMap device_handles_;
Vladislav Kaznacheev 2014/05/20 13:06:12 I am a bit confused about the names (device_handle
vkuzkokov 2014/05/20 14:25:50 I renamed device_handles_ to all_device_handles_ (
114 scoped_ptr<DevToolsAndroidBridge::DeviceHandleMap> used_device_handles_;
108 }; 115 };
109 116
110 DiscoveryRequest::DiscoveryRequest( 117 DiscoveryRequest::DiscoveryRequest(
111 scoped_refptr<DevToolsAndroidBridge> android_bridge, 118 scoped_refptr<DevToolsAndroidBridge> android_bridge,
119 const DevToolsAndroidBridge::DeviceHandleMap& device_handles,
112 AndroidDeviceManager* device_manager, 120 AndroidDeviceManager* device_manager,
113 base::MessageLoop* device_message_loop, 121 base::MessageLoop* device_message_loop,
114 const AndroidDeviceManager::DeviceProviders& device_providers, 122 const AndroidDeviceManager::DeviceProviders& device_providers,
115 const Callback& callback) 123 const Callback& callback)
116 : android_bridge_(android_bridge), 124 : android_bridge_(android_bridge),
117 device_manager_(device_manager), 125 device_manager_(device_manager),
118 device_message_loop_(device_message_loop), 126 device_message_loop_(device_message_loop),
119 callback_(callback) { 127 callback_(callback),
128 device_handles_(device_handles) {
120 remote_devices_.reset(new DevToolsAndroidBridge::RemoteDevices()); 129 remote_devices_.reset(new DevToolsAndroidBridge::RemoteDevices());
130 used_device_handles_.reset(new DevToolsAndroidBridge::DeviceHandleMap());
121 131
122 device_message_loop_->PostTask( 132 device_message_loop_->PostTask(
123 FROM_HERE, base::Bind( 133 FROM_HERE, base::Bind(
124 &AndroidDeviceManager::QueryDevices, 134 &AndroidDeviceManager::QueryDevices,
125 device_manager_, 135 device_manager_,
126 device_providers, 136 device_providers,
127 base::Bind(&DiscoveryRequest::ReceivedSerials, this))); 137 base::Bind(&DiscoveryRequest::ReceivedSerials, this)));
128 } 138 }
129 139
130 DiscoveryRequest::~DiscoveryRequest() { 140 DiscoveryRequest::~DiscoveryRequest() {
(...skipping 16 matching lines...) Expand all
147 return; 157 return;
148 } 158 }
149 159
150 if (device_manager_->IsConnected(current_serial())) { 160 if (device_manager_->IsConnected(current_serial())) {
151 device_manager_->QueryDeviceInfo(current_serial(), 161 device_manager_->QueryDeviceInfo(current_serial(),
152 base::Bind(&DiscoveryRequest::ReceivedDeviceInfo, this)); 162 base::Bind(&DiscoveryRequest::ReceivedDeviceInfo, this));
153 } else { 163 } else {
154 AndroidDeviceManager::DeviceInfo offline_info; 164 AndroidDeviceManager::DeviceInfo offline_info;
155 offline_info.model = kModelOffline; 165 offline_info.model = kModelOffline;
156 remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice( 166 remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice(
157 android_bridge_, current_serial(), offline_info, false)); 167 FindDeviceHandle(current_serial()), offline_info, false));
158 NextDevice(); 168 NextDevice();
159 } 169 }
160 } 170 }
161 171
162 void DiscoveryRequest::ReceivedDeviceInfo( 172 void DiscoveryRequest::ReceivedDeviceInfo(
163 const AndroidDeviceManager::DeviceInfo& device_info) { 173 const AndroidDeviceManager::DeviceInfo& device_info) {
164 remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice( 174 remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice(
165 android_bridge_, current_serial(), device_info, true)); 175 FindDeviceHandle(current_serial()), device_info, true));
166 browsers_ = remote_devices_->back()->browsers(); 176 browsers_ = remote_devices_->back()->browsers();
167 ProcessSockets(); 177 ProcessSockets();
168 } 178 }
169 179
170 void DiscoveryRequest::ProcessSockets() { 180 void DiscoveryRequest::ProcessSockets() {
171 DCHECK_EQ(device_message_loop_, base::MessageLoop::current()); 181 DCHECK_EQ(device_message_loop_, base::MessageLoop::current());
172 if (browsers_.size() == 0) { 182 if (browsers_.size() == 0) {
173 NextDevice(); 183 NextDevice();
174 return; 184 return;
175 } 185 }
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 browsers_.pop_back(); 243 browsers_.pop_back();
234 ProcessSockets(); 244 ProcessSockets();
235 } 245 }
236 246
237 void DiscoveryRequest::NextDevice() { 247 void DiscoveryRequest::NextDevice() {
238 serials_.pop_back(); 248 serials_.pop_back();
239 ProcessSerials(); 249 ProcessSerials();
240 } 250 }
241 251
242 void DiscoveryRequest::Respond() { 252 void DiscoveryRequest::Respond() {
243 callback_.Run(remote_devices_.release()); 253 callback_.Run(remote_devices_.release(), used_device_handles_.release());
254 }
255
256 scoped_refptr<DevToolsAndroidBridge::DeviceHandle>
257 DiscoveryRequest::FindDeviceHandle(const std::string& serial) {
258 DevToolsAndroidBridge::DeviceHandleMap::iterator it =
259 device_handles_.find(serial);
260 scoped_refptr<DevToolsAndroidBridge::DeviceHandle> device_handle;
261 if (it != device_handles_.end()) {
262 device_handle = it->second;
263 } else {
264 device_handle = new DevToolsAndroidBridge::DeviceHandle(android_bridge_,
265 serial);
266 device_handles_[serial] = device_handle;
267 }
268 (*used_device_handles_)[serial] = device_handle;
269 return device_handle;
244 } 270 }
245 271
246 // ProtocolCommand ------------------------------------------------------------ 272 // ProtocolCommand ------------------------------------------------------------
247 273
248 class ProtocolCommand 274 class ProtocolCommand
249 : public DevToolsAndroidBridge::AndroidWebSocket::Delegate { 275 : public DevToolsAndroidBridge::AndroidWebSocket::Delegate {
250 public: 276 public:
251 ProtocolCommand( 277 ProtocolCommand(
252 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, 278 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
253 const std::string& debug_url, 279 const std::string& debug_url,
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 base::Closure callback) const { 601 base::Closure callback) const {
576 base::DictionaryValue params; 602 base::DictionaryValue params;
577 params.SetString(kUrlParam, url); 603 params.SetString(kUrlParam, url);
578 browser_->SendProtocolCommand(debug_url_, kPageNavigateCommand, &params, 604 browser_->SendProtocolCommand(debug_url_, kPageNavigateCommand, &params,
579 callback); 605 callback);
580 } 606 }
581 607
582 // DevToolsAndroidBridge::RemoteBrowser --------------------------------------- 608 // DevToolsAndroidBridge::RemoteBrowser ---------------------------------------
583 609
584 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser( 610 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser(
585 scoped_refptr<DevToolsAndroidBridge> android_bridge, 611 scoped_refptr<DeviceHandle> device_handle,
586 const std::string& serial,
587 const AndroidDeviceManager::BrowserInfo& browser_info) 612 const AndroidDeviceManager::BrowserInfo& browser_info)
588 : android_bridge_(android_bridge), 613 : device_handle_(device_handle),
589 serial_(serial),
590 socket_(browser_info.socket_name), 614 socket_(browser_info.socket_name),
591 display_name_(browser_info.display_name), 615 display_name_(browser_info.display_name),
592 type_(browser_info.type), 616 type_(browser_info.type),
593 page_descriptors_(new base::ListValue()) { 617 page_descriptors_(new base::ListValue()) {
594 } 618 }
595 619
596 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() const { 620 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() const {
597 return type_ == AndroidDeviceManager::BrowserInfo::kTypeChrome; 621 return type_ == AndroidDeviceManager::BrowserInfo::kTypeChrome;
598 } 622 }
599 623
(...skipping 29 matching lines...) Expand all
629 } 653 }
630 return result; 654 return result;
631 } 655 }
632 656
633 void DevToolsAndroidBridge::RemoteBrowser::SetPageDescriptors( 657 void DevToolsAndroidBridge::RemoteBrowser::SetPageDescriptors(
634 const base::ListValue& list) { 658 const base::ListValue& list) {
635 page_descriptors_.reset(list.DeepCopy()); 659 page_descriptors_.reset(list.DeepCopy());
636 } 660 }
637 661
638 static void RespondOnUIThread( 662 static void RespondOnUIThread(
639 const DevToolsAndroidBridge::RemoteBrowser::JsonRequestCallback& callback, 663 const DevToolsAndroidBridge::JsonRequestCallback& callback,
640 int result, 664 int result,
641 const std::string& response) { 665 const std::string& response) {
642 if (callback.is_null()) 666 if (callback.is_null())
643 return; 667 return;
644 BrowserThread::PostTask( 668 BrowserThread::PostTask(
645 BrowserThread::UI, FROM_HERE, base::Bind(callback, result, response)); 669 BrowserThread::UI, FROM_HERE, base::Bind(callback, result, response));
646 } 670 }
647 671
648 void DevToolsAndroidBridge::RemoteBrowser::SendJsonRequest( 672 void DevToolsAndroidBridge::RemoteBrowser::SendJsonRequest(
649 const std::string& request, const JsonRequestCallback& callback) { 673 const std::string& request, const JsonRequestCallback& callback) {
650 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 674 device_handle_->SendJsonRequest(socket_, request, callback);
651 android_bridge_->device_message_loop()->PostTask(
652 FROM_HERE,
653 base::Bind(&AndroidDeviceManager::HttpQuery,
654 android_bridge_->device_manager(), serial_, socket_, request,
655 base::Bind(&RespondOnUIThread, callback)));
656 } 675 }
657 676
658 void DevToolsAndroidBridge::RemoteBrowser::SendProtocolCommand( 677 void DevToolsAndroidBridge::RemoteBrowser::SendProtocolCommand(
659 const std::string& debug_url, 678 const std::string& debug_url,
660 const std::string& method, 679 const std::string& method,
661 base::DictionaryValue* params, 680 base::DictionaryValue* params,
662 const base::Closure callback) { 681 const base::Closure callback) {
663 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 682 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
664 if (debug_url.empty()) 683 if (debug_url.empty())
665 return; 684 return;
666 DevToolsProtocol::Command command(1, method, params); 685 DevToolsProtocol::Command command(1, method, params);
667 new ProtocolCommand(this, debug_url, command.Serialize(), callback); 686 new ProtocolCommand(this, debug_url, command.Serialize(), callback);
668 } 687 }
669 688
670 void DevToolsAndroidBridge::RemoteBrowser::Open( 689 void DevToolsAndroidBridge::RemoteBrowser::Open(
671 const std::string& url, 690 const std::string& url,
672 const DevToolsAndroidBridge::RemotePageCallback& callback) { 691 const DevToolsAndroidBridge::RemotePageCallback& callback) {
673 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 692 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
674 InnerOpen(url, base::Bind(&RemoteBrowser::RespondToOpenOnUIThread, 693 InnerOpen(url, base::Bind(&RemoteBrowser::RespondToOpenOnUIThread,
675 this, callback)); 694 this, callback));
676 } 695 }
677 696
678 scoped_refptr<content::DevToolsAgentHost> 697 scoped_refptr<content::DevToolsAgentHost>
679 DevToolsAndroidBridge::RemoteBrowser::GetAgentHost() { 698 DevToolsAndroidBridge::RemoteBrowser::GetAgentHost() {
680 return AgentHostDelegate::GetOrCreateAgentHost( 699 return AgentHostDelegate::GetOrCreateAgentHost(
681 "adb:" + serial_ + ":" + socket_, this, kBrowserTargetSocket); 700 "adb:" + device_handle_->serial() + ":" + socket_,
701 this,
702 kBrowserTargetSocket);
703 }
704
705 scoped_refptr<DevToolsAndroidBridge::AndroidWebSocket>
706 DevToolsAndroidBridge::RemoteBrowser::CreateWebSocket(
707 const std::string& url,
708 DevToolsAndroidBridge::AndroidWebSocket::Delegate* delegate) {
709 return device_handle_->CreateWebSocket(socket_, url, delegate);
682 } 710 }
683 711
684 void DevToolsAndroidBridge::RemoteBrowser::RespondToOpenOnUIThread( 712 void DevToolsAndroidBridge::RemoteBrowser::RespondToOpenOnUIThread(
685 const DevToolsAndroidBridge::RemotePageCallback& callback, 713 const DevToolsAndroidBridge::RemotePageCallback& callback,
686 int result, 714 int result,
687 const std::string& response) { 715 const std::string& response) {
688 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 716 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
689 if (result < 0) { 717 if (result < 0) {
690 callback.Run(NULL); 718 callback.Run(NULL);
691 return; 719 return;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 if (value && value->GetAsDictionary(&dict)) { 779 if (value && value->GetAsDictionary(&dict)) {
752 RemotePageTarget new_page(this, *dict); 780 RemotePageTarget new_page(this, *dict);
753 new_page.Navigate(url, 781 new_page.Navigate(url,
754 base::Bind(&RespondOnUIThread, callback, result, response)); 782 base::Bind(&RespondOnUIThread, callback, result, response));
755 } 783 }
756 } 784 }
757 785
758 DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() { 786 DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() {
759 } 787 }
760 788
761
762 // DevToolsAndroidBridge::RemoteDevice ---------------------------------------- 789 // DevToolsAndroidBridge::RemoteDevice ----------------------------------------
763 790
764 DevToolsAndroidBridge::RemoteDevice::RemoteDevice( 791 DevToolsAndroidBridge::RemoteDevice::RemoteDevice(
765 scoped_refptr<DevToolsAndroidBridge> android_bridge, 792 scoped_refptr<DevToolsAndroidBridge::DeviceHandle> device_handle,
766 const std::string& serial,
767 const AndroidDeviceManager::DeviceInfo& device_info, 793 const AndroidDeviceManager::DeviceInfo& device_info,
768 bool connected) 794 bool connected)
769 : android_bridge_(android_bridge), 795 : device_handle_(device_handle),
770 serial_(serial),
771 model_(device_info.model), 796 model_(device_info.model),
772 connected_(connected), 797 connected_(connected),
773 screen_size_(device_info.screen_size) { 798 screen_size_(device_info.screen_size) {
774 for (std::vector<AndroidDeviceManager::BrowserInfo>::const_iterator it = 799 for (std::vector<AndroidDeviceManager::BrowserInfo>::const_iterator it =
775 device_info.browser_info.begin(); 800 device_info.browser_info.begin();
776 it != device_info.browser_info.end(); 801 it != device_info.browser_info.end();
777 ++it) { 802 ++it) {
778 browsers_.push_back(new DevToolsAndroidBridge::RemoteBrowser( 803 browsers_.push_back(new DevToolsAndroidBridge::RemoteBrowser(
779 android_bridge_, serial_, *it)); 804 device_handle, *it));
780 } 805 }
781 } 806 }
782 807
783 void DevToolsAndroidBridge::RemoteDevice::OpenSocket( 808 void DevToolsAndroidBridge::RemoteDevice::OpenSocket(
784 const std::string& socket_name, 809 const std::string& socket_name,
785 const AndroidDeviceManager::SocketCallback& callback) { 810 const AndroidDeviceManager::SocketCallback& callback) {
786 android_bridge_->device_message_loop()->PostTask(FROM_HERE, 811 device_handle_->OpenSocket(socket_name, callback);
787 base::Bind(&AndroidDeviceManager::OpenSocket,
788 android_bridge_->device_manager(),
789 serial_,
790 socket_name,
791 callback));
792 } 812 }
793 813
794 DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() { 814 DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() {
795 } 815 }
796 816
797 // DevToolsAndroidBridge::HandlerThread --------------------------------- 817 // DevToolsAndroidBridge::HandlerThread ---------------------------------
798 818
799 const char kDevToolsAdbBridgeThreadName[] = "Chrome_DevToolsADBThread"; 819 const char kDevToolsAdbBridgeThreadName[] = "Chrome_DevToolsADBThread";
800 820
801 DevToolsAndroidBridge::HandlerThread* 821 DevToolsAndroidBridge::HandlerThread*
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 855 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
836 instance_ = NULL; 856 instance_ = NULL;
837 if (!thread_) 857 if (!thread_)
838 return; 858 return;
839 // Shut down thread on FILE thread to join into IO. 859 // Shut down thread on FILE thread to join into IO.
840 BrowserThread::PostTask( 860 BrowserThread::PostTask(
841 BrowserThread::FILE, FROM_HERE, 861 BrowserThread::FILE, FROM_HERE,
842 base::Bind(&HandlerThread::StopThread, thread_)); 862 base::Bind(&HandlerThread::StopThread, thread_));
843 } 863 }
844 864
865 // DevToolsAndroidBridge::DeviceHandle ----------------------------------------
866
867 DevToolsAndroidBridge::DeviceHandle::DeviceHandle(
868 scoped_refptr<DevToolsAndroidBridge> android_bridge,
869 const std::string& serial)
870 : android_bridge_(android_bridge),
871 serial_(serial) {
872 }
873
874 void DevToolsAndroidBridge::DeviceHandle::SendJsonRequest(
875 const std::string& socket,
876 const std::string& request,
877 const JsonRequestCallback& callback) {
878 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
879 android_bridge_->device_message_loop()->PostTask(
880 FROM_HERE,
881 base::Bind(&AndroidDeviceManager::HttpQuery,
882 android_bridge_->device_manager(),
883 serial_,
884 socket,
885 request,
886 base::Bind(&RespondOnUIThread, callback)));
887 }
888
889 void DevToolsAndroidBridge::DeviceHandle::OpenSocket(
890 const std::string& socket_name,
891 const AndroidDeviceManager::SocketCallback& callback) {
892 android_bridge_->device_message_loop()->PostTask(FROM_HERE,
893 base::Bind(&AndroidDeviceManager::OpenSocket,
894 android_bridge_->device_manager(),
895 serial_,
896 socket_name,
897 callback));
898 }
899
900 DevToolsAndroidBridge::DeviceHandle::~DeviceHandle() {
901 android_bridge_->device_message_loop()->PostTask(FROM_HERE,
902 base::Bind(&AndroidDeviceManager::ReleaseDevice,
903 android_bridge_->device_manager(),
904 serial_));
905 }
906
845 // DevToolsAndroidBridge ------------------------------------------------------ 907 // DevToolsAndroidBridge ------------------------------------------------------
846 908
847 DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile) 909 DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile)
848 : profile_(profile), 910 : profile_(profile),
849 handler_thread_(HandlerThread::GetInstance()) { 911 handler_thread_(HandlerThread::GetInstance()) {
850 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 912 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
851 pref_change_registrar_.Init(profile_->GetPrefs()); 913 pref_change_registrar_.Init(profile_->GetPrefs());
852 pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled, 914 pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled,
853 base::Bind(&DevToolsAndroidBridge::CreateDeviceProviders, 915 base::Bind(&DevToolsAndroidBridge::CreateDeviceProviders,
854 base::Unretained(this))); 916 base::Unretained(this)));
(...skipping 13 matching lines...) Expand all
868 RequestDeviceList(); 930 RequestDeviceList();
869 } 931 }
870 932
871 void DevToolsAndroidBridge::RemoveDeviceListListener( 933 void DevToolsAndroidBridge::RemoveDeviceListListener(
872 DeviceListListener* listener) { 934 DeviceListListener* listener) {
873 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 935 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
874 DeviceListListeners::iterator it = std::find( 936 DeviceListListeners::iterator it = std::find(
875 device_list_listeners_.begin(), device_list_listeners_.end(), listener); 937 device_list_listeners_.begin(), device_list_listeners_.end(), listener);
876 DCHECK(it != device_list_listeners_.end()); 938 DCHECK(it != device_list_listeners_.end());
877 device_list_listeners_.erase(it); 939 device_list_listeners_.erase(it);
878 if (device_list_listeners_.empty() && device_manager_) { 940 if (device_list_listeners_.empty() && device_manager_)
879 device_message_loop()->PostTask(FROM_HERE, 941 device_handles_.clear();
880 base::Bind(&AndroidDeviceManager::Stop, device_manager_));
881 }
882 } 942 }
883 943
884 void DevToolsAndroidBridge::AddDeviceCountListener( 944 void DevToolsAndroidBridge::AddDeviceCountListener(
885 DeviceCountListener* listener) { 945 DeviceCountListener* listener) {
886 device_count_listeners_.push_back(listener); 946 device_count_listeners_.push_back(listener);
887 if (device_count_listeners_.size() == 1 && device_manager_) 947 if (device_count_listeners_.size() == 1 && device_manager_)
888 RequestDeviceCount(); 948 RequestDeviceCount();
889 } 949 }
890 950
891 void DevToolsAndroidBridge::RemoveDeviceCountListener( 951 void DevToolsAndroidBridge::RemoveDeviceCountListener(
892 DeviceCountListener* listener) { 952 DeviceCountListener* listener) {
893 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 953 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
894 DeviceCountListeners::iterator it = std::find( 954 DeviceCountListeners::iterator it = std::find(
895 device_count_listeners_.begin(), device_count_listeners_.end(), listener); 955 device_count_listeners_.begin(), device_count_listeners_.end(), listener);
896 DCHECK(it != device_count_listeners_.end()); 956 DCHECK(it != device_count_listeners_.end());
897 device_count_listeners_.erase(it); 957 device_count_listeners_.erase(it);
898 } 958 }
899 959
900 // static 960 // static
901 bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) { 961 bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) {
902 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 962 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
903 return g_host_delegates.Get().find(agent_id) != g_host_delegates.Get().end(); 963 return g_host_delegates.Get().find(agent_id) != g_host_delegates.Get().end();
904 } 964 }
905 965
966 void DevToolsAndroidBridge::IsConnectedForTest(const std::string& serial,
967 const base::Callback<void(bool)>& callback) {
968 base::PostTaskAndReplyWithResult(
969 device_message_loop()->message_loop_proxy(),
970 FROM_HERE,
971 base::Bind(&AndroidDeviceManager::IsConnected, device_manager_, serial),
972 callback);
973 }
974
906 DevToolsAndroidBridge::~DevToolsAndroidBridge() { 975 DevToolsAndroidBridge::~DevToolsAndroidBridge() {
907 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 976 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
908 DCHECK(device_list_listeners_.empty()); 977 DCHECK(device_list_listeners_.empty());
909 DCHECK(device_count_listeners_.empty()); 978 DCHECK(device_count_listeners_.empty());
910 if (device_manager_) { 979 if (device_manager_) {
911 AndroidDeviceManager* raw_ptr = device_manager_.get(); 980 AndroidDeviceManager* raw_ptr = device_manager_.get();
912 device_manager_->AddRef(); 981 device_manager_->AddRef();
913 device_manager_ = NULL; 982 device_manager_ = NULL;
914 device_message_loop()->ReleaseSoon(FROM_HERE, raw_ptr); 983 device_message_loop()->ReleaseSoon(FROM_HERE, raw_ptr);
915 } 984 }
916 } 985 }
917 986
918 void DevToolsAndroidBridge::RequestDeviceList() { 987 void DevToolsAndroidBridge::RequestDeviceList() {
919 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 988 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
920 DCHECK(device_manager_); 989 DCHECK(device_manager_);
921 990
922 if (device_list_listeners_.empty()) 991 if (device_list_listeners_.empty())
923 return; 992 return;
924 993
925 new DiscoveryRequest( 994 new DiscoveryRequest(
926 this, 995 this,
996 device_handles_,
927 device_manager(), 997 device_manager(),
928 device_message_loop(), 998 device_message_loop(),
929 device_providers_, 999 device_providers_,
930 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this)); 1000 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this));
931 } 1001 }
932 1002
933 void DevToolsAndroidBridge::CreatedDeviceManager( 1003 void DevToolsAndroidBridge::CreatedDeviceManager(
934 scoped_refptr<AndroidDeviceManager> device_manager) { 1004 scoped_refptr<AndroidDeviceManager> device_manager) {
935 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1005 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
936 device_manager_ = device_manager; 1006 device_manager_ = device_manager;
937 if (!device_list_listeners_.empty()) 1007 if (!device_list_listeners_.empty())
938 RequestDeviceList(); 1008 RequestDeviceList();
939 if (!device_count_listeners_.empty()) 1009 if (!device_count_listeners_.empty())
940 RequestDeviceCount(); 1010 RequestDeviceCount();
941 } 1011 }
942 1012
943 void DevToolsAndroidBridge::ReceivedDeviceList(RemoteDevices* devices_ptr) { 1013 void DevToolsAndroidBridge::ReceivedDeviceList(RemoteDevices* devices_ptr,
1014 DeviceHandleMap* device_handles_ptr) {
944 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1015 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
945 1016
946 scoped_ptr<RemoteDevices> devices(devices_ptr); 1017 scoped_ptr<RemoteDevices> devices(devices_ptr);
1018 scoped_ptr<DeviceHandleMap> device_handles(device_handles_ptr);
947 1019
948 if (device_list_listeners_.empty()) 1020 if (device_list_listeners_.empty())
949 return; 1021 return;
950 1022
1023 device_handles_ = *device_handles.get();
1024
951 DeviceListListeners copy(device_list_listeners_); 1025 DeviceListListeners copy(device_list_listeners_);
952 for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it) 1026 for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it)
953 (*it)->DeviceListChanged(*devices.get()); 1027 (*it)->DeviceListChanged(*devices.get());
954 1028
955 BrowserThread::PostDelayedTask( 1029 BrowserThread::PostDelayedTask(
956 BrowserThread::UI, 1030 BrowserThread::UI,
957 FROM_HERE, 1031 FROM_HERE,
958 base::Bind(&DevToolsAndroidBridge::RequestDeviceList, this), 1032 base::Bind(&DevToolsAndroidBridge::RequestDeviceList, this),
959 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); 1033 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs));
960 } 1034 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1001 PrefService* service = profile_->GetPrefs(); 1075 PrefService* service = profile_->GetPrefs();
1002 const PrefService::Preference* pref = 1076 const PrefService::Preference* pref =
1003 service->FindPreference(prefs::kDevToolsDiscoverUsbDevicesEnabled); 1077 service->FindPreference(prefs::kDevToolsDiscoverUsbDevicesEnabled);
1004 const base::Value* pref_value = pref->GetValue(); 1078 const base::Value* pref_value = pref->GetValue();
1005 1079
1006 bool enabled; 1080 bool enabled;
1007 if (pref_value->GetAsBoolean(&enabled) && enabled) { 1081 if (pref_value->GetAsBoolean(&enabled) && enabled) {
1008 device_providers_.push_back(new UsbDeviceProvider(profile_)); 1082 device_providers_.push_back(new UsbDeviceProvider(profile_));
1009 } 1083 }
1010 } 1084 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/device/devtools_android_bridge.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698