| Index: chrome/browser/devtools/device/devtools_android_bridge.cc
|
| diff --git a/chrome/browser/devtools/device/devtools_android_bridge.cc b/chrome/browser/devtools/device/devtools_android_bridge.cc
|
| index 71257c644e61d6098d91771b5b1df0bd67ac137d..76e2f59a298ba0fe9f5d95b93cbdd54cb78e084f 100644
|
| --- a/chrome/browser/devtools/device/devtools_android_bridge.cc
|
| +++ b/chrome/browser/devtools/device/devtools_android_bridge.cc
|
| @@ -41,8 +41,6 @@ using content::BrowserThread;
|
|
|
| namespace {
|
|
|
| -const char kModelOffline[] = "Offline";
|
| -
|
| const char kPageListRequest[] = "/json";
|
| const char kVersionRequest[] = "/json/version";
|
| const char kClosePageRequest[] = "/json/close/%s";
|
| @@ -65,14 +63,17 @@ class DiscoveryRequest : public base::RefCountedThreadSafe<
|
| DiscoveryRequest,
|
| BrowserThread::DeleteOnUIThread> {
|
| public:
|
| - typedef base::Callback<void(DevToolsAndroidBridge::RemoteDevices*)> Callback;
|
| + typedef base::Callback<void(scoped_ptr<DevToolsAndroidBridge::RemoteDevices>)>
|
| + DiscoveryCallback;
|
| + typedef AndroidDeviceManager::Device Device;
|
| + typedef AndroidDeviceManager::Devices Devices;
|
|
|
| DiscoveryRequest(
|
| scoped_refptr<DevToolsAndroidBridge> android_bridge,
|
| AndroidDeviceManager* device_manager,
|
| - base::MessageLoop* device_message_loop,
|
| + scoped_refptr<base::MessageLoopProxy> device_message_loop,
|
| const AndroidDeviceManager::DeviceProviders& device_providers,
|
| - const Callback& callback);
|
| + const DiscoveryCallback& callback);
|
|
|
| private:
|
| friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
|
| @@ -80,14 +81,14 @@ class DiscoveryRequest : public base::RefCountedThreadSafe<
|
|
|
| virtual ~DiscoveryRequest();
|
|
|
| - void ReceivedSerials(const std::vector<std::string>& serials);
|
| - void ProcessSerials();
|
| + void ReceivedDevices(const Devices& devices);
|
| + void ProcessDevices();
|
| void ReceivedDeviceInfo(const AndroidDeviceManager::DeviceInfo& device_info);
|
| void ProcessSockets();
|
| void ReceivedVersion(int result, const std::string& response);
|
| void ReceivedPages(int result, const std::string& response);
|
|
|
| - std::string current_serial() const { return serials_.back(); }
|
| + scoped_refptr<Device> current_device() { return devices_.back(); }
|
|
|
| scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> current_browser() const {
|
| return browsers_.back();
|
| @@ -98,11 +99,8 @@ class DiscoveryRequest : public base::RefCountedThreadSafe<
|
|
|
| void Respond();
|
|
|
| - scoped_refptr<DevToolsAndroidBridge> android_bridge_;
|
| - AndroidDeviceManager* device_manager_;
|
| - base::MessageLoop* device_message_loop_;
|
| - Callback callback_;
|
| - std::vector<std::string> serials_;
|
| + DiscoveryCallback callback_;
|
| + Devices devices_;
|
| DevToolsAndroidBridge::RemoteBrowsers browsers_;
|
| scoped_ptr<DevToolsAndroidBridge::RemoteDevices> remote_devices_;
|
| };
|
| @@ -110,72 +108,55 @@ class DiscoveryRequest : public base::RefCountedThreadSafe<
|
| DiscoveryRequest::DiscoveryRequest(
|
| scoped_refptr<DevToolsAndroidBridge> android_bridge,
|
| AndroidDeviceManager* device_manager,
|
| - base::MessageLoop* device_message_loop,
|
| + scoped_refptr<base::MessageLoopProxy> device_message_loop,
|
| const AndroidDeviceManager::DeviceProviders& device_providers,
|
| - const Callback& callback)
|
| - : android_bridge_(android_bridge),
|
| - device_manager_(device_manager),
|
| - device_message_loop_(device_message_loop),
|
| - callback_(callback) {
|
| + const DiscoveryCallback& callback)
|
| + : callback_(callback) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| remote_devices_.reset(new DevToolsAndroidBridge::RemoteDevices());
|
|
|
| - device_message_loop_->PostTask(
|
| - FROM_HERE, base::Bind(
|
| - &AndroidDeviceManager::QueryDevices,
|
| - device_manager_,
|
| - device_providers,
|
| - base::Bind(&DiscoveryRequest::ReceivedSerials, this)));
|
| + device_manager->QueryDevices(
|
| + device_message_loop,
|
| + device_providers,
|
| + base::Bind(&DiscoveryRequest::ReceivedDevices, this));
|
| }
|
|
|
| DiscoveryRequest::~DiscoveryRequest() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| }
|
|
|
| -void DiscoveryRequest::ReceivedSerials(
|
| - const std::vector<std::string>& serials) {
|
| - DCHECK_EQ(device_message_loop_, base::MessageLoop::current());
|
| - serials_ = serials;
|
| - ProcessSerials();
|
| +void DiscoveryRequest::ReceivedDevices(const Devices& devices) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + devices_ = devices;
|
| + ProcessDevices();
|
| }
|
|
|
| -void DiscoveryRequest::ProcessSerials() {
|
| - DCHECK_EQ(device_message_loop_, base::MessageLoop::current());
|
| - if (serials_.size() == 0) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&DiscoveryRequest::Respond, this));
|
| +void DiscoveryRequest::ProcessDevices() {
|
| + if (devices_.size() == 0) {
|
| + Respond();
|
| return;
|
| }
|
|
|
| - if (device_manager_->IsConnected(current_serial())) {
|
| - device_manager_->QueryDeviceInfo(current_serial(),
|
| - base::Bind(&DiscoveryRequest::ReceivedDeviceInfo, this));
|
| - } else {
|
| - AndroidDeviceManager::DeviceInfo offline_info;
|
| - offline_info.model = kModelOffline;
|
| - remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice(
|
| - android_bridge_, current_serial(), offline_info, false));
|
| - NextDevice();
|
| - }
|
| + current_device()->QueryDeviceInfo(
|
| + base::Bind(&DiscoveryRequest::ReceivedDeviceInfo, this));
|
| }
|
|
|
| void DiscoveryRequest::ReceivedDeviceInfo(
|
| const AndroidDeviceManager::DeviceInfo& device_info) {
|
| - remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice(
|
| - android_bridge_, current_serial(), device_info, true));
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + remote_devices_->push_back(
|
| + new DevToolsAndroidBridge::RemoteDevice(current_device(), device_info));
|
| browsers_ = remote_devices_->back()->browsers();
|
| ProcessSockets();
|
| }
|
|
|
| void DiscoveryRequest::ProcessSockets() {
|
| - DCHECK_EQ(device_message_loop_, base::MessageLoop::current());
|
| if (browsers_.size() == 0) {
|
| NextDevice();
|
| return;
|
| }
|
|
|
| - device_manager_->HttpQuery(
|
| - current_serial(),
|
| + current_device()->SendJsonRequest(
|
| current_browser()->socket(),
|
| kVersionRequest,
|
| base::Bind(&DiscoveryRequest::ReceivedVersion, this));
|
| @@ -183,7 +164,7 @@ void DiscoveryRequest::ProcessSockets() {
|
|
|
| void DiscoveryRequest::ReceivedVersion(int result,
|
| const std::string& response) {
|
| - DCHECK_EQ(device_message_loop_, base::MessageLoop::current());
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| if (result < 0) {
|
| NextBrowser();
|
| return;
|
| @@ -210,8 +191,7 @@ void DiscoveryRequest::ReceivedVersion(int result,
|
| }
|
| }
|
|
|
| - device_manager_->HttpQuery(
|
| - current_serial(),
|
| + current_device()->SendJsonRequest(
|
| current_browser()->socket(),
|
| kPageListRequest,
|
| base::Bind(&DiscoveryRequest::ReceivedPages, this));
|
| @@ -219,7 +199,7 @@ void DiscoveryRequest::ReceivedVersion(int result,
|
|
|
| void DiscoveryRequest::ReceivedPages(int result,
|
| const std::string& response) {
|
| - DCHECK_EQ(device_message_loop_, base::MessageLoop::current());
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| if (result >= 0) {
|
| scoped_ptr<base::Value> value(base::JSONReader::Read(response));
|
| base::ListValue* list_value;
|
| @@ -235,12 +215,12 @@ void DiscoveryRequest::NextBrowser() {
|
| }
|
|
|
| void DiscoveryRequest::NextDevice() {
|
| - serials_.pop_back();
|
| - ProcessSerials();
|
| + devices_.pop_back();
|
| + ProcessDevices();
|
| }
|
|
|
| void DiscoveryRequest::Respond() {
|
| - callback_.Run(remote_devices_.release());
|
| + callback_.Run(remote_devices_.Pass());
|
| }
|
|
|
| // ProtocolCommand ------------------------------------------------------------
|
| @@ -582,11 +562,9 @@ void RemotePageTarget::Navigate(const std::string& url,
|
| // DevToolsAndroidBridge::RemoteBrowser ---------------------------------------
|
|
|
| DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser(
|
| - scoped_refptr<DevToolsAndroidBridge> android_bridge,
|
| - const std::string& serial,
|
| + scoped_refptr<Device> device,
|
| const AndroidDeviceManager::BrowserInfo& browser_info)
|
| - : android_bridge_(android_bridge),
|
| - serial_(serial),
|
| + : device_(device),
|
| socket_(browser_info.socket_name),
|
| display_name_(browser_info.display_name),
|
| type_(browser_info.type),
|
| @@ -636,7 +614,7 @@ void DevToolsAndroidBridge::RemoteBrowser::SetPageDescriptors(
|
| }
|
|
|
| static void RespondOnUIThread(
|
| - const DevToolsAndroidBridge::RemoteBrowser::JsonRequestCallback& callback,
|
| + const DevToolsAndroidBridge::JsonRequestCallback& callback,
|
| int result,
|
| const std::string& response) {
|
| if (callback.is_null())
|
| @@ -647,12 +625,7 @@ static void RespondOnUIThread(
|
|
|
| void DevToolsAndroidBridge::RemoteBrowser::SendJsonRequest(
|
| const std::string& request, const JsonRequestCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - android_bridge_->device_message_loop()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&AndroidDeviceManager::HttpQuery,
|
| - android_bridge_->device_manager(), serial_, socket_, request,
|
| - base::Bind(&RespondOnUIThread, callback)));
|
| + device_->SendJsonRequest(socket_, request, callback);
|
| }
|
|
|
| void DevToolsAndroidBridge::RemoteBrowser::SendProtocolCommand(
|
| @@ -678,7 +651,14 @@ void DevToolsAndroidBridge::RemoteBrowser::Open(
|
| scoped_refptr<content::DevToolsAgentHost>
|
| DevToolsAndroidBridge::RemoteBrowser::GetAgentHost() {
|
| return AgentHostDelegate::GetOrCreateAgentHost(
|
| - "adb:" + serial_ + ":" + socket_, this, kBrowserTargetSocket);
|
| + "adb:" + device_->serial() + ":" + socket_, this, kBrowserTargetSocket);
|
| +}
|
| +
|
| +scoped_refptr<DevToolsAndroidBridge::AndroidWebSocket>
|
| +DevToolsAndroidBridge::RemoteBrowser::CreateWebSocket(
|
| + const std::string& url,
|
| + DevToolsAndroidBridge::AndroidWebSocket::Delegate* delegate) {
|
| + return device_->CreateWebSocket(socket_, url, delegate);
|
| }
|
|
|
| void DevToolsAndroidBridge::RemoteBrowser::RespondToOpenOnUIThread(
|
| @@ -758,37 +738,27 @@ void DevToolsAndroidBridge::RemoteBrowser::NavigatePageOnUIThread(
|
| DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() {
|
| }
|
|
|
| -
|
| // DevToolsAndroidBridge::RemoteDevice ----------------------------------------
|
|
|
| DevToolsAndroidBridge::RemoteDevice::RemoteDevice(
|
| - scoped_refptr<DevToolsAndroidBridge> android_bridge,
|
| - const std::string& serial,
|
| - const AndroidDeviceManager::DeviceInfo& device_info,
|
| - bool connected)
|
| - : android_bridge_(android_bridge),
|
| - serial_(serial),
|
| + scoped_refptr<AndroidDeviceManager::Device> device,
|
| + const AndroidDeviceManager::DeviceInfo& device_info)
|
| + : device_(device),
|
| model_(device_info.model),
|
| - connected_(connected),
|
| + connected_(device_info.connected),
|
| screen_size_(device_info.screen_size) {
|
| for (std::vector<AndroidDeviceManager::BrowserInfo>::const_iterator it =
|
| device_info.browser_info.begin();
|
| it != device_info.browser_info.end();
|
| ++it) {
|
| - browsers_.push_back(new DevToolsAndroidBridge::RemoteBrowser(
|
| - android_bridge_, serial_, *it));
|
| + browsers_.push_back(new DevToolsAndroidBridge::RemoteBrowser(device, *it));
|
| }
|
| }
|
|
|
| void DevToolsAndroidBridge::RemoteDevice::OpenSocket(
|
| const std::string& socket_name,
|
| const AndroidDeviceManager::SocketCallback& callback) {
|
| - android_bridge_->device_message_loop()->PostTask(FROM_HERE,
|
| - base::Bind(&AndroidDeviceManager::OpenSocket,
|
| - android_bridge_->device_manager(),
|
| - serial_,
|
| - socket_name,
|
| - callback));
|
| + device_->OpenSocket(socket_name, callback);
|
| }
|
|
|
| DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() {
|
| @@ -821,8 +791,9 @@ DevToolsAndroidBridge::HandlerThread::HandlerThread() {
|
| }
|
| }
|
|
|
| -base::MessageLoop* DevToolsAndroidBridge::HandlerThread::message_loop() {
|
| - return thread_ ? thread_->message_loop() : NULL;
|
| +scoped_refptr<base::MessageLoopProxy>
|
| +DevToolsAndroidBridge::HandlerThread::message_loop() {
|
| + return thread_ ? thread_->message_loop_proxy() : NULL;
|
| }
|
|
|
| // static
|
| @@ -854,7 +825,7 @@ DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile)
|
| base::Unretained(this)));
|
| CreateDeviceProviders();
|
| base::PostTaskAndReplyWithResult(
|
| - device_message_loop()->message_loop_proxy(),
|
| + device_message_loop(),
|
| FROM_HERE,
|
| base::Bind(&AndroidDeviceManager::Create),
|
| base::Bind(&DevToolsAndroidBridge::CreatedDeviceManager, this));
|
| @@ -875,10 +846,8 @@ void DevToolsAndroidBridge::RemoveDeviceListListener(
|
| device_list_listeners_.begin(), device_list_listeners_.end(), listener);
|
| DCHECK(it != device_list_listeners_.end());
|
| device_list_listeners_.erase(it);
|
| - if (device_list_listeners_.empty() && device_manager_) {
|
| - device_message_loop()->PostTask(FROM_HERE,
|
| - base::Bind(&AndroidDeviceManager::Stop, device_manager_));
|
| - }
|
| + if (device_list_listeners_.empty())
|
| + devices_.clear();
|
| }
|
|
|
| void DevToolsAndroidBridge::AddDeviceCountListener(
|
| @@ -940,14 +909,15 @@ void DevToolsAndroidBridge::CreatedDeviceManager(
|
| RequestDeviceCount();
|
| }
|
|
|
| -void DevToolsAndroidBridge::ReceivedDeviceList(RemoteDevices* devices_ptr) {
|
| +void DevToolsAndroidBridge::ReceivedDeviceList(
|
| + scoped_ptr<RemoteDevices> devices) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| - scoped_ptr<RemoteDevices> devices(devices_ptr);
|
| -
|
| if (device_list_listeners_.empty())
|
| return;
|
|
|
| + devices_ = *devices;
|
| +
|
| DeviceListListeners copy(device_list_listeners_);
|
| for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it)
|
| (*it)->DeviceListChanged(*devices.get());
|
|
|