Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(545)

Side by Side Diff: extensions/browser/api/device_permissions_prompt.cc

Issue 633793002: Prompt for granting permission to access USB devices. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rename UsbDevicesChosen -> OnUsbDevicesChosen. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "extensions/browser/api/device_permissions_prompt.h"
6
7 #include "base/strings/stringprintf.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "content/public/browser/browser_thread.h"
10 #include "device/core/device_client.h"
11 #include "device/usb/usb_device.h"
12 #include "device/usb/usb_device_filter.h"
13 #include "device/usb/usb_ids.h"
14 #include "device/usb/usb_service.h"
15 #include "extensions/browser/api/device_permissions_manager.h"
16 #include "extensions/common/extension.h"
17 #include "extensions/strings/grit/extensions_strings.h"
18 #include "ui/base/l10n/l10n_util.h"
19
20 namespace extensions {
21
22 using device::UsbDevice;
23 using device::UsbDeviceFilter;
24 using device::UsbService;
25
26 DevicePermissionsPrompt::Prompt::DeviceInfo::DeviceInfo(
27 scoped_refptr<UsbDevice> device,
28 const base::string16& name,
29 const base::string16& serial_number,
30 const base::string16& tooltip)
31 : device(device),
32 name(name),
33 serial_number(serial_number),
34 tooltip(tooltip) {
35 }
36
37 DevicePermissionsPrompt::Prompt::DeviceInfo::~DeviceInfo() {
38 }
39
40 DevicePermissionsPrompt::Prompt::Prompt()
41 : extension_(nullptr),
42 browser_context_(nullptr),
43 multiple_(false),
44 observer_(nullptr) {
45 }
46
47 void DevicePermissionsPrompt::Prompt::SetObserver(Observer* observer) {
48 observer_ = observer;
49
50 content::BrowserThread::PostTask(
51 content::BrowserThread::FILE,
52 FROM_HERE,
53 base::Bind(&DevicePermissionsPrompt::Prompt::DoDeviceQuery, this));
54 }
55
56 base::string16 DevicePermissionsPrompt::Prompt::GetHeading() const {
57 return l10n_util::GetStringUTF16(IDS_DEVICE_PERMISSIONS_PROMPT_HEADING);
58 }
59
60 base::string16 DevicePermissionsPrompt::Prompt::GetPromptMessage() const {
61 return l10n_util::GetStringFUTF16(multiple_
62 ? IDS_DEVICE_PERMISSIONS_PROMPT_MULTIPLE
63 : IDS_DEVICE_PERMISSIONS_PROMPT_SINGLE,
64 base::UTF8ToUTF16(extension_->name()));
65 }
66
67 scoped_refptr<UsbDevice> DevicePermissionsPrompt::Prompt::GetDevice(
68 size_t index) const {
69 DCHECK_LT(index, devices_.size());
70 return devices_[index].device;
71 }
72
73 void DevicePermissionsPrompt::Prompt::GrantDevicePermission(
74 size_t index) const {
75 DCHECK_LT(index, devices_.size());
76 DevicePermissionsManager* permissions_manager =
77 DevicePermissionsManager::Get(browser_context_);
78 if (permissions_manager) {
79 permissions_manager->AllowUsbDevice(extension_->id(),
80 devices_[index].device,
81 devices_[index].serial_number);
82 }
83 }
84
85 void DevicePermissionsPrompt::Prompt::set_filters(
86 const std::vector<UsbDeviceFilter>& filters) {
87 filters_ = filters;
88 }
89
90 DevicePermissionsPrompt::Prompt::~Prompt() {
91 }
92
93 void DevicePermissionsPrompt::Prompt::DoDeviceQuery() {
94 UsbService* service = device::DeviceClient::Get()->GetUsbService();
95 if (!service) {
96 return;
97 }
98
99 std::vector<scoped_refptr<UsbDevice>> devices;
100 service->GetDevices(&devices);
101
102 std::vector<DeviceInfo> device_info;
103 for (const auto& device : devices) {
104 if (!(filters_.empty() || UsbDeviceFilter::MatchesAny(device, filters_))) {
105 continue;
106 }
107
108 const char* vendor_name_raw =
109 device::UsbIds::GetVendorName(device->vendor_id());
110 base::string16 vendor_name;
111 if (vendor_name_raw) {
112 vendor_name = base::UTF8ToUTF16(vendor_name_raw);
113 } else {
114 vendor_name = l10n_util::GetStringUTF16(IDS_DEVICE_UNKNOWN_VENDOR);
115 }
116
117 const char* product_name_raw = device::UsbIds::GetProductName(
118 device->vendor_id(), device->product_id());
119 base::string16 product_name;
120 if (product_name_raw) {
121 product_name = base::UTF8ToUTF16(product_name_raw);
122 } else {
123 product_name = l10n_util::GetStringUTF16(IDS_DEVICE_UNKNOWN_PRODUCT);
124 }
125
126 base::string16 manufacturer_string;
127 if (!device->GetManufacturer(&manufacturer_string)) {
128 manufacturer_string = vendor_name;
129 }
130
131 base::string16 product_string;
132 if (!device->GetProduct(&product_string)) {
133 product_string = product_name;
134 }
135
136 base::string16 serial_number;
137 if (!device->GetSerialNumber(&serial_number)) {
138 serial_number.clear();
139 }
140
141 base::string16 vendor_id =
142 base::ASCIIToUTF16(base::StringPrintf("0x%04x", device->vendor_id()));
143 base::string16 product_id =
144 base::ASCIIToUTF16(base::StringPrintf("0x%04x", device->product_id()));
145
146 device_info.push_back(DeviceInfo(
147 device,
148 l10n_util::GetStringFUTF16(IDS_DEVICE_PERMISSIONS_PROMPT_DEVICE_NAME,
149 product_string,
150 manufacturer_string),
151 serial_number,
152 l10n_util::GetStringFUTF16(IDS_DEVICE_PERMISSIONS_PROMPT_DEVICE_TOOLTIP,
153 vendor_name,
154 vendor_id,
155 product_name,
156 product_id)));
157 }
158
159 content::BrowserThread::PostTask(
160 content::BrowserThread::UI,
161 FROM_HERE,
162 base::Bind(
163 &DevicePermissionsPrompt::Prompt::SetDevices, this, device_info));
164 }
165
166 void DevicePermissionsPrompt::Prompt::SetDevices(
167 const std::vector<DeviceInfo>& devices) {
168 devices_ = devices;
169 if (observer_) {
170 observer_->OnDevicesChanged();
171 }
172 }
173
174 DevicePermissionsPrompt::DevicePermissionsPrompt(
175 content::WebContents* web_contents)
176 : web_contents_(web_contents),
177 delegate_(nullptr) {
178 }
179
180 DevicePermissionsPrompt::~DevicePermissionsPrompt() {
181 }
182
183 void DevicePermissionsPrompt::AskForUsbDevices(
184 Delegate* delegate,
185 const Extension* extension,
186 content::BrowserContext* context,
187 bool multiple,
188 const std::vector<UsbDeviceFilter>& filters) {
189 prompt_ = new Prompt();
190 prompt_->set_extension(extension);
191 prompt_->set_browser_context(context);
192 prompt_->set_multiple(multiple);
193 prompt_->set_filters(filters);
194 delegate_ = delegate;
195
196 GetDefaultShowDialogCallback().Run(web_contents_, delegate_, prompt_);
197 }
198
199 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/browser/api/device_permissions_prompt.h ('k') | extensions/browser/api/extensions_api_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698