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

Side by Side Diff: chrome/browser/devtools/device/devtools_android_bridge.cc

Issue 500373004: DevTools: Make port forwarding part of DevToolsAndroidBridge. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/devtools/device/devtools_android_bridge.h" 5 #include "chrome/browser/devtools/device/devtools_android_bridge.h"
6 6
7 #include <map> 7 #include <map>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/base64.h" 10 #include "base/base64.h"
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/compiler_specific.h" 12 #include "base/compiler_specific.h"
13 #include "base/json/json_reader.h" 13 #include "base/json/json_reader.h"
14 #include "base/lazy_instance.h" 14 #include "base/lazy_instance.h"
15 #include "base/message_loop/message_loop.h" 15 #include "base/message_loop/message_loop.h"
16 #include "base/prefs/pref_service.h" 16 #include "base/prefs/pref_service.h"
17 #include "base/strings/string_number_conversions.h" 17 #include "base/strings/string_number_conversions.h"
18 #include "base/strings/string_util.h" 18 #include "base/strings/string_util.h"
19 #include "base/strings/stringprintf.h" 19 #include "base/strings/stringprintf.h"
20 #include "base/strings/utf_string_conversions.h" 20 #include "base/strings/utf_string_conversions.h"
21 #include "base/threading/thread.h" 21 #include "base/threading/thread.h"
22 #include "base/values.h" 22 #include "base/values.h"
23 #include "chrome/browser/devtools/browser_list_tabcontents_provider.h" 23 #include "chrome/browser/devtools/browser_list_tabcontents_provider.h"
24 #include "chrome/browser/devtools/device/adb/adb_device_info_query.h" 24 #include "chrome/browser/devtools/device/adb/adb_device_info_query.h"
25 #include "chrome/browser/devtools/device/adb/adb_device_provider.h" 25 #include "chrome/browser/devtools/device/adb/adb_device_provider.h"
26 #include "chrome/browser/devtools/device/port_forwarding_controller.h"
26 #include "chrome/browser/devtools/device/self_device_provider.h" 27 #include "chrome/browser/devtools/device/self_device_provider.h"
27 #include "chrome/browser/devtools/device/usb/usb_device_provider.h" 28 #include "chrome/browser/devtools/device/usb/usb_device_provider.h"
28 #include "chrome/browser/devtools/devtools_protocol.h" 29 #include "chrome/browser/devtools/devtools_protocol.h"
29 #include "chrome/browser/devtools/devtools_target_impl.h" 30 #include "chrome/browser/devtools/devtools_target_impl.h"
30 #include "chrome/browser/devtools/devtools_window.h" 31 #include "chrome/browser/devtools/devtools_window.h"
31 #include "chrome/browser/profiles/profile.h" 32 #include "chrome/browser/profiles/profile.h"
32 #include "chrome/common/pref_names.h" 33 #include "chrome/common/pref_names.h"
33 #include "components/keyed_service/content/browser_context_dependency_manager.h" 34 #include "components/keyed_service/content/browser_context_dependency_manager.h"
34 #include "content/public/browser/devtools_agent_host.h" 35 #include "content/public/browser/devtools_agent_host.h"
35 #include "content/public/browser/devtools_external_agent_proxy.h" 36 #include "content/public/browser/devtools_external_agent_proxy.h"
(...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 } 727 }
727 728
728 DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() { 729 DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() {
729 } 730 }
730 731
731 // DevToolsAndroidBridge ------------------------------------------------------ 732 // DevToolsAndroidBridge ------------------------------------------------------
732 733
733 DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile) 734 DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile)
734 : profile_(profile), 735 : profile_(profile),
735 device_manager_(AndroidDeviceManager::Create()), 736 device_manager_(AndroidDeviceManager::Create()),
736 task_scheduler_(base::Bind(&DevToolsAndroidBridge::ScheduleTaskDefault)) { 737 task_scheduler_(base::Bind(&DevToolsAndroidBridge::ScheduleTaskDefault)),
738 port_forwarding_controller_(new PortForwardingController(profile)) {
737 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 739 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
738 pref_change_registrar_.Init(profile_->GetPrefs()); 740 pref_change_registrar_.Init(profile_->GetPrefs());
739 pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled, 741 pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled,
740 base::Bind(&DevToolsAndroidBridge::CreateDeviceProviders, 742 base::Bind(&DevToolsAndroidBridge::CreateDeviceProviders,
741 base::Unretained(this))); 743 base::Unretained(this)));
742 CreateDeviceProviders(); 744 CreateDeviceProviders();
743 } 745 }
744 746
745 void DevToolsAndroidBridge::AddDeviceListListener( 747 void DevToolsAndroidBridge::AddDeviceListListener(
746 DeviceListListener* listener) { 748 DeviceListListener* listener) {
747 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 749 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
750 bool polling_was_off = !NeedsDeviceListPolling();
748 device_list_listeners_.push_back(listener); 751 device_list_listeners_.push_back(listener);
749 if (device_list_listeners_.size() == 1) 752 if (polling_was_off)
750 StartDeviceListPolling(); 753 StartDeviceListPolling();
751 } 754 }
752 755
753 void DevToolsAndroidBridge::RemoveDeviceListListener( 756 void DevToolsAndroidBridge::RemoveDeviceListListener(
754 DeviceListListener* listener) { 757 DeviceListListener* listener) {
755 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 758 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
756 DeviceListListeners::iterator it = std::find( 759 DeviceListListeners::iterator it = std::find(
757 device_list_listeners_.begin(), device_list_listeners_.end(), listener); 760 device_list_listeners_.begin(), device_list_listeners_.end(), listener);
758 DCHECK(it != device_list_listeners_.end()); 761 DCHECK(it != device_list_listeners_.end());
759 device_list_listeners_.erase(it); 762 device_list_listeners_.erase(it);
760 if (device_list_listeners_.empty()) 763 if (!NeedsDeviceListPolling())
761 StopDeviceListPolling(); 764 StopDeviceListPolling();
762 } 765 }
763 766
764 void DevToolsAndroidBridge::AddDeviceCountListener( 767 void DevToolsAndroidBridge::AddDeviceCountListener(
765 DeviceCountListener* listener) { 768 DeviceCountListener* listener) {
766 device_count_listeners_.push_back(listener); 769 device_count_listeners_.push_back(listener);
767 if (device_count_listeners_.size() == 1) 770 if (device_count_listeners_.size() == 1)
768 StartDeviceCountPolling(); 771 StartDeviceCountPolling();
769 } 772 }
770 773
771 void DevToolsAndroidBridge::RemoveDeviceCountListener( 774 void DevToolsAndroidBridge::RemoveDeviceCountListener(
772 DeviceCountListener* listener) { 775 DeviceCountListener* listener) {
773 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 776 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
774 DeviceCountListeners::iterator it = std::find( 777 DeviceCountListeners::iterator it = std::find(
775 device_count_listeners_.begin(), device_count_listeners_.end(), listener); 778 device_count_listeners_.begin(), device_count_listeners_.end(), listener);
776 DCHECK(it != device_count_listeners_.end()); 779 DCHECK(it != device_count_listeners_.end());
777 device_count_listeners_.erase(it); 780 device_count_listeners_.erase(it);
778 if (device_count_listeners_.empty()) 781 if (device_count_listeners_.empty())
779 StopDeviceCountPolling(); 782 StopDeviceCountPolling();
780 } 783 }
781 784
785 void DevToolsAndroidBridge::AddPortForwardingListener(
786 PortForwardingListener* listener) {
787 bool polling_was_off = !NeedsDeviceListPolling();
788 port_forwarding_listeners_.push_back(listener);
789 if (polling_was_off)
790 StartDeviceListPolling();
791 }
792
793 void DevToolsAndroidBridge::RemovePortForwardingListener(
794 PortForwardingListener* listener) {
795 PortForwardingListeners::iterator it = std::find(
796 port_forwarding_listeners_.begin(),
797 port_forwarding_listeners_.end(),
798 listener);
799 DCHECK(it != port_forwarding_listeners_.end());
800 port_forwarding_listeners_.erase(it);
801 if (!NeedsDeviceListPolling())
802 StopDeviceListPolling();
803 }
804
782 // static 805 // static
783 bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) { 806 bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) {
784 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 807 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
785 return g_host_delegates.Get().find(agent_id) != g_host_delegates.Get().end(); 808 return g_host_delegates.Get().find(agent_id) != g_host_delegates.Get().end();
786 } 809 }
787 810
788 DevToolsAndroidBridge::~DevToolsAndroidBridge() { 811 DevToolsAndroidBridge::~DevToolsAndroidBridge() {
789 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 812 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
790 DCHECK(device_list_listeners_.empty()); 813 DCHECK(device_list_listeners_.empty());
791 DCHECK(device_count_listeners_.empty()); 814 DCHECK(device_count_listeners_.empty());
815 DCHECK(port_forwarding_listeners_.empty());
792 } 816 }
793 817
794 void DevToolsAndroidBridge::StartDeviceListPolling() { 818 void DevToolsAndroidBridge::StartDeviceListPolling() {
795 device_list_callback_.Reset( 819 device_list_callback_.Reset(
796 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this)); 820 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this));
797 RequestDeviceList(device_list_callback_.callback()); 821 RequestDeviceList(device_list_callback_.callback());
798 } 822 }
799 823
800 void DevToolsAndroidBridge::StopDeviceListPolling() { 824 void DevToolsAndroidBridge::StopDeviceListPolling() {
801 device_list_callback_.Cancel(); 825 device_list_callback_.Cancel();
802 devices_.clear(); 826 devices_.clear();
803 } 827 }
804 828
829 bool DevToolsAndroidBridge::NeedsDeviceListPolling() {
830 return !device_list_listeners_.empty() || !port_forwarding_listeners_.empty();
831 }
832
805 void DevToolsAndroidBridge::RequestDeviceList( 833 void DevToolsAndroidBridge::RequestDeviceList(
806 const base::Callback<void(const RemoteDevices&)>& callback) { 834 const base::Callback<void(const RemoteDevices&)>& callback) {
807 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 835 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
808 836
809 if (device_list_listeners_.empty() || 837 if (!NeedsDeviceListPolling() ||
810 !callback.Equals(device_list_callback_.callback())) 838 !callback.Equals(device_list_callback_.callback()))
811 return; 839 return;
812 840
813 new DiscoveryRequest(device_manager_.get(), callback); 841 new DiscoveryRequest(device_manager_.get(), callback);
814 } 842 }
815 843
816 void DevToolsAndroidBridge::ReceivedDeviceList(const RemoteDevices& devices) { 844 void DevToolsAndroidBridge::ReceivedDeviceList(const RemoteDevices& devices) {
817 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 845 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
818 846
819 DeviceListListeners copy(device_list_listeners_); 847 DeviceListListeners copy(device_list_listeners_);
820 for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it) 848 for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it)
821 (*it)->DeviceListChanged(devices); 849 (*it)->DeviceListChanged(devices);
822 850
823 if (device_list_listeners_.empty()) 851 DevicesStatus status =
852 port_forwarding_controller_->DeviceListChanged(devices);
853 PortForwardingListeners forwarding_listeners(port_forwarding_listeners_);
854 for (PortForwardingListeners::iterator it = forwarding_listeners.begin();
855 it != forwarding_listeners.end(); ++it) {
856 (*it)->PortStatusChanged(status);
857 }
858
859 if (!NeedsDeviceListPolling())
824 return; 860 return;
825 861
826 devices_ = devices; 862 devices_ = devices;
827 863
828 task_scheduler_.Run( 864 task_scheduler_.Run(
829 base::Bind(&DevToolsAndroidBridge::RequestDeviceList, 865 base::Bind(&DevToolsAndroidBridge::RequestDeviceList,
830 this, device_list_callback_.callback())); 866 this, device_list_callback_.callback()));
831 } 867 }
832 868
833 void DevToolsAndroidBridge::StartDeviceCountPolling() { 869 void DevToolsAndroidBridge::StartDeviceCountPolling() {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
889 PrefService* service = profile_->GetPrefs(); 925 PrefService* service = profile_->GetPrefs();
890 const PrefService::Preference* pref = 926 const PrefService::Preference* pref =
891 service->FindPreference(prefs::kDevToolsDiscoverUsbDevicesEnabled); 927 service->FindPreference(prefs::kDevToolsDiscoverUsbDevicesEnabled);
892 const base::Value* pref_value = pref->GetValue(); 928 const base::Value* pref_value = pref->GetValue();
893 929
894 bool enabled; 930 bool enabled;
895 if (pref_value->GetAsBoolean(&enabled) && enabled) { 931 if (pref_value->GetAsBoolean(&enabled) && enabled) {
896 device_providers.push_back(new UsbDeviceProvider(profile_)); 932 device_providers.push_back(new UsbDeviceProvider(profile_));
897 } 933 }
898 device_manager_->SetDeviceProviders(device_providers); 934 device_manager_->SetDeviceProviders(device_providers);
899 if (!device_list_listeners_.empty()) { 935 if (NeedsDeviceListPolling()) {
900 StopDeviceListPolling(); 936 StopDeviceListPolling();
901 StartDeviceListPolling(); 937 StartDeviceListPolling();
902 } 938 }
903 } 939 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698