Chromium Code Reviews| Index: extensions/browser/api/device_permissions_prompt.cc |
| diff --git a/extensions/browser/api/device_permissions_prompt.cc b/extensions/browser/api/device_permissions_prompt.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..76279305ed9ad7d47fb6b59133e744350c2afe5e |
| --- /dev/null |
| +++ b/extensions/browser/api/device_permissions_prompt.cc |
| @@ -0,0 +1,194 @@ |
| +// Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "extensions/browser/api/device_permissions_prompt.h" |
| + |
| +#include "base/strings/stringprintf.h" |
| +#include "base/strings/utf_string_conversions.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "device/core/device_client.h" |
| +#include "device/usb/usb_device.h" |
| +#include "device/usb/usb_device_filter.h" |
| +#include "device/usb/usb_ids.h" |
| +#include "device/usb/usb_service.h" |
| +#include "extensions/browser/api/device_permissions_manager.h" |
| +#include "extensions/common/extension.h" |
| +#include "extensions/strings/grit/extensions_strings.h" |
| +#include "ui/base/l10n/l10n_util.h" |
| + |
| +namespace extensions { |
| + |
| +using device::UsbDevice; |
| +using device::UsbDeviceFilter; |
| +using device::UsbService; |
| + |
| +DevicePermissionsPrompt::Prompt::DeviceInfo::DeviceInfo( |
| + scoped_refptr<UsbDevice> device, |
| + base::string16 name, |
| + base::string16 serial_number, |
| + base::string16 tooltip) |
| + : device(device), |
| + name(name), |
| + serial_number(serial_number), |
| + tooltip(tooltip) { |
| +} |
| + |
| +DevicePermissionsPrompt::Prompt::DeviceInfo::~DeviceInfo() { |
| +} |
| + |
| +DevicePermissionsPrompt::Prompt::Prompt() { |
| +} |
|
Finnur
2014/10/15 10:01:25
None of the class members get initialized?
Reilly Grant (use Gerrit)
2014/10/15 19:15:33
Done.
|
| + |
| +void DevicePermissionsPrompt::Prompt::SetObserver(Observer* observer) { |
| + observer_ = observer; |
| + |
| + content::BrowserThread::PostTask( |
| + content::BrowserThread::FILE, |
| + FROM_HERE, |
| + base::Bind(&DevicePermissionsPrompt::Prompt::DoDeviceQuery, this)); |
| +} |
| + |
| +base::string16 DevicePermissionsPrompt::Prompt::GetHeading() const { |
| + return l10n_util::GetStringUTF16(IDS_DEVICE_PERMISSIONS_PROMPT_HEADING); |
| +} |
| + |
| +base::string16 DevicePermissionsPrompt::Prompt::GetPromptMessage() const { |
| + return l10n_util::GetStringFUTF16(multiple_ |
| + ? IDS_DEVICE_PERMISSIONS_PROMPT_MULTIPLE |
| + : IDS_DEVICE_PERMISSIONS_PROMPT_SINGLE, |
| + base::UTF8ToUTF16(extension_->name())); |
| +} |
| + |
| +scoped_refptr<UsbDevice> DevicePermissionsPrompt::Prompt::GetDevice( |
| + size_t index) const { |
| + DCHECK_LT(index, devices_.size()); |
| + return devices_[index].device; |
| +} |
| + |
| +void DevicePermissionsPrompt::Prompt::GrantDevicePermission( |
| + size_t index) const { |
| + DCHECK_LT(index, devices_.size()); |
| + DevicePermissionsManager* permissions_manager = |
| + DevicePermissionsManager::Get(browser_context_); |
| + if (permissions_manager) { |
| + permissions_manager->AllowUsbDevice(extension_->id(), |
| + devices_[index].device, |
| + devices_[index].serial_number); |
| + } |
| +} |
| + |
| +void DevicePermissionsPrompt::Prompt::set_filters( |
| + const std::vector<UsbDeviceFilter>& filters) { |
| + filters_ = filters; |
| +} |
| + |
| +DevicePermissionsPrompt::Prompt::~Prompt() { |
| +} |
| + |
| +void DevicePermissionsPrompt::Prompt::DoDeviceQuery() { |
| + UsbService* service = device::DeviceClient::Get()->GetUsbService(); |
| + if (!service) { |
| + return; |
| + } |
|
Finnur
2014/10/15 10:01:26
nit: Single-line if, no braces. Here and everywher
Reilly Grant (use Gerrit)
2014/10/15 19:15:33
"In general, curly braces are not required for sin
|
| + |
| + std::vector<scoped_refptr<UsbDevice>> devices; |
|
Finnur
2014/10/15 10:01:25
style: s/>>/> >/
Reilly Grant (use Gerrit)
2014/10/15 19:15:33
clang-format has been updated to prefer the no-spa
|
| + service->GetDevices(&devices); |
| + |
| + std::vector<DeviceInfo> device_info; |
| + for (const auto& device : devices) { |
| + if (!(filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_))) { |
| + continue; |
| + } |
| + |
| + const char* vendor_name_raw = |
| + device::UsbIds::GetVendorName(device->vendor_id()); |
| + base::string16 vendor_name; |
| + if (vendor_name_raw) { |
| + vendor_name = base::UTF8ToUTF16(vendor_name_raw); |
| + } else { |
| + vendor_name = l10n_util::GetStringUTF16(IDS_DEVICE_UNKNOWN_VENDOR); |
| + } |
| + |
| + const char* product_name_raw = device::UsbIds::GetProductName( |
| + device->vendor_id(), device->product_id()); |
| + base::string16 product_name; |
| + if (product_name_raw) { |
| + product_name = base::UTF8ToUTF16(product_name_raw); |
| + } else { |
| + product_name = l10n_util::GetStringUTF16(IDS_DEVICE_UNKNOWN_PRODUCT); |
| + } |
| + |
| + base::string16 manufacturer_string; |
| + if (!device->GetManufacturer(&manufacturer_string)) { |
| + manufacturer_string = vendor_name; |
| + } |
| + |
| + base::string16 product_string; |
| + if (!device->GetProduct(&product_string)) { |
| + product_string = product_name; |
| + } |
| + |
| + base::string16 serial_number; |
| + if (!device->GetSerialNumber(&serial_number)) { |
| + serial_number.clear(); |
| + } |
| + |
| + base::string16 vendor_id = |
| + base::ASCIIToUTF16(base::StringPrintf("0x%04x", device->vendor_id())); |
| + base::string16 product_id = |
| + base::ASCIIToUTF16(base::StringPrintf("0x%04x", device->product_id())); |
| + |
| + device_info.push_back(DeviceInfo( |
| + device, |
| + l10n_util::GetStringFUTF16(IDS_DEVICE_PERMISSIONS_PROMPT_DEVICE_NAME, |
| + product_string, |
| + manufacturer_string), |
| + serial_number, |
| + l10n_util::GetStringFUTF16(IDS_DEVICE_PERMISSIONS_PROMPT_DEVICE_TOOLTIP, |
| + vendor_name, |
| + vendor_id, |
| + product_name, |
| + product_id))); |
| + } |
| + |
| + content::BrowserThread::PostTask( |
| + content::BrowserThread::UI, |
| + FROM_HERE, |
| + base::Bind( |
| + &DevicePermissionsPrompt::Prompt::SetDevices, this, device_info)); |
| +} |
| + |
| +void DevicePermissionsPrompt::Prompt::SetDevices( |
| + const std::vector<DeviceInfo>& devices) { |
| + devices_ = devices; |
| + if (observer_) { |
| + observer_->OnDevicesChanged(); |
| + } |
| +} |
| + |
| +DevicePermissionsPrompt::DevicePermissionsPrompt( |
| + content::WebContents* web_contents) |
| + : web_contents_(web_contents) { |
|
Finnur
2014/10/15 10:01:26
delegate_(NULL) ?
Well, I guess we're using nullpt
Reilly Grant (use Gerrit)
2014/10/15 19:15:33
Done.
|
| +} |
| + |
| +DevicePermissionsPrompt::~DevicePermissionsPrompt() { |
| +} |
| + |
| +void DevicePermissionsPrompt::AskForUsbDevices( |
| + Delegate* delegate, |
| + const Extension* extension, |
| + content::BrowserContext* context, |
| + bool multiple, |
| + std::vector<UsbDeviceFilter> filters) { |
| + prompt_ = new Prompt(); |
| + prompt_->set_extension(extension); |
| + prompt_->set_browser_context(context); |
| + prompt_->set_multiple(multiple); |
| + prompt_->set_filters(filters); |
| + delegate_ = delegate; |
| + |
| + GetDefaultShowDialogCallback().Run(web_contents_, delegate_, prompt_); |
| +} |
| + |
| +} // namespace extensions |