OLD | NEW |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |