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