| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "modules/webusb/USB.h" | 5 #include "modules/webusb/USB.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/ScriptPromise.h" | 7 #include "bindings/core/v8/ScriptPromise.h" |
| 8 #include "bindings/core/v8/ScriptPromiseResolver.h" | 8 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 9 #include "core/dom/DOMException.h" | 9 #include "core/dom/DOMException.h" |
| 10 #include "core/dom/Document.h" | 10 #include "core/dom/Document.h" |
| 11 #include "core/dom/ExceptionCode.h" | 11 #include "core/dom/ExceptionCode.h" |
| 12 #include "device/usb/public/interfaces/device.mojom-blink.h" | 12 #include "device/usb/public/interfaces/device.mojom-blink.h" |
| 13 #include "modules/EventTargetModules.h" | 13 #include "modules/EventTargetModules.h" |
| 14 #include "modules/webusb/USBConnectionEvent.h" | 14 #include "modules/webusb/USBConnectionEvent.h" |
| 15 #include "modules/webusb/USBDevice.h" | 15 #include "modules/webusb/USBDevice.h" |
| 16 #include "modules/webusb/USBDeviceFilter.h" | 16 #include "modules/webusb/USBDeviceFilter.h" |
| 17 #include "modules/webusb/USBDeviceRequestOptions.h" | 17 #include "modules/webusb/USBDeviceRequestOptions.h" |
| 18 #include "platform/UserGestureIndicator.h" | 18 #include "platform/UserGestureIndicator.h" |
| 19 #include "platform/mojo/MojoHelper.h" | 19 #include "platform/mojo/MojoHelper.h" |
| 20 #include "platform/wtf/Functional.h" | 20 #include "platform/wtf/Functional.h" |
| 21 #include "public/platform/InterfaceProvider.h" | 21 #include "public/platform/InterfaceProvider.h" |
| 22 #include "public/platform/Platform.h" | 22 #include "public/platform/Platform.h" |
| 23 | 23 |
| 24 namespace usb = device::usb::blink; | 24 using device::mojom::blink::UsbDeviceFilterPtr; |
| 25 using device::mojom::blink::UsbDeviceInfoPtr; |
| 26 using device::mojom::blink::UsbDevicePtr; |
| 25 | 27 |
| 26 namespace blink { | 28 namespace blink { |
| 27 namespace { | 29 namespace { |
| 28 | 30 |
| 29 const char kNoServiceError[] = "USB service unavailable."; | 31 const char kNoServiceError[] = "USB service unavailable."; |
| 30 | 32 |
| 31 usb::DeviceFilterPtr ConvertDeviceFilter(const USBDeviceFilter& filter) { | 33 UsbDeviceFilterPtr ConvertDeviceFilter(const USBDeviceFilter& filter) { |
| 32 auto mojo_filter = usb::DeviceFilter::New(); | 34 auto mojo_filter = device::mojom::blink::UsbDeviceFilter::New(); |
| 33 mojo_filter->has_vendor_id = filter.hasVendorId(); | 35 mojo_filter->has_vendor_id = filter.hasVendorId(); |
| 34 if (mojo_filter->has_vendor_id) | 36 if (mojo_filter->has_vendor_id) |
| 35 mojo_filter->vendor_id = filter.vendorId(); | 37 mojo_filter->vendor_id = filter.vendorId(); |
| 36 mojo_filter->has_product_id = filter.hasProductId(); | 38 mojo_filter->has_product_id = filter.hasProductId(); |
| 37 if (mojo_filter->has_product_id) | 39 if (mojo_filter->has_product_id) |
| 38 mojo_filter->product_id = filter.productId(); | 40 mojo_filter->product_id = filter.productId(); |
| 39 mojo_filter->has_class_code = filter.hasClassCode(); | 41 mojo_filter->has_class_code = filter.hasClassCode(); |
| 40 if (mojo_filter->has_class_code) | 42 if (mojo_filter->has_class_code) |
| 41 mojo_filter->class_code = filter.classCode(); | 43 mojo_filter->class_code = filter.classCode(); |
| 42 mojo_filter->has_subclass_code = filter.hasSubclassCode(); | 44 mojo_filter->has_subclass_code = filter.hasSubclassCode(); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 chooser_service_.set_connection_error_handler( | 102 chooser_service_.set_connection_error_handler( |
| 101 ConvertToBaseCallback(WTF::Bind(&USB::OnChooserServiceConnectionError, | 103 ConvertToBaseCallback(WTF::Bind(&USB::OnChooserServiceConnectionError, |
| 102 WrapWeakPersistent(this)))); | 104 WrapWeakPersistent(this)))); |
| 103 } | 105 } |
| 104 | 106 |
| 105 if (!UserGestureIndicator::ConsumeUserGesture()) { | 107 if (!UserGestureIndicator::ConsumeUserGesture()) { |
| 106 resolver->Reject(DOMException::Create( | 108 resolver->Reject(DOMException::Create( |
| 107 kSecurityError, | 109 kSecurityError, |
| 108 "Must be handling a user gesture to show a permission request.")); | 110 "Must be handling a user gesture to show a permission request.")); |
| 109 } else { | 111 } else { |
| 110 Vector<usb::DeviceFilterPtr> filters; | 112 Vector<UsbDeviceFilterPtr> filters; |
| 111 if (options.hasFilters()) { | 113 if (options.hasFilters()) { |
| 112 filters.ReserveCapacity(options.filters().size()); | 114 filters.ReserveCapacity(options.filters().size()); |
| 113 for (const auto& filter : options.filters()) | 115 for (const auto& filter : options.filters()) |
| 114 filters.push_back(ConvertDeviceFilter(filter)); | 116 filters.push_back(ConvertDeviceFilter(filter)); |
| 115 } | 117 } |
| 116 chooser_service_requests_.insert(resolver); | 118 chooser_service_requests_.insert(resolver); |
| 117 chooser_service_->GetPermission( | 119 chooser_service_->GetPermission( |
| 118 std::move(filters), ConvertToBaseCallback(WTF::Bind( | 120 std::move(filters), ConvertToBaseCallback(WTF::Bind( |
| 119 &USB::OnGetPermission, WrapPersistent(this), | 121 &USB::OnGetPermission, WrapPersistent(this), |
| 120 WrapPersistent(resolver)))); | 122 WrapPersistent(resolver)))); |
| 121 } | 123 } |
| 122 return promise; | 124 return promise; |
| 123 } | 125 } |
| 124 | 126 |
| 125 ExecutionContext* USB::GetExecutionContext() const { | 127 ExecutionContext* USB::GetExecutionContext() const { |
| 126 return ContextLifecycleObserver::GetExecutionContext(); | 128 return ContextLifecycleObserver::GetExecutionContext(); |
| 127 } | 129 } |
| 128 | 130 |
| 129 const AtomicString& USB::InterfaceName() const { | 131 const AtomicString& USB::InterfaceName() const { |
| 130 return EventTargetNames::USB; | 132 return EventTargetNames::USB; |
| 131 } | 133 } |
| 132 | 134 |
| 133 void USB::ContextDestroyed(ExecutionContext*) { | 135 void USB::ContextDestroyed(ExecutionContext*) { |
| 134 device_manager_.reset(); | 136 device_manager_.reset(); |
| 135 device_manager_requests_.Clear(); | 137 device_manager_requests_.Clear(); |
| 136 chooser_service_.reset(); | 138 chooser_service_.reset(); |
| 137 chooser_service_requests_.Clear(); | 139 chooser_service_requests_.Clear(); |
| 138 } | 140 } |
| 139 | 141 |
| 140 USBDevice* USB::GetOrCreateDevice(usb::DeviceInfoPtr device_info) { | 142 USBDevice* USB::GetOrCreateDevice(UsbDeviceInfoPtr device_info) { |
| 141 USBDevice* device = device_cache_.at(device_info->guid); | 143 USBDevice* device = device_cache_.at(device_info->guid); |
| 142 if (!device) { | 144 if (!device) { |
| 143 String guid = device_info->guid; | 145 String guid = device_info->guid; |
| 144 usb::DevicePtr pipe; | 146 UsbDevicePtr pipe; |
| 145 device_manager_->GetDevice(guid, mojo::MakeRequest(&pipe)); | 147 device_manager_->GetDevice(guid, mojo::MakeRequest(&pipe)); |
| 146 device = USBDevice::Create(std::move(device_info), std::move(pipe), | 148 device = USBDevice::Create(std::move(device_info), std::move(pipe), |
| 147 GetExecutionContext()); | 149 GetExecutionContext()); |
| 148 device_cache_.insert(guid, device); | 150 device_cache_.insert(guid, device); |
| 149 } | 151 } |
| 150 return device; | 152 return device; |
| 151 } | 153 } |
| 152 | 154 |
| 153 void USB::OnGetDevices(ScriptPromiseResolver* resolver, | 155 void USB::OnGetDevices(ScriptPromiseResolver* resolver, |
| 154 Vector<usb::DeviceInfoPtr> device_infos) { | 156 Vector<UsbDeviceInfoPtr> device_infos) { |
| 155 auto request_entry = device_manager_requests_.Find(resolver); | 157 auto request_entry = device_manager_requests_.Find(resolver); |
| 156 if (request_entry == device_manager_requests_.end()) | 158 if (request_entry == device_manager_requests_.end()) |
| 157 return; | 159 return; |
| 158 device_manager_requests_.erase(request_entry); | 160 device_manager_requests_.erase(request_entry); |
| 159 | 161 |
| 160 HeapVector<Member<USBDevice>> devices; | 162 HeapVector<Member<USBDevice>> devices; |
| 161 for (auto& device_info : device_infos) | 163 for (auto& device_info : device_infos) |
| 162 devices.push_back(GetOrCreateDevice(std::move(device_info))); | 164 devices.push_back(GetOrCreateDevice(std::move(device_info))); |
| 163 resolver->Resolve(devices); | 165 resolver->Resolve(devices); |
| 164 device_manager_requests_.erase(resolver); | 166 device_manager_requests_.erase(resolver); |
| 165 } | 167 } |
| 166 | 168 |
| 167 void USB::OnGetPermission(ScriptPromiseResolver* resolver, | 169 void USB::OnGetPermission(ScriptPromiseResolver* resolver, |
| 168 usb::DeviceInfoPtr device_info) { | 170 UsbDeviceInfoPtr device_info) { |
| 169 auto request_entry = chooser_service_requests_.Find(resolver); | 171 auto request_entry = chooser_service_requests_.Find(resolver); |
| 170 if (request_entry == chooser_service_requests_.end()) | 172 if (request_entry == chooser_service_requests_.end()) |
| 171 return; | 173 return; |
| 172 chooser_service_requests_.erase(request_entry); | 174 chooser_service_requests_.erase(request_entry); |
| 173 | 175 |
| 174 EnsureDeviceManagerConnection(); | 176 EnsureDeviceManagerConnection(); |
| 175 if (!device_manager_) { | 177 if (!device_manager_) { |
| 176 resolver->Reject(DOMException::Create(kNotFoundError, kNoServiceError)); | 178 resolver->Reject(DOMException::Create(kNotFoundError, kNoServiceError)); |
| 177 return; | 179 return; |
| 178 } | 180 } |
| 179 | 181 |
| 180 if (device_info) { | 182 if (device_info) { |
| 181 resolver->Resolve(GetOrCreateDevice(std::move(device_info))); | 183 resolver->Resolve(GetOrCreateDevice(std::move(device_info))); |
| 182 } else { | 184 } else { |
| 183 resolver->Reject( | 185 resolver->Reject( |
| 184 DOMException::Create(kNotFoundError, "No device selected.")); | 186 DOMException::Create(kNotFoundError, "No device selected.")); |
| 185 } | 187 } |
| 186 } | 188 } |
| 187 | 189 |
| 188 void USB::OnDeviceAdded(usb::DeviceInfoPtr device_info) { | 190 void USB::OnDeviceAdded(UsbDeviceInfoPtr device_info) { |
| 189 if (!device_manager_) | 191 if (!device_manager_) |
| 190 return; | 192 return; |
| 191 | 193 |
| 192 DispatchEvent(USBConnectionEvent::Create( | 194 DispatchEvent(USBConnectionEvent::Create( |
| 193 EventTypeNames::connect, GetOrCreateDevice(std::move(device_info)))); | 195 EventTypeNames::connect, GetOrCreateDevice(std::move(device_info)))); |
| 194 } | 196 } |
| 195 | 197 |
| 196 void USB::OnDeviceRemoved(usb::DeviceInfoPtr device_info) { | 198 void USB::OnDeviceRemoved(UsbDeviceInfoPtr device_info) { |
| 197 String guid = device_info->guid; | 199 String guid = device_info->guid; |
| 198 USBDevice* device = device_cache_.at(guid); | 200 USBDevice* device = device_cache_.at(guid); |
| 199 if (!device) { | 201 if (!device) { |
| 200 device = USBDevice::Create(std::move(device_info), nullptr, | 202 device = USBDevice::Create(std::move(device_info), nullptr, |
| 201 GetExecutionContext()); | 203 GetExecutionContext()); |
| 202 } | 204 } |
| 203 DispatchEvent(USBConnectionEvent::Create(EventTypeNames::disconnect, device)); | 205 DispatchEvent(USBConnectionEvent::Create(EventTypeNames::disconnect, device)); |
| 204 device_cache_.erase(guid); | 206 device_cache_.erase(guid); |
| 205 } | 207 } |
| 206 | 208 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 | 245 |
| 244 DEFINE_TRACE(USB) { | 246 DEFINE_TRACE(USB) { |
| 245 visitor->Trace(device_manager_requests_); | 247 visitor->Trace(device_manager_requests_); |
| 246 visitor->Trace(chooser_service_requests_); | 248 visitor->Trace(chooser_service_requests_); |
| 247 visitor->Trace(device_cache_); | 249 visitor->Trace(device_cache_); |
| 248 EventTargetWithInlineData::Trace(visitor); | 250 EventTargetWithInlineData::Trace(visitor); |
| 249 ContextLifecycleObserver::Trace(visitor); | 251 ContextLifecycleObserver::Trace(visitor); |
| 250 } | 252 } |
| 251 | 253 |
| 252 } // namespace blink | 254 } // namespace blink |
| OLD | NEW |