| OLD | NEW |
| 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 22 matching lines...) Expand all Loading... |
| 33 #include "content/public/browser/devtools_external_agent_proxy.h" | 33 #include "content/public/browser/devtools_external_agent_proxy.h" |
| 34 #include "content/public/browser/devtools_external_agent_proxy_delegate.h" | 34 #include "content/public/browser/devtools_external_agent_proxy_delegate.h" |
| 35 #include "content/public/browser/devtools_manager.h" | 35 #include "content/public/browser/devtools_manager.h" |
| 36 #include "crypto/rsa_private_key.h" | 36 #include "crypto/rsa_private_key.h" |
| 37 #include "net/base/net_errors.h" | 37 #include "net/base/net_errors.h" |
| 38 | 38 |
| 39 using content::BrowserThread; | 39 using content::BrowserThread; |
| 40 | 40 |
| 41 namespace { | 41 namespace { |
| 42 | 42 |
| 43 const char kDevToolsAdbBridgeThreadName[] = "Chrome_DevToolsADBThread"; | |
| 44 const char kHostDevicesCommand[] = "host:devices"; | |
| 45 const char kHostTransportCommand[] = "host:transport:%s|%s"; | |
| 46 const char kLocalAbstractCommand[] = "localabstract:%s"; | |
| 47 const char kDeviceModelCommand[] = "shell:getprop ro.product.model"; | 43 const char kDeviceModelCommand[] = "shell:getprop ro.product.model"; |
| 48 const char kOpenedUnixSocketsCommand[] = "shell:cat /proc/net/unix"; | 44 const char kOpenedUnixSocketsCommand[] = "shell:cat /proc/net/unix"; |
| 49 const char kListProcessesCommand[] = "shell:ps"; | 45 const char kListProcessesCommand[] = "shell:ps"; |
| 50 const char kDumpsysCommand[] = "shell:dumpsys window policy"; | 46 const char kDumpsysCommand[] = "shell:dumpsys window policy"; |
| 51 const char kDumpsysScreenSizePrefix[] = "mStable="; | 47 const char kDumpsysScreenSizePrefix[] = "mStable="; |
| 52 | 48 |
| 53 const char kPageListRequest[] = "GET /json HTTP/1.1\r\n\r\n"; | 49 const char kPageListRequest[] = "GET /json HTTP/1.1\r\n\r\n"; |
| 54 const char kVersionRequest[] = "GET /json/version HTTP/1.1\r\n\r\n"; | 50 const char kVersionRequest[] = "GET /json/version HTTP/1.1\r\n\r\n"; |
| 55 const char kClosePageRequest[] = "GET /json/close/%s HTTP/1.1\r\n\r\n"; | 51 const char kClosePageRequest[] = "GET /json/close/%s HTTP/1.1\r\n\r\n"; |
| 56 const char kNewPageRequest[] = "GET /json/new HTTP/1.1\r\n\r\n"; | 52 const char kNewPageRequest[] = "GET /json/new HTTP/1.1\r\n\r\n"; |
| 57 const char kActivatePageRequest[] = | 53 const char kActivatePageRequest[] = |
| 58 "GET /json/activate/%s HTTP/1.1\r\n\r\n"; | 54 "GET /json/activate/%s HTTP/1.1\r\n\r\n"; |
| 59 const int kAdbPort = 5037; | |
| 60 const int kBufferSize = 16 * 1024; | |
| 61 const int kAdbPollingIntervalMs = 1000; | 55 const int kAdbPollingIntervalMs = 1000; |
| 62 | 56 |
| 63 const char kUrlParam[] = "url"; | 57 const char kUrlParam[] = "url"; |
| 64 const char kPageReloadCommand[] = "Page.reload"; | 58 const char kPageReloadCommand[] = "Page.reload"; |
| 65 const char kPageNavigateCommand[] = "Page.navigate"; | 59 const char kPageNavigateCommand[] = "Page.navigate"; |
| 66 | 60 |
| 67 #if defined(DEBUG_DEVTOOLS) | 61 #if defined(DEBUG_DEVTOOLS) |
| 68 const char kChrome[] = "Chrome"; | 62 const char kChrome[] = "Chrome"; |
| 69 const char kLocalChrome[] = "Local Chrome"; | 63 const char kLocalChrome[] = "Local Chrome"; |
| 70 #endif // defined(DEBUG_DEVTOOLS) | 64 #endif // defined(DEBUG_DEVTOOLS) |
| 71 | 65 |
| 72 typedef DevToolsAdbBridge::Callback Callback; | 66 typedef DevToolsAdbBridge::Callback Callback; |
| 73 typedef std::vector<scoped_refptr<DevToolsAdbBridge::AndroidDevice> > | 67 typedef std::vector<scoped_refptr<AndroidDevice> > |
| 74 AndroidDevices; | 68 AndroidDevices; |
| 75 typedef base::Callback<void(const AndroidDevices&)> AndroidDevicesCallback; | 69 typedef base::Callback<void(const AndroidDevices&)> AndroidDevicesCallback; |
| 76 | 70 |
| 77 | |
| 78 // AdbDeviceImpl -------------------------------------------------------------- | |
| 79 | |
| 80 class AdbDeviceImpl : public DevToolsAdbBridge::AndroidDevice { | |
| 81 public: | |
| 82 AdbDeviceImpl(const std::string& serial, bool is_connected); | |
| 83 virtual void RunCommand(const std::string& command, | |
| 84 const CommandCallback& callback) OVERRIDE; | |
| 85 virtual void OpenSocket(const std::string& name, | |
| 86 const SocketCallback& callback) OVERRIDE; | |
| 87 private: | |
| 88 virtual ~AdbDeviceImpl() {} | |
| 89 }; | |
| 90 | |
| 91 AdbDeviceImpl::AdbDeviceImpl(const std::string& serial, bool is_connected) | |
| 92 : AndroidDevice(serial, is_connected) { | |
| 93 } | |
| 94 | |
| 95 void AdbDeviceImpl::RunCommand(const std::string& command, | |
| 96 const CommandCallback& callback) { | |
| 97 std::string query = base::StringPrintf(kHostTransportCommand, | |
| 98 serial().c_str(), command.c_str()); | |
| 99 AdbClientSocket::AdbQuery(kAdbPort, query, callback); | |
| 100 } | |
| 101 | |
| 102 void AdbDeviceImpl::OpenSocket(const std::string& name, | |
| 103 const SocketCallback& callback) { | |
| 104 std::string socket_name = | |
| 105 base::StringPrintf(kLocalAbstractCommand, name.c_str()); | |
| 106 AdbClientSocket::TransportQuery(kAdbPort, serial(), socket_name, callback); | |
| 107 } | |
| 108 | |
| 109 // UsbDeviceImpl -------------------------------------------------------------- | |
| 110 | |
| 111 class UsbDeviceImpl : public DevToolsAdbBridge::AndroidDevice { | |
| 112 public: | |
| 113 explicit UsbDeviceImpl(AndroidUsbDevice* device); | |
| 114 virtual void RunCommand(const std::string& command, | |
| 115 const CommandCallback& callback) OVERRIDE; | |
| 116 virtual void OpenSocket(const std::string& name, | |
| 117 const SocketCallback& callback) OVERRIDE; | |
| 118 | |
| 119 private: | |
| 120 void OnOpenSocket(const SocketCallback& callback, | |
| 121 net::StreamSocket* socket, | |
| 122 int result); | |
| 123 void OpenedForCommand(const CommandCallback& callback, | |
| 124 net::StreamSocket* socket, | |
| 125 int result); | |
| 126 void OnRead(net::StreamSocket* socket, | |
| 127 scoped_refptr<net::IOBuffer> buffer, | |
| 128 const std::string& data, | |
| 129 const CommandCallback& callback, | |
| 130 int result); | |
| 131 | |
| 132 virtual ~UsbDeviceImpl() {} | |
| 133 scoped_refptr<AndroidUsbDevice> device_; | |
| 134 }; | |
| 135 | |
| 136 | |
| 137 UsbDeviceImpl::UsbDeviceImpl(AndroidUsbDevice* device) | |
| 138 : AndroidDevice(device->serial(), device->is_connected()), | |
| 139 device_(device) { | |
| 140 device_->InitOnCallerThread(); | |
| 141 } | |
| 142 | |
| 143 void UsbDeviceImpl::RunCommand(const std::string& command, | |
| 144 const CommandCallback& callback) { | |
| 145 net::StreamSocket* socket = device_->CreateSocket(command); | |
| 146 int result = socket->Connect(base::Bind(&UsbDeviceImpl::OpenedForCommand, | |
| 147 this, callback, socket)); | |
| 148 if (result != net::ERR_IO_PENDING) | |
| 149 callback.Run(result, std::string()); | |
| 150 } | |
| 151 | |
| 152 void UsbDeviceImpl::OpenSocket(const std::string& name, | |
| 153 const SocketCallback& callback) { | |
| 154 std::string socket_name = | |
| 155 base::StringPrintf(kLocalAbstractCommand, name.c_str()); | |
| 156 net::StreamSocket* socket = device_->CreateSocket(socket_name); | |
| 157 int result = socket->Connect(base::Bind(&UsbDeviceImpl::OnOpenSocket, this, | |
| 158 callback, socket)); | |
| 159 if (result != net::ERR_IO_PENDING) | |
| 160 callback.Run(result, NULL); | |
| 161 } | |
| 162 | |
| 163 void UsbDeviceImpl::OnOpenSocket(const SocketCallback& callback, | |
| 164 net::StreamSocket* socket, | |
| 165 int result) { | |
| 166 callback.Run(result, result == net::OK ? socket : NULL); | |
| 167 } | |
| 168 | |
| 169 void UsbDeviceImpl::OpenedForCommand(const CommandCallback& callback, | |
| 170 net::StreamSocket* socket, | |
| 171 int result) { | |
| 172 if (result != net::OK) { | |
| 173 callback.Run(result, std::string()); | |
| 174 return; | |
| 175 } | |
| 176 scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(kBufferSize); | |
| 177 result = socket->Read(buffer, kBufferSize, | |
| 178 base::Bind(&UsbDeviceImpl::OnRead, this, | |
| 179 socket, buffer, std::string(), callback)); | |
| 180 if (result != net::ERR_IO_PENDING) | |
| 181 OnRead(socket, buffer, std::string(), callback, result); | |
| 182 } | |
| 183 | |
| 184 void UsbDeviceImpl::OnRead(net::StreamSocket* socket, | |
| 185 scoped_refptr<net::IOBuffer> buffer, | |
| 186 const std::string& data, | |
| 187 const CommandCallback& callback, | |
| 188 int result) { | |
| 189 if (result <= 0) { | |
| 190 callback.Run(result, result == 0 ? data : std::string()); | |
| 191 delete socket; | |
| 192 return; | |
| 193 } | |
| 194 | |
| 195 std::string new_data = data + std::string(buffer->data(), result); | |
| 196 result = socket->Read(buffer, kBufferSize, | |
| 197 base::Bind(&UsbDeviceImpl::OnRead, this, | |
| 198 socket, buffer, new_data, callback)); | |
| 199 if (result != net::ERR_IO_PENDING) | |
| 200 OnRead(socket, buffer, new_data, callback, result); | |
| 201 } | |
| 202 | |
| 203 | |
| 204 // AdbCountDevicesCommand ----------------------------------------------------- | |
| 205 | |
| 206 class AdbCountDevicesCommand : public base::RefCountedThreadSafe< | |
| 207 AdbCountDevicesCommand, | |
| 208 content::BrowserThread::DeleteOnUIThread> { | |
| 209 public: | |
| 210 typedef base::Callback<void(int)> Callback; | |
| 211 | |
| 212 AdbCountDevicesCommand( | |
| 213 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, | |
| 214 const Callback& callback); | |
| 215 | |
| 216 private: | |
| 217 friend struct content::BrowserThread::DeleteOnThread< | |
| 218 content::BrowserThread::UI>; | |
| 219 friend class base::DeleteHelper<AdbCountDevicesCommand>; | |
| 220 | |
| 221 virtual ~AdbCountDevicesCommand(); | |
| 222 void RequestAdbDeviceCount(); | |
| 223 void ReceivedAdbDeviceCount(int result, const std::string& response); | |
| 224 void Respond(int count); | |
| 225 | |
| 226 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread_; | |
| 227 Callback callback_; | |
| 228 }; | |
| 229 | |
| 230 AdbCountDevicesCommand::AdbCountDevicesCommand( | |
| 231 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, | |
| 232 const Callback& callback) | |
| 233 : adb_thread_(adb_thread), | |
| 234 callback_(callback) { | |
| 235 adb_thread_->message_loop()->PostTask( | |
| 236 FROM_HERE, base::Bind(&AdbCountDevicesCommand::RequestAdbDeviceCount, | |
| 237 this)); | |
| 238 } | |
| 239 | |
| 240 AdbCountDevicesCommand::~AdbCountDevicesCommand() { | |
| 241 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 242 } | |
| 243 | |
| 244 void AdbCountDevicesCommand::RequestAdbDeviceCount() { | |
| 245 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); | |
| 246 AdbClientSocket::AdbQuery( | |
| 247 kAdbPort, kHostDevicesCommand, | |
| 248 base::Bind(&AdbCountDevicesCommand::ReceivedAdbDeviceCount, this)); | |
| 249 } | |
| 250 | |
| 251 void AdbCountDevicesCommand::ReceivedAdbDeviceCount( | |
| 252 int result, | |
| 253 const std::string& response) { | |
| 254 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); | |
| 255 std::vector<std::string> serials; | |
| 256 Tokenize(response, "\n", &serials); | |
| 257 BrowserThread::PostTask( | |
| 258 BrowserThread::UI, FROM_HERE, | |
| 259 base::Bind(&AdbCountDevicesCommand::Respond, this, serials.size())); | |
| 260 } | |
| 261 | |
| 262 void AdbCountDevicesCommand::Respond(int count) { | |
| 263 callback_.Run(count); | |
| 264 } | |
| 265 | |
| 266 | |
| 267 // AdbPagesCommand ------------------------------------------------------------ | 71 // AdbPagesCommand ------------------------------------------------------------ |
| 268 | 72 |
| 269 class AdbPagesCommand : public base::RefCountedThreadSafe< | 73 class AdbPagesCommand : public base::RefCountedThreadSafe< |
| 270 AdbPagesCommand, | 74 AdbPagesCommand, |
| 271 content::BrowserThread::DeleteOnUIThread> { | 75 BrowserThread::DeleteOnUIThread> { |
| 272 public: | 76 public: |
| 273 typedef base::Callback<void(DevToolsAdbBridge::RemoteDevices*)> Callback; | 77 typedef base::Callback<void(DevToolsAdbBridge::RemoteDevices*)> Callback; |
| 274 | 78 |
| 275 AdbPagesCommand( | 79 AdbPagesCommand( |
| 276 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, | 80 scoped_refptr<RefCountedAdbThread> adb_thread, |
| 277 crypto::RSAPrivateKey* rsa_key, bool discover_usb, | 81 const DevToolsAdbBridge::DeviceProviders& device_providers, |
| 278 const Callback& callback); | 82 const Callback& callback); |
| 279 | 83 |
| 280 private: | 84 private: |
| 281 friend struct content::BrowserThread::DeleteOnThread< | 85 friend struct BrowserThread::DeleteOnThread< |
| 282 content::BrowserThread::UI>; | 86 BrowserThread::UI>; |
| 283 friend class base::DeleteHelper<AdbPagesCommand>; | 87 friend class base::DeleteHelper<AdbPagesCommand>; |
| 284 | 88 |
| 285 virtual ~AdbPagesCommand(); | 89 virtual ~AdbPagesCommand(); |
| 286 void ReceivedUsbDevices(const AndroidUsbDevices& usb_devices); | 90 void ProcessDeviceProviders(); |
| 287 void WrapUsbDevices(const AndroidUsbDevices& usb_devices); | 91 void ReceivedDevices(const AndroidDevices& devices); |
| 288 | 92 |
| 289 void ReceivedAdbDevices(int result, const std::string& response); | |
| 290 void ProcessSerials(); | 93 void ProcessSerials(); |
| 291 void ReceivedModel(int result, const std::string& response); | 94 void ReceivedModel(int result, const std::string& response); |
| 292 void ReceivedSockets(int result, const std::string& response); | 95 void ReceivedSockets(int result, const std::string& response); |
| 293 void ReceivedDumpsys(int result, const std::string& response); | 96 void ReceivedDumpsys(int result, const std::string& response); |
| 294 void ReceivedProcesses(int result, const std::string& response); | 97 void ReceivedProcesses(int result, const std::string& response); |
| 295 void ProcessSockets(); | 98 void ProcessSockets(); |
| 296 void ReceivedVersion(int result, const std::string& response); | 99 void ReceivedVersion(int result, const std::string& response); |
| 297 void ReceivedPages(int result, const std::string& response); | 100 void ReceivedPages(int result, const std::string& response); |
| 298 void Respond(); | 101 void Respond(); |
| 299 void ParseSocketsList(const std::string& response); | 102 void ParseSocketsList(const std::string& response); |
| 300 void ParseProcessList(const std::string& response); | 103 void ParseProcessList(const std::string& response); |
| 301 void ParseDumpsysResponse(const std::string& response); | 104 void ParseDumpsysResponse(const std::string& response); |
| 302 void ParseScreenSize(const std::string& str); | 105 void ParseScreenSize(const std::string& str); |
| 303 | 106 |
| 304 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread_; | 107 scoped_refptr<RefCountedAdbThread> adb_thread_; |
| 305 Callback callback_; | 108 Callback callback_; |
| 306 AndroidDevices devices_; | 109 AndroidDevices devices_; |
| 307 DevToolsAdbBridge::RemoteBrowsers browsers_; | 110 DevToolsAdbBridge::RemoteBrowsers browsers_; |
| 308 scoped_ptr<DevToolsAdbBridge::RemoteDevices> remote_devices_; | 111 scoped_ptr<DevToolsAdbBridge::RemoteDevices> remote_devices_; |
| 112 DevToolsAdbBridge::DeviceProviders device_providers_; |
| 309 }; | 113 }; |
| 310 | 114 |
| 311 AdbPagesCommand::AdbPagesCommand( | 115 AdbPagesCommand::AdbPagesCommand( |
| 312 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, | 116 scoped_refptr<RefCountedAdbThread> adb_thread, |
| 313 crypto::RSAPrivateKey* rsa_key, bool discover_usb, | 117 const DevToolsAdbBridge::DeviceProviders& device_providers, |
| 314 const Callback& callback) | 118 const Callback& callback) |
| 315 : adb_thread_(adb_thread), | 119 : adb_thread_(adb_thread), |
| 316 callback_(callback) { | 120 callback_(callback), |
| 121 device_providers_(device_providers){ |
| 317 remote_devices_.reset(new DevToolsAdbBridge::RemoteDevices()); | 122 remote_devices_.reset(new DevToolsAdbBridge::RemoteDevices()); |
| 318 | 123 |
| 319 if (discover_usb) { | 124 ProcessDeviceProviders(); |
| 320 AndroidUsbDevice::Enumerate(rsa_key, | |
| 321 base::Bind(&AdbPagesCommand::ReceivedUsbDevices, this)); | |
| 322 } else { | |
| 323 ReceivedUsbDevices(AndroidUsbDevices()); | |
| 324 } | |
| 325 } | 125 } |
| 326 | 126 |
| 327 AdbPagesCommand::~AdbPagesCommand() { | 127 AdbPagesCommand::~AdbPagesCommand() { |
| 328 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 128 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 329 } | 129 } |
| 330 | 130 |
| 331 void AdbPagesCommand::ReceivedUsbDevices(const AndroidUsbDevices& usb_devices) { | 131 void AdbPagesCommand::ProcessDeviceProviders() { |
| 332 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 132 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 333 adb_thread_->message_loop()->PostTask( | 133 if (device_providers_.empty()) { |
| 334 FROM_HERE, base::Bind(&AdbPagesCommand::WrapUsbDevices, this, | 134 adb_thread_->message_loop()->PostTask( |
| 335 usb_devices)); | 135 FROM_HERE, base::Bind(&AdbPagesCommand::ProcessSerials, this)); |
| 136 return; |
| 137 } |
| 138 |
| 139 const scoped_refptr<AndroidDeviceProvider>& device_provider = |
| 140 device_providers_.back(); |
| 141 |
| 142 device_provider->QueryDevices( |
| 143 base::Bind(&AdbPagesCommand::ReceivedDevices, this)); |
| 336 } | 144 } |
| 337 | 145 |
| 338 void AdbPagesCommand::WrapUsbDevices(const AndroidUsbDevices& usb_devices) { | 146 void AdbPagesCommand::ReceivedDevices(const AndroidDevices& devices) { |
| 339 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); | 147 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 148 DCHECK(!device_providers_.empty()); |
| 149 device_providers_.pop_back(); |
| 340 | 150 |
| 341 #if defined(DEBUG_DEVTOOLS) | 151 devices_.insert(devices_.end(), devices.begin(), devices.end()); |
| 342 devices_.push_back(new AdbDeviceImpl("", true)); // For desktop debugging. | |
| 343 #endif // defined(DEBUG_DEVTOOLS) | |
| 344 | 152 |
| 345 for (AndroidUsbDevices::const_iterator it = usb_devices.begin(); | 153 if (!device_providers_.empty()) { |
| 346 it != usb_devices.end(); ++it) { | 154 ProcessDeviceProviders(); |
| 347 devices_.push_back(new UsbDeviceImpl(*it)); | 155 } else { |
| 156 adb_thread_->message_loop()->PostTask( |
| 157 FROM_HERE, base::Bind(&AdbPagesCommand::ProcessSerials, this)); |
| 348 } | 158 } |
| 349 | |
| 350 AdbClientSocket::AdbQuery( | |
| 351 kAdbPort, kHostDevicesCommand, | |
| 352 base::Bind(&AdbPagesCommand::ReceivedAdbDevices, this)); | |
| 353 } | |
| 354 | |
| 355 void AdbPagesCommand::ReceivedAdbDevices( | |
| 356 int result, | |
| 357 const std::string& response) { | |
| 358 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); | |
| 359 std::vector<std::string> serials; | |
| 360 Tokenize(response, "\n", &serials); | |
| 361 for (size_t i = 0; i < serials.size(); ++i) { | |
| 362 std::vector<std::string> tokens; | |
| 363 Tokenize(serials[i], "\t ", &tokens); | |
| 364 bool offline = tokens.size() > 1 && tokens[1] == "offline"; | |
| 365 devices_.push_back(new AdbDeviceImpl(tokens[0], !offline)); | |
| 366 } | |
| 367 ProcessSerials(); | |
| 368 } | 159 } |
| 369 | 160 |
| 370 void AdbPagesCommand::ProcessSerials() { | 161 void AdbPagesCommand::ProcessSerials() { |
| 371 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); | 162 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); |
| 372 if (devices_.size() == 0) { | 163 if (devices_.size() == 0) { |
| 373 BrowserThread::PostTask( | 164 BrowserThread::PostTask( |
| 374 BrowserThread::UI, FROM_HERE, | 165 BrowserThread::UI, FROM_HERE, |
| 375 base::Bind(&AdbPagesCommand::Respond, this)); | 166 base::Bind(&AdbPagesCommand::Respond, this)); |
| 376 return; | 167 return; |
| 377 } | 168 } |
| 378 | 169 |
| 379 #if defined(DEBUG_DEVTOOLS) | 170 #if defined(DEBUG_DEVTOOLS) |
| 380 // For desktop remote debugging. | 171 // For desktop remote debugging. |
| 381 if (devices_.back()->serial().empty()) { | 172 if (devices_.back()->serial().empty()) { |
| 382 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = | 173 scoped_refptr<AndroidDevice> device = |
| 383 devices_.back(); | 174 devices_.back(); |
| 384 device->set_model(kLocalChrome); | 175 device->set_model(kLocalChrome); |
| 385 remote_devices_->push_back( | 176 remote_devices_->push_back( |
| 386 new DevToolsAdbBridge::RemoteDevice(device)); | 177 new DevToolsAdbBridge::RemoteDevice(device)); |
| 387 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> remote_browser = | 178 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> remote_browser = |
| 388 new DevToolsAdbBridge::RemoteBrowser( | 179 new DevToolsAdbBridge::RemoteBrowser( |
| 389 adb_thread_, device, std::string()); | 180 adb_thread_, device, std::string()); |
| 390 remote_browser->set_product(kChrome); | 181 remote_browser->set_product(kChrome); |
| 391 remote_devices_->back()->AddBrowser(remote_browser); | 182 remote_devices_->back()->AddBrowser(remote_browser); |
| 392 browsers_.push_back(remote_browser); | 183 browsers_.push_back(remote_browser); |
| 393 device->HttpQuery( | 184 device->HttpQuery( |
| 394 std::string(), kVersionRequest, | 185 std::string(), kVersionRequest, |
| 395 base::Bind(&AdbPagesCommand::ReceivedVersion, this)); | 186 base::Bind(&AdbPagesCommand::ReceivedVersion, this)); |
| 396 return; | 187 return; |
| 397 } | 188 } |
| 398 #endif // defined(DEBUG_DEVTOOLS) | 189 #endif // defined(DEBUG_DEVTOOLS) |
| 399 | 190 |
| 400 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); | 191 scoped_refptr<AndroidDevice> device = devices_.back(); |
| 401 if (device->is_connected()) { | 192 if (device->is_connected()) { |
| 402 device->RunCommand(kDeviceModelCommand, | 193 device->RunCommand(kDeviceModelCommand, |
| 403 base::Bind(&AdbPagesCommand::ReceivedModel, this)); | 194 base::Bind(&AdbPagesCommand::ReceivedModel, this)); |
| 404 } else { | 195 } else { |
| 405 remote_devices_->push_back(new DevToolsAdbBridge::RemoteDevice(device)); | 196 remote_devices_->push_back(new DevToolsAdbBridge::RemoteDevice(device)); |
| 406 devices_.pop_back(); | 197 devices_.pop_back(); |
| 407 ProcessSerials(); | 198 ProcessSerials(); |
| 408 } | 199 } |
| 409 } | 200 } |
| 410 | 201 |
| 411 void AdbPagesCommand::ReceivedModel(int result, const std::string& response) { | 202 void AdbPagesCommand::ReceivedModel(int result, const std::string& response) { |
| 412 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); | 203 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); |
| 413 if (result < 0) { | 204 if (result < 0) { |
| 414 devices_.pop_back(); | 205 devices_.pop_back(); |
| 415 ProcessSerials(); | 206 ProcessSerials(); |
| 416 return; | 207 return; |
| 417 } | 208 } |
| 418 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); | 209 scoped_refptr<AndroidDevice> device = devices_.back(); |
| 419 device->set_model(response); | 210 device->set_model(response); |
| 420 remote_devices_->push_back( | 211 remote_devices_->push_back( |
| 421 new DevToolsAdbBridge::RemoteDevice(device)); | 212 new DevToolsAdbBridge::RemoteDevice(device)); |
| 422 device->RunCommand(kOpenedUnixSocketsCommand, | 213 device->RunCommand(kOpenedUnixSocketsCommand, |
| 423 base::Bind(&AdbPagesCommand::ReceivedSockets, this)); | 214 base::Bind(&AdbPagesCommand::ReceivedSockets, this)); |
| 424 } | 215 } |
| 425 | 216 |
| 426 void AdbPagesCommand::ReceivedSockets(int result, | 217 void AdbPagesCommand::ReceivedSockets(int result, |
| 427 const std::string& response) { | 218 const std::string& response) { |
| 428 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); | 219 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); |
| 429 if (result < 0) { | 220 if (result < 0) { |
| 430 devices_.pop_back(); | 221 devices_.pop_back(); |
| 431 ProcessSerials(); | 222 ProcessSerials(); |
| 432 return; | 223 return; |
| 433 } | 224 } |
| 434 | 225 |
| 435 ParseSocketsList(response); | 226 ParseSocketsList(response); |
| 436 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); | 227 scoped_refptr<AndroidDevice> device = devices_.back(); |
| 437 device->RunCommand(kDumpsysCommand, | 228 device->RunCommand(kDumpsysCommand, |
| 438 base::Bind(&AdbPagesCommand::ReceivedDumpsys, this)); | 229 base::Bind(&AdbPagesCommand::ReceivedDumpsys, this)); |
| 439 } | 230 } |
| 440 | 231 |
| 441 void AdbPagesCommand::ReceivedDumpsys(int result, | 232 void AdbPagesCommand::ReceivedDumpsys(int result, |
| 442 const std::string& response) { | 233 const std::string& response) { |
| 443 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); | 234 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); |
| 444 if (result >= 0) | 235 if (result >= 0) |
| 445 ParseDumpsysResponse(response); | 236 ParseDumpsysResponse(response); |
| 446 | 237 |
| 447 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); | 238 scoped_refptr<AndroidDevice> device = devices_.back(); |
| 448 device->RunCommand(kListProcessesCommand, | 239 device->RunCommand(kListProcessesCommand, |
| 449 base::Bind(&AdbPagesCommand::ReceivedProcesses, this)); | 240 base::Bind(&AdbPagesCommand::ReceivedProcesses, this)); |
| 450 } | 241 } |
| 451 | 242 |
| 452 void AdbPagesCommand::ReceivedProcesses(int result, | 243 void AdbPagesCommand::ReceivedProcesses(int result, |
| 453 const std::string& response) { | 244 const std::string& response) { |
| 454 if (result >= 0) | 245 if (result >= 0) |
| 455 ParseProcessList(response); | 246 ParseProcessList(response); |
| 456 | 247 |
| 457 if (browsers_.size() == 0) { | 248 if (browsers_.size() == 0) { |
| 458 devices_.pop_back(); | 249 devices_.pop_back(); |
| 459 ProcessSerials(); | 250 ProcessSerials(); |
| 460 } else { | 251 } else { |
| 461 ProcessSockets(); | 252 ProcessSockets(); |
| 462 } | 253 } |
| 463 } | 254 } |
| 464 | 255 |
| 465 void AdbPagesCommand::ProcessSockets() { | 256 void AdbPagesCommand::ProcessSockets() { |
| 466 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); | 257 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); |
| 467 if (browsers_.size() == 0) { | 258 if (browsers_.size() == 0) { |
| 468 devices_.pop_back(); | 259 devices_.pop_back(); |
| 469 ProcessSerials(); | 260 ProcessSerials(); |
| 470 } else { | 261 } else { |
| 471 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); | 262 scoped_refptr<AndroidDevice> device = devices_.back(); |
| 472 device->HttpQuery(browsers_.back()->socket(), kVersionRequest, | 263 device->HttpQuery(browsers_.back()->socket(), kVersionRequest, |
| 473 base::Bind(&AdbPagesCommand::ReceivedVersion, this)); | 264 base::Bind(&AdbPagesCommand::ReceivedVersion, this)); |
| 474 } | 265 } |
| 475 } | 266 } |
| 476 | 267 |
| 477 void AdbPagesCommand::ReceivedVersion(int result, | 268 void AdbPagesCommand::ReceivedVersion(int result, |
| 478 const std::string& response) { | 269 const std::string& response) { |
| 479 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); | 270 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); |
| 480 if (result < 0) { | 271 if (result < 0) { |
| 481 browsers_.pop_back(); | 272 browsers_.pop_back(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 494 if (parts.size() == 2) { | 285 if (parts.size() == 2) { |
| 495 if (parts[0] != "Version") // WebView has this for legacy reasons. | 286 if (parts[0] != "Version") // WebView has this for legacy reasons. |
| 496 browsers_.back()->set_product(parts[0]); | 287 browsers_.back()->set_product(parts[0]); |
| 497 browsers_.back()->set_version(parts[1]); | 288 browsers_.back()->set_version(parts[1]); |
| 498 } else { | 289 } else { |
| 499 browsers_.back()->set_version(browser); | 290 browsers_.back()->set_version(browser); |
| 500 } | 291 } |
| 501 } | 292 } |
| 502 } | 293 } |
| 503 | 294 |
| 504 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = devices_.back(); | 295 scoped_refptr<AndroidDevice> device = devices_.back(); |
| 505 device->HttpQuery(browsers_.back()->socket(), kPageListRequest, | 296 device->HttpQuery(browsers_.back()->socket(), kPageListRequest, |
| 506 base::Bind(&AdbPagesCommand::ReceivedPages, this)); | 297 base::Bind(&AdbPagesCommand::ReceivedPages, this)); |
| 507 } | 298 } |
| 508 | 299 |
| 509 void AdbPagesCommand::ReceivedPages(int result, | 300 void AdbPagesCommand::ReceivedPages(int result, |
| 510 const std::string& response) { | 301 const std::string& response) { |
| 511 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); | 302 DCHECK_EQ(adb_thread_->message_loop(), base::MessageLoop::current()); |
| 512 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> browser = browsers_.back(); | 303 scoped_refptr<DevToolsAdbBridge::RemoteBrowser> browser = browsers_.back(); |
| 513 browsers_.pop_back(); | 304 browsers_.pop_back(); |
| 514 if (result < 0) { | 305 if (result < 0) { |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 | 438 |
| 648 remote_devices_->back()->set_screen_size(gfx::Size(width, height)); | 439 remote_devices_->back()->set_screen_size(gfx::Size(width, height)); |
| 649 } | 440 } |
| 650 | 441 |
| 651 | 442 |
| 652 // AdbProtocolCommand --------------------------------------------------------- | 443 // AdbProtocolCommand --------------------------------------------------------- |
| 653 | 444 |
| 654 class AdbProtocolCommand : public AdbWebSocket::Delegate { | 445 class AdbProtocolCommand : public AdbWebSocket::Delegate { |
| 655 public: | 446 public: |
| 656 AdbProtocolCommand( | 447 AdbProtocolCommand( |
| 657 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, | 448 scoped_refptr<RefCountedAdbThread> adb_thread, |
| 658 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, | 449 scoped_refptr<AndroidDevice> device, |
| 659 const std::string& socket_name, | 450 const std::string& socket_name, |
| 660 const std::string& debug_url, | 451 const std::string& debug_url, |
| 661 const std::string& command); | 452 const std::string& command); |
| 662 | 453 |
| 663 private: | 454 private: |
| 664 virtual void OnSocketOpened() OVERRIDE; | 455 virtual void OnSocketOpened() OVERRIDE; |
| 665 virtual void OnFrameRead(const std::string& message) OVERRIDE; | 456 virtual void OnFrameRead(const std::string& message) OVERRIDE; |
| 666 virtual void OnSocketClosed(bool closed_by_device) OVERRIDE; | 457 virtual void OnSocketClosed(bool closed_by_device) OVERRIDE; |
| 667 virtual bool ProcessIncomingMessage(const std::string& message) OVERRIDE; | 458 virtual bool ProcessIncomingMessage(const std::string& message) OVERRIDE; |
| 668 | 459 |
| 669 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread_; | 460 scoped_refptr<RefCountedAdbThread> adb_thread_; |
| 670 const std::string command_; | 461 const std::string command_; |
| 671 scoped_refptr<AdbWebSocket> web_socket_; | 462 scoped_refptr<AdbWebSocket> web_socket_; |
| 672 | 463 |
| 673 DISALLOW_COPY_AND_ASSIGN(AdbProtocolCommand); | 464 DISALLOW_COPY_AND_ASSIGN(AdbProtocolCommand); |
| 674 }; | 465 }; |
| 675 | 466 |
| 676 AdbProtocolCommand::AdbProtocolCommand( | 467 AdbProtocolCommand::AdbProtocolCommand( |
| 677 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, | 468 scoped_refptr<RefCountedAdbThread> adb_thread, |
| 678 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, | 469 scoped_refptr<AndroidDevice> device, |
| 679 const std::string& socket_name, | 470 const std::string& socket_name, |
| 680 const std::string& debug_url, | 471 const std::string& debug_url, |
| 681 const std::string& command) | 472 const std::string& command) |
| 682 : adb_thread_(adb_thread), | 473 : adb_thread_(adb_thread), |
| 683 command_(command) { | 474 command_(command) { |
| 684 web_socket_ = new AdbWebSocket( | 475 web_socket_ = new AdbWebSocket( |
| 685 device, socket_name, debug_url, adb_thread_->message_loop(), this); | 476 device, socket_name, debug_url, adb_thread_->message_loop(), this); |
| 686 } | 477 } |
| 687 | 478 |
| 688 void AdbProtocolCommand::OnSocketOpened() { | 479 void AdbProtocolCommand::OnSocketOpened() { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 704 | 495 |
| 705 const char kDevToolsChannelNameFormat[] = "%s_devtools_remote"; | 496 const char kDevToolsChannelNameFormat[] = "%s_devtools_remote"; |
| 706 | 497 |
| 707 class AgentHostDelegate; | 498 class AgentHostDelegate; |
| 708 | 499 |
| 709 typedef std::map<std::string, AgentHostDelegate*> AgentHostDelegates; | 500 typedef std::map<std::string, AgentHostDelegate*> AgentHostDelegates; |
| 710 | 501 |
| 711 base::LazyInstance<AgentHostDelegates>::Leaky g_host_delegates = | 502 base::LazyInstance<AgentHostDelegates>::Leaky g_host_delegates = |
| 712 LAZY_INSTANCE_INITIALIZER; | 503 LAZY_INSTANCE_INITIALIZER; |
| 713 | 504 |
| 714 DevToolsAdbBridge::Wrapper::Wrapper(Profile* profile) | 505 DevToolsAdbBridge::Wrapper::Wrapper() { |
| 715 : bridge_(new DevToolsAdbBridge(profile)) { | 506 bridge_ = new DevToolsAdbBridge(); |
| 716 } | 507 } |
| 717 | 508 |
| 718 DevToolsAdbBridge::Wrapper::~Wrapper() { | 509 DevToolsAdbBridge::Wrapper::~Wrapper() { |
| 719 } | 510 } |
| 720 | 511 |
| 721 DevToolsAdbBridge* DevToolsAdbBridge::Wrapper::Get() { | 512 DevToolsAdbBridge* DevToolsAdbBridge::Wrapper::Get() { |
| 722 return bridge_.get(); | 513 return bridge_.get(); |
| 723 } | 514 } |
| 724 | 515 |
| 725 // static | 516 // static |
| (...skipping 13 matching lines...) Expand all Loading... |
| 739 DevToolsAdbBridge::Factory::Factory() | 530 DevToolsAdbBridge::Factory::Factory() |
| 740 : BrowserContextKeyedServiceFactory( | 531 : BrowserContextKeyedServiceFactory( |
| 741 "DevToolsAdbBridge", | 532 "DevToolsAdbBridge", |
| 742 BrowserContextDependencyManager::GetInstance()) {} | 533 BrowserContextDependencyManager::GetInstance()) {} |
| 743 | 534 |
| 744 DevToolsAdbBridge::Factory::~Factory() {} | 535 DevToolsAdbBridge::Factory::~Factory() {} |
| 745 | 536 |
| 746 BrowserContextKeyedService* | 537 BrowserContextKeyedService* |
| 747 DevToolsAdbBridge::Factory::BuildServiceInstanceFor( | 538 DevToolsAdbBridge::Factory::BuildServiceInstanceFor( |
| 748 content::BrowserContext* context) const { | 539 content::BrowserContext* context) const { |
| 749 return new DevToolsAdbBridge::Wrapper(Profile::FromBrowserContext(context)); | 540 return new DevToolsAdbBridge::Wrapper(); |
| 750 } | 541 } |
| 751 | 542 |
| 752 | 543 |
| 753 // DevToolsAdbBridge::AndroidDevice ------------------------------------------- | |
| 754 | |
| 755 DevToolsAdbBridge::AndroidDevice::AndroidDevice(const std::string& serial, | |
| 756 bool is_connected) | |
| 757 : serial_(serial), | |
| 758 is_connected_(is_connected) { | |
| 759 } | |
| 760 | |
| 761 void DevToolsAdbBridge::AndroidDevice::HttpQuery( | |
| 762 const std::string& la_name, | |
| 763 const std::string& request, | |
| 764 const CommandCallback& callback) { | |
| 765 OpenSocket(la_name, base::Bind(&AndroidDevice::OnHttpSocketOpened, this, | |
| 766 request, callback)); | |
| 767 } | |
| 768 | |
| 769 void DevToolsAdbBridge::AndroidDevice::HttpUpgrade( | |
| 770 const std::string& la_name, | |
| 771 const std::string& request, | |
| 772 const SocketCallback& callback) { | |
| 773 OpenSocket(la_name, base::Bind(&AndroidDevice::OnHttpSocketOpened2, this, | |
| 774 request, callback)); | |
| 775 } | |
| 776 | |
| 777 DevToolsAdbBridge::AndroidDevice::~AndroidDevice() { | |
| 778 } | |
| 779 | |
| 780 void DevToolsAdbBridge::AndroidDevice::OnHttpSocketOpened( | |
| 781 const std::string& request, | |
| 782 const CommandCallback& callback, | |
| 783 int result, | |
| 784 net::StreamSocket* socket) { | |
| 785 if (result != net::OK) { | |
| 786 callback.Run(result, std::string()); | |
| 787 return; | |
| 788 } | |
| 789 AdbClientSocket::HttpQuery(socket, request, callback); | |
| 790 } | |
| 791 | |
| 792 void DevToolsAdbBridge::AndroidDevice::OnHttpSocketOpened2( | |
| 793 const std::string& request, | |
| 794 const SocketCallback& callback, | |
| 795 int result, | |
| 796 net::StreamSocket* socket) { | |
| 797 if (result != net::OK) { | |
| 798 callback.Run(result, NULL); | |
| 799 return; | |
| 800 } | |
| 801 AdbClientSocket::HttpQuery(socket, request, callback); | |
| 802 } | |
| 803 | |
| 804 | |
| 805 // AgentHostDelegate ---------------------------------------------------------- | 544 // AgentHostDelegate ---------------------------------------------------------- |
| 806 | 545 |
| 807 class AgentHostDelegate : public content::DevToolsExternalAgentProxyDelegate, | 546 class AgentHostDelegate : public content::DevToolsExternalAgentProxyDelegate, |
| 808 public AdbWebSocket::Delegate { | 547 public AdbWebSocket::Delegate { |
| 809 public: | 548 public: |
| 810 AgentHostDelegate( | 549 AgentHostDelegate( |
| 811 const std::string& id, | 550 const std::string& id, |
| 812 scoped_refptr<DevToolsAdbBridge::AndroidDevice> device, | 551 scoped_refptr<AndroidDevice> device, |
| 813 const std::string& socket_name, | 552 const std::string& socket_name, |
| 814 const std::string& debug_url, | 553 const std::string& debug_url, |
| 815 const std::string& frontend_url, | 554 const std::string& frontend_url, |
| 816 base::MessageLoop* adb_message_loop, | 555 base::MessageLoop* adb_message_loop, |
| 817 Profile* profile) | 556 Profile* profile) |
| 818 : id_(id), | 557 : id_(id), |
| 819 serial_(device->serial()), | 558 serial_(device->serial()), |
| 820 frontend_url_(frontend_url), | 559 frontend_url_(frontend_url), |
| 821 adb_message_loop_(adb_message_loop), | 560 adb_message_loop_(adb_message_loop), |
| 822 profile_(profile) { | 561 profile_(profile) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 | 613 |
| 875 scoped_ptr<content::DevToolsExternalAgentProxy> proxy_; | 614 scoped_ptr<content::DevToolsExternalAgentProxy> proxy_; |
| 876 scoped_refptr<AdbWebSocket> web_socket_; | 615 scoped_refptr<AdbWebSocket> web_socket_; |
| 877 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate); | 616 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate); |
| 878 }; | 617 }; |
| 879 | 618 |
| 880 | 619 |
| 881 // DevToolsAdbBridge::RemotePage ---------------------------------------------- | 620 // DevToolsAdbBridge::RemotePage ---------------------------------------------- |
| 882 | 621 |
| 883 DevToolsAdbBridge::RemotePage::RemotePage( | 622 DevToolsAdbBridge::RemotePage::RemotePage( |
| 884 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, | 623 scoped_refptr<RefCountedAdbThread> adb_thread, |
| 885 scoped_refptr<AndroidDevice> device, | 624 scoped_refptr<AndroidDevice> device, |
| 886 const std::string& socket, | 625 const std::string& socket, |
| 887 const base::DictionaryValue& value) | 626 const base::DictionaryValue& value) |
| 888 : adb_thread_(adb_thread), | 627 : adb_thread_(adb_thread), |
| 889 device_(device), | 628 device_(device), |
| 890 socket_(socket) { | 629 socket_(socket) { |
| 891 value.GetString("id", &id_); | 630 value.GetString("id", &id_); |
| 892 value.GetString("url", &url_); | 631 value.GetString("url", &url_); |
| 893 value.GetString("title", &title_); | 632 value.GetString("title", &title_); |
| 894 value.GetString("description", &description_); | 633 value.GetString("description", &description_); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 958 return; | 697 return; |
| 959 DevToolsProtocol::Command command(1, method, params); | 698 DevToolsProtocol::Command command(1, method, params); |
| 960 new AdbProtocolCommand( | 699 new AdbProtocolCommand( |
| 961 adb_thread_, device_, socket_, debug_url_, command.Serialize()); | 700 adb_thread_, device_, socket_, debug_url_, command.Serialize()); |
| 962 } | 701 } |
| 963 | 702 |
| 964 DevToolsAdbBridge::RemotePage::~RemotePage() { | 703 DevToolsAdbBridge::RemotePage::~RemotePage() { |
| 965 } | 704 } |
| 966 | 705 |
| 967 void DevToolsAdbBridge::RemotePage::RequestActivate( | 706 void DevToolsAdbBridge::RemotePage::RequestActivate( |
| 968 const CommandCallback& callback) { | 707 const AndroidDevice::CommandCallback& callback) { |
| 969 std::string request = base::StringPrintf(kActivatePageRequest, id_.c_str()); | 708 std::string request = base::StringPrintf(kActivatePageRequest, id_.c_str()); |
| 970 adb_thread_->message_loop()->PostTask(FROM_HERE, | 709 adb_thread_->message_loop()->PostTask(FROM_HERE, |
| 971 base::Bind(&AndroidDevice::HttpQuery, | 710 base::Bind(&AndroidDevice::HttpQuery, |
| 972 device_, socket_, request, callback)); | 711 device_, socket_, request, callback)); |
| 973 } | 712 } |
| 974 | 713 |
| 975 void DevToolsAdbBridge::RemotePage::InspectOnHandlerThread( | 714 void DevToolsAdbBridge::RemotePage::InspectOnHandlerThread( |
| 976 Profile* profile, int result, const std::string& response) { | 715 Profile* profile, int result, const std::string& response) { |
| 977 BrowserThread::PostTask( | 716 BrowserThread::PostTask( |
| 978 BrowserThread::UI, FROM_HERE, | 717 BrowserThread::UI, FROM_HERE, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 989 new AgentHostDelegate( | 728 new AgentHostDelegate( |
| 990 agent_id_, device_, socket_, debug_url_, | 729 agent_id_, device_, socket_, debug_url_, |
| 991 frontend_url_, adb_thread_->message_loop(), profile); | 730 frontend_url_, adb_thread_->message_loop(), profile); |
| 992 } | 731 } |
| 993 } | 732 } |
| 994 | 733 |
| 995 | 734 |
| 996 // DevToolsAdbBridge::RemoteBrowser ------------------------------------------- | 735 // DevToolsAdbBridge::RemoteBrowser ------------------------------------------- |
| 997 | 736 |
| 998 DevToolsAdbBridge::RemoteBrowser::RemoteBrowser( | 737 DevToolsAdbBridge::RemoteBrowser::RemoteBrowser( |
| 999 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> adb_thread, | 738 scoped_refptr<RefCountedAdbThread> adb_thread, |
| 1000 scoped_refptr<AndroidDevice> device, | 739 scoped_refptr<AndroidDevice> device, |
| 1001 const std::string& socket) | 740 const std::string& socket) |
| 1002 : adb_thread_(adb_thread), | 741 : adb_thread_(adb_thread), |
| 1003 device_(device), | 742 device_(device), |
| 1004 socket_(socket) { | 743 socket_(socket) { |
| 1005 } | 744 } |
| 1006 | 745 |
| 1007 void DevToolsAdbBridge::RemoteBrowser::Open(const std::string& url) { | 746 void DevToolsAdbBridge::RemoteBrowser::Open(const std::string& url) { |
| 1008 adb_thread_->message_loop()->PostTask(FROM_HERE, | 747 adb_thread_->message_loop()->PostTask(FROM_HERE, |
| 1009 base::Bind(&AndroidDevice::HttpQuery, | 748 base::Bind(&AndroidDevice::HttpQuery, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1058 | 797 |
| 1059 void DevToolsAdbBridge::RemoteDevice::AddBrowser( | 798 void DevToolsAdbBridge::RemoteDevice::AddBrowser( |
| 1060 scoped_refptr<RemoteBrowser> browser) { | 799 scoped_refptr<RemoteBrowser> browser) { |
| 1061 browsers_.push_back(browser); | 800 browsers_.push_back(browser); |
| 1062 } | 801 } |
| 1063 | 802 |
| 1064 DevToolsAdbBridge::RemoteDevice::~RemoteDevice() { | 803 DevToolsAdbBridge::RemoteDevice::~RemoteDevice() { |
| 1065 } | 804 } |
| 1066 | 805 |
| 1067 | 806 |
| 1068 // DevToolsAdbBridge::RefCountedAdbThread ------------------------------------- | |
| 1069 | |
| 1070 DevToolsAdbBridge::RefCountedAdbThread* | |
| 1071 DevToolsAdbBridge::RefCountedAdbThread::instance_ = NULL; | |
| 1072 | |
| 1073 // static | |
| 1074 scoped_refptr<DevToolsAdbBridge::RefCountedAdbThread> | |
| 1075 DevToolsAdbBridge::RefCountedAdbThread::GetInstance() { | |
| 1076 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 1077 if (!instance_) | |
| 1078 new RefCountedAdbThread(); | |
| 1079 return instance_; | |
| 1080 } | |
| 1081 | |
| 1082 DevToolsAdbBridge::RefCountedAdbThread::RefCountedAdbThread() { | |
| 1083 instance_ = this; | |
| 1084 thread_ = new base::Thread(kDevToolsAdbBridgeThreadName); | |
| 1085 base::Thread::Options options; | |
| 1086 options.message_loop_type = base::MessageLoop::TYPE_IO; | |
| 1087 if (!thread_->StartWithOptions(options)) { | |
| 1088 delete thread_; | |
| 1089 thread_ = NULL; | |
| 1090 } | |
| 1091 } | |
| 1092 | |
| 1093 base::MessageLoop* DevToolsAdbBridge::RefCountedAdbThread::message_loop() { | |
| 1094 return thread_ ? thread_->message_loop() : NULL; | |
| 1095 } | |
| 1096 | |
| 1097 // static | |
| 1098 void DevToolsAdbBridge::RefCountedAdbThread::StopThread(base::Thread* thread) { | |
| 1099 thread->Stop(); | |
| 1100 } | |
| 1101 | |
| 1102 DevToolsAdbBridge::RefCountedAdbThread::~RefCountedAdbThread() { | |
| 1103 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 1104 instance_ = NULL; | |
| 1105 if (!thread_) | |
| 1106 return; | |
| 1107 // Shut down thread on FILE thread to join into IO. | |
| 1108 BrowserThread::PostTask( | |
| 1109 BrowserThread::FILE, FROM_HERE, | |
| 1110 base::Bind(&RefCountedAdbThread::StopThread, thread_)); | |
| 1111 } | |
| 1112 | |
| 1113 | |
| 1114 // DevToolsAdbBridge ---------------------------------------------------------- | 807 // DevToolsAdbBridge ---------------------------------------------------------- |
| 1115 | 808 |
| 1116 DevToolsAdbBridge::DevToolsAdbBridge(Profile* profile) | 809 DevToolsAdbBridge::DevToolsAdbBridge() |
| 1117 : adb_thread_(RefCountedAdbThread::GetInstance()), | 810 : adb_thread_(RefCountedAdbThread::GetInstance()), |
| 1118 has_message_loop_(adb_thread_->message_loop() != NULL), | 811 has_message_loop_(adb_thread_->message_loop() != NULL) { |
| 1119 discover_usb_devices_(false) { | |
| 1120 rsa_key_.reset(AndroidRSAPrivateKey(profile)); | |
| 1121 } | 812 } |
| 1122 | 813 |
| 1123 void DevToolsAdbBridge::AddListener(Listener* listener) { | 814 void DevToolsAdbBridge::AddListener(Listener* listener) { |
| 1124 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 815 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1125 if (listeners_.empty()) | 816 if (listeners_.empty()) |
| 1126 RequestRemoteDevices(); | 817 RequestRemoteDevices(); |
| 1127 listeners_.push_back(listener); | 818 listeners_.push_back(listener); |
| 1128 } | 819 } |
| 1129 | 820 |
| 1130 void DevToolsAdbBridge::RemoveListener(Listener* listener) { | 821 void DevToolsAdbBridge::RemoveListener(Listener* listener) { |
| 1131 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 822 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1132 Listeners::iterator it = | 823 Listeners::iterator it = |
| 1133 std::find(listeners_.begin(), listeners_.end(), listener); | 824 std::find(listeners_.begin(), listeners_.end(), listener); |
| 1134 DCHECK(it != listeners_.end()); | 825 DCHECK(it != listeners_.end()); |
| 1135 listeners_.erase(it); | 826 listeners_.erase(it); |
| 1136 } | 827 } |
| 1137 | 828 |
| 1138 void DevToolsAdbBridge::CountDevices( | |
| 1139 const base::Callback<void(int)>& callback) { | |
| 1140 if (discover_usb_devices_) { | |
| 1141 // Count raw devices, adb included. | |
| 1142 AndroidUsbDevice::CountDevices(callback); | |
| 1143 return; | |
| 1144 } | |
| 1145 new AdbCountDevicesCommand(adb_thread_, callback); | |
| 1146 } | |
| 1147 | |
| 1148 DevToolsAdbBridge::~DevToolsAdbBridge() { | 829 DevToolsAdbBridge::~DevToolsAdbBridge() { |
| 1149 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 830 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1150 DCHECK(listeners_.empty()); | 831 DCHECK(listeners_.empty()); |
| 1151 } | 832 } |
| 1152 | 833 |
| 1153 void DevToolsAdbBridge::RequestRemoteDevices() { | 834 void DevToolsAdbBridge::RequestRemoteDevices() { |
| 1154 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 835 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1155 if (!has_message_loop_) | 836 if (!has_message_loop_) |
| 1156 return; | 837 return; |
| 838 |
| 1157 new AdbPagesCommand( | 839 new AdbPagesCommand( |
| 1158 adb_thread_, rsa_key_.get(), discover_usb_devices_, | 840 adb_thread_, device_providers_, |
| 1159 base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this)); | 841 base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this)); |
| 1160 } | 842 } |
| 1161 | 843 |
| 1162 void DevToolsAdbBridge::ReceivedRemoteDevices(RemoteDevices* devices_ptr) { | 844 void DevToolsAdbBridge::ReceivedRemoteDevices(RemoteDevices* devices_ptr) { |
| 1163 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 845 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1164 | 846 |
| 1165 scoped_ptr<RemoteDevices> devices(devices_ptr); | 847 scoped_ptr<RemoteDevices> devices(devices_ptr); |
| 1166 | 848 |
| 1167 Listeners copy(listeners_); | 849 Listeners copy(listeners_); |
| 1168 for (Listeners::iterator it = copy.begin(); it != copy.end(); ++it) | 850 for (Listeners::iterator it = copy.begin(); it != copy.end(); ++it) |
| 1169 (*it)->RemoteDevicesChanged(devices.get()); | 851 (*it)->RemoteDevicesChanged(devices.get()); |
| 1170 | 852 |
| 1171 if (listeners_.empty()) | 853 if (listeners_.empty()) |
| 1172 return; | 854 return; |
| 1173 | 855 |
| 1174 BrowserThread::PostDelayedTask( | 856 BrowserThread::PostDelayedTask( |
| 1175 BrowserThread::UI, | 857 BrowserThread::UI, |
| 1176 FROM_HERE, | 858 FROM_HERE, |
| 1177 base::Bind(&DevToolsAdbBridge::RequestRemoteDevices, this), | 859 base::Bind(&DevToolsAdbBridge::RequestRemoteDevices, this), |
| 1178 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); | 860 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); |
| 1179 } | 861 } |
| OLD | NEW |