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 |