| 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" |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 const std::string& response); | 107 const std::string& response); |
| 108 | 108 |
| 109 DeviceListCallback callback_; | 109 DeviceListCallback callback_; |
| 110 CompleteDevices complete_devices_; | 110 CompleteDevices complete_devices_; |
| 111 }; | 111 }; |
| 112 | 112 |
| 113 DevToolsAndroidBridge::DiscoveryRequest::DiscoveryRequest( | 113 DevToolsAndroidBridge::DiscoveryRequest::DiscoveryRequest( |
| 114 AndroidDeviceManager* device_manager, | 114 AndroidDeviceManager* device_manager, |
| 115 const DeviceListCallback& callback) | 115 const DeviceListCallback& callback) |
| 116 : callback_(callback) { | 116 : callback_(callback) { |
| 117 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 117 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 118 device_manager->QueryDevices( | 118 device_manager->QueryDevices( |
| 119 base::Bind(&DiscoveryRequest::ReceivedDevices, this)); | 119 base::Bind(&DiscoveryRequest::ReceivedDevices, this)); |
| 120 } | 120 } |
| 121 | 121 |
| 122 DevToolsAndroidBridge::DiscoveryRequest::~DiscoveryRequest() { | 122 DevToolsAndroidBridge::DiscoveryRequest::~DiscoveryRequest() { |
| 123 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 123 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 124 callback_.Run(complete_devices_); | 124 callback_.Run(complete_devices_); |
| 125 } | 125 } |
| 126 | 126 |
| 127 void DevToolsAndroidBridge::DiscoveryRequest::ReceivedDevices( | 127 void DevToolsAndroidBridge::DiscoveryRequest::ReceivedDevices( |
| 128 const AndroidDeviceManager::Devices& devices) { | 128 const AndroidDeviceManager::Devices& devices) { |
| 129 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 129 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 130 for (const auto& device : devices) { | 130 for (const auto& device : devices) { |
| 131 device->QueryDeviceInfo( | 131 device->QueryDeviceInfo( |
| 132 base::Bind(&DiscoveryRequest::ReceivedDeviceInfo, this, device)); | 132 base::Bind(&DiscoveryRequest::ReceivedDeviceInfo, this, device)); |
| 133 } | 133 } |
| 134 } | 134 } |
| 135 | 135 |
| 136 void DevToolsAndroidBridge::DiscoveryRequest::ReceivedDeviceInfo( | 136 void DevToolsAndroidBridge::DiscoveryRequest::ReceivedDeviceInfo( |
| 137 scoped_refptr<AndroidDeviceManager::Device> device, | 137 scoped_refptr<AndroidDeviceManager::Device> device, |
| 138 const AndroidDeviceManager::DeviceInfo& device_info) { | 138 const AndroidDeviceManager::DeviceInfo& device_info) { |
| 139 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 139 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 140 scoped_refptr<RemoteDevice> remote_device = | 140 scoped_refptr<RemoteDevice> remote_device = |
| 141 new RemoteDevice(device->serial(), device_info); | 141 new RemoteDevice(device->serial(), device_info); |
| 142 complete_devices_.push_back(std::make_pair(device, remote_device)); | 142 complete_devices_.push_back(std::make_pair(device, remote_device)); |
| 143 for (RemoteBrowsers::iterator it = remote_device->browsers().begin(); | 143 for (RemoteBrowsers::iterator it = remote_device->browsers().begin(); |
| 144 it != remote_device->browsers().end(); ++it) { | 144 it != remote_device->browsers().end(); ++it) { |
| 145 device->SendJsonRequest( | 145 device->SendJsonRequest( |
| 146 (*it)->socket(), | 146 (*it)->socket(), |
| 147 kVersionRequest, | 147 kVersionRequest, |
| 148 base::Bind(&DiscoveryRequest::ReceivedVersion, this, *it)); | 148 base::Bind(&DiscoveryRequest::ReceivedVersion, this, *it)); |
| 149 device->SendJsonRequest( | 149 device->SendJsonRequest( |
| 150 (*it)->socket(), | 150 (*it)->socket(), |
| 151 kPageListRequest, | 151 kPageListRequest, |
| 152 base::Bind(&DiscoveryRequest::ReceivedPages, this, *it)); | 152 base::Bind(&DiscoveryRequest::ReceivedPages, this, *it)); |
| 153 } | 153 } |
| 154 } | 154 } |
| 155 | 155 |
| 156 void DevToolsAndroidBridge::DiscoveryRequest::ReceivedVersion( | 156 void DevToolsAndroidBridge::DiscoveryRequest::ReceivedVersion( |
| 157 scoped_refptr<RemoteBrowser> browser, | 157 scoped_refptr<RemoteBrowser> browser, |
| 158 int result, | 158 int result, |
| 159 const std::string& response) { | 159 const std::string& response) { |
| 160 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 160 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 161 if (result < 0) | 161 if (result < 0) |
| 162 return; | 162 return; |
| 163 // Parse version, append to package name if available, | 163 // Parse version, append to package name if available, |
| 164 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); | 164 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); |
| 165 base::DictionaryValue* dict; | 165 base::DictionaryValue* dict; |
| 166 if (value && value->GetAsDictionary(&dict)) { | 166 if (value && value->GetAsDictionary(&dict)) { |
| 167 std::string browser_name; | 167 std::string browser_name; |
| 168 if (dict->GetString("Browser", &browser_name)) { | 168 if (dict->GetString("Browser", &browser_name)) { |
| 169 std::vector<std::string> parts; | 169 std::vector<std::string> parts; |
| 170 Tokenize(browser_name, "/", &parts); | 170 Tokenize(browser_name, "/", &parts); |
| 171 if (parts.size() == 2) | 171 if (parts.size() == 2) |
| 172 browser->version_ = parts[1]; | 172 browser->version_ = parts[1]; |
| 173 else | 173 else |
| 174 browser->version_ = browser_name; | 174 browser->version_ = browser_name; |
| 175 } | 175 } |
| 176 std::string package; | 176 std::string package; |
| 177 if (dict->GetString("Android-Package", &package)) { | 177 if (dict->GetString("Android-Package", &package)) { |
| 178 browser->display_name_ = | 178 browser->display_name_ = |
| 179 AndroidDeviceManager::GetBrowserName(browser->socket(), package); | 179 AndroidDeviceManager::GetBrowserName(browser->socket(), package); |
| 180 } | 180 } |
| 181 } | 181 } |
| 182 } | 182 } |
| 183 | 183 |
| 184 void DevToolsAndroidBridge::DiscoveryRequest::ReceivedPages( | 184 void DevToolsAndroidBridge::DiscoveryRequest::ReceivedPages( |
| 185 scoped_refptr<RemoteBrowser> browser, | 185 scoped_refptr<RemoteBrowser> browser, |
| 186 int result, | 186 int result, |
| 187 const std::string& response) { | 187 const std::string& response) { |
| 188 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 188 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 189 if (result < 0) | 189 if (result < 0) |
| 190 return; | 190 return; |
| 191 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); | 191 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); |
| 192 base::ListValue* list_value; | 192 base::ListValue* list_value; |
| 193 if (value && value->GetAsList(&list_value)) { | 193 if (value && value->GetAsList(&list_value)) { |
| 194 for (const auto& page_value : *list_value) { | 194 for (const auto& page_value : *list_value) { |
| 195 base::DictionaryValue* dict; | 195 base::DictionaryValue* dict; |
| 196 if (page_value->GetAsDictionary(&dict)) { | 196 if (page_value->GetAsDictionary(&dict)) { |
| 197 browser->pages_.push_back( | 197 browser->pages_.push_back( |
| 198 new RemotePage(browser->browser_id_, *dict, browser->IsWebView())); | 198 new RemotePage(browser->browser_id_, *dict, browser->IsWebView())); |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 }; | 341 }; |
| 342 | 342 |
| 343 // static | 343 // static |
| 344 scoped_refptr<content::DevToolsAgentHost> | 344 scoped_refptr<content::DevToolsAgentHost> |
| 345 DevToolsAndroidBridge::AgentHostDelegate::GetOrCreateAgentHost( | 345 DevToolsAndroidBridge::AgentHostDelegate::GetOrCreateAgentHost( |
| 346 DevToolsAndroidBridge* bridge, | 346 DevToolsAndroidBridge* bridge, |
| 347 const std::string& id, | 347 const std::string& id, |
| 348 const BrowserId& browser_id, | 348 const BrowserId& browser_id, |
| 349 const std::string& debug_url, | 349 const std::string& debug_url, |
| 350 bool is_web_view) { | 350 bool is_web_view) { |
| 351 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 351 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 352 AgentHostDelegates::iterator it = bridge->host_delegates_.find(id); | 352 AgentHostDelegates::iterator it = bridge->host_delegates_.find(id); |
| 353 if (it != bridge->host_delegates_.end()) | 353 if (it != bridge->host_delegates_.end()) |
| 354 return it->second->agent_host_; | 354 return it->second->agent_host_; |
| 355 | 355 |
| 356 AgentHostDelegate* delegate = | 356 AgentHostDelegate* delegate = |
| 357 new AgentHostDelegate(bridge, id, browser_id, debug_url, is_web_view); | 357 new AgentHostDelegate(bridge, id, browser_id, debug_url, is_web_view); |
| 358 scoped_refptr<content::DevToolsAgentHost> result = | 358 scoped_refptr<content::DevToolsAgentHost> result = |
| 359 content::DevToolsAgentHost::Create(delegate); | 359 content::DevToolsAgentHost::Create(delegate); |
| 360 delegate->agent_host_ = result.get(); | 360 delegate->agent_host_ = result.get(); |
| 361 return result; | 361 return result; |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 655 } | 655 } |
| 656 device->SendJsonRequest(browser_id.second, request, callback); | 656 device->SendJsonRequest(browser_id.second, request, callback); |
| 657 } | 657 } |
| 658 | 658 |
| 659 void DevToolsAndroidBridge::SendProtocolCommand( | 659 void DevToolsAndroidBridge::SendProtocolCommand( |
| 660 const BrowserId& browser_id, | 660 const BrowserId& browser_id, |
| 661 const std::string& debug_url, | 661 const std::string& debug_url, |
| 662 const std::string& method, | 662 const std::string& method, |
| 663 scoped_ptr<base::DictionaryValue> params, | 663 scoped_ptr<base::DictionaryValue> params, |
| 664 const base::Closure callback) { | 664 const base::Closure callback) { |
| 665 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 665 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 666 if (debug_url.empty()) | 666 if (debug_url.empty()) |
| 667 return; | 667 return; |
| 668 scoped_refptr<AndroidDeviceManager::Device> device( | 668 scoped_refptr<AndroidDeviceManager::Device> device( |
| 669 FindDevice(browser_id.first)); | 669 FindDevice(browser_id.first)); |
| 670 if (!device.get()) { | 670 if (!device.get()) { |
| 671 callback.Run(); | 671 callback.Run(); |
| 672 return; | 672 return; |
| 673 } | 673 } |
| 674 new ProtocolCommand( | 674 new ProtocolCommand( |
| 675 device, browser_id.second, debug_url, | 675 device, browser_id.second, debug_url, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 704 const std::string& serial) { | 704 const std::string& serial) { |
| 705 DeviceMap::iterator it = device_map_.find(serial); | 705 DeviceMap::iterator it = device_map_.find(serial); |
| 706 return it == device_map_.end() ? nullptr : it->second; | 706 return it == device_map_.end() ? nullptr : it->second; |
| 707 } | 707 } |
| 708 | 708 |
| 709 void DevToolsAndroidBridge::RespondToOpenOnUIThread( | 709 void DevToolsAndroidBridge::RespondToOpenOnUIThread( |
| 710 scoped_refptr<RemoteBrowser> browser, | 710 scoped_refptr<RemoteBrowser> browser, |
| 711 const RemotePageCallback& callback, | 711 const RemotePageCallback& callback, |
| 712 int result, | 712 int result, |
| 713 const std::string& response) { | 713 const std::string& response) { |
| 714 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 714 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 715 if (result < 0) { | 715 if (result < 0) { |
| 716 callback.Run(NULL); | 716 callback.Run(NULL); |
| 717 return; | 717 return; |
| 718 } | 718 } |
| 719 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); | 719 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); |
| 720 base::DictionaryValue* dict; | 720 base::DictionaryValue* dict; |
| 721 if (value && value->GetAsDictionary(&dict)) { | 721 if (value && value->GetAsDictionary(&dict)) { |
| 722 scoped_refptr<RemotePage> new_page( | 722 scoped_refptr<RemotePage> new_page( |
| 723 new RemotePage(browser->browser_id_, *dict, browser->IsWebView())); | 723 new RemotePage(browser->browser_id_, *dict, browser->IsWebView())); |
| 724 callback.Run(new_page); | 724 callback.Run(new_page); |
| 725 } | 725 } |
| 726 } | 726 } |
| 727 | 727 |
| 728 void DevToolsAndroidBridge::OpenRemotePage( | 728 void DevToolsAndroidBridge::OpenRemotePage( |
| 729 scoped_refptr<RemoteBrowser> browser, | 729 scoped_refptr<RemoteBrowser> browser, |
| 730 const std::string& input_url, | 730 const std::string& input_url, |
| 731 const DevToolsAndroidBridge::RemotePageCallback& callback) { | 731 const DevToolsAndroidBridge::RemotePageCallback& callback) { |
| 732 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 732 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 733 GURL gurl(input_url); | 733 GURL gurl(input_url); |
| 734 if (!gurl.is_valid()) { | 734 if (!gurl.is_valid()) { |
| 735 gurl = GURL("http://" + input_url); | 735 gurl = GURL("http://" + input_url); |
| 736 if (!gurl.is_valid()) | 736 if (!gurl.is_valid()) |
| 737 return; | 737 return; |
| 738 } | 738 } |
| 739 std::string url = gurl.spec(); | 739 std::string url = gurl.spec(); |
| 740 RemoteBrowser::ParsedVersion parsed_version = browser->GetParsedVersion(); | 740 RemoteBrowser::ParsedVersion parsed_version = browser->GetParsedVersion(); |
| 741 | 741 |
| 742 if (browser->IsChrome() && | 742 if (browser->IsChrome() && |
| (...skipping 11 matching lines...) Expand all Loading... |
| 754 AsWeakPtr(), browser, callback, url)); | 754 AsWeakPtr(), browser, callback, url)); |
| 755 } | 755 } |
| 756 } | 756 } |
| 757 | 757 |
| 758 void DevToolsAndroidBridge::PageCreatedOnUIThread( | 758 void DevToolsAndroidBridge::PageCreatedOnUIThread( |
| 759 scoped_refptr<RemoteBrowser> browser, | 759 scoped_refptr<RemoteBrowser> browser, |
| 760 const RemotePageCallback& callback, | 760 const RemotePageCallback& callback, |
| 761 const std::string& url, | 761 const std::string& url, |
| 762 int result, | 762 int result, |
| 763 const std::string& response) { | 763 const std::string& response) { |
| 764 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 764 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 765 | 765 |
| 766 if (result < 0) | 766 if (result < 0) |
| 767 return; | 767 return; |
| 768 // Navigating too soon after the page creation breaks navigation history | 768 // Navigating too soon after the page creation breaks navigation history |
| 769 // (crbug.com/311014). This can be avoided by adding a moderate delay. | 769 // (crbug.com/311014). This can be avoided by adding a moderate delay. |
| 770 BrowserThread::PostDelayedTask( | 770 BrowserThread::PostDelayedTask( |
| 771 BrowserThread::UI, FROM_HERE, | 771 BrowserThread::UI, FROM_HERE, |
| 772 base::Bind(&DevToolsAndroidBridge::NavigatePageOnUIThread, | 772 base::Bind(&DevToolsAndroidBridge::NavigatePageOnUIThread, |
| 773 AsWeakPtr(), browser, callback, result, response, url), | 773 AsWeakPtr(), browser, callback, result, response, url), |
| 774 base::TimeDelta::FromMilliseconds(kNewPageNavigateDelayMs)); | 774 base::TimeDelta::FromMilliseconds(kNewPageNavigateDelayMs)); |
| 775 } | 775 } |
| 776 | 776 |
| 777 void DevToolsAndroidBridge::NavigatePageOnUIThread( | 777 void DevToolsAndroidBridge::NavigatePageOnUIThread( |
| 778 scoped_refptr<RemoteBrowser> browser, | 778 scoped_refptr<RemoteBrowser> browser, |
| 779 const RemotePageCallback& callback, | 779 const RemotePageCallback& callback, |
| 780 int result, | 780 int result, |
| 781 const std::string& response, | 781 const std::string& response, |
| 782 const std::string& url) { | 782 const std::string& url) { |
| 783 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 783 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 784 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); | 784 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); |
| 785 base::DictionaryValue* dict; | 785 base::DictionaryValue* dict; |
| 786 | 786 |
| 787 if (value && value->GetAsDictionary(&dict)) { | 787 if (value && value->GetAsDictionary(&dict)) { |
| 788 RemotePageTarget new_page(this, browser->browser_id_, *dict, | 788 RemotePageTarget new_page(this, browser->browser_id_, *dict, |
| 789 browser->IsWebView()); | 789 browser->IsWebView()); |
| 790 new_page.Navigate(url, | 790 new_page.Navigate(url, |
| 791 base::Bind(&DevToolsAndroidBridge::RespondToOpenOnUIThread, | 791 base::Bind(&DevToolsAndroidBridge::RespondToOpenOnUIThread, |
| 792 AsWeakPtr(), browser, callback, result, response)); | 792 AsWeakPtr(), browser, callback, result, response)); |
| 793 } | 793 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 822 Profile* profile, | 822 Profile* profile, |
| 823 SigninManagerBase* signin_manager, | 823 SigninManagerBase* signin_manager, |
| 824 ProfileOAuth2TokenService* const token_service) | 824 ProfileOAuth2TokenService* const token_service) |
| 825 : profile_(profile), | 825 : profile_(profile), |
| 826 signin_manager_(signin_manager), | 826 signin_manager_(signin_manager), |
| 827 token_service_(token_service), | 827 token_service_(token_service), |
| 828 device_manager_(AndroidDeviceManager::Create()), | 828 device_manager_(AndroidDeviceManager::Create()), |
| 829 task_scheduler_(base::Bind(&DevToolsAndroidBridge::ScheduleTaskDefault)), | 829 task_scheduler_(base::Bind(&DevToolsAndroidBridge::ScheduleTaskDefault)), |
| 830 port_forwarding_controller_(new PortForwardingController(profile, this)), | 830 port_forwarding_controller_(new PortForwardingController(profile, this)), |
| 831 weak_factory_(this) { | 831 weak_factory_(this) { |
| 832 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 832 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 833 pref_change_registrar_.Init(profile_->GetPrefs()); | 833 pref_change_registrar_.Init(profile_->GetPrefs()); |
| 834 pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled, | 834 pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled, |
| 835 base::Bind(&DevToolsAndroidBridge::CreateDeviceProviders, | 835 base::Bind(&DevToolsAndroidBridge::CreateDeviceProviders, |
| 836 base::Unretained(this))); | 836 base::Unretained(this))); |
| 837 CreateDeviceProviders(); | 837 CreateDeviceProviders(); |
| 838 } | 838 } |
| 839 | 839 |
| 840 void DevToolsAndroidBridge::AddDeviceListListener( | 840 void DevToolsAndroidBridge::AddDeviceListListener( |
| 841 DeviceListListener* listener) { | 841 DeviceListListener* listener) { |
| 842 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 842 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 843 bool polling_was_off = !NeedsDeviceListPolling(); | 843 bool polling_was_off = !NeedsDeviceListPolling(); |
| 844 device_list_listeners_.push_back(listener); | 844 device_list_listeners_.push_back(listener); |
| 845 if (polling_was_off) | 845 if (polling_was_off) |
| 846 StartDeviceListPolling(); | 846 StartDeviceListPolling(); |
| 847 } | 847 } |
| 848 | 848 |
| 849 void DevToolsAndroidBridge::RemoveDeviceListListener( | 849 void DevToolsAndroidBridge::RemoveDeviceListListener( |
| 850 DeviceListListener* listener) { | 850 DeviceListListener* listener) { |
| 851 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 851 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 852 DeviceListListeners::iterator it = std::find( | 852 DeviceListListeners::iterator it = std::find( |
| 853 device_list_listeners_.begin(), device_list_listeners_.end(), listener); | 853 device_list_listeners_.begin(), device_list_listeners_.end(), listener); |
| 854 DCHECK(it != device_list_listeners_.end()); | 854 DCHECK(it != device_list_listeners_.end()); |
| 855 device_list_listeners_.erase(it); | 855 device_list_listeners_.erase(it); |
| 856 if (!NeedsDeviceListPolling()) | 856 if (!NeedsDeviceListPolling()) |
| 857 StopDeviceListPolling(); | 857 StopDeviceListPolling(); |
| 858 } | 858 } |
| 859 | 859 |
| 860 void DevToolsAndroidBridge::AddDeviceCountListener( | 860 void DevToolsAndroidBridge::AddDeviceCountListener( |
| 861 DeviceCountListener* listener) { | 861 DeviceCountListener* listener) { |
| 862 device_count_listeners_.push_back(listener); | 862 device_count_listeners_.push_back(listener); |
| 863 if (device_count_listeners_.size() == 1) | 863 if (device_count_listeners_.size() == 1) |
| 864 StartDeviceCountPolling(); | 864 StartDeviceCountPolling(); |
| 865 } | 865 } |
| 866 | 866 |
| 867 void DevToolsAndroidBridge::RemoveDeviceCountListener( | 867 void DevToolsAndroidBridge::RemoveDeviceCountListener( |
| 868 DeviceCountListener* listener) { | 868 DeviceCountListener* listener) { |
| 869 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 869 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 870 DeviceCountListeners::iterator it = std::find( | 870 DeviceCountListeners::iterator it = std::find( |
| 871 device_count_listeners_.begin(), device_count_listeners_.end(), listener); | 871 device_count_listeners_.begin(), device_count_listeners_.end(), listener); |
| 872 DCHECK(it != device_count_listeners_.end()); | 872 DCHECK(it != device_count_listeners_.end()); |
| 873 device_count_listeners_.erase(it); | 873 device_count_listeners_.erase(it); |
| 874 if (device_count_listeners_.empty()) | 874 if (device_count_listeners_.empty()) |
| 875 StopDeviceCountPolling(); | 875 StopDeviceCountPolling(); |
| 876 } | 876 } |
| 877 | 877 |
| 878 void DevToolsAndroidBridge::AddPortForwardingListener( | 878 void DevToolsAndroidBridge::AddPortForwardingListener( |
| 879 PortForwardingListener* listener) { | 879 PortForwardingListener* listener) { |
| 880 bool polling_was_off = !NeedsDeviceListPolling(); | 880 bool polling_was_off = !NeedsDeviceListPolling(); |
| 881 port_forwarding_listeners_.push_back(listener); | 881 port_forwarding_listeners_.push_back(listener); |
| 882 if (polling_was_off) | 882 if (polling_was_off) |
| 883 StartDeviceListPolling(); | 883 StartDeviceListPolling(); |
| 884 } | 884 } |
| 885 | 885 |
| 886 void DevToolsAndroidBridge::RemovePortForwardingListener( | 886 void DevToolsAndroidBridge::RemovePortForwardingListener( |
| 887 PortForwardingListener* listener) { | 887 PortForwardingListener* listener) { |
| 888 PortForwardingListeners::iterator it = std::find( | 888 PortForwardingListeners::iterator it = std::find( |
| 889 port_forwarding_listeners_.begin(), | 889 port_forwarding_listeners_.begin(), |
| 890 port_forwarding_listeners_.end(), | 890 port_forwarding_listeners_.end(), |
| 891 listener); | 891 listener); |
| 892 DCHECK(it != port_forwarding_listeners_.end()); | 892 DCHECK(it != port_forwarding_listeners_.end()); |
| 893 port_forwarding_listeners_.erase(it); | 893 port_forwarding_listeners_.erase(it); |
| 894 if (!NeedsDeviceListPolling()) | 894 if (!NeedsDeviceListPolling()) |
| 895 StopDeviceListPolling(); | 895 StopDeviceListPolling(); |
| 896 } | 896 } |
| 897 | 897 |
| 898 bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) { | 898 bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) { |
| 899 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 899 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 900 return host_delegates_.find(agent_id) != host_delegates_.end(); | 900 return host_delegates_.find(agent_id) != host_delegates_.end(); |
| 901 } | 901 } |
| 902 | 902 |
| 903 DevToolsAndroidBridge::~DevToolsAndroidBridge() { | 903 DevToolsAndroidBridge::~DevToolsAndroidBridge() { |
| 904 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 904 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 905 DCHECK(device_list_listeners_.empty()); | 905 DCHECK(device_list_listeners_.empty()); |
| 906 DCHECK(device_count_listeners_.empty()); | 906 DCHECK(device_count_listeners_.empty()); |
| 907 DCHECK(port_forwarding_listeners_.empty()); | 907 DCHECK(port_forwarding_listeners_.empty()); |
| 908 } | 908 } |
| 909 | 909 |
| 910 void DevToolsAndroidBridge::StartDeviceListPolling() { | 910 void DevToolsAndroidBridge::StartDeviceListPolling() { |
| 911 device_list_callback_.Reset( | 911 device_list_callback_.Reset( |
| 912 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, AsWeakPtr())); | 912 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, AsWeakPtr())); |
| 913 RequestDeviceList(device_list_callback_.callback()); | 913 RequestDeviceList(device_list_callback_.callback()); |
| 914 } | 914 } |
| 915 | 915 |
| 916 void DevToolsAndroidBridge::StopDeviceListPolling() { | 916 void DevToolsAndroidBridge::StopDeviceListPolling() { |
| 917 device_list_callback_.Cancel(); | 917 device_list_callback_.Cancel(); |
| 918 device_map_.clear(); | 918 device_map_.clear(); |
| 919 } | 919 } |
| 920 | 920 |
| 921 bool DevToolsAndroidBridge::NeedsDeviceListPolling() { | 921 bool DevToolsAndroidBridge::NeedsDeviceListPolling() { |
| 922 return !device_list_listeners_.empty() || !port_forwarding_listeners_.empty(); | 922 return !device_list_listeners_.empty() || !port_forwarding_listeners_.empty(); |
| 923 } | 923 } |
| 924 | 924 |
| 925 void DevToolsAndroidBridge::RequestDeviceList( | 925 void DevToolsAndroidBridge::RequestDeviceList( |
| 926 const DeviceListCallback& callback) { | 926 const DeviceListCallback& callback) { |
| 927 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 927 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 928 | 928 |
| 929 if (!NeedsDeviceListPolling() || | 929 if (!NeedsDeviceListPolling() || |
| 930 !callback.Equals(device_list_callback_.callback())) | 930 !callback.Equals(device_list_callback_.callback())) |
| 931 return; | 931 return; |
| 932 | 932 |
| 933 new DiscoveryRequest(device_manager_.get(), callback); | 933 new DiscoveryRequest(device_manager_.get(), callback); |
| 934 } | 934 } |
| 935 | 935 |
| 936 void DevToolsAndroidBridge::ReceivedDeviceList( | 936 void DevToolsAndroidBridge::ReceivedDeviceList( |
| 937 const CompleteDevices& complete_devices) { | 937 const CompleteDevices& complete_devices) { |
| 938 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 938 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 939 | 939 |
| 940 device_map_.clear(); | 940 device_map_.clear(); |
| 941 RemoteDevices remote_devices; | 941 RemoteDevices remote_devices; |
| 942 for (const auto& pair : complete_devices) { | 942 for (const auto& pair : complete_devices) { |
| 943 device_map_[pair.first->serial()] = pair.first; | 943 device_map_[pair.first->serial()] = pair.first; |
| 944 remote_devices.push_back(pair.second); | 944 remote_devices.push_back(pair.second); |
| 945 } | 945 } |
| 946 | 946 |
| 947 DeviceListListeners copy(device_list_listeners_); | 947 DeviceListListeners copy(device_list_listeners_); |
| 948 for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it) | 948 for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 969 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceCount, AsWeakPtr())); | 969 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceCount, AsWeakPtr())); |
| 970 RequestDeviceCount(device_count_callback_.callback()); | 970 RequestDeviceCount(device_count_callback_.callback()); |
| 971 } | 971 } |
| 972 | 972 |
| 973 void DevToolsAndroidBridge::StopDeviceCountPolling() { | 973 void DevToolsAndroidBridge::StopDeviceCountPolling() { |
| 974 device_count_callback_.Cancel(); | 974 device_count_callback_.Cancel(); |
| 975 } | 975 } |
| 976 | 976 |
| 977 void DevToolsAndroidBridge::RequestDeviceCount( | 977 void DevToolsAndroidBridge::RequestDeviceCount( |
| 978 const base::Callback<void(int)>& callback) { | 978 const base::Callback<void(int)>& callback) { |
| 979 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 979 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 980 | 980 |
| 981 if (device_count_listeners_.empty() || | 981 if (device_count_listeners_.empty() || |
| 982 !callback.Equals(device_count_callback_.callback())) | 982 !callback.Equals(device_count_callback_.callback())) |
| 983 return; | 983 return; |
| 984 | 984 |
| 985 UsbDeviceProvider::CountDevices(callback); | 985 UsbDeviceProvider::CountDevices(callback); |
| 986 } | 986 } |
| 987 | 987 |
| 988 void DevToolsAndroidBridge::ReceivedDeviceCount(int count) { | 988 void DevToolsAndroidBridge::ReceivedDeviceCount(int count) { |
| 989 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 989 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 990 | 990 |
| 991 DeviceCountListeners copy(device_count_listeners_); | 991 DeviceCountListeners copy(device_count_listeners_); |
| 992 for (DeviceCountListeners::iterator it = copy.begin(); it != copy.end(); ++it) | 992 for (DeviceCountListeners::iterator it = copy.begin(); it != copy.end(); ++it) |
| 993 (*it)->DeviceCountChanged(count); | 993 (*it)->DeviceCountChanged(count); |
| 994 | 994 |
| 995 if (device_count_listeners_.empty()) | 995 if (device_count_listeners_.empty()) |
| 996 return; | 996 return; |
| 997 | 997 |
| 998 task_scheduler_.Run( | 998 task_scheduler_.Run( |
| 999 base::Bind(&DevToolsAndroidBridge::RequestDeviceCount, | 999 base::Bind(&DevToolsAndroidBridge::RequestDeviceCount, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1034 device_providers.push_back( | 1034 device_providers.push_back( |
| 1035 new WebRTCDeviceProvider(profile_, signin_manager_, token_service_)); | 1035 new WebRTCDeviceProvider(profile_, signin_manager_, token_service_)); |
| 1036 } | 1036 } |
| 1037 | 1037 |
| 1038 device_manager_->SetDeviceProviders(device_providers); | 1038 device_manager_->SetDeviceProviders(device_providers); |
| 1039 if (NeedsDeviceListPolling()) { | 1039 if (NeedsDeviceListPolling()) { |
| 1040 StopDeviceListPolling(); | 1040 StopDeviceListPolling(); |
| 1041 StartDeviceListPolling(); | 1041 StartDeviceListPolling(); |
| 1042 } | 1042 } |
| 1043 } | 1043 } |
| OLD | NEW |