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 "extensions/browser/api/device_permissions_prompt.h" | 5 #include "extensions/browser/api/device_permissions_prompt.h" |
6 | 6 |
| 7 #include "base/barrier_closure.h" |
7 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
8 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
9 #include "content/public/browser/browser_thread.h" | 10 #include "content/public/browser/browser_thread.h" |
10 #include "device/core/device_client.h" | 11 #include "device/core/device_client.h" |
11 #include "device/usb/usb_device.h" | 12 #include "device/usb/usb_device.h" |
12 #include "device/usb/usb_device_filter.h" | 13 #include "device/usb/usb_device_filter.h" |
13 #include "device/usb/usb_ids.h" | 14 #include "device/usb/usb_ids.h" |
14 #include "device/usb/usb_service.h" | 15 #include "device/usb/usb_service.h" |
15 #include "extensions/browser/api/device_permissions_manager.h" | 16 #include "extensions/browser/api/device_permissions_manager.h" |
16 #include "extensions/common/extension.h" | 17 #include "extensions/common/extension.h" |
17 #include "extensions/strings/grit/extensions_strings.h" | 18 #include "extensions/strings/grit/extensions_strings.h" |
18 #include "ui/base/l10n/l10n_util.h" | 19 #include "ui/base/l10n/l10n_util.h" |
19 | 20 |
| 21 using content::BrowserThread; |
20 using device::UsbDevice; | 22 using device::UsbDevice; |
21 using device::UsbDeviceFilter; | 23 using device::UsbDeviceFilter; |
22 using device::UsbService; | 24 using device::UsbService; |
23 | 25 |
24 namespace extensions { | 26 namespace extensions { |
25 | 27 |
26 DevicePermissionsPrompt::Prompt::DeviceInfo::DeviceInfo( | 28 DevicePermissionsPrompt::Prompt::DeviceInfo::DeviceInfo( |
27 scoped_refptr<UsbDevice> device) | 29 scoped_refptr<UsbDevice> device) |
28 : device(device) { | 30 : device(device) { |
29 base::string16 manufacturer_string; | 31 base::string16 manufacturer_string; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 browser_context_(nullptr), | 76 browser_context_(nullptr), |
75 multiple_(false), | 77 multiple_(false), |
76 observer_(nullptr), | 78 observer_(nullptr), |
77 usb_service_observer_(this) { | 79 usb_service_observer_(this) { |
78 } | 80 } |
79 | 81 |
80 void DevicePermissionsPrompt::Prompt::SetObserver(Observer* observer) { | 82 void DevicePermissionsPrompt::Prompt::SetObserver(Observer* observer) { |
81 observer_ = observer; | 83 observer_ = observer; |
82 | 84 |
83 if (observer_) { | 85 if (observer_) { |
84 content::BrowserThread::PostTask( | 86 BrowserThread::PostTask( |
85 content::BrowserThread::FILE, FROM_HERE, | 87 BrowserThread::FILE, FROM_HERE, |
86 base::Bind(&DevicePermissionsPrompt::Prompt::DoDeviceQuery, this)); | 88 base::Bind(&DevicePermissionsPrompt::Prompt::DoDeviceQuery, this)); |
87 } | 89 } |
88 } | 90 } |
89 | 91 |
90 base::string16 DevicePermissionsPrompt::Prompt::GetHeading() const { | 92 base::string16 DevicePermissionsPrompt::Prompt::GetHeading() const { |
91 return l10n_util::GetStringUTF16( | 93 return l10n_util::GetStringUTF16( |
92 multiple_ ? IDS_DEVICE_PERMISSIONS_PROMPT_TITLE_MULTIPLE | 94 multiple_ ? IDS_DEVICE_PERMISSIONS_PROMPT_TITLE_MULTIPLE |
93 : IDS_DEVICE_PERMISSIONS_PROMPT_TITLE_SINGLE); | 95 : IDS_DEVICE_PERMISSIONS_PROMPT_TITLE_SINGLE); |
94 } | 96 } |
95 | 97 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 | 131 |
130 void DevicePermissionsPrompt::Prompt::DoDeviceQuery() { | 132 void DevicePermissionsPrompt::Prompt::DoDeviceQuery() { |
131 UsbService* service = device::DeviceClient::Get()->GetUsbService(); | 133 UsbService* service = device::DeviceClient::Get()->GetUsbService(); |
132 if (!service) { | 134 if (!service) { |
133 return; | 135 return; |
134 } | 136 } |
135 | 137 |
136 std::vector<scoped_refptr<UsbDevice>> devices; | 138 std::vector<scoped_refptr<UsbDevice>> devices; |
137 service->GetDevices(&devices); | 139 service->GetDevices(&devices); |
138 | 140 |
139 std::vector<DeviceInfo> device_info; | |
140 for (const auto& device : devices) { | |
141 if (!(filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_))) { | |
142 continue; | |
143 } | |
144 | |
145 device_info.push_back(DeviceInfo(device)); | |
146 } | |
147 | |
148 if (!usb_service_observer_.IsObserving(service)) { | 141 if (!usb_service_observer_.IsObserving(service)) { |
149 usb_service_observer_.Add(service); | 142 usb_service_observer_.Add(service); |
150 } | 143 } |
151 | 144 |
152 content::BrowserThread::PostTask( | 145 std::vector<DeviceInfo>* device_info = new std::vector<DeviceInfo>(); |
153 content::BrowserThread::UI, | 146 base::Closure barrier = base::BarrierClosure( |
154 FROM_HERE, | 147 devices.size(), |
155 base::Bind( | 148 base::Bind(&DevicePermissionsPrompt::Prompt::DeviceQueryComplete, this, |
156 &DevicePermissionsPrompt::Prompt::SetDevices, this, device_info)); | 149 base::Owned(device_info))); |
| 150 |
| 151 for (const auto& device : devices) { |
| 152 if (filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_)) { |
| 153 device->CheckUsbAccess( |
| 154 base::Bind(&DevicePermissionsPrompt::Prompt::AppendCheckedUsbDevice, |
| 155 this, device_info, device, barrier)); |
| 156 } else { |
| 157 barrier.Run(); |
| 158 } |
| 159 } |
| 160 } |
| 161 |
| 162 void DevicePermissionsPrompt::Prompt::AppendCheckedUsbDevice( |
| 163 std::vector<DeviceInfo>* device_info, |
| 164 scoped_refptr<UsbDevice> device, |
| 165 const base::Closure& callback, |
| 166 bool allowed) { |
| 167 if (allowed) { |
| 168 device_info->push_back(DeviceInfo(device)); |
| 169 } |
| 170 callback.Run(); |
| 171 } |
| 172 |
| 173 void DevicePermissionsPrompt::Prompt::AddCheckedUsbDevice( |
| 174 scoped_refptr<UsbDevice> device, |
| 175 bool allowed) { |
| 176 if (allowed) { |
| 177 BrowserThread::PostTask( |
| 178 BrowserThread::UI, FROM_HERE, |
| 179 base::Bind(&DevicePermissionsPrompt::Prompt::AddDevice, this, |
| 180 DeviceInfo(device))); |
| 181 } |
| 182 } |
| 183 |
| 184 void DevicePermissionsPrompt::Prompt::DeviceQueryComplete( |
| 185 std::vector<DeviceInfo>* device_info) { |
| 186 BrowserThread::PostTask( |
| 187 BrowserThread::UI, FROM_HERE, |
| 188 base::Bind(&DevicePermissionsPrompt::Prompt::SetDevices, this, |
| 189 *device_info)); |
157 } | 190 } |
158 | 191 |
159 void DevicePermissionsPrompt::Prompt::SetDevices( | 192 void DevicePermissionsPrompt::Prompt::SetDevices( |
160 const std::vector<DeviceInfo>& devices) { | 193 const std::vector<DeviceInfo>& devices) { |
161 devices_ = devices; | 194 devices_ = devices; |
162 if (observer_) { | 195 if (observer_) { |
163 observer_->OnDevicesChanged(); | 196 observer_->OnDevicesChanged(); |
164 } | 197 } |
165 } | 198 } |
166 | 199 |
(...skipping 19 matching lines...) Expand all Loading... |
186 observer_->OnDevicesChanged(); | 219 observer_->OnDevicesChanged(); |
187 } | 220 } |
188 } | 221 } |
189 | 222 |
190 void DevicePermissionsPrompt::Prompt::OnDeviceAdded( | 223 void DevicePermissionsPrompt::Prompt::OnDeviceAdded( |
191 scoped_refptr<UsbDevice> device) { | 224 scoped_refptr<UsbDevice> device) { |
192 if (!(filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_))) { | 225 if (!(filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_))) { |
193 return; | 226 return; |
194 } | 227 } |
195 | 228 |
196 content::BrowserThread::PostTask( | 229 device->CheckUsbAccess(base::Bind( |
197 content::BrowserThread::UI, FROM_HERE, | 230 &DevicePermissionsPrompt::Prompt::AddCheckedUsbDevice, this, device)); |
198 base::Bind(&DevicePermissionsPrompt::Prompt::AddDevice, this, | |
199 DeviceInfo(device))); | |
200 } | 231 } |
201 | 232 |
202 void DevicePermissionsPrompt::Prompt::OnDeviceRemoved( | 233 void DevicePermissionsPrompt::Prompt::OnDeviceRemoved( |
203 scoped_refptr<UsbDevice> device) { | 234 scoped_refptr<UsbDevice> device) { |
204 content::BrowserThread::PostTask( | 235 BrowserThread::PostTask( |
205 content::BrowserThread::UI, FROM_HERE, | 236 BrowserThread::UI, FROM_HERE, |
206 base::Bind(&DevicePermissionsPrompt::Prompt::RemoveDevice, this, device)); | 237 base::Bind(&DevicePermissionsPrompt::Prompt::RemoveDevice, this, device)); |
207 } | 238 } |
208 | 239 |
209 DevicePermissionsPrompt::DevicePermissionsPrompt( | 240 DevicePermissionsPrompt::DevicePermissionsPrompt( |
210 content::WebContents* web_contents) | 241 content::WebContents* web_contents) |
211 : web_contents_(web_contents), delegate_(nullptr) { | 242 : web_contents_(web_contents), delegate_(nullptr) { |
212 } | 243 } |
213 | 244 |
214 DevicePermissionsPrompt::~DevicePermissionsPrompt() { | 245 DevicePermissionsPrompt::~DevicePermissionsPrompt() { |
215 } | 246 } |
216 | 247 |
217 void DevicePermissionsPrompt::AskForUsbDevices( | 248 void DevicePermissionsPrompt::AskForUsbDevices( |
218 Delegate* delegate, | 249 Delegate* delegate, |
219 const Extension* extension, | 250 const Extension* extension, |
220 content::BrowserContext* context, | 251 content::BrowserContext* context, |
221 bool multiple, | 252 bool multiple, |
222 const std::vector<UsbDeviceFilter>& filters) { | 253 const std::vector<UsbDeviceFilter>& filters) { |
223 prompt_ = new Prompt(); | 254 prompt_ = new Prompt(); |
224 prompt_->set_extension(extension); | 255 prompt_->set_extension(extension); |
225 prompt_->set_browser_context(context); | 256 prompt_->set_browser_context(context); |
226 prompt_->set_multiple(multiple); | 257 prompt_->set_multiple(multiple); |
227 prompt_->set_filters(filters); | 258 prompt_->set_filters(filters); |
228 delegate_ = delegate; | 259 delegate_ = delegate; |
229 | 260 |
230 ShowDialog(); | 261 ShowDialog(); |
231 } | 262 } |
232 | 263 |
233 } // namespace extensions | 264 } // namespace extensions |
OLD | NEW |