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

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

Issue 809743006: Add an Observer interface to UsbService for device add/remove. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Clarify comment. Created 5 years, 11 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
« no previous file with comments | « extensions/browser/api/device_permissions_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_manager.h" 5 #include "extensions/browser/api/device_permissions_manager.h"
6 6
7 #include "base/memory/singleton.h" 7 #include "base/memory/singleton.h"
8 #include "base/strings/string_number_conversions.h" 8 #include "base/strings/string_number_conversions.h"
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
11 #include "base/values.h" 11 #include "base/values.h"
12 #include "components/keyed_service/content/browser_context_dependency_manager.h" 12 #include "components/keyed_service/content/browser_context_dependency_manager.h"
13 #include "device/core/device_client.h"
14 #include "device/usb/usb_device.h"
13 #include "device/usb/usb_ids.h" 15 #include "device/usb/usb_ids.h"
14 #include "extensions/browser/extension_host.h" 16 #include "extensions/browser/extension_host.h"
15 #include "extensions/browser/extension_prefs.h" 17 #include "extensions/browser/extension_prefs.h"
16 #include "extensions/browser/extensions_browser_client.h" 18 #include "extensions/browser/extensions_browser_client.h"
17 #include "extensions/browser/process_manager.h" 19 #include "extensions/browser/process_manager.h"
18 #include "extensions/browser/process_manager_factory.h" 20 #include "extensions/browser/process_manager_factory.h"
19 #include "extensions/strings/grit/extensions_strings.h" 21 #include "extensions/strings/grit/extensions_strings.h"
20 #include "ui/base/l10n/l10n_util.h" 22 #include "ui/base/l10n/l10n_util.h"
21 23
22 namespace extensions { 24 namespace extensions {
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 } 433 }
432 434
433 device_permissions->entries_.insert(device_entry); 435 device_permissions->entries_.insert(device_entry);
434 SaveDevicePermissionEntry(context_, extension_id, device_entry); 436 SaveDevicePermissionEntry(context_, extension_id, device_entry);
435 } else if (!ContainsKey(device_permissions->ephemeral_devices_, device)) { 437 } else if (!ContainsKey(device_permissions->ephemeral_devices_, device)) {
436 // Non-persistent devices cannot be reliably identified when they are 438 // Non-persistent devices cannot be reliably identified when they are
437 // reconnected so such devices are only remembered until disconnect. 439 // reconnected so such devices are only remembered until disconnect.
438 // Register an observer here so that this set doesn't grow undefinitely. 440 // Register an observer here so that this set doesn't grow undefinitely.
439 device_permissions->entries_.insert(device_entry); 441 device_permissions->entries_.insert(device_entry);
440 device_permissions->ephemeral_devices_[device] = device_entry; 442 device_permissions->ephemeral_devices_[device] = device_entry;
441 device->AddObserver(this); 443
444 // Only start observing when an ephemeral device has been added so that
445 // UsbService is not automatically initialized on profile creation (which it
446 // would be if this call were in the constructor).
447 device::UsbService* usb_service =
448 device::DeviceClient::Get()->GetUsbService();
449 DCHECK(usb_service);
450 if (!usb_service_observer_.IsObserving(usb_service)) {
451 usb_service_observer_.Add(usb_service);
452 }
442 } 453 }
443 } 454 }
444 455
445 void DevicePermissionsManager::UpdateLastUsed( 456 void DevicePermissionsManager::UpdateLastUsed(
446 const std::string& extension_id, 457 const std::string& extension_id,
447 scoped_refptr<DevicePermissionEntry> entry) { 458 scoped_refptr<DevicePermissionEntry> entry) {
448 DCHECK(CalledOnValidThread()); 459 DCHECK(CalledOnValidThread());
449 entry->set_last_used(base::Time::Now()); 460 entry->set_last_used(base::Time::Now());
450 if (entry->IsPersistent()) { 461 if (entry->IsPersistent()) {
451 UpdateDevicePermissionEntry(context_, extension_id, entry); 462 UpdateDevicePermissionEntry(context_, extension_id, entry);
452 } 463 }
453 } 464 }
454 465
455 void DevicePermissionsManager::RemoveEntry( 466 void DevicePermissionsManager::RemoveEntry(
456 const std::string& extension_id, 467 const std::string& extension_id,
457 scoped_refptr<DevicePermissionEntry> entry) { 468 scoped_refptr<DevicePermissionEntry> entry) {
458 DCHECK(CalledOnValidThread()); 469 DCHECK(CalledOnValidThread());
459 DevicePermissions* device_permissions = Get(extension_id); 470 DevicePermissions* device_permissions = Get(extension_id);
460 DCHECK(device_permissions); 471 DCHECK(device_permissions);
461 DCHECK(ContainsKey(device_permissions->entries_, entry)); 472 DCHECK(ContainsKey(device_permissions->entries_, entry));
462 device_permissions->entries_.erase(entry); 473 device_permissions->entries_.erase(entry);
463 if (entry->IsPersistent()) { 474 if (entry->IsPersistent()) {
464 RemoveDevicePermissionEntry(context_, extension_id, entry); 475 RemoveDevicePermissionEntry(context_, extension_id, entry);
465 } else { 476 } else {
466 device_permissions->ephemeral_devices_.erase(entry->device_); 477 device_permissions->ephemeral_devices_.erase(entry->device_);
467 entry->device_->RemoveObserver(this);
468 } 478 }
469 } 479 }
470 480
471 void DevicePermissionsManager::Clear(const std::string& extension_id) { 481 void DevicePermissionsManager::Clear(const std::string& extension_id) {
472 DCHECK(CalledOnValidThread()); 482 DCHECK(CalledOnValidThread());
473 483
474 ClearDevicePermissionEntries(ExtensionPrefs::Get(context_), extension_id); 484 ClearDevicePermissionEntries(ExtensionPrefs::Get(context_), extension_id);
475 DevicePermissions* device_permissions = Get(extension_id); 485 DevicePermissions* device_permissions = Get(extension_id);
476 if (device_permissions) { 486 if (device_permissions) {
477 for (const auto& device_entry : device_permissions->ephemeral_devices_) {
478 device_entry.first->RemoveObserver(this);
479 }
480 extension_id_to_device_permissions_.erase(extension_id); 487 extension_id_to_device_permissions_.erase(extension_id);
481 delete device_permissions; 488 delete device_permissions;
482 } 489 }
483 } 490 }
484 491
485 DevicePermissionsManager::DevicePermissionsManager( 492 DevicePermissionsManager::DevicePermissionsManager(
486 content::BrowserContext* context) 493 content::BrowserContext* context)
487 : context_(context), process_manager_observer_(this) { 494 : context_(context),
495 process_manager_observer_(this),
496 usb_service_observer_(this) {
488 process_manager_observer_.Add(ProcessManager::Get(context)); 497 process_manager_observer_.Add(ProcessManager::Get(context));
489 } 498 }
490 499
491 DevicePermissionsManager::~DevicePermissionsManager() { 500 DevicePermissionsManager::~DevicePermissionsManager() {
492 for (const auto& map_entry : extension_id_to_device_permissions_) { 501 for (const auto& map_entry : extension_id_to_device_permissions_) {
493 DevicePermissions* device_permissions = map_entry.second; 502 DevicePermissions* device_permissions = map_entry.second;
494 for (const auto& device_entry : device_permissions->ephemeral_devices_) {
495 device_entry.first->RemoveObserver(this);
496 }
497 delete device_permissions; 503 delete device_permissions;
498 } 504 }
499 } 505 }
500 506
501 DevicePermissions* DevicePermissionsManager::Get( 507 DevicePermissions* DevicePermissionsManager::Get(
502 const std::string& extension_id) const { 508 const std::string& extension_id) const {
503 std::map<std::string, DevicePermissions*>::const_iterator it = 509 std::map<std::string, DevicePermissions*>::const_iterator it =
504 extension_id_to_device_permissions_.find(extension_id); 510 extension_id_to_device_permissions_.find(extension_id);
505 if (it != extension_id_to_device_permissions_.end()) { 511 if (it != extension_id_to_device_permissions_.end()) {
506 return it->second; 512 return it->second;
(...skipping 15 matching lines...) Expand all
522 528
523 void DevicePermissionsManager::OnBackgroundHostClose( 529 void DevicePermissionsManager::OnBackgroundHostClose(
524 const std::string& extension_id) { 530 const std::string& extension_id) {
525 DCHECK(CalledOnValidThread()); 531 DCHECK(CalledOnValidThread());
526 532
527 DevicePermissions* device_permissions = Get(extension_id); 533 DevicePermissions* device_permissions = Get(extension_id);
528 if (device_permissions) { 534 if (device_permissions) {
529 // When all of the app's windows are closed and the background page is 535 // When all of the app's windows are closed and the background page is
530 // suspended all ephemeral device permissions are cleared. 536 // suspended all ephemeral device permissions are cleared.
531 for (const auto& map_entry : device_permissions->ephemeral_devices_) { 537 for (const auto& map_entry : device_permissions->ephemeral_devices_) {
532 map_entry.first->RemoveObserver(this);
533 device_permissions->entries_.erase(map_entry.second); 538 device_permissions->entries_.erase(map_entry.second);
534 } 539 }
535 device_permissions->ephemeral_devices_.clear(); 540 device_permissions->ephemeral_devices_.clear();
536 } 541 }
537 } 542 }
538 543
539 void DevicePermissionsManager::OnDisconnect(scoped_refptr<UsbDevice> device) { 544 void DevicePermissionsManager::OnDeviceRemoved(
545 scoped_refptr<UsbDevice> device) {
540 for (const auto& map_entry : extension_id_to_device_permissions_) { 546 for (const auto& map_entry : extension_id_to_device_permissions_) {
541 // An ephemeral device cannot be identified if it is reconnected and so 547 // An ephemeral device cannot be identified if it is reconnected and so
542 // permission to access it is cleared on disconnect. 548 // permission to access it is cleared on disconnect.
543 DevicePermissions* device_permissions = map_entry.second; 549 DevicePermissions* device_permissions = map_entry.second;
544 const auto& device_entry = 550 const auto& device_entry =
545 device_permissions->ephemeral_devices_.find(device); 551 device_permissions->ephemeral_devices_.find(device);
546 DCHECK(device_entry != device_permissions->ephemeral_devices_.end()); 552 if (device_entry != device_permissions->ephemeral_devices_.end()) {
547 device_permissions->entries_.erase(device_entry->second); 553 device_permissions->entries_.erase(device_entry->second);
548 device_permissions->ephemeral_devices_.erase(device); 554 device_permissions->ephemeral_devices_.erase(device);
549 device->RemoveObserver(this); 555 }
550 } 556 }
551 } 557 }
552 558
553 // static 559 // static
554 DevicePermissionsManager* DevicePermissionsManagerFactory::GetForBrowserContext( 560 DevicePermissionsManager* DevicePermissionsManagerFactory::GetForBrowserContext(
555 content::BrowserContext* context) { 561 content::BrowserContext* context) {
556 return static_cast<DevicePermissionsManager*>( 562 return static_cast<DevicePermissionsManager*>(
557 GetInstance()->GetServiceForBrowserContext(context, true)); 563 GetInstance()->GetServiceForBrowserContext(context, true));
558 } 564 }
559 565
(...skipping 20 matching lines...) Expand all
580 586
581 BrowserContext* DevicePermissionsManagerFactory::GetBrowserContextToUse( 587 BrowserContext* DevicePermissionsManagerFactory::GetBrowserContextToUse(
582 BrowserContext* context) const { 588 BrowserContext* context) const {
583 // Return the original (possibly off-the-record) browser context so that a 589 // Return the original (possibly off-the-record) browser context so that a
584 // separate instance of the DevicePermissionsManager is used in incognito 590 // separate instance of the DevicePermissionsManager is used in incognito
585 // mode. The parent class's implemenation returns NULL. 591 // mode. The parent class's implemenation returns NULL.
586 return context; 592 return context;
587 } 593 }
588 594
589 } // namespace extensions 595 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/browser/api/device_permissions_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698