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/hid/hid_device_manager.h" | 5 #include "extensions/browser/api/hid/hid_device_manager.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| 11 #include "content/public/browser/browser_thread.h" |
11 #include "device/core/device_client.h" | 12 #include "device/core/device_client.h" |
12 #include "device/hid/hid_device_filter.h" | 13 #include "device/hid/hid_device_filter.h" |
13 #include "device/hid/hid_service.h" | 14 #include "device/hid/hid_service.h" |
14 #include "extensions/browser/api/extensions_api_client.h" | 15 #include "extensions/browser/api/extensions_api_client.h" |
15 #include "extensions/common/permissions/permissions_data.h" | 16 #include "extensions/common/permissions/permissions_data.h" |
16 #include "extensions/common/permissions/usb_device_permission.h" | 17 #include "extensions/common/permissions/usb_device_permission.h" |
17 | 18 |
18 using device::HidDeviceFilter; | 19 using device::HidDeviceFilter; |
19 using device::HidService; | 20 using device::HidService; |
20 using device::HidUsageAndPage; | 21 using device::HidUsageAndPage; |
(...skipping 10 matching lines...) Expand all Loading... |
31 BrowserContextKeyedAPIFactory<HidDeviceManager>* | 32 BrowserContextKeyedAPIFactory<HidDeviceManager>* |
32 HidDeviceManager::GetFactoryInstance() { | 33 HidDeviceManager::GetFactoryInstance() { |
33 static base::LazyInstance<BrowserContextKeyedAPIFactory<HidDeviceManager> > | 34 static base::LazyInstance<BrowserContextKeyedAPIFactory<HidDeviceManager> > |
34 factory = LAZY_INSTANCE_INITIALIZER; | 35 factory = LAZY_INSTANCE_INITIALIZER; |
35 return &factory.Get(); | 36 return &factory.Get(); |
36 } | 37 } |
37 | 38 |
38 scoped_ptr<base::ListValue> HidDeviceManager::GetApiDevices( | 39 scoped_ptr<base::ListValue> HidDeviceManager::GetApiDevices( |
39 const Extension* extension, | 40 const Extension* extension, |
40 const std::vector<HidDeviceFilter>& filters) { | 41 const std::vector<HidDeviceFilter>& filters) { |
| 42 DCHECK(IsCalledOnValidThread()); |
41 UpdateDevices(); | 43 UpdateDevices(); |
42 | 44 |
43 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); | 45 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); |
44 DCHECK(hid_service); | 46 DCHECK(hid_service); |
45 base::ListValue* api_devices = new base::ListValue(); | 47 base::ListValue* api_devices = new base::ListValue(); |
46 for (ResourceIdToDeviceIdMap::const_iterator device_iter = | 48 for (ResourceIdToDeviceIdMap::const_iterator device_iter = |
47 device_ids_.begin(); | 49 device_ids_.begin(); |
48 device_iter != device_ids_.end(); | 50 device_iter != device_ids_.end(); |
49 ++device_iter) { | 51 ++device_iter) { |
50 int resource_id = device_iter->first; | 52 int resource_id = device_iter->first; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 api_devices->Append(api_device_info.ToValue().release()); | 102 api_devices->Append(api_device_info.ToValue().release()); |
101 } | 103 } |
102 } | 104 } |
103 } | 105 } |
104 | 106 |
105 return scoped_ptr<base::ListValue>(api_devices); | 107 return scoped_ptr<base::ListValue>(api_devices); |
106 } | 108 } |
107 | 109 |
108 bool HidDeviceManager::GetDeviceInfo(int resource_id, | 110 bool HidDeviceManager::GetDeviceInfo(int resource_id, |
109 device::HidDeviceInfo* device_info) { | 111 device::HidDeviceInfo* device_info) { |
| 112 DCHECK(IsCalledOnValidThread()); |
110 UpdateDevices(); | 113 UpdateDevices(); |
111 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); | 114 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); |
112 DCHECK(hid_service); | 115 DCHECK(hid_service); |
113 | 116 |
114 ResourceIdToDeviceIdMap::const_iterator device_iter = | 117 ResourceIdToDeviceIdMap::const_iterator device_iter = |
115 device_ids_.find(resource_id); | 118 device_ids_.find(resource_id); |
116 if (device_iter == device_ids_.end()) | 119 if (device_iter == device_ids_.end()) |
117 return false; | 120 return false; |
118 | 121 |
119 return hid_service->GetDeviceInfo(device_iter->second, device_info); | 122 return hid_service->GetDeviceInfo(device_iter->second, device_info); |
120 } | 123 } |
121 | 124 |
122 bool HidDeviceManager::HasPermission(const Extension* extension, | 125 bool HidDeviceManager::HasPermission(const Extension* extension, |
123 const device::HidDeviceInfo& device_info) { | 126 const device::HidDeviceInfo& device_info) { |
| 127 DCHECK(IsCalledOnValidThread()); |
124 UsbDevicePermission::CheckParam usbParam( | 128 UsbDevicePermission::CheckParam usbParam( |
125 device_info.vendor_id, | 129 device_info.vendor_id, |
126 device_info.product_id, | 130 device_info.product_id, |
127 UsbDevicePermissionData::UNSPECIFIED_INTERFACE); | 131 UsbDevicePermissionData::UNSPECIFIED_INTERFACE); |
128 if (extension->permissions_data()->CheckAPIPermissionWithParam( | 132 if (extension->permissions_data()->CheckAPIPermissionWithParam( |
129 APIPermission::kUsbDevice, &usbParam)) { | 133 APIPermission::kUsbDevice, &usbParam)) { |
130 return true; | 134 return true; |
131 } | 135 } |
132 | 136 |
133 if (extension->permissions_data()->HasAPIPermission( | 137 if (extension->permissions_data()->HasAPIPermission( |
134 APIPermission::kU2fDevices)) { | 138 APIPermission::kU2fDevices)) { |
135 HidDeviceFilter u2f_filter; | 139 HidDeviceFilter u2f_filter; |
136 u2f_filter.SetUsagePage(0xF1D0); | 140 u2f_filter.SetUsagePage(0xF1D0); |
137 if (u2f_filter.Matches(device_info)) { | 141 if (u2f_filter.Matches(device_info)) { |
138 return true; | 142 return true; |
139 } | 143 } |
140 } | 144 } |
141 | 145 |
142 return false; | 146 return false; |
143 } | 147 } |
144 | 148 |
| 149 // static |
| 150 bool HidDeviceManager::IsCalledOnValidThread() { |
| 151 return content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE); |
| 152 } |
| 153 |
145 void HidDeviceManager::UpdateDevices() { | 154 void HidDeviceManager::UpdateDevices() { |
146 thread_checker_.CalledOnValidThread(); | 155 DCHECK(IsCalledOnValidThread()); |
147 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); | 156 HidService* hid_service = device::DeviceClient::Get()->GetHidService(); |
148 DCHECK(hid_service); | 157 DCHECK(hid_service); |
149 | 158 |
150 std::vector<device::HidDeviceInfo> devices; | 159 std::vector<device::HidDeviceInfo> devices; |
151 hid_service->GetDevices(&devices); | 160 hid_service->GetDevices(&devices); |
152 | 161 |
153 // Build an updated bidi mapping between resource ID and underlying device ID. | 162 // Build an updated bidi mapping between resource ID and underlying device ID. |
154 DeviceIdToResourceIdMap new_resource_ids; | 163 DeviceIdToResourceIdMap new_resource_ids; |
155 ResourceIdToDeviceIdMap new_device_ids; | 164 ResourceIdToDeviceIdMap new_device_ids; |
156 for (std::vector<device::HidDeviceInfo>::const_iterator iter = | 165 for (std::vector<device::HidDeviceInfo>::const_iterator iter = |
(...skipping 11 matching lines...) Expand all Loading... |
168 new_id = next_resource_id_++; | 177 new_id = next_resource_id_++; |
169 } | 178 } |
170 new_resource_ids[device_info.device_id] = new_id; | 179 new_resource_ids[device_info.device_id] = new_id; |
171 new_device_ids[new_id] = device_info.device_id; | 180 new_device_ids[new_id] = device_info.device_id; |
172 } | 181 } |
173 device_ids_.swap(new_device_ids); | 182 device_ids_.swap(new_device_ids); |
174 resource_ids_.swap(new_resource_ids); | 183 resource_ids_.swap(new_resource_ids); |
175 } | 184 } |
176 | 185 |
177 } // namespace extensions | 186 } // namespace extensions |
OLD | NEW |