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()); |