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

Unified Diff: chrome/browser/devtools/device/devtools_android_bridge.cc

Issue 287643002: DevTools: Partially redesigned DevToolsAndroidBridge and AndroidDeviceManager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Little simplification Created 6 years, 7 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 side-by-side diff with in-line comments
Download patch
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 5fefecc91fd06be14e3a306811c07f953321afba..82ff7cc7949aebc6246ef8e2d6b4c8199462f891 100644
--- a/chrome/browser/devtools/device/devtools_android_bridge.cc
+++ b/chrome/browser/devtools/device/devtools_android_bridge.cc
@@ -230,10 +230,12 @@ class DiscoveryRequest : public base::RefCountedThreadSafe<
DiscoveryRequest,
BrowserThread::DeleteOnUIThread> {
public:
- typedef base::Callback<void(DevToolsAndroidBridge::RemoteDevices*)> Callback;
+ typedef base::Callback<void(DevToolsAndroidBridge::RemoteDevices*,
+ DevToolsAndroidBridge::DeviceHandleMap*)> Callback;
DiscoveryRequest(
scoped_refptr<DevToolsAndroidBridge> android_bridge,
+ const DevToolsAndroidBridge::DeviceHandleMap& device_handles,
AndroidDeviceManager* device_manager,
base::MessageLoop* device_message_loop,
const AndroidDeviceManager::DeviceProviders& device_providers,
@@ -281,6 +283,9 @@ class DiscoveryRequest : public base::RefCountedThreadSafe<
void ParseDumpsysResponse(const std::string& response);
void ParseScreenSize(const std::string& str);
+ scoped_refptr<DevToolsAndroidBridge::DeviceHandle>
+ FindDeviceHandle(const std::string& serial);
+
scoped_refptr<DevToolsAndroidBridge> android_bridge_;
AndroidDeviceManager* device_manager_;
base::MessageLoop* device_message_loop_;
@@ -288,10 +293,13 @@ class DiscoveryRequest : public base::RefCountedThreadSafe<
std::vector<std::string> serials_;
DevToolsAndroidBridge::RemoteBrowsers browsers_;
scoped_ptr<DevToolsAndroidBridge::RemoteDevices> remote_devices_;
+ DevToolsAndroidBridge::DeviceHandleMap device_handles_;
+ scoped_ptr<DevToolsAndroidBridge::DeviceHandleMap> used_device_handles_;
};
DiscoveryRequest::DiscoveryRequest(
scoped_refptr<DevToolsAndroidBridge> android_bridge,
+ const DevToolsAndroidBridge::DeviceHandleMap& device_handles,
AndroidDeviceManager* device_manager,
base::MessageLoop* device_message_loop,
const AndroidDeviceManager::DeviceProviders& device_providers,
@@ -299,8 +307,10 @@ DiscoveryRequest::DiscoveryRequest(
: android_bridge_(android_bridge),
device_manager_(device_manager),
device_message_loop_(device_message_loop),
- callback_(callback) {
+ callback_(callback),
+ device_handles_(device_handles) {
Vladislav Kaznacheev 2014/05/19 10:32:11 So there is a scenario where DeviceHandle instance
vkuzkokov 2014/05/20 12:34:29 Yep. One possible solution would be to extend Disc
remote_devices_.reset(new DevToolsAndroidBridge::RemoteDevices());
+ used_device_handles_.reset(new DevToolsAndroidBridge::DeviceHandleMap());
device_message_loop_->PostTask(
FROM_HERE, base::Bind(
@@ -335,7 +345,7 @@ void DiscoveryRequest::ProcessSerials() {
base::Bind(&DiscoveryRequest::ReceivedModel, this));
} else {
remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice(
- android_bridge_, current_serial(), kUnknownModel, false));
+ FindDeviceHandle(current_serial()), kUnknownModel, false));
NextDevice();
}
}
@@ -347,7 +357,7 @@ void DiscoveryRequest::ReceivedModel(int result, const std::string& response) {
return;
}
remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice(
- android_bridge_, current_serial(), response, true));
+ FindDeviceHandle(current_serial()), response, true));
device_manager_->RunCommand(current_serial(), kDumpsysCommand,
base::Bind(&DiscoveryRequest::ReceivedDumpsys, this));
}
@@ -480,7 +490,7 @@ void DiscoveryRequest::NextDevice() {
}
void DiscoveryRequest::Respond() {
- callback_.Run(remote_devices_.release());
+ callback_.Run(remote_devices_.release(), used_device_handles_.release());
}
void DiscoveryRequest::CreateBrowsers(
@@ -513,7 +523,8 @@ void DiscoveryRequest::CreateBrowsers(
scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser =
new DevToolsAndroidBridge::RemoteBrowser(
- android_bridge_, current_serial(), socket);
+ FindDeviceHandle(current_serial()),
+ socket);
StringMap::iterator pit = pid_to_package.find(pid);
if (pit != pid_to_package.end()) {
@@ -609,6 +620,21 @@ void DiscoveryRequest::ParseScreenSize(const std::string& str) {
remote_devices_->back()->set_screen_size(gfx::Size(width, height));
}
+scoped_refptr<DevToolsAndroidBridge::DeviceHandle>
+DiscoveryRequest::FindDeviceHandle(const std::string& serial) {
+ DevToolsAndroidBridge::DeviceHandleMap::iterator it =
+ device_handles_.find(serial);
+ scoped_refptr<DevToolsAndroidBridge::DeviceHandle> device_handle;
+ if (it != device_handles_.end()) {
+ device_handle = it->second;
+ } else {
+ device_handle = new DevToolsAndroidBridge::DeviceHandle(android_bridge_,
+ serial);
+ device_handles_[serial] = device_handle;
+ }
+ (*used_device_handles_)[serial] = device_handle;
+ return device_handle;
+}
// ProtocolCommand ------------------------------------------------------------
@@ -949,11 +975,9 @@ void RemotePageTarget::Navigate(const std::string& url,
// DevToolsAndroidBridge::RemoteBrowser ---------------------------------------
DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser(
- scoped_refptr<DevToolsAndroidBridge> android_bridge,
- const std::string& serial,
+ scoped_refptr<DeviceHandle> device_handle,
const std::string& socket)
- : android_bridge_(android_bridge),
- serial_(serial),
+ : device_handle_(device_handle),
socket_(socket),
page_descriptors_(new base::ListValue()) {
}
@@ -1009,10 +1033,13 @@ 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(
+ device_handle_->android_bridge()->device_message_loop()->PostTask(
Vladislav Kaznacheev 2014/05/19 10:32:11 Lets consider moving it into DeviceHandle as well.
vkuzkokov 2014/05/20 12:34:29 Done.
FROM_HERE,
base::Bind(&AndroidDeviceManager::HttpQuery,
- android_bridge_->device_manager(), serial_, socket_, request,
+ device_handle_->android_bridge()->device_manager(),
+ device_handle_->serial(),
+ socket_,
+ request,
base::Bind(&RespondOnUIThread, callback)));
}
@@ -1117,12 +1144,10 @@ DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() {
// DevToolsAndroidBridge::RemoteDevice ----------------------------------------
DevToolsAndroidBridge::RemoteDevice::RemoteDevice(
- scoped_refptr<DevToolsAndroidBridge> android_bridge,
- const std::string& serial,
+ scoped_refptr<DeviceHandle> device_handle,
const std::string& model,
bool connected)
- : android_bridge_(android_bridge),
- serial_(serial),
+ : device_handle_(device_handle),
model_(model),
connected_(connected) {
}
@@ -1135,10 +1160,10 @@ void DevToolsAndroidBridge::RemoteDevice::AddBrowser(
void DevToolsAndroidBridge::RemoteDevice::OpenSocket(
const std::string& socket_name,
const AndroidDeviceManager::SocketCallback& callback) {
- android_bridge_->device_message_loop()->PostTask(FROM_HERE,
+ device_handle_->android_bridge()->device_message_loop()->PostTask(FROM_HERE,
Vladislav Kaznacheev 2014/05/19 10:32:11 Ditto
vkuzkokov 2014/05/20 12:34:29 Done.
base::Bind(&AndroidDeviceManager::OpenSocket,
- android_bridge_->device_manager(),
- serial_,
+ device_handle_->android_bridge()->device_manager(),
+ device_handle_->serial(),
socket_name,
callback));
}
@@ -1194,6 +1219,22 @@ DevToolsAndroidBridge::HandlerThread::~HandlerThread() {
base::Bind(&HandlerThread::StopThread, thread_));
}
+// DevToolsAndroidBridge::DeviceHandle ----------------------------------------
+
+DevToolsAndroidBridge::DeviceHandle::DeviceHandle(
+ scoped_refptr<DevToolsAndroidBridge> android_bridge,
+ const std::string& serial)
+ : android_bridge_(android_bridge),
+ serial_(serial) {
+}
+
+DevToolsAndroidBridge::DeviceHandle::~DeviceHandle() {
+ android_bridge_->device_message_loop()->PostTask(FROM_HERE,
+ base::Bind(&AndroidDeviceManager::ReleaseDevice,
+ android_bridge_->device_manager(),
+ serial_));
+}
+
// DevToolsAndroidBridge ------------------------------------------------------
DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile)
@@ -1227,10 +1268,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() && device_manager_)
+ device_handles_.clear();
}
void DevToolsAndroidBridge::AddDeviceCountListener(
@@ -1255,13 +1294,19 @@ bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) {
return g_host_delegates.Get().find(agent_id) != g_host_delegates.Get().end();
}
+void DevToolsAndroidBridge::IsConnectedForTest(const std::string& serial,
+ const base::Callback<void(bool)>& callback) {
+ base::PostTaskAndReplyWithResult(
+ device_message_loop()->message_loop_proxy(),
+ FROM_HERE,
+ base::Bind(&AndroidDeviceManager::IsConnected, device_manager_, serial),
+ callback);
+}
+
DevToolsAndroidBridge::~DevToolsAndroidBridge() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(device_list_listeners_.empty());
DCHECK(device_count_listeners_.empty());
- if (device_manager_)
- device_message_loop()->PostTask(FROM_HERE,
- base::Bind(&AndroidDeviceManager::Stop, device_manager_));
}
void DevToolsAndroidBridge::RequestDeviceList() {
@@ -1273,6 +1318,7 @@ void DevToolsAndroidBridge::RequestDeviceList() {
new DiscoveryRequest(
this,
+ device_handles_,
device_manager(),
device_message_loop(),
device_providers_,
@@ -1289,14 +1335,18 @@ void DevToolsAndroidBridge::CreatedDeviceManager(
RequestDeviceCount();
}
-void DevToolsAndroidBridge::ReceivedDeviceList(RemoteDevices* devices_ptr) {
+void DevToolsAndroidBridge::ReceivedDeviceList(RemoteDevices* devices_ptr,
+ DeviceHandleMap* device_handles_ptr) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
scoped_ptr<RemoteDevices> devices(devices_ptr);
+ scoped_ptr<DeviceHandleMap> device_handles(device_handles_ptr);
if (device_list_listeners_.empty())
return;
+ device_handles_ = *device_handles.get();
+
DeviceListListeners copy(device_list_listeners_);
for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it)
(*it)->DeviceListChanged(*devices.get());

Powered by Google App Engine
This is Rietveld 408576698