| 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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 | 56 |
| 57 const int kMinVersionNewWithURL = 32; | 57 const int kMinVersionNewWithURL = 32; |
| 58 const int kNewPageNavigateDelayMs = 500; | 58 const int kNewPageNavigateDelayMs = 500; |
| 59 | 59 |
| 60 // DiscoveryRequest ----------------------------------------------------- | 60 // DiscoveryRequest ----------------------------------------------------- |
| 61 | 61 |
| 62 class DiscoveryRequest : public base::RefCountedThreadSafe< | 62 class DiscoveryRequest : public base::RefCountedThreadSafe< |
| 63 DiscoveryRequest, | 63 DiscoveryRequest, |
| 64 BrowserThread::DeleteOnUIThread> { | 64 BrowserThread::DeleteOnUIThread> { |
| 65 public: | 65 public: |
| 66 typedef base::Callback<void(const DevToolsAndroidBridge::RemoteDevices&)> | |
| 67 DiscoveryCallback; | |
| 68 typedef AndroidDeviceManager::Device Device; | 66 typedef AndroidDeviceManager::Device Device; |
| 69 typedef AndroidDeviceManager::Devices Devices; | 67 typedef AndroidDeviceManager::Devices Devices; |
| 68 typedef AndroidDeviceManager::DeviceInfo DeviceInfo; |
| 69 typedef DevToolsAndroidBridge::RemoteDevice RemoteDevice; |
| 70 typedef DevToolsAndroidBridge::RemoteDevices RemoteDevices; |
| 71 typedef DevToolsAndroidBridge::RemoteBrowser RemoteBrowser; |
| 72 typedef DevToolsAndroidBridge::RemoteBrowsers RemoteBrowsers; |
| 73 typedef base::Callback<void(const RemoteDevices&)> DiscoveryCallback; |
| 70 | 74 |
| 71 DiscoveryRequest( | 75 DiscoveryRequest(AndroidDeviceManager* device_manager, |
| 72 AndroidDeviceManager* device_manager, | 76 const DiscoveryCallback& callback); |
| 73 const DiscoveryCallback& callback); | |
| 74 | |
| 75 private: | 77 private: |
| 76 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; | 78 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; |
| 77 friend class base::DeleteHelper<DiscoveryRequest>; | 79 friend class base::DeleteHelper<DiscoveryRequest>; |
| 78 | |
| 79 virtual ~DiscoveryRequest(); | 80 virtual ~DiscoveryRequest(); |
| 80 | 81 |
| 81 void ReceivedDevices(const Devices& devices); | 82 void ReceivedDevices(const Devices& devices); |
| 82 void ProcessDevices(); | 83 void ReceivedDeviceInfo(scoped_refptr<Device> device, |
| 83 void ReceivedDeviceInfo(const AndroidDeviceManager::DeviceInfo& device_info); | 84 const DeviceInfo& device_info); |
| 84 void ProcessSockets(); | 85 void ReceivedVersion(scoped_refptr<RemoteBrowser>, |
| 85 void ReceivedVersion(int result, const std::string& response); | 86 int result, |
| 86 void ReceivedPages(int result, const std::string& response); | 87 const std::string& response); |
| 87 | 88 void ReceivedPages(scoped_refptr<RemoteBrowser>, |
| 88 scoped_refptr<Device> current_device() { return devices_.back(); } | 89 int result, |
| 89 | 90 const std::string& response); |
| 90 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> current_browser() const { | |
| 91 return browsers_.back(); | |
| 92 } | |
| 93 | |
| 94 void NextBrowser(); | |
| 95 void NextDevice(); | |
| 96 | |
| 97 void Respond(); | |
| 98 | 91 |
| 99 DiscoveryCallback callback_; | 92 DiscoveryCallback callback_; |
| 100 Devices devices_; | 93 RemoteDevices remote_devices_; |
| 101 DevToolsAndroidBridge::RemoteBrowsers browsers_; | |
| 102 DevToolsAndroidBridge::RemoteDevices remote_devices_; | |
| 103 }; | 94 }; |
| 104 | 95 |
| 105 DiscoveryRequest::DiscoveryRequest( | 96 DiscoveryRequest::DiscoveryRequest( |
| 106 AndroidDeviceManager* device_manager, | 97 AndroidDeviceManager* device_manager, |
| 107 const DiscoveryCallback& callback) | 98 const DiscoveryCallback& callback) |
| 108 : callback_(callback) { | 99 : callback_(callback) { |
| 109 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 100 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 110 | |
| 111 device_manager->QueryDevices( | 101 device_manager->QueryDevices( |
| 112 base::Bind(&DiscoveryRequest::ReceivedDevices, this)); | 102 base::Bind(&DiscoveryRequest::ReceivedDevices, this)); |
| 113 } | 103 } |
| 114 | 104 |
| 115 DiscoveryRequest::~DiscoveryRequest() { | 105 DiscoveryRequest::~DiscoveryRequest() { |
| 116 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 106 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 107 callback_.Run(remote_devices_); |
| 117 } | 108 } |
| 118 | 109 |
| 119 void DiscoveryRequest::ReceivedDevices(const Devices& devices) { | 110 void DiscoveryRequest::ReceivedDevices(const Devices& devices) { |
| 120 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 111 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 121 devices_ = devices; | 112 for (Devices::const_iterator it = devices.begin(); |
| 122 ProcessDevices(); | 113 it != devices.end(); ++it) { |
| 114 (*it)->QueryDeviceInfo( |
| 115 base::Bind(&DiscoveryRequest::ReceivedDeviceInfo, this, *it)); |
| 116 } |
| 123 } | 117 } |
| 124 | 118 |
| 125 void DiscoveryRequest::ProcessDevices() { | 119 void DiscoveryRequest::ReceivedDeviceInfo(scoped_refptr<Device> device, |
| 126 if (devices_.size() == 0) { | 120 const DeviceInfo& device_info) { |
| 127 Respond(); | 121 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 128 return; | 122 scoped_refptr<RemoteDevice> remote_device = |
| 123 new RemoteDevice(device, device_info); |
| 124 remote_devices_.push_back(remote_device); |
| 125 for (RemoteBrowsers::iterator it = remote_device->browsers().begin(); |
| 126 it != remote_device->browsers().end(); ++it) { |
| 127 (*it)->SendJsonRequest( |
| 128 kVersionRequest, |
| 129 base::Bind(&DiscoveryRequest::ReceivedVersion, this, *it)); |
| 130 (*it)->SendJsonRequest( |
| 131 kPageListRequest, |
| 132 base::Bind(&DiscoveryRequest::ReceivedPages, this, *it)); |
| 129 } | 133 } |
| 130 | |
| 131 current_device()->QueryDeviceInfo( | |
| 132 base::Bind(&DiscoveryRequest::ReceivedDeviceInfo, this)); | |
| 133 } | 134 } |
| 134 | 135 |
| 135 void DiscoveryRequest::ReceivedDeviceInfo( | 136 void DiscoveryRequest::ReceivedVersion(scoped_refptr<RemoteBrowser> browser, |
| 136 const AndroidDeviceManager::DeviceInfo& device_info) { | 137 int result, |
| 137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 138 remote_devices_.push_back( | |
| 139 new DevToolsAndroidBridge::RemoteDevice(current_device(), device_info)); | |
| 140 browsers_ = remote_devices_.back()->browsers(); | |
| 141 ProcessSockets(); | |
| 142 } | |
| 143 | |
| 144 void DiscoveryRequest::ProcessSockets() { | |
| 145 if (browsers_.size() == 0) { | |
| 146 NextDevice(); | |
| 147 return; | |
| 148 } | |
| 149 | |
| 150 current_device()->SendJsonRequest( | |
| 151 current_browser()->socket(), | |
| 152 kVersionRequest, | |
| 153 base::Bind(&DiscoveryRequest::ReceivedVersion, this)); | |
| 154 } | |
| 155 | |
| 156 void DiscoveryRequest::ReceivedVersion(int result, | |
| 157 const std::string& response) { | 138 const std::string& response) { |
| 158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 139 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 159 if (result < 0) { | 140 if (result < 0) |
| 160 NextBrowser(); | |
| 161 return; | 141 return; |
| 162 } | |
| 163 | |
| 164 // Parse version, append to package name if available, | 142 // Parse version, append to package name if available, |
| 165 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); | 143 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); |
| 166 base::DictionaryValue* dict; | 144 base::DictionaryValue* dict; |
| 167 if (value && value->GetAsDictionary(&dict)) { | 145 if (value && value->GetAsDictionary(&dict)) { |
| 168 std::string browser; | 146 std::string browser_name; |
| 169 if (dict->GetString("Browser", &browser)) { | 147 if (dict->GetString("Browser", &browser_name)) { |
| 170 std::vector<std::string> parts; | 148 std::vector<std::string> parts; |
| 171 Tokenize(browser, "/", &parts); | 149 Tokenize(browser_name, "/", &parts); |
| 172 if (parts.size() == 2) | 150 if (parts.size() == 2) |
| 173 current_browser()->set_version(parts[1]); | 151 browser->set_version(parts[1]); |
| 174 else | 152 else |
| 175 current_browser()->set_version(browser); | 153 browser->set_version(browser_name); |
| 176 } | 154 } |
| 177 std::string package; | 155 std::string package; |
| 178 if (dict->GetString("Android-Package", &package)) { | 156 if (dict->GetString("Android-Package", &package)) { |
| 179 current_browser()->set_display_name( | 157 browser->set_display_name( |
| 180 AdbDeviceInfoQuery::GetDisplayName(current_browser()->socket(), | 158 AdbDeviceInfoQuery::GetDisplayName(browser->socket(), package)); |
| 181 package)); | |
| 182 } | 159 } |
| 183 } | 160 } |
| 184 | |
| 185 current_device()->SendJsonRequest( | |
| 186 current_browser()->socket(), | |
| 187 kPageListRequest, | |
| 188 base::Bind(&DiscoveryRequest::ReceivedPages, this)); | |
| 189 } | 161 } |
| 190 | 162 |
| 191 void DiscoveryRequest::ReceivedPages(int result, | 163 void DiscoveryRequest::ReceivedPages(scoped_refptr<RemoteBrowser> browser, |
| 164 int result, |
| 192 const std::string& response) { | 165 const std::string& response) { |
| 193 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 166 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 194 if (result >= 0) { | 167 if (result < 0) |
| 195 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); | 168 return; |
| 196 base::ListValue* list_value; | 169 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); |
| 197 if (value && value->GetAsList(&list_value)) | 170 base::ListValue* list_value; |
| 198 current_browser()->SetPageDescriptors(*list_value); | 171 if (value && value->GetAsList(&list_value)) |
| 199 } | 172 browser->SetPageDescriptors(*list_value); |
| 200 NextBrowser(); | |
| 201 } | |
| 202 | |
| 203 void DiscoveryRequest::NextBrowser() { | |
| 204 browsers_.pop_back(); | |
| 205 ProcessSockets(); | |
| 206 } | |
| 207 | |
| 208 void DiscoveryRequest::NextDevice() { | |
| 209 devices_.pop_back(); | |
| 210 ProcessDevices(); | |
| 211 } | |
| 212 | |
| 213 void DiscoveryRequest::Respond() { | |
| 214 callback_.Run(remote_devices_); | |
| 215 } | 173 } |
| 216 | 174 |
| 217 // ProtocolCommand ------------------------------------------------------------ | 175 // ProtocolCommand ------------------------------------------------------------ |
| 218 | 176 |
| 219 class ProtocolCommand | 177 class ProtocolCommand |
| 220 : public DevToolsAndroidBridge::AndroidWebSocket::Delegate { | 178 : public DevToolsAndroidBridge::AndroidWebSocket::Delegate { |
| 221 public: | 179 public: |
| 222 ProtocolCommand( | 180 ProtocolCommand( |
| 223 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, | 181 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, |
| 224 const std::string& debug_url, | 182 const std::string& debug_url, |
| (...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 927 bool enabled; | 885 bool enabled; |
| 928 if (pref_value->GetAsBoolean(&enabled) && enabled) { | 886 if (pref_value->GetAsBoolean(&enabled) && enabled) { |
| 929 device_providers.push_back(new UsbDeviceProvider(profile_)); | 887 device_providers.push_back(new UsbDeviceProvider(profile_)); |
| 930 } | 888 } |
| 931 device_manager_->SetDeviceProviders(device_providers); | 889 device_manager_->SetDeviceProviders(device_providers); |
| 932 if (!device_list_listeners_.empty()) { | 890 if (!device_list_listeners_.empty()) { |
| 933 StopDeviceListPolling(); | 891 StopDeviceListPolling(); |
| 934 StartDeviceListPolling(); | 892 StartDeviceListPolling(); |
| 935 } | 893 } |
| 936 } | 894 } |
| OLD | NEW |