Commit 4e7c1817 authored by vkuzkokov's avatar vkuzkokov Committed by Commit bot

DevTools: Make port forwarding part of DevToolsAndroidBridge.

Rather than being a subscriber to DTAB port forwarding becomes part of it so that DTAB could stop discovering new devices when chrome://inspect is closed.

BUG=387067

Review URL: https://codereview.chromium.org/500373004

Cr-Commit-Position: refs/heads/master@{#293143}
parent 1bc56d57
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "chrome/browser/devtools/browser_list_tabcontents_provider.h" #include "chrome/browser/devtools/browser_list_tabcontents_provider.h"
#include "chrome/browser/devtools/device/adb/adb_device_info_query.h" #include "chrome/browser/devtools/device/adb/adb_device_info_query.h"
#include "chrome/browser/devtools/device/adb/adb_device_provider.h" #include "chrome/browser/devtools/device/adb/adb_device_provider.h"
#include "chrome/browser/devtools/device/port_forwarding_controller.h"
#include "chrome/browser/devtools/device/self_device_provider.h" #include "chrome/browser/devtools/device/self_device_provider.h"
#include "chrome/browser/devtools/device/usb/usb_device_provider.h" #include "chrome/browser/devtools/device/usb/usb_device_provider.h"
#include "chrome/browser/devtools/devtools_protocol.h" #include "chrome/browser/devtools/devtools_protocol.h"
...@@ -733,7 +734,8 @@ DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() { ...@@ -733,7 +734,8 @@ DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() {
DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile) DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile)
: profile_(profile), : profile_(profile),
device_manager_(AndroidDeviceManager::Create()), device_manager_(AndroidDeviceManager::Create()),
task_scheduler_(base::Bind(&DevToolsAndroidBridge::ScheduleTaskDefault)) { task_scheduler_(base::Bind(&DevToolsAndroidBridge::ScheduleTaskDefault)),
port_forwarding_controller_(new PortForwardingController(profile)) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
pref_change_registrar_.Init(profile_->GetPrefs()); pref_change_registrar_.Init(profile_->GetPrefs());
pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled, pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled,
...@@ -745,8 +747,9 @@ DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile) ...@@ -745,8 +747,9 @@ DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile)
void DevToolsAndroidBridge::AddDeviceListListener( void DevToolsAndroidBridge::AddDeviceListListener(
DeviceListListener* listener) { DeviceListListener* listener) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
bool polling_was_off = !NeedsDeviceListPolling();
device_list_listeners_.push_back(listener); device_list_listeners_.push_back(listener);
if (device_list_listeners_.size() == 1) if (polling_was_off)
StartDeviceListPolling(); StartDeviceListPolling();
} }
...@@ -757,7 +760,7 @@ void DevToolsAndroidBridge::RemoveDeviceListListener( ...@@ -757,7 +760,7 @@ void DevToolsAndroidBridge::RemoveDeviceListListener(
device_list_listeners_.begin(), device_list_listeners_.end(), listener); device_list_listeners_.begin(), device_list_listeners_.end(), listener);
DCHECK(it != device_list_listeners_.end()); DCHECK(it != device_list_listeners_.end());
device_list_listeners_.erase(it); device_list_listeners_.erase(it);
if (device_list_listeners_.empty()) if (!NeedsDeviceListPolling())
StopDeviceListPolling(); StopDeviceListPolling();
} }
...@@ -779,6 +782,26 @@ void DevToolsAndroidBridge::RemoveDeviceCountListener( ...@@ -779,6 +782,26 @@ void DevToolsAndroidBridge::RemoveDeviceCountListener(
StopDeviceCountPolling(); StopDeviceCountPolling();
} }
void DevToolsAndroidBridge::AddPortForwardingListener(
PortForwardingListener* listener) {
bool polling_was_off = !NeedsDeviceListPolling();
port_forwarding_listeners_.push_back(listener);
if (polling_was_off)
StartDeviceListPolling();
}
void DevToolsAndroidBridge::RemovePortForwardingListener(
PortForwardingListener* listener) {
PortForwardingListeners::iterator it = std::find(
port_forwarding_listeners_.begin(),
port_forwarding_listeners_.end(),
listener);
DCHECK(it != port_forwarding_listeners_.end());
port_forwarding_listeners_.erase(it);
if (!NeedsDeviceListPolling())
StopDeviceListPolling();
}
// static // static
bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) { bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
...@@ -789,6 +812,7 @@ DevToolsAndroidBridge::~DevToolsAndroidBridge() { ...@@ -789,6 +812,7 @@ DevToolsAndroidBridge::~DevToolsAndroidBridge() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(device_list_listeners_.empty()); DCHECK(device_list_listeners_.empty());
DCHECK(device_count_listeners_.empty()); DCHECK(device_count_listeners_.empty());
DCHECK(port_forwarding_listeners_.empty());
} }
void DevToolsAndroidBridge::StartDeviceListPolling() { void DevToolsAndroidBridge::StartDeviceListPolling() {
...@@ -802,11 +826,15 @@ void DevToolsAndroidBridge::StopDeviceListPolling() { ...@@ -802,11 +826,15 @@ void DevToolsAndroidBridge::StopDeviceListPolling() {
devices_.clear(); devices_.clear();
} }
bool DevToolsAndroidBridge::NeedsDeviceListPolling() {
return !device_list_listeners_.empty() || !port_forwarding_listeners_.empty();
}
void DevToolsAndroidBridge::RequestDeviceList( void DevToolsAndroidBridge::RequestDeviceList(
const base::Callback<void(const RemoteDevices&)>& callback) { const base::Callback<void(const RemoteDevices&)>& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (device_list_listeners_.empty() || if (!NeedsDeviceListPolling() ||
!callback.Equals(device_list_callback_.callback())) !callback.Equals(device_list_callback_.callback()))
return; return;
...@@ -820,7 +848,15 @@ void DevToolsAndroidBridge::ReceivedDeviceList(const RemoteDevices& devices) { ...@@ -820,7 +848,15 @@ void DevToolsAndroidBridge::ReceivedDeviceList(const RemoteDevices& devices) {
for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it) for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it)
(*it)->DeviceListChanged(devices); (*it)->DeviceListChanged(devices);
if (device_list_listeners_.empty()) DevicesStatus status =
port_forwarding_controller_->DeviceListChanged(devices);
PortForwardingListeners forwarding_listeners(port_forwarding_listeners_);
for (PortForwardingListeners::iterator it = forwarding_listeners.begin();
it != forwarding_listeners.end(); ++it) {
(*it)->PortStatusChanged(status);
}
if (!NeedsDeviceListPolling())
return; return;
devices_ = devices; devices_ = devices;
...@@ -896,7 +932,7 @@ void DevToolsAndroidBridge::CreateDeviceProviders() { ...@@ -896,7 +932,7 @@ void DevToolsAndroidBridge::CreateDeviceProviders() {
device_providers.push_back(new UsbDeviceProvider(profile_)); device_providers.push_back(new UsbDeviceProvider(profile_));
} }
device_manager_->SetDeviceProviders(device_providers); device_manager_->SetDeviceProviders(device_providers);
if (!device_list_listeners_.empty()) { if (NeedsDeviceListPolling()) {
StopDeviceListPolling(); StopDeviceListPolling();
StartDeviceListPolling(); StartDeviceListPolling();
} }
......
...@@ -33,6 +33,7 @@ class BrowserContext; ...@@ -33,6 +33,7 @@ class BrowserContext;
} }
class DevToolsTargetImpl; class DevToolsTargetImpl;
class PortForwardingController;
class Profile; class Profile;
class DevToolsAndroidBridge class DevToolsAndroidBridge
...@@ -208,6 +209,23 @@ class DevToolsAndroidBridge ...@@ -208,6 +209,23 @@ class DevToolsAndroidBridge
void AddDeviceCountListener(DeviceCountListener* listener); void AddDeviceCountListener(DeviceCountListener* listener);
void RemoveDeviceCountListener(DeviceCountListener* listener); void RemoveDeviceCountListener(DeviceCountListener* listener);
typedef int PortStatus;
typedef std::map<int, PortStatus> PortStatusMap;
typedef std::map<std::string, PortStatusMap> DevicesStatus;
class PortForwardingListener {
public:
typedef DevToolsAndroidBridge::PortStatusMap PortStatusMap;
typedef DevToolsAndroidBridge::DevicesStatus DevicesStatus;
virtual void PortStatusChanged(const DevicesStatus&) = 0;
protected:
virtual ~PortForwardingListener() {}
};
void AddPortForwardingListener(PortForwardingListener* listener);
void RemovePortForwardingListener(PortForwardingListener* listener);
void set_device_providers_for_test( void set_device_providers_for_test(
const AndroidDeviceManager::DeviceProviders& device_providers) { const AndroidDeviceManager::DeviceProviders& device_providers) {
device_manager_->SetDeviceProviders(device_providers); device_manager_->SetDeviceProviders(device_providers);
...@@ -229,6 +247,7 @@ class DevToolsAndroidBridge ...@@ -229,6 +247,7 @@ class DevToolsAndroidBridge
void StartDeviceListPolling(); void StartDeviceListPolling();
void StopDeviceListPolling(); void StopDeviceListPolling();
bool NeedsDeviceListPolling();
void RequestDeviceList( void RequestDeviceList(
const base::Callback<void(const RemoteDevices&)>& callback); const base::Callback<void(const RemoteDevices&)>& callback);
void ReceivedDeviceList(const RemoteDevices& devices); void ReceivedDeviceList(const RemoteDevices& devices);
...@@ -254,6 +273,10 @@ class DevToolsAndroidBridge ...@@ -254,6 +273,10 @@ class DevToolsAndroidBridge
base::CancelableCallback<void(int)> device_count_callback_; base::CancelableCallback<void(int)> device_count_callback_;
base::Callback<void(const base::Closure&)> task_scheduler_; base::Callback<void(const base::Closure&)> task_scheduler_;
typedef std::vector<PortForwardingListener*> PortForwardingListeners;
PortForwardingListeners port_forwarding_listeners_;
scoped_ptr<PortForwardingController> port_forwarding_controller_;
PrefChangeRegistrar pref_change_registrar_; PrefChangeRegistrar pref_change_registrar_;
DISALLOW_COPY_AND_ASSIGN(DevToolsAndroidBridge); DISALLOW_COPY_AND_ASSIGN(DevToolsAndroidBridge);
}; };
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
#include "base/prefs/pref_service.h" #include "base/prefs/pref_service.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "chrome/browser/devtools/browser_list_tabcontents_provider.h" #include "chrome/browser/devtools/browser_list_tabcontents_provider.h"
#include "chrome/browser/devtools/device/port_forwarding_controller.h" #include "chrome/browser/devtools/device/devtools_android_bridge.h"
#include "chrome/browser/devtools/device/self_device_provider.h" #include "chrome/browser/devtools/device/self_device_provider.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
...@@ -35,18 +35,18 @@ class PortForwardingTest: public InProcessBrowserTest { ...@@ -35,18 +35,18 @@ class PortForwardingTest: public InProcessBrowserTest {
} }
protected: protected:
class Listener : public PortForwardingController::Listener { class Listener : public DevToolsAndroidBridge::PortForwardingListener {
public: public:
explicit Listener(Profile* profile) explicit Listener(Profile* profile)
: profile_(profile), : profile_(profile),
skip_empty_devices_(true) { skip_empty_devices_(true) {
PortForwardingController::Factory::GetForProfile(profile_)-> DevToolsAndroidBridge::Factory::GetForProfile(profile_)->
AddListener(this); AddPortForwardingListener(this);
} }
virtual ~Listener() { virtual ~Listener() {
PortForwardingController::Factory::GetForProfile(profile_)-> DevToolsAndroidBridge::Factory::GetForProfile(profile_)->
RemoveListener(this); RemovePortForwardingListener(this);
} }
virtual void PortStatusChanged(const DevicesStatus& status) OVERRIDE { virtual void PortStatusChanged(const DevicesStatus& status) OVERRIDE {
......
...@@ -531,8 +531,7 @@ void PortForwardingController::Connection::OnFrameRead( ...@@ -531,8 +531,7 @@ void PortForwardingController::Connection::OnFrameRead(
PortForwardingController::PortForwardingController(Profile* profile) PortForwardingController::PortForwardingController(Profile* profile)
: profile_(profile), : profile_(profile),
pref_service_(profile->GetPrefs()), pref_service_(profile->GetPrefs()) {
listening_(false) {
pref_change_registrar_.Init(pref_service_); pref_change_registrar_.Init(pref_service_);
base::Closure callback = base::Bind( base::Closure callback = base::Bind(
&PortForwardingController::OnPrefsChange, base::Unretained(this)); &PortForwardingController::OnPrefsChange, base::Unretained(this));
...@@ -541,29 +540,14 @@ PortForwardingController::PortForwardingController(Profile* profile) ...@@ -541,29 +540,14 @@ PortForwardingController::PortForwardingController(Profile* profile)
OnPrefsChange(); OnPrefsChange();
} }
PortForwardingController::~PortForwardingController() {} PortForwardingController::~PortForwardingController() {}
void PortForwardingController::Shutdown() { PortForwardingController::DevicesStatus
// Existing connection will not be shut down. This might be confusing for PortForwardingController::DeviceListChanged(
// some users, but the opposite is more confusing.
StopListening();
}
void PortForwardingController::AddListener(Listener* listener) {
listeners_.push_back(listener);
}
void PortForwardingController::RemoveListener(Listener* listener) {
Listeners::iterator it =
std::find(listeners_.begin(), listeners_.end(), listener);
DCHECK(it != listeners_.end());
listeners_.erase(it);
}
void PortForwardingController::DeviceListChanged(
const DevToolsAndroidBridge::RemoteDevices& devices) { const DevToolsAndroidBridge::RemoteDevices& devices) {
DevicesStatus status; DevicesStatus status;
if (forwarding_map_.empty())
return status;
for (DevToolsAndroidBridge::RemoteDevices::const_iterator it = for (DevToolsAndroidBridge::RemoteDevices::const_iterator it =
devices.begin(); it != devices.end(); ++it) { devices.begin(); it != devices.end(); ++it) {
...@@ -582,7 +566,7 @@ void PortForwardingController::DeviceListChanged( ...@@ -582,7 +566,7 @@ void PortForwardingController::DeviceListChanged(
} }
} }
NotifyListeners(status); return status;
} }
void PortForwardingController::OnPrefsChange() { void PortForwardingController::OnPrefsChange() {
...@@ -602,36 +586,12 @@ void PortForwardingController::OnPrefsChange() { ...@@ -602,36 +586,12 @@ void PortForwardingController::OnPrefsChange() {
} }
if (!forwarding_map_.empty()) { if (!forwarding_map_.empty()) {
StartListening();
UpdateConnections(); UpdateConnections();
} else { } else {
StopListening();
ShutdownConnections(); ShutdownConnections();
NotifyListeners(DevicesStatus());
} }
} }
void PortForwardingController::StartListening() {
if (listening_)
return;
listening_ = true;
DevToolsAndroidBridge* android_bridge =
DevToolsAndroidBridge::Factory::GetForProfile(profile_);
if (android_bridge)
android_bridge->AddDeviceListListener(this);
}
void PortForwardingController::StopListening() {
if (!listening_)
return;
listening_ = false;
DevToolsAndroidBridge* android_bridge =
DevToolsAndroidBridge::Factory::GetForProfile(profile_);
if (android_bridge)
android_bridge->RemoveDeviceListListener(this);
}
void PortForwardingController::UpdateConnections() { void PortForwardingController::UpdateConnections() {
for (Registry::iterator it = registry_.begin(); it != registry_.end(); ++it) for (Registry::iterator it = registry_.begin(); it != registry_.end(); ++it)
it->second->UpdateForwardingMap(forwarding_map_); it->second->UpdateForwardingMap(forwarding_map_);
...@@ -642,36 +602,3 @@ void PortForwardingController::ShutdownConnections() { ...@@ -642,36 +602,3 @@ void PortForwardingController::ShutdownConnections() {
it->second->Shutdown(); it->second->Shutdown();
registry_.clear(); registry_.clear();
} }
void PortForwardingController::NotifyListeners(
const DevicesStatus& status) const {
Listeners copy(listeners_); // Iterate over copy.
for (Listeners::const_iterator it = copy.begin(); it != copy.end(); ++it)
(*it)->PortStatusChanged(status);
}
// static
PortForwardingController::Factory*
PortForwardingController::Factory::GetInstance() {
return Singleton<PortForwardingController::Factory>::get();
}
// static
PortForwardingController* PortForwardingController::Factory::GetForProfile(
Profile* profile) {
return static_cast<PortForwardingController*>(GetInstance()->
GetServiceForBrowserContext(profile, true));
}
PortForwardingController::Factory::Factory()
: BrowserContextKeyedServiceFactory(
"PortForwardingController",
BrowserContextDependencyManager::GetInstance()) {}
PortForwardingController::Factory::~Factory() {}
KeyedService* PortForwardingController::Factory::BuildServiceInstanceFor(
content::BrowserContext* context) const {
Profile* profile = Profile::FromBrowserContext(context);
return new PortForwardingController(profile);
}
...@@ -15,81 +15,33 @@ ...@@ -15,81 +15,33 @@
class PrefService; class PrefService;
class Profile; class Profile;
class PortForwardingController class PortForwardingController {
: private KeyedService,
private DevToolsAndroidBridge::DeviceListListener {
public: public:
typedef DevToolsAndroidBridge::PortStatus PortStatus;
typedef DevToolsAndroidBridge::PortStatusMap PortStatusMap;
typedef DevToolsAndroidBridge::DevicesStatus DevicesStatus;
explicit PortForwardingController(Profile* profile); explicit PortForwardingController(Profile* profile);
virtual ~PortForwardingController(); virtual ~PortForwardingController();
// KeyedService implementation. DevicesStatus DeviceListChanged(
virtual void Shutdown() OVERRIDE; const DevToolsAndroidBridge::RemoteDevices& devices);
class Factory : public BrowserContextKeyedServiceFactory {
public:
// Returns singleton instance of Factory.
static Factory* GetInstance();
// Returns PortForwardingController associated with |profile|.
static PortForwardingController* GetForProfile(Profile* profile);
private:
friend struct DefaultSingletonTraits<Factory>;
Factory();
virtual ~Factory();
// BrowserContextKeyedServiceFactory overrides:
virtual KeyedService* BuildServiceInstanceFor(
content::BrowserContext* context) const OVERRIDE;
DISALLOW_COPY_AND_ASSIGN(Factory);
};
typedef int PortStatus;
typedef std::map<int, PortStatus> PortStatusMap;
typedef std::map<std::string, PortStatusMap> DevicesStatus;
class Listener {
public:
typedef PortForwardingController::PortStatusMap PortStatusMap;
typedef PortForwardingController::DevicesStatus DevicesStatus;
virtual void PortStatusChanged(const DevicesStatus&) = 0;
protected:
virtual ~Listener() {}
};
void AddListener(Listener* listener);
void RemoveListener(Listener* listener);
private: private:
class Connection; class Connection;
typedef std::map<std::string, Connection*> Registry; typedef std::map<std::string, Connection*> Registry;
// DevToolsAndroidBridge::Listener implementation.
virtual void DeviceListChanged(
const DevToolsAndroidBridge::RemoteDevices& devices) OVERRIDE;
void OnPrefsChange(); void OnPrefsChange();
void StartListening();
void StopListening();
void UpdateConnections(); void UpdateConnections();
void ShutdownConnections(); void ShutdownConnections();
void NotifyListeners(const DevicesStatus& status) const;
Profile* profile_; Profile* profile_;
PrefService* pref_service_; PrefService* pref_service_;
PrefChangeRegistrar pref_change_registrar_; PrefChangeRegistrar pref_change_registrar_;
Registry registry_; Registry registry_;
typedef std::vector<Listener*> Listeners;
Listeners listeners_;
bool listening_;
typedef std::map<int, std::string> ForwardingMap; typedef std::map<int, std::string> ForwardingMap;
ForwardingMap forwarding_map_; ForwardingMap forwarding_map_;
......
...@@ -515,17 +515,17 @@ PortForwardingStatusSerializer::PortForwardingStatusSerializer( ...@@ -515,17 +515,17 @@ PortForwardingStatusSerializer::PortForwardingStatusSerializer(
const Callback& callback, Profile* profile) const Callback& callback, Profile* profile)
: callback_(callback), : callback_(callback),
profile_(profile) { profile_(profile) {
PortForwardingController* port_forwarding_controller = DevToolsAndroidBridge* android_bridge =
PortForwardingController::Factory::GetForProfile(profile_); DevToolsAndroidBridge::Factory::GetForProfile(profile_);
if (port_forwarding_controller) if (android_bridge)
port_forwarding_controller->AddListener(this); android_bridge->AddPortForwardingListener(this);
} }
PortForwardingStatusSerializer::~PortForwardingStatusSerializer() { PortForwardingStatusSerializer::~PortForwardingStatusSerializer() {
PortForwardingController* port_forwarding_controller = DevToolsAndroidBridge* android_bridge =
PortForwardingController::Factory::GetForProfile(profile_); DevToolsAndroidBridge::Factory::GetForProfile(profile_);
if (port_forwarding_controller) if (android_bridge)
port_forwarding_controller->RemoveListener(this); android_bridge->RemovePortForwardingListener(this);
} }
void PortForwardingStatusSerializer::PortStatusChanged( void PortForwardingStatusSerializer::PortStatusChanged(
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "chrome/browser/devtools/device/port_forwarding_controller.h" #include "chrome/browser/devtools/device/devtools_android_bridge.h"
namespace base { namespace base {
class ListValue; class ListValue;
...@@ -64,7 +64,7 @@ class DevToolsTargetsUIHandler { ...@@ -64,7 +64,7 @@ class DevToolsTargetsUIHandler {
}; };
class PortForwardingStatusSerializer class PortForwardingStatusSerializer
: private PortForwardingController::Listener { : private DevToolsAndroidBridge::PortForwardingListener {
public: public:
typedef base::Callback<void(const base::Value&)> Callback; typedef base::Callback<void(const base::Value&)> Callback;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment