| Index: chrome/browser/devtools/device/android_device_manager.cc
|
| diff --git a/chrome/browser/devtools/device/android_device_manager.cc b/chrome/browser/devtools/device/android_device_manager.cc
|
| index 6184fe560fee2fc06495a6f00918d12742ff49ab..4b404267455820fc8c9a8a056abb2cc716d4e02d 100644
|
| --- a/chrome/browser/devtools/device/android_device_manager.cc
|
| +++ b/chrome/browser/devtools/device/android_device_manager.cc
|
| @@ -15,6 +15,8 @@ namespace {
|
|
|
| const int kBufferSize = 16 * 1024;
|
|
|
| +static const char kModelOffline[] = "Offline";
|
| +
|
| static const char kHttpGetRequest[] = "GET %s HTTP/1.1\r\n\r\n";
|
|
|
| static const char kWebSocketUpgradeRequest[] = "GET %s HTTP/1.1\r\n"
|
| @@ -24,6 +26,31 @@ static const char kWebSocketUpgradeRequest[] = "GET %s HTTP/1.1\r\n"
|
| "Sec-WebSocket-Version: 13\r\n"
|
| "\r\n";
|
|
|
| +static void PostDeviceInfoCallback(
|
| + scoped_refptr<base::MessageLoopProxy> response_message_loop,
|
| + const AndroidDeviceManager::DeviceInfoCallback& callback,
|
| + const AndroidDeviceManager::DeviceInfo& device_info) {
|
| + response_message_loop->PostTask(FROM_HERE, base::Bind(callback, device_info));
|
| +}
|
| +
|
| +static void PostCommandCallback(
|
| + scoped_refptr<base::MessageLoopProxy> response_message_loop,
|
| + const AndroidDeviceManager::CommandCallback& callback,
|
| + int result,
|
| + const std::string& response) {
|
| + response_message_loop->PostTask(FROM_HERE,
|
| + base::Bind(callback, result, response));
|
| +}
|
| +
|
| +static void PostSocketCallback(
|
| + scoped_refptr<base::MessageLoopProxy> response_message_loop,
|
| + const AndroidDeviceManager::SocketCallback& callback,
|
| + int result,
|
| + net::StreamSocket* socket) {
|
| + response_message_loop->PostTask(FROM_HERE,
|
| + base::Bind(callback, result, socket));
|
| +}
|
| +
|
| class HttpRequest {
|
| public:
|
| typedef AndroidDeviceManager::CommandCallback CommandCallback;
|
| @@ -53,11 +80,9 @@ class HttpRequest {
|
|
|
| private:
|
| HttpRequest(net::StreamSocket* socket,
|
| - const std::string& request,
|
| - const CommandCallback& callback)
|
| - : socket_(socket),
|
| - command_callback_(callback),
|
| - body_pos_(0) {
|
| + const std::string& request,
|
| + const CommandCallback& callback)
|
| + : socket_(socket), command_callback_(callback), body_pos_(0) {
|
| SendRequest(request);
|
| }
|
|
|
| @@ -174,33 +199,102 @@ class HttpRequest {
|
| size_t body_pos_;
|
| };
|
|
|
| +class DevicesRequest : public base::RefCountedThreadSafe<DevicesRequest> {
|
| + public:
|
| + typedef AndroidDeviceManager::DeviceInfo DeviceInfo;
|
| + typedef AndroidDeviceManager::DeviceProvider DeviceProvider;
|
| + typedef AndroidDeviceManager::DeviceProviders DeviceProviders;
|
| + typedef AndroidDeviceManager::DeviceDescriptors DeviceDescriptors;
|
| + typedef base::Callback<void(const DeviceDescriptors&)> DescriptorsCallback;
|
| +
|
| + static void Start(scoped_refptr<base::MessageLoopProxy> device_message_loop,
|
| + const DeviceProviders& providers,
|
| + const DescriptorsCallback& callback) {
|
| + // Don't keep counted reference on calling thread;
|
| + DevicesRequest* request = new DevicesRequest(callback);
|
| + // Avoid destruction while sending requests
|
| + request->AddRef();
|
| + for (DeviceProviders::const_iterator it = providers.begin();
|
| + it != providers.end();
|
| + ++it) {
|
| + device_message_loop->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(
|
| + &DeviceProvider::QueryDevices,
|
| + *it,
|
| + base::Bind(&DevicesRequest::ProcessSerials, request, *it)));
|
| + }
|
| + device_message_loop->ReleaseSoon(FROM_HERE, request);
|
| + }
|
| +
|
| + private:
|
| + explicit DevicesRequest(const DescriptorsCallback& callback)
|
| + : response_message_loop_(base::MessageLoopProxy::current()),
|
| + callback_(callback) {}
|
| +
|
| + friend class base::RefCountedThreadSafe<DevicesRequest>;
|
| + ~DevicesRequest() {
|
| + response_message_loop_->PostTask(FROM_HERE,
|
| + base::Bind(callback_, descriptors_));
|
| + }
|
| +
|
| + typedef std::vector<std::string> Serials;
|
| +
|
| + void ProcessSerials(scoped_refptr<DeviceProvider> provider,
|
| + const Serials& serials) {
|
| + for (Serials::const_iterator it = serials.begin(); it != serials.end();
|
| + ++it) {
|
| + descriptors_.resize(descriptors_.size() + 1);
|
| + descriptors_.back().provider = provider;
|
| + descriptors_.back().serial = *it;
|
| + }
|
| + }
|
| +
|
| + scoped_refptr<base::MessageLoopProxy> response_message_loop_;
|
| + DescriptorsCallback callback_;
|
| + DeviceDescriptors descriptors_;
|
| +};
|
| +
|
| } // namespace
|
|
|
| AndroidDeviceManager::BrowserInfo::BrowserInfo()
|
| : type(kTypeOther) {
|
| }
|
|
|
| -AndroidDeviceManager::DeviceInfo::DeviceInfo() {
|
| +AndroidDeviceManager::DeviceInfo::DeviceInfo()
|
| + : model(kModelOffline), connected(false) {
|
| }
|
|
|
| AndroidDeviceManager::DeviceInfo::~DeviceInfo() {
|
| }
|
|
|
| -AndroidDeviceManager::Device::Device(const std::string& serial,
|
| - bool is_connected)
|
| - : serial_(serial),
|
| - is_connected_(is_connected) {
|
| +void AndroidDeviceManager::DeviceProvider::SendJsonRequest(
|
| + const std::string& serial,
|
| + const std::string& socket_name,
|
| + const std::string& request,
|
| + const CommandCallback& callback) {
|
| + OpenSocket(serial,
|
| + socket_name,
|
| + base::Bind(&HttpRequest::CommandRequest,
|
| + base::StringPrintf(kHttpGetRequest, request.c_str()),
|
| + callback));
|
| }
|
|
|
| -void AndroidDeviceManager::Device::HttpQuery(const std::string& socket_name,
|
| - const std::string& path,
|
| - const CommandCallback& callback) {
|
| - std::string request(base::StringPrintf(kHttpGetRequest, path.c_str()));
|
| - OpenSocket(socket_name,
|
| - base::Bind(&HttpRequest::CommandRequest, request, callback));
|
| +void AndroidDeviceManager::DeviceProvider::HttpUpgrade(
|
| + const std::string& serial,
|
| + const std::string& socket_name,
|
| + const std::string& url,
|
| + const SocketCallback& callback) {
|
| + OpenSocket(
|
| + serial,
|
| + socket_name,
|
| + base::Bind(&HttpRequest::SocketRequest,
|
| + base::StringPrintf(kWebSocketUpgradeRequest, url.c_str()),
|
| + callback));
|
| }
|
|
|
| -AndroidDeviceManager::Device::~Device() {
|
| +void AndroidDeviceManager::DeviceProvider::ReleaseDevice(
|
| + const std::string& serial) {
|
| }
|
|
|
| AndroidDeviceManager::DeviceProvider::DeviceProvider() {
|
| @@ -209,131 +303,120 @@ AndroidDeviceManager::DeviceProvider::DeviceProvider() {
|
| AndroidDeviceManager::DeviceProvider::~DeviceProvider() {
|
| }
|
|
|
| -// static
|
| -scoped_refptr<AndroidDeviceManager> AndroidDeviceManager::Create() {
|
| - return new AndroidDeviceManager();
|
| +void AndroidDeviceManager::Device::QueryDeviceInfo(
|
| + const DeviceInfoCallback& callback) {
|
| + device_message_loop_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&DeviceProvider::QueryDeviceInfo,
|
| + provider_,
|
| + serial_,
|
| + base::Bind(&PostDeviceInfoCallback,
|
| + base::MessageLoopProxy::current(),
|
| + callback)));
|
| }
|
|
|
| -void AndroidDeviceManager::QueryDevices(
|
| - const DeviceProviders& providers,
|
| - const QueryDevicesCallback& callback) {
|
| - DCHECK(CalledOnValidThread());
|
| - stopped_ = false;
|
| - Devices empty;
|
| - QueryNextProvider(callback, providers, empty, empty);
|
| +void AndroidDeviceManager::Device::OpenSocket(const std::string& socket_name,
|
| + const SocketCallback& callback) {
|
| + device_message_loop_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&DeviceProvider::OpenSocket,
|
| + provider_,
|
| + serial_,
|
| + socket_name,
|
| + base::Bind(&PostSocketCallback,
|
| + base::MessageLoopProxy::current(),
|
| + callback)));
|
| }
|
|
|
| -void AndroidDeviceManager::Stop() {
|
| - DCHECK(CalledOnValidThread());
|
| - stopped_ = true;
|
| - devices_.clear();
|
| +void AndroidDeviceManager::Device::SendJsonRequest(
|
| + const std::string& socket_name,
|
| + const std::string& request,
|
| + const CommandCallback& callback) {
|
| + device_message_loop_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&DeviceProvider::SendJsonRequest,
|
| + provider_,
|
| + serial_,
|
| + socket_name,
|
| + request,
|
| + base::Bind(&PostCommandCallback,
|
| + base::MessageLoopProxy::current(),
|
| + callback)));
|
| }
|
|
|
| -bool AndroidDeviceManager::IsConnected(const std::string& serial) {
|
| - DCHECK(CalledOnValidThread());
|
| - Device* device = FindDevice(serial);
|
| - return device && device->is_connected();
|
| +void AndroidDeviceManager::Device::HttpUpgrade(const std::string& socket_name,
|
| + const std::string& url,
|
| + const SocketCallback& callback) {
|
| + device_message_loop_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&DeviceProvider::HttpUpgrade,
|
| + provider_,
|
| + serial_,
|
| + socket_name,
|
| + url,
|
| + base::Bind(&PostSocketCallback,
|
| + base::MessageLoopProxy::current(),
|
| + callback)));
|
| }
|
|
|
| -void AndroidDeviceManager::QueryDeviceInfo(const std::string& serial,
|
| - const DeviceInfoCallback& callback) {
|
| - DCHECK(CalledOnValidThread());
|
| - Device* device = FindDevice(serial);
|
| - if (device)
|
| - device->QueryDeviceInfo(callback);
|
| - else
|
| - callback.Run(DeviceInfo());
|
| +AndroidDeviceManager::Device::Device(
|
| + scoped_refptr<base::MessageLoopProxy> device_message_loop,
|
| + const scoped_refptr<DeviceProvider>& provider,
|
| + const std::string& serial)
|
| + : device_message_loop_(device_message_loop),
|
| + provider_(provider),
|
| + serial_(serial),
|
| + weak_factory_(this) {
|
| }
|
|
|
| -void AndroidDeviceManager::OpenSocket(
|
| - const std::string& serial,
|
| - const std::string& socket_name,
|
| - const SocketCallback& callback) {
|
| - DCHECK(CalledOnValidThread());
|
| - Device* device = FindDevice(serial);
|
| - if (device)
|
| - device->OpenSocket(socket_name, callback);
|
| - else
|
| - callback.Run(net::ERR_CONNECTION_FAILED, NULL);
|
| +AndroidDeviceManager::Device::~Device() {
|
| + device_message_loop_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&DeviceProvider::ReleaseDevice, provider_, serial_));
|
| }
|
|
|
| -void AndroidDeviceManager::HttpQuery(
|
| - const std::string& serial,
|
| - const std::string& socket_name,
|
| - const std::string& request,
|
| - const CommandCallback& callback) {
|
| - DCHECK(CalledOnValidThread());
|
| - Device* device = FindDevice(serial);
|
| - if (device)
|
| - device->HttpQuery(socket_name, request, callback);
|
| - else
|
| - callback.Run(net::ERR_CONNECTION_FAILED, std::string());
|
| +// static
|
| +scoped_refptr<AndroidDeviceManager> AndroidDeviceManager::Create() {
|
| + return new AndroidDeviceManager();
|
| }
|
|
|
| -void AndroidDeviceManager::HttpUpgrade(
|
| - const std::string& serial,
|
| - const std::string& socket_name,
|
| - const std::string& url,
|
| - const SocketCallback& callback) {
|
| - DCHECK(CalledOnValidThread());
|
| - Device* device = FindDevice(serial);
|
| - if (device) {
|
| - device->OpenSocket(
|
| - socket_name,
|
| - base::Bind(&HttpRequest::SocketRequest,
|
| - base::StringPrintf(kWebSocketUpgradeRequest, url.c_str()),
|
| - callback));
|
| - } else {
|
| - callback.Run(net::ERR_CONNECTION_FAILED, NULL);
|
| - }
|
| +void AndroidDeviceManager::QueryDevices(
|
| + scoped_refptr<base::MessageLoopProxy> device_message_loop,
|
| + const DeviceProviders& providers,
|
| + const DevicesCallback& callback) {
|
| + DevicesRequest::Start(device_message_loop,
|
| + providers,
|
| + base::Bind(&AndroidDeviceManager::UpdateDevices,
|
| + this,
|
| + device_message_loop,
|
| + callback));
|
| }
|
|
|
| -AndroidDeviceManager::AndroidDeviceManager()
|
| - : stopped_(false) {
|
| +AndroidDeviceManager::AndroidDeviceManager() {
|
| }
|
|
|
| AndroidDeviceManager::~AndroidDeviceManager() {
|
| }
|
|
|
| -void AndroidDeviceManager::QueryNextProvider(
|
| - const QueryDevicesCallback& callback,
|
| - const DeviceProviders& providers,
|
| - const Devices& total_devices,
|
| - const Devices& new_devices) {
|
| - DCHECK(CalledOnValidThread());
|
| -
|
| - if (stopped_)
|
| - return;
|
| -
|
| - Devices more_devices(total_devices);
|
| - more_devices.insert(
|
| - more_devices.end(), new_devices.begin(), new_devices.end());
|
| -
|
| - if (providers.empty()) {
|
| - std::vector<std::string> serials;
|
| - devices_.clear();
|
| - for (Devices::const_iterator it = more_devices.begin();
|
| - it != more_devices.end(); ++it) {
|
| - devices_[(*it)->serial()] = *it;
|
| - serials.push_back((*it)->serial());
|
| +void AndroidDeviceManager::UpdateDevices(
|
| + scoped_refptr<base::MessageLoopProxy> device_message_loop,
|
| + const DevicesCallback& callback,
|
| + const DeviceDescriptors& descriptors) {
|
| + Devices response;
|
| + DeviceWeakMap new_devices;
|
| + for (DeviceDescriptors::const_iterator it = descriptors.begin();
|
| + it != descriptors.end();
|
| + ++it) {
|
| + DeviceWeakMap::iterator found = devices_.find(it->serial);
|
| + scoped_refptr<Device> device;
|
| + if (found == devices_.end() || !found->second) {
|
| + device = new Device(device_message_loop, it->provider, it->serial);
|
| + } else {
|
| + device = found->second.get();
|
| }
|
| - callback.Run(serials);
|
| - return;
|
| + response.push_back(device);
|
| + new_devices[it->serial] = device->weak_factory_.GetWeakPtr();
|
| }
|
| -
|
| - scoped_refptr<DeviceProvider> current_provider = providers.back();
|
| - DeviceProviders less_providers = providers;
|
| - less_providers.pop_back();
|
| - current_provider->QueryDevices(
|
| - base::Bind(&AndroidDeviceManager::QueryNextProvider,
|
| - this, callback, less_providers, more_devices));
|
| -}
|
| -
|
| -AndroidDeviceManager::Device*
|
| -AndroidDeviceManager::FindDevice(const std::string& serial) {
|
| - DCHECK(CalledOnValidThread());
|
| - DeviceMap::const_iterator it = devices_.find(serial);
|
| - if (it == devices_.end())
|
| - return NULL;
|
| - return (*it).second.get();
|
| + devices_.swap(new_devices);
|
| + callback.Run(response);
|
| }
|
|
|