| 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 <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/i18n/message_formatter.h" | 10 #include "base/i18n/message_formatter.h" |
| 11 #include "base/scoped_observer.h" | 11 #include "base/scoped_observer.h" |
| 12 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
| 13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 14 #include "build/build_config.h" | 14 #include "build/build_config.h" |
| 15 #include "device/base/device_client.h" | 15 #include "device/base/device_client.h" |
| 16 #include "device/hid/hid_device_filter.h" | 16 #include "device/hid/hid_device_filter.h" |
| 17 #include "device/hid/hid_device_info.h" | 17 #include "device/hid/hid_device_info.h" |
| 18 #include "device/hid/hid_service.h" | 18 #include "device/hid/hid_service.h" |
| 19 #include "device/usb/usb_device.h" | 19 #include "device/usb/usb_device.h" |
| 20 #include "device/usb/usb_device_filter.h" | 20 #include "device/usb/usb_device_filter.h" |
| 21 #include "device/usb/usb_ids.h" | 21 #include "device/usb/usb_ids.h" |
| 22 #include "device/usb/usb_service.h" | 22 #include "device/usb/usb_service.h" |
| 23 #include "extensions/browser/api/device_permissions_manager.h" | 23 #include "extensions/browser/api/device_permissions_manager.h" |
| 24 #include "extensions/common/extension.h" | 24 #include "extensions/common/extension.h" |
| 25 #include "extensions/strings/grit/extensions_strings.h" | |
| 26 #include "ui/base/l10n/l10n_util.h" | 25 #include "ui/base/l10n/l10n_util.h" |
| 27 | 26 |
| 28 #if defined(OS_CHROMEOS) | 27 #if defined(OS_CHROMEOS) |
| 29 #include "chromeos/dbus/dbus_thread_manager.h" | 28 #include "chromeos/dbus/dbus_thread_manager.h" |
| 30 #include "chromeos/dbus/permission_broker_client.h" | 29 #include "chromeos/dbus/permission_broker_client.h" |
| 31 #include "device/hid/hid_device_info_linux.h" | 30 #include "device/hid/hid_device_info_linux.h" |
| 32 #endif // defined(OS_CHROMEOS) | 31 #endif // defined(OS_CHROMEOS) |
| 33 | 32 |
| 34 using device::HidDeviceFilter; | 33 using device::HidDeviceFilter; |
| 35 using device::HidService; | 34 using device::HidService; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 if (observer) { | 91 if (observer) { |
| 93 UsbService* service = device::DeviceClient::Get()->GetUsbService(); | 92 UsbService* service = device::DeviceClient::Get()->GetUsbService(); |
| 94 if (service && !service_observer_.IsObserving(service)) { | 93 if (service && !service_observer_.IsObserving(service)) { |
| 95 service->GetDevices( | 94 service->GetDevices( |
| 96 base::Bind(&UsbDevicePermissionsPrompt::OnDevicesEnumerated, this)); | 95 base::Bind(&UsbDevicePermissionsPrompt::OnDevicesEnumerated, this)); |
| 97 service_observer_.Add(service); | 96 service_observer_.Add(service); |
| 98 } | 97 } |
| 99 } | 98 } |
| 100 } | 99 } |
| 101 | 100 |
| 102 base::string16 GetHeading() const override { | |
| 103 return l10n_util::GetSingleOrMultipleStringUTF16( | |
| 104 IDS_USB_DEVICE_PERMISSIONS_PROMPT_TITLE, multiple()); | |
| 105 } | |
| 106 | |
| 107 void Dismissed() override { | 101 void Dismissed() override { |
| 108 DevicePermissionsManager* permissions_manager = | 102 DevicePermissionsManager* permissions_manager = |
| 109 DevicePermissionsManager::Get(browser_context()); | 103 DevicePermissionsManager::Get(browser_context()); |
| 110 std::vector<scoped_refptr<UsbDevice>> devices; | 104 std::vector<scoped_refptr<UsbDevice>> devices; |
| 111 for (const auto& device : devices_) { | 105 for (const auto& device : devices_) { |
| 112 if (device->granted()) { | 106 if (device->granted()) { |
| 113 const UsbDeviceInfo* usb_device = | 107 const UsbDeviceInfo* usb_device = |
| 114 static_cast<const UsbDeviceInfo*>(device.get()); | 108 static_cast<const UsbDeviceInfo*>(device.get()); |
| 115 devices.push_back(usb_device->device()); | 109 devices.push_back(usb_device->device()); |
| 116 if (permissions_manager) { | 110 if (permissions_manager) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 133 device->CheckUsbAccess( | 127 device->CheckUsbAccess( |
| 134 base::Bind(&UsbDevicePermissionsPrompt::AddCheckedDevice, this, | 128 base::Bind(&UsbDevicePermissionsPrompt::AddCheckedDevice, this, |
| 135 base::Passed(&device_info))); | 129 base::Passed(&device_info))); |
| 136 } | 130 } |
| 137 | 131 |
| 138 void OnDeviceRemoved(scoped_refptr<UsbDevice> device) override { | 132 void OnDeviceRemoved(scoped_refptr<UsbDevice> device) override { |
| 139 for (auto it = devices_.begin(); it != devices_.end(); ++it) { | 133 for (auto it = devices_.begin(); it != devices_.end(); ++it) { |
| 140 const UsbDeviceInfo* entry = | 134 const UsbDeviceInfo* entry = |
| 141 static_cast<const UsbDeviceInfo*>((*it).get()); | 135 static_cast<const UsbDeviceInfo*>((*it).get()); |
| 142 if (entry->device() == device) { | 136 if (entry->device() == device) { |
| 137 size_t index = it - devices_.begin(); |
| 138 base::string16 device_name = (*it)->name(); |
| 143 devices_.erase(it); | 139 devices_.erase(it); |
| 144 if (observer()) { | 140 if (observer()) |
| 145 observer()->OnDevicesChanged(); | 141 observer()->OnDeviceRemoved(index, device_name); |
| 146 } | |
| 147 return; | 142 return; |
| 148 } | 143 } |
| 149 } | 144 } |
| 150 } | 145 } |
| 151 | 146 |
| 152 void OnDevicesEnumerated( | 147 void OnDevicesEnumerated( |
| 153 const std::vector<scoped_refptr<UsbDevice>>& devices) { | 148 const std::vector<scoped_refptr<UsbDevice>>& devices) { |
| 154 for (const auto& device : devices) { | 149 for (const auto& device : devices) { |
| 155 OnDeviceAdded(device); | 150 OnDeviceAdded(device); |
| 156 } | 151 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 if (observer) { | 201 if (observer) { |
| 207 HidService* service = device::DeviceClient::Get()->GetHidService(); | 202 HidService* service = device::DeviceClient::Get()->GetHidService(); |
| 208 if (service && !service_observer_.IsObserving(service)) { | 203 if (service && !service_observer_.IsObserving(service)) { |
| 209 service->GetDevices( | 204 service->GetDevices( |
| 210 base::Bind(&HidDevicePermissionsPrompt::OnDevicesEnumerated, this)); | 205 base::Bind(&HidDevicePermissionsPrompt::OnDevicesEnumerated, this)); |
| 211 service_observer_.Add(service); | 206 service_observer_.Add(service); |
| 212 } | 207 } |
| 213 } | 208 } |
| 214 } | 209 } |
| 215 | 210 |
| 216 base::string16 GetHeading() const override { | |
| 217 return l10n_util::GetSingleOrMultipleStringUTF16( | |
| 218 IDS_HID_DEVICE_PERMISSIONS_PROMPT_TITLE, multiple()); | |
| 219 } | |
| 220 | |
| 221 void Dismissed() override { | 211 void Dismissed() override { |
| 222 DevicePermissionsManager* permissions_manager = | 212 DevicePermissionsManager* permissions_manager = |
| 223 DevicePermissionsManager::Get(browser_context()); | 213 DevicePermissionsManager::Get(browser_context()); |
| 224 std::vector<scoped_refptr<device::HidDeviceInfo>> devices; | 214 std::vector<scoped_refptr<device::HidDeviceInfo>> devices; |
| 225 for (const auto& device : devices_) { | 215 for (const auto& device : devices_) { |
| 226 if (device->granted()) { | 216 if (device->granted()) { |
| 227 const HidDeviceInfo* hid_device = | 217 const HidDeviceInfo* hid_device = |
| 228 static_cast<const HidDeviceInfo*>(device.get()); | 218 static_cast<const HidDeviceInfo*>(device.get()); |
| 229 devices.push_back(hid_device->device()); | 219 devices.push_back(hid_device->device()); |
| 230 if (permissions_manager) { | 220 if (permissions_manager) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 257 AddCheckedDevice(std::move(device_info), true); | 247 AddCheckedDevice(std::move(device_info), true); |
| 258 #endif // defined(OS_CHROMEOS) | 248 #endif // defined(OS_CHROMEOS) |
| 259 } | 249 } |
| 260 } | 250 } |
| 261 | 251 |
| 262 void OnDeviceRemoved(scoped_refptr<device::HidDeviceInfo> device) override { | 252 void OnDeviceRemoved(scoped_refptr<device::HidDeviceInfo> device) override { |
| 263 for (auto it = devices_.begin(); it != devices_.end(); ++it) { | 253 for (auto it = devices_.begin(); it != devices_.end(); ++it) { |
| 264 const HidDeviceInfo* entry = | 254 const HidDeviceInfo* entry = |
| 265 static_cast<const HidDeviceInfo*>((*it).get()); | 255 static_cast<const HidDeviceInfo*>((*it).get()); |
| 266 if (entry->device() == device) { | 256 if (entry->device() == device) { |
| 257 size_t index = it - devices_.begin(); |
| 258 base::string16 device_name = (*it)->name(); |
| 267 devices_.erase(it); | 259 devices_.erase(it); |
| 268 if (observer()) { | 260 if (observer()) |
| 269 observer()->OnDevicesChanged(); | 261 observer()->OnDeviceRemoved(index, device_name); |
| 270 } | |
| 271 return; | 262 return; |
| 272 } | 263 } |
| 273 } | 264 } |
| 274 } | 265 } |
| 275 | 266 |
| 276 void OnDevicesEnumerated( | 267 void OnDevicesEnumerated( |
| 277 const std::vector<scoped_refptr<device::HidDeviceInfo>>& devices) { | 268 const std::vector<scoped_refptr<device::HidDeviceInfo>>& devices) { |
| 278 for (const auto& device : devices) { | 269 for (const auto& device : devices) { |
| 279 OnDeviceAdded(device); | 270 OnDeviceAdded(device); |
| 280 } | 271 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 308 DevicePermissionsPrompt::Prompt::Prompt(const Extension* extension, | 299 DevicePermissionsPrompt::Prompt::Prompt(const Extension* extension, |
| 309 content::BrowserContext* context, | 300 content::BrowserContext* context, |
| 310 bool multiple) | 301 bool multiple) |
| 311 : extension_(extension), browser_context_(context), multiple_(multiple) { | 302 : extension_(extension), browser_context_(context), multiple_(multiple) { |
| 312 } | 303 } |
| 313 | 304 |
| 314 void DevicePermissionsPrompt::Prompt::SetObserver(Observer* observer) { | 305 void DevicePermissionsPrompt::Prompt::SetObserver(Observer* observer) { |
| 315 observer_ = observer; | 306 observer_ = observer; |
| 316 } | 307 } |
| 317 | 308 |
| 318 base::string16 DevicePermissionsPrompt::Prompt::GetPromptMessage() const { | |
| 319 return base::i18n::MessageFormatter::FormatWithNumberedArgs( | |
| 320 l10n_util::GetStringUTF16(IDS_DEVICE_PERMISSIONS_PROMPT), | |
| 321 multiple_ ? "multiple" : "single", extension_->name()); | |
| 322 } | |
| 323 | |
| 324 base::string16 DevicePermissionsPrompt::Prompt::GetDeviceName( | 309 base::string16 DevicePermissionsPrompt::Prompt::GetDeviceName( |
| 325 size_t index) const { | 310 size_t index) const { |
| 326 DCHECK_LT(index, devices_.size()); | 311 DCHECK_LT(index, devices_.size()); |
| 327 return devices_[index]->name(); | 312 return devices_[index]->name(); |
| 328 } | 313 } |
| 329 | 314 |
| 330 base::string16 DevicePermissionsPrompt::Prompt::GetDeviceSerialNumber( | 315 base::string16 DevicePermissionsPrompt::Prompt::GetDeviceSerialNumber( |
| 331 size_t index) const { | 316 size_t index) const { |
| 332 DCHECK_LT(index, devices_.size()); | 317 DCHECK_LT(index, devices_.size()); |
| 333 return devices_[index]->serial_number(); | 318 return devices_[index]->serial_number(); |
| 334 } | 319 } |
| 335 | 320 |
| 336 void DevicePermissionsPrompt::Prompt::GrantDevicePermission(size_t index) { | 321 void DevicePermissionsPrompt::Prompt::GrantDevicePermission(size_t index) { |
| 337 DCHECK_LT(index, devices_.size()); | 322 DCHECK_LT(index, devices_.size()); |
| 338 devices_[index]->set_granted(); | 323 devices_[index]->set_granted(); |
| 339 } | 324 } |
| 340 | 325 |
| 341 DevicePermissionsPrompt::Prompt::~Prompt() { | 326 DevicePermissionsPrompt::Prompt::~Prompt() { |
| 342 } | 327 } |
| 343 | 328 |
| 344 void DevicePermissionsPrompt::Prompt::AddCheckedDevice( | 329 void DevicePermissionsPrompt::Prompt::AddCheckedDevice( |
| 345 std::unique_ptr<DeviceInfo> device, | 330 std::unique_ptr<DeviceInfo> device, |
| 346 bool allowed) { | 331 bool allowed) { |
| 347 if (allowed) { | 332 if (allowed) { |
| 333 base::string16 device_name = device->name(); |
| 348 devices_.push_back(std::move(device)); | 334 devices_.push_back(std::move(device)); |
| 349 if (observer_) { | 335 if (observer_) |
| 350 observer_->OnDevicesChanged(); | 336 observer_->OnDeviceAdded(devices_.size() - 1, device_name); |
| 351 } | |
| 352 } | 337 } |
| 353 } | 338 } |
| 354 | 339 |
| 355 DevicePermissionsPrompt::DevicePermissionsPrompt( | 340 DevicePermissionsPrompt::DevicePermissionsPrompt( |
| 356 content::WebContents* web_contents) | 341 content::WebContents* web_contents) |
| 357 : web_contents_(web_contents) { | 342 : web_contents_(web_contents) { |
| 358 } | 343 } |
| 359 | 344 |
| 360 DevicePermissionsPrompt::~DevicePermissionsPrompt() { | 345 DevicePermissionsPrompt::~DevicePermissionsPrompt() { |
| 361 } | 346 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 // static | 379 // static |
| 395 scoped_refptr<DevicePermissionsPrompt::Prompt> | 380 scoped_refptr<DevicePermissionsPrompt::Prompt> |
| 396 DevicePermissionsPrompt::CreateUsbPromptForTest(const Extension* extension, | 381 DevicePermissionsPrompt::CreateUsbPromptForTest(const Extension* extension, |
| 397 bool multiple) { | 382 bool multiple) { |
| 398 return make_scoped_refptr(new UsbDevicePermissionsPrompt( | 383 return make_scoped_refptr(new UsbDevicePermissionsPrompt( |
| 399 extension, nullptr, multiple, std::vector<UsbDeviceFilter>(), | 384 extension, nullptr, multiple, std::vector<UsbDeviceFilter>(), |
| 400 base::Bind(&NoopUsbCallback))); | 385 base::Bind(&NoopUsbCallback))); |
| 401 } | 386 } |
| 402 | 387 |
| 403 } // namespace extensions | 388 } // namespace extensions |
| OLD | NEW |