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

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: Moved Device::OpenSocket callback to HandlerThread 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 1a674dfa394e2eec144154033d4979ab78c65acc..5bf7b550be6e656189d5432afd05be2b4f35ff16 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,14 @@ 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,
- const AndroidDeviceManager::DeviceProviders& device_providers,
- const Callback& callback);
+ const DiscoveryCallback& callback);
private:
friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
@@ -80,14 +78,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,84 +96,59 @@ 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_;
};
DiscoveryRequest::DiscoveryRequest(
- scoped_refptr<DevToolsAndroidBridge> android_bridge,
AndroidDeviceManager* device_manager,
- base::MessageLoop* 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(
+ 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 +156,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 +183,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 +191,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 +207,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 ------------------------------------------------------------
@@ -588,11 +560,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),
@@ -642,7 +612,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())
@@ -653,12 +623,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(
@@ -684,7 +649,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(
@@ -764,113 +736,50 @@ 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() {
}
-// DevToolsAndroidBridge::HandlerThread ---------------------------------
-
-const char kDevToolsAdbBridgeThreadName[] = "Chrome_DevToolsADBThread";
-
-DevToolsAndroidBridge::HandlerThread*
-DevToolsAndroidBridge::HandlerThread::instance_ = NULL;
-
-// static
-scoped_refptr<DevToolsAndroidBridge::HandlerThread>
-DevToolsAndroidBridge::HandlerThread::GetInstance() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (!instance_)
- new HandlerThread();
- return instance_;
-}
-
-DevToolsAndroidBridge::HandlerThread::HandlerThread() {
- instance_ = this;
- thread_ = new base::Thread(kDevToolsAdbBridgeThreadName);
- base::Thread::Options options;
- options.message_loop_type = base::MessageLoop::TYPE_IO;
- if (!thread_->StartWithOptions(options)) {
- delete thread_;
- thread_ = NULL;
- }
-}
-
-base::MessageLoop* DevToolsAndroidBridge::HandlerThread::message_loop() {
- return thread_ ? thread_->message_loop() : NULL;
-}
-
-// static
-void DevToolsAndroidBridge::HandlerThread::StopThread(
- base::Thread* thread) {
- thread->Stop();
-}
-
-DevToolsAndroidBridge::HandlerThread::~HandlerThread() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- instance_ = NULL;
- if (!thread_)
- return;
- // Shut down thread on FILE thread to join into IO.
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- base::Bind(&HandlerThread::StopThread, thread_));
-}
-
// DevToolsAndroidBridge ------------------------------------------------------
DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile)
: profile_(profile),
- handler_thread_(HandlerThread::GetInstance()) {
+ device_manager_(AndroidDeviceManager::Create()) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
pref_change_registrar_.Init(profile_->GetPrefs());
pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled,
base::Bind(&DevToolsAndroidBridge::CreateDeviceProviders,
base::Unretained(this)));
CreateDeviceProviders();
- base::PostTaskAndReplyWithResult(
- device_message_loop()->message_loop_proxy(),
- FROM_HERE,
- base::Bind(&AndroidDeviceManager::Create),
- base::Bind(&DevToolsAndroidBridge::CreatedDeviceManager, this));
}
void DevToolsAndroidBridge::AddDeviceListListener(
DeviceListListener* listener) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
device_list_listeners_.push_back(listener);
- if (device_list_listeners_.size() == 1 && device_manager_)
+ if (device_list_listeners_.size() == 1)
RequestDeviceList();
}
@@ -881,16 +790,14 @@ 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(
DeviceCountListener* listener) {
device_count_listeners_.push_back(listener);
- if (device_count_listeners_.size() == 1 && device_manager_)
+ if (device_count_listeners_.size() == 1)
RequestDeviceCount();
}
@@ -913,47 +820,28 @@ DevToolsAndroidBridge::~DevToolsAndroidBridge() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(device_list_listeners_.empty());
DCHECK(device_count_listeners_.empty());
- if (device_manager_) {
- AndroidDeviceManager* raw_ptr = device_manager_.get();
- device_manager_->AddRef();
- device_manager_ = NULL;
- device_message_loop()->ReleaseSoon(FROM_HERE, raw_ptr);
- }
}
void DevToolsAndroidBridge::RequestDeviceList() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- DCHECK(device_manager_);
if (device_list_listeners_.empty())
return;
new DiscoveryRequest(
- this,
- device_manager(),
- device_message_loop(),
- device_providers_,
+ device_manager_.get(),
base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this));
}
-void DevToolsAndroidBridge::CreatedDeviceManager(
- scoped_refptr<AndroidDeviceManager> device_manager) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- device_manager_ = device_manager;
- if (!device_list_listeners_.empty())
- RequestDeviceList();
- if (!device_count_listeners_.empty())
- 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());
@@ -967,7 +855,6 @@ void DevToolsAndroidBridge::ReceivedDeviceList(RemoteDevices* devices_ptr) {
void DevToolsAndroidBridge::RequestDeviceCount() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- DCHECK(device_manager_);
if (device_count_listeners_.empty())
return;
@@ -994,15 +881,15 @@ void DevToolsAndroidBridge::ReceivedDeviceCount(int count) {
}
void DevToolsAndroidBridge::CreateDeviceProviders() {
- device_providers_.clear();
+ AndroidDeviceManager::DeviceProviders device_providers;
#if defined(DEBUG_DEVTOOLS)
BrowserListTabContentsProvider::EnableTethering();
// We cannot rely on command line switch here as we might want to connect
// to another instance of Chrome. Using hard-coded port number instead.
const int kDefaultDebuggingPort = 9222;
- device_providers_.push_back(new SelfAsDeviceProvider(kDefaultDebuggingPort));
+ device_providers.push_back(new SelfAsDeviceProvider(kDefaultDebuggingPort));
#endif
- device_providers_.push_back(new AdbDeviceProvider());
+ device_providers.push_back(new AdbDeviceProvider());
PrefService* service = profile_->GetPrefs();
const PrefService::Preference* pref =
@@ -1011,6 +898,7 @@ void DevToolsAndroidBridge::CreateDeviceProviders() {
bool enabled;
if (pref_value->GetAsBoolean(&enabled) && enabled) {
- device_providers_.push_back(new UsbDeviceProvider(profile_));
+ device_providers.push_back(new UsbDeviceProvider(profile_));
}
+ device_manager_->SetDeviceProviders(device_providers);
}
« no previous file with comments | « chrome/browser/devtools/device/devtools_android_bridge.h ('k') | chrome/browser/devtools/device/self_device_provider.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698