| 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 |