From 7adf217e66275bd3ed37757aa40e311cdca19837 Mon Sep 17 00:00:00 2001 From: reillyg Date: Tue, 5 May 2015 12:35:55 -0700 Subject: Add HID support to DevicePermissionsManager and DevicePermissionsPrompt. This patch lays down the backend support necessary for the HID device picker API. The DevicePermissionsManager can now manage HID device permissions (both ephemeral devices that will be forgotten when they are disconnected and persistent devices that are written to the prefs file). The DevicePermissionsPrompt gains support for enumerating HID devices. BUG=457899 Review URL: https://codereview.chromium.org/1123633002 Cr-Commit-Position: refs/heads/master@{#328379} --- device/hid/hid_service.cc | 11 ++++++++++- device/hid/hid_service.h | 8 ++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) (limited to 'device') diff --git a/device/hid/hid_service.cc b/device/hid/hid_service.cc index fc50a41..1993999 100644 --- a/device/hid/hid_service.cc +++ b/device/hid/hid_service.cc @@ -34,6 +34,10 @@ void HidService::Observer::OnDeviceRemoved( scoped_refptr device_info) { } +void HidService::Observer::OnDeviceRemovedCleanup( + scoped_refptr device_info) { +} + HidService* HidService::GetInstance( scoped_refptr file_task_runner) { if (g_service == NULL) { @@ -124,10 +128,15 @@ void HidService::RemoveDevice(const HidDeviceId& device_id) { if (it != devices_.end()) { HID_LOG(USER) << "HID device removed: deviceId='" << device_id << "'"; + scoped_refptr device = it->second; if (enumeration_ready_) { - FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceRemoved(it->second)); + FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceRemoved(device)); } devices_.erase(it); + if (enumeration_ready_) { + FOR_EACH_OBSERVER(Observer, observer_list_, + OnDeviceRemovedCleanup(device)); + } } } diff --git a/device/hid/hid_service.h b/device/hid/hid_service.h index 6d6ef2b..4a4d3ad 100644 --- a/device/hid/hid_service.h +++ b/device/hid/hid_service.h @@ -27,7 +27,15 @@ class HidService { class Observer { public: virtual void OnDeviceAdded(scoped_refptr info); + // Notifies all observers that a device is being removed, called before + // removing the device from HidService. Observers should not depend on the + // order in which they are notified of the OnDeviceRemove event. virtual void OnDeviceRemoved(scoped_refptr info); + // Notifies all observers again, after having first notified all observers + // with OnDeviceRemoved and removed the device from internal structures. + // Each observer must not depend on any other observers' awareness of the + // device as they could be cleaned up in any order. + virtual void OnDeviceRemovedCleanup(scoped_refptr info); }; typedef base::Callback>&)> -- cgit v1.1