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

Side by Side Diff: chrome/browser/devtools/devtools_adb_bridge.cc

Issue 23953002: DevTools: request usb permission on ChromeOS. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/devtools/devtools_adb_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 (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/devtools_adb_bridge.h" 5 #include "chrome/browser/devtools/devtools_adb_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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 } 92 }
93 private: 93 private:
94 virtual ~AdbDeviceImpl() {} 94 virtual ~AdbDeviceImpl() {}
95 }; 95 };
96 96
97 class UsbDeviceImpl : public DevToolsAdbBridge::AndroidDevice { 97 class UsbDeviceImpl : public DevToolsAdbBridge::AndroidDevice {
98 public: 98 public:
99 explicit UsbDeviceImpl(AndroidUsbDevice* device) 99 explicit UsbDeviceImpl(AndroidUsbDevice* device)
100 : AndroidDevice(device->serial()), 100 : AndroidDevice(device->serial()),
101 device_(device) { 101 device_(device) {
102 device_->InitOnCallerThread();
102 } 103 }
103 104
104 virtual void RunCommand(const std::string& command, 105 virtual void RunCommand(const std::string& command,
105 const CommandCallback& callback) OVERRIDE { 106 const CommandCallback& callback) OVERRIDE {
106 net::StreamSocket* socket = device_->CreateSocket(command); 107 net::StreamSocket* socket = device_->CreateSocket(command);
107 int result = socket->Connect(base::Bind(&UsbDeviceImpl::OpenedForCommand, 108 int result = socket->Connect(base::Bind(&UsbDeviceImpl::OpenedForCommand,
108 this, callback, socket)); 109 this, callback, socket));
109 if (result != net::ERR_IO_PENDING) 110 if (result != net::ERR_IO_PENDING)
110 callback.Run(result, std::string()); 111 callback.Run(result, std::string());
111 } 112 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 virtual ~UsbDeviceImpl() {} 166 virtual ~UsbDeviceImpl() {}
166 scoped_refptr<AndroidUsbDevice> device_; 167 scoped_refptr<AndroidUsbDevice> device_;
167 }; 168 };
168 169
169 class AdbPagesCommand : public base::RefCountedThreadSafe< 170 class AdbPagesCommand : public base::RefCountedThreadSafe<
170 AdbPagesCommand, 171 AdbPagesCommand,
171 content::BrowserThread::DeleteOnUIThread> { 172 content::BrowserThread::DeleteOnUIThread> {
172 public: 173 public:
173 typedef base::Callback<void(DevToolsAdbBridge::RemoteDevices*)> Callback; 174 typedef base::Callback<void(DevToolsAdbBridge::RemoteDevices*)> Callback;
174 175
175 AdbPagesCommand(DevToolsAdbBridge* bridge, const Callback& callback) 176 AdbPagesCommand(DevToolsAdbBridge* bridge,
177 crypto::RSAPrivateKey* rsa_key,
178 const Callback& callback)
176 : bridge_(bridge), 179 : bridge_(bridge),
177 callback_(callback) { 180 callback_(callback) {
178 remote_devices_.reset(new DevToolsAdbBridge::RemoteDevices()); 181 remote_devices_.reset(new DevToolsAdbBridge::RemoteDevices());
179 bridge_->GetAdbMessageLoop()->PostTask(FROM_HERE, 182
180 base::Bind(&DevToolsAdbBridge::EnumerateUsbDevices, bridge_, 183 if (CommandLine::ForCurrentProcess()->HasSwitch(
181 base::Bind(&AdbPagesCommand::ReceivedUsbDevices, this))); 184 switches::kRemoteDebuggingRawUSB)) {
185 AndroidUsbDevice::Enumerate(rsa_key,
186 base::Bind(&AdbPagesCommand::ReceivedUsbDevices, this));
187 } else {
188 ReceivedUsbDevices(AndroidUsbDevices());
189 }
182 } 190 }
183 191
184 private: 192 private:
185 friend struct content::BrowserThread::DeleteOnThread< 193 friend struct content::BrowserThread::DeleteOnThread<
186 content::BrowserThread::UI>; 194 content::BrowserThread::UI>;
187 friend class base::DeleteHelper<AdbPagesCommand>; 195 friend class base::DeleteHelper<AdbPagesCommand>;
188 196
189 virtual ~AdbPagesCommand() { 197 virtual ~AdbPagesCommand() {
190 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 198 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
191 } 199 }
192 200
193 void ReceivedUsbDevices(const AndroidDevices& devices) { 201 void ReceivedUsbDevices(const AndroidUsbDevices& usb_devices) {
202 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
203 bridge_->GetAdbMessageLoop()->PostTask(
204 FROM_HERE, base::Bind(&AdbPagesCommand::WrapUsbDevices, this,
205 usb_devices));
206 }
207
208 void WrapUsbDevices(const AndroidUsbDevices& usb_devices) {
194 DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current()); 209 DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current());
195 devices_ = devices; 210
196 bridge_->EnumerateAdbDevices( 211 #if defined(DEBUG_DEVTOOLS)
212 devices_.push_back(new AdbDeviceImpl("")); // For desktop remote debugging.
213 #endif // defined(DEBUG_DEVTOOLS)
214
215 for (AndroidUsbDevices::const_iterator it = usb_devices.begin();
216 it != usb_devices.end(); ++it) {
217 devices_.push_back(new UsbDeviceImpl(*it));
218 }
219
220 AdbClientSocket::AdbQuery(
221 kAdbPort, kHostDevicesCommand,
197 base::Bind(&AdbPagesCommand::ReceivedAdbDevices, this)); 222 base::Bind(&AdbPagesCommand::ReceivedAdbDevices, this));
198 } 223 }
199 224
200 void ReceivedAdbDevices(const AndroidDevices& devices) { 225 void ReceivedAdbDevices(
201 devices_.insert(devices_.end(), devices.begin(), devices.end()); 226 int result,
227 const std::string& response) {
228 DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current());
229 std::vector<std::string> serials;
230 Tokenize(response, "\n", &serials);
231 for (size_t i = 0; i < serials.size(); ++i) {
232 std::vector<std::string> tokens;
233 Tokenize(serials[i], "\t ", &tokens);
234 devices_.push_back(new AdbDeviceImpl(tokens[0]));
235 }
202 ProcessSerials(); 236 ProcessSerials();
203 } 237 }
204 238
205 void ProcessSerials() { 239 void ProcessSerials() {
206 DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current()); 240 DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current());
207 if (devices_.size() == 0) { 241 if (devices_.size() == 0) {
208 BrowserThread::PostTask( 242 BrowserThread::PostTask(
209 BrowserThread::UI, FROM_HERE, 243 BrowserThread::UI, FROM_HERE,
210 base::Bind(&AdbPagesCommand::Respond, this)); 244 base::Bind(&AdbPagesCommand::Respond, this));
211 return; 245 return;
(...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 895
862 DevToolsAdbBridge::DevToolsAdbBridge(Profile* profile) 896 DevToolsAdbBridge::DevToolsAdbBridge(Profile* profile)
863 : profile_(profile), 897 : profile_(profile),
864 adb_thread_(RefCountedAdbThread::GetInstance()), 898 adb_thread_(RefCountedAdbThread::GetInstance()),
865 has_message_loop_(adb_thread_->message_loop() != NULL) { 899 has_message_loop_(adb_thread_->message_loop() != NULL) {
866 rsa_key_.reset(AndroidRSAPrivateKey(profile)); 900 rsa_key_.reset(AndroidRSAPrivateKey(profile));
867 port_forwarding_controller_.reset( 901 port_forwarding_controller_.reset(
868 new PortForwardingController(this, profile->GetPrefs())); 902 new PortForwardingController(this, profile->GetPrefs()));
869 } 903 }
870 904
871 void DevToolsAdbBridge::EnumerateUsbDevices(
872 const AndroidDevicesCallback& callback) {
873 DCHECK_EQ(base::MessageLoop::current(), adb_thread_->message_loop());
874 if (CommandLine::ForCurrentProcess()->HasSwitch(
875 switches::kRemoteDebuggingRawUSB)) {
876 AndroidUsbDevice::Enumerate(rsa_key_.get(),
877 base::Bind(&DevToolsAdbBridge::ReceivedUsbDevices, this, callback));
878 } else {
879 ReceivedUsbDevices(callback, AndroidUsbDevices());
880 }
881 }
882
883 void DevToolsAdbBridge::EnumerateAdbDevices(
884 const AndroidDevicesCallback& callback) {
885 DCHECK_EQ(base::MessageLoop::current(), adb_thread_->message_loop());
886
887 AdbClientSocket::AdbQuery(
888 kAdbPort, kHostDevicesCommand,
889 base::Bind(&DevToolsAdbBridge::ReceivedAdbDevices, this, callback));
890 }
891
892 void DevToolsAdbBridge::AddListener(Listener* listener) { 905 void DevToolsAdbBridge::AddListener(Listener* listener) {
893 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 906 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
894 if (listeners_.empty()) 907 if (listeners_.empty())
895 RequestRemoteDevices(); 908 RequestRemoteDevices();
896 listeners_.push_back(listener); 909 listeners_.push_back(listener);
897 } 910 }
898 911
899 void DevToolsAdbBridge::RemoveListener(Listener* listener) { 912 void DevToolsAdbBridge::RemoveListener(Listener* listener) {
900 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 913 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
901 Listeners::iterator it = 914 Listeners::iterator it =
902 std::find(listeners_.begin(), listeners_.end(), listener); 915 std::find(listeners_.begin(), listeners_.end(), listener);
903 DCHECK(it != listeners_.end()); 916 DCHECK(it != listeners_.end());
904 listeners_.erase(it); 917 listeners_.erase(it);
905 } 918 }
906 919
907 base::MessageLoop* DevToolsAdbBridge::GetAdbMessageLoop() { 920 base::MessageLoop* DevToolsAdbBridge::GetAdbMessageLoop() {
908 return adb_thread_->message_loop(); 921 return adb_thread_->message_loop();
909 } 922 }
910 923
911 DevToolsAdbBridge::~DevToolsAdbBridge() { 924 DevToolsAdbBridge::~DevToolsAdbBridge() {
912 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 925 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
913 DCHECK(listeners_.empty()); 926 DCHECK(listeners_.empty());
914 } 927 }
915 928
916 void DevToolsAdbBridge::ReceivedUsbDevices(
917 const AndroidDevicesCallback& callback,
918 const AndroidUsbDevices& usb_devices) {
919 AndroidDevices devices;
920
921 #if defined(DEBUG_DEVTOOLS)
922 devices.push_back(new AdbDeviceImpl("")); // For desktop remote debugging.
923 #endif // defined(DEBUG_DEVTOOLS)
924
925 for (AndroidUsbDevices::const_iterator it = usb_devices.begin();
926 it != usb_devices.end(); ++it) {
927 devices.push_back(new UsbDeviceImpl(*it));
928 }
929
930 callback.Run(devices);
931 }
932
933 void DevToolsAdbBridge::ReceivedAdbDevices(
934 const AndroidDevicesCallback& callback,
935 int result,
936 const std::string& response) {
937 AndroidDevices devices;
938 if (result != net::OK) {
939 callback.Run(devices);
940 return;
941 }
942
943 std::vector<std::string> serials;
944 Tokenize(response, "\n", &serials);
945 for (size_t i = 0; i < serials.size(); ++i) {
946 std::vector<std::string> tokens;
947 Tokenize(serials[i], "\t ", &tokens);
948 devices.push_back(new AdbDeviceImpl(tokens[0]));
949 }
950 callback.Run(devices);
951 }
952
953 void DevToolsAdbBridge::RequestRemoteDevices() { 929 void DevToolsAdbBridge::RequestRemoteDevices() {
954 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 930 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
955 if (!has_message_loop_) 931 if (!has_message_loop_)
956 return; 932 return;
957 933
958 new AdbPagesCommand( 934 new AdbPagesCommand(
959 this, base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this)); 935 this, rsa_key_.get(),
936 base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this));
960 } 937 }
961 938
962 void DevToolsAdbBridge::ReceivedRemoteDevices(RemoteDevices* devices_ptr) { 939 void DevToolsAdbBridge::ReceivedRemoteDevices(RemoteDevices* devices_ptr) {
963 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 940 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
964 941
965 scoped_ptr<RemoteDevices> devices(devices_ptr); 942 scoped_ptr<RemoteDevices> devices(devices_ptr);
966 port_forwarding_controller_->UpdateDeviceList(*devices.get()); 943 port_forwarding_controller_->UpdateDeviceList(*devices.get());
967 944
968 Listeners copy(listeners_); 945 Listeners copy(listeners_);
969 for (Listeners::iterator it = copy.begin(); it != copy.end(); ++it) 946 for (Listeners::iterator it = copy.begin(); it != copy.end(); ++it)
970 (*it)->RemoteDevicesChanged(devices.get()); 947 (*it)->RemoteDevicesChanged(devices.get());
971 948
972 if (listeners_.empty()) 949 if (listeners_.empty())
973 return; 950 return;
974 951
975 BrowserThread::PostDelayedTask( 952 BrowserThread::PostDelayedTask(
976 BrowserThread::UI, 953 BrowserThread::UI,
977 FROM_HERE, 954 FROM_HERE,
978 base::Bind(&DevToolsAdbBridge::RequestRemoteDevices, this), 955 base::Bind(&DevToolsAdbBridge::RequestRemoteDevices, this),
979 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); 956 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs));
980 } 957 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/devtools_adb_bridge.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698