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 |