diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi index a6992de2655b6..6c7518a890d75 100644 --- a/content/content_renderer.gypi +++ b/content/content_renderer.gypi @@ -13,7 +13,6 @@ '../components/url_formatter/url_formatter.gyp:url_formatter', '../device/battery/battery.gyp:device_battery', '../device/battery/battery.gyp:device_battery_mojo_bindings', - '../device/usb/usb.gyp:device_usb_mojo_bindings', '../device/vibration/vibration.gyp:device_vibration', '../device/vibration/vibration.gyp:device_vibration_mojo_bindings', '../gin/gin.gyp:gin', @@ -465,12 +464,6 @@ 'renderer/theme_helper_mac.mm', 'renderer/top_level_blame_context.cc', 'renderer/top_level_blame_context.h', - 'renderer/usb/type_converters.cc', - 'renderer/usb/type_converters.h', - 'renderer/usb/web_usb_client_impl.cc', - 'renderer/usb/web_usb_client_impl.h', - 'renderer/usb/web_usb_device_impl.cc', - 'renderer/usb/web_usb_device_impl.h', 'renderer/web_frame_utils.cc', 'renderer/web_frame_utils.h', 'renderer/web_ui_extension.cc', diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 4f0d7c6601cc9..6295d19229988 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -125,7 +125,6 @@ #include "content/renderer/shared_worker_repository.h" #include "content/renderer/skia_benchmarking_extension.h" #include "content/renderer/stats_collection_controller.h" -#include "content/renderer/usb/web_usb_client_impl.h" #include "content/renderer/web_frame_utils.h" #include "content/renderer/web_ui_extension.h" #include "content/renderer/websharedworker_proxy.h" @@ -161,7 +160,6 @@ #include "third_party/WebKit/public/platform/WebURLError.h" #include "third_party/WebKit/public/platform/WebURLResponse.h" #include "third_party/WebKit/public/platform/WebVector.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBClient.h" #include "third_party/WebKit/public/web/WebColorSuggestion.h" #include "third_party/WebKit/public/web/WebDocument.h" #include "third_party/WebKit/public/web/WebFindOptions.h" @@ -4285,16 +4283,6 @@ blink::WebBluetooth* RenderFrameImpl::bluetooth() { return bluetooth_.get(); } -blink::WebUSBClient* RenderFrameImpl::usbClient() { - if (!base::FeatureList::IsEnabled(features::kWebUsb)) - return nullptr; - - if (!usb_client_) - usb_client_.reset(new WebUSBClientImpl(GetServiceRegistry())); - - return usb_client_.get(); -} - #if defined(ENABLE_WEBVR) blink::WebVRClient* RenderFrameImpl::webVRClient() { if (!vr_dispatcher_) diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 57c67a1b3c2fe..574659b314365 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h @@ -616,7 +616,6 @@ class CONTENT_EXPORT RenderFrameImpl void unregisterProtocolHandler(const blink::WebString& scheme, const blink::WebURL& url) override; blink::WebBluetooth* bluetooth() override; - blink::WebUSBClient* usbClient() override; void checkIfAudioSinkExistsAndIsAuthorized( const blink::WebString& sink_id, const blink::WebSecurityOrigin& security_origin, @@ -1193,8 +1192,6 @@ class CONTENT_EXPORT RenderFrameImpl std::unique_ptr<blink::WebBluetooth> bluetooth_; - std::unique_ptr<blink::WebUSBClient> usb_client_; - // Manages play, pause notifications for WebMediaPlayer implementations; its // lifetime is tied to the RenderFrame via the RenderFrameObserver interface. media::RendererWebMediaPlayerDelegate* media_player_delegate_; diff --git a/content/renderer/usb/DEPS b/content/renderer/usb/DEPS deleted file mode 100644 index b7aeef531c4d2..0000000000000 --- a/content/renderer/usb/DEPS +++ /dev/null @@ -1,3 +0,0 @@ -include_rules = [ - "+device/usb/public", -] diff --git a/content/renderer/usb/OWNERS b/content/renderer/usb/OWNERS deleted file mode 100644 index b16946a30b707..0000000000000 --- a/content/renderer/usb/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -reillyg@chromium.org -rockot@chromium.org diff --git a/content/renderer/usb/type_converters.cc b/content/renderer/usb/type_converters.cc deleted file mode 100644 index 5c47c93466230..0000000000000 --- a/content/renderer/usb/type_converters.cc +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/usb/type_converters.h" - -#include <stddef.h> - -#include "base/logging.h" - -namespace mojo { - -// static -blink::WebUSBDevice::TransferDirection -TypeConverter<blink::WebUSBDevice::TransferDirection, - device::usb::TransferDirection>:: - Convert(const device::usb::TransferDirection& direction) { - switch (direction) { - case device::usb::TransferDirection::INBOUND: - return blink::WebUSBDevice::TransferDirection::In; - case device::usb::TransferDirection::OUTBOUND: - return blink::WebUSBDevice::TransferDirection::Out; - default: - NOTREACHED(); - return blink::WebUSBDevice::TransferDirection::In; - } -} - -// static -device::usb::TransferDirection -TypeConverter<device::usb::TransferDirection, - blink::WebUSBDevice::TransferDirection>:: - Convert(const blink::WebUSBDevice::TransferDirection& direction) { - switch (direction) { - case blink::WebUSBDevice::TransferDirection::In: - return device::usb::TransferDirection::INBOUND; - case blink::WebUSBDevice::TransferDirection::Out: - return device::usb::TransferDirection::OUTBOUND; - default: - NOTREACHED(); - return device::usb::TransferDirection::INBOUND; - } -} - -// static -device::usb::ControlTransferType -TypeConverter<device::usb::ControlTransferType, - blink::WebUSBDevice::RequestType>:: - Convert(const blink::WebUSBDevice::RequestType& direction) { - switch (direction) { - case blink::WebUSBDevice::RequestType::Standard: - return device::usb::ControlTransferType::STANDARD; - case blink::WebUSBDevice::RequestType::Class: - return device::usb::ControlTransferType::CLASS; - case blink::WebUSBDevice::RequestType::Vendor: - return device::usb::ControlTransferType::VENDOR; - default: - NOTREACHED(); - return device::usb::ControlTransferType::STANDARD; - } -} - -// static -device::usb::ControlTransferRecipient -TypeConverter<device::usb::ControlTransferRecipient, - blink::WebUSBDevice::RequestRecipient>:: - Convert(const blink::WebUSBDevice::RequestRecipient& direction) { - switch (direction) { - case blink::WebUSBDevice::RequestRecipient::Device: - return device::usb::ControlTransferRecipient::DEVICE; - case blink::WebUSBDevice::RequestRecipient::Interface: - return device::usb::ControlTransferRecipient::INTERFACE; - case blink::WebUSBDevice::RequestRecipient::Endpoint: - return device::usb::ControlTransferRecipient::ENDPOINT; - case blink::WebUSBDevice::RequestRecipient::Other: - return device::usb::ControlTransferRecipient::OTHER; - default: - NOTREACHED(); - return device::usb::ControlTransferRecipient::DEVICE; - } -} - -// static -device::usb::ControlTransferParamsPtr -TypeConverter<device::usb::ControlTransferParamsPtr, - blink::WebUSBDevice::ControlTransferParameters>:: - Convert(const blink::WebUSBDevice::ControlTransferParameters& parameters) { - device::usb::ControlTransferParamsPtr params = - device::usb::ControlTransferParams::New(); - params->type = - mojo::ConvertTo<device::usb::ControlTransferType>(parameters.type); - params->recipient = mojo::ConvertTo<device::usb::ControlTransferRecipient>( - parameters.recipient); - params->request = parameters.request; - params->value = parameters.value; - params->index = parameters.index; - return params; -} - -// static -blink::WebUSBDeviceInfo::Endpoint::Type TypeConverter< - blink::WebUSBDeviceInfo::Endpoint::Type, - device::usb::EndpointType>::Convert(const device::usb::EndpointType& - endpoint_type) { - switch (endpoint_type) { - case device::usb::EndpointType::BULK: - return blink::WebUSBDeviceInfo::Endpoint::Type::Bulk; - case device::usb::EndpointType::INTERRUPT: - return blink::WebUSBDeviceInfo::Endpoint::Type::Interrupt; - case device::usb::EndpointType::ISOCHRONOUS: - return blink::WebUSBDeviceInfo::Endpoint::Type::Isochronous; - default: - NOTREACHED(); - return blink::WebUSBDeviceInfo::Endpoint::Type::Bulk; - } -} - -// static -blink::WebUSBDeviceInfo::Endpoint -TypeConverter<blink::WebUSBDeviceInfo::Endpoint, device::usb::EndpointInfoPtr>:: - Convert(const device::usb::EndpointInfoPtr& info) { - blink::WebUSBDeviceInfo::Endpoint endpoint; - endpoint.endpointNumber = info->endpoint_number; - endpoint.direction = - mojo::ConvertTo<blink::WebUSBDevice::TransferDirection>(info->direction); - endpoint.type = - mojo::ConvertTo<blink::WebUSBDeviceInfo::Endpoint::Type>(info->type); - endpoint.packetSize = info->packet_size; - return endpoint; -} - -// static -blink::WebUSBDeviceInfo::AlternateInterface -TypeConverter<blink::WebUSBDeviceInfo::AlternateInterface, - device::usb::AlternateInterfaceInfoPtr>:: - Convert(const device::usb::AlternateInterfaceInfoPtr& info) { - blink::WebUSBDeviceInfo::AlternateInterface alternate; - alternate.alternateSetting = info->alternate_setting; - alternate.classCode = info->class_code; - alternate.subclassCode = info->subclass_code; - alternate.protocolCode = info->protocol_code; - if (!info->interface_name.is_null()) - alternate.interfaceName = blink::WebString::fromUTF8(info->interface_name); - alternate.endpoints = blink::WebVector<blink::WebUSBDeviceInfo::Endpoint>( - info->endpoints.size()); - for (size_t i = 0; i < info->endpoints.size(); ++i) { - alternate.endpoints[i] = - mojo::ConvertTo<blink::WebUSBDeviceInfo::Endpoint>(info->endpoints[i]); - } - return alternate; -} - -// static -blink::WebUSBDeviceInfo::Interface TypeConverter< - blink::WebUSBDeviceInfo::Interface, - device::usb::InterfaceInfoPtr>::Convert(const device::usb::InterfaceInfoPtr& - info) { - blink::WebUSBDeviceInfo::Interface interface; - interface.interfaceNumber = info->interface_number; - interface.alternates = - blink::WebVector<blink::WebUSBDeviceInfo::AlternateInterface>( - info->alternates.size()); - for (size_t i = 0; i < info->alternates.size(); ++i) { - interface.alternates[i] = - mojo::ConvertTo<blink::WebUSBDeviceInfo::AlternateInterface>( - info->alternates[i]); - } - return interface; -} - -// static -blink::WebUSBDeviceInfo::Configuration -TypeConverter<blink::WebUSBDeviceInfo::Configuration, - device::usb::ConfigurationInfoPtr>:: - Convert(const device::usb::ConfigurationInfoPtr& info) { - blink::WebUSBDeviceInfo::Configuration config; - config.configurationValue = info->configuration_value; - if (!info->configuration_name.is_null()) { - config.configurationName = - blink::WebString::fromUTF8(info->configuration_name); - } - config.interfaces = blink::WebVector<blink::WebUSBDeviceInfo::Interface>( - info->interfaces.size()); - for (size_t i = 0; i < info->interfaces.size(); ++i) { - config.interfaces[i] = mojo::ConvertTo<blink::WebUSBDeviceInfo::Interface>( - info->interfaces[i]); - } - return config; -} - -// static -blink::WebUSBDeviceInfo -TypeConverter<blink::WebUSBDeviceInfo, device::usb::DeviceInfoPtr>::Convert( - const device::usb::DeviceInfoPtr& info) { - blink::WebUSBDeviceInfo device; - device.guid = blink::WebString::fromUTF8(info->guid); - device.usbVersionMajor = info->usb_version_major; - device.usbVersionMinor = info->usb_version_minor; - device.usbVersionSubminor = info->usb_version_subminor; - device.deviceClass = info->class_code; - device.deviceSubclass = info->subclass_code; - device.deviceProtocol = info->protocol_code; - device.vendorID = info->vendor_id; - device.productID = info->product_id; - device.deviceVersionMajor = info->device_version_major; - device.deviceVersionMinor = info->device_version_minor; - device.deviceVersionSubminor = info->device_version_subminor; - if (!info->manufacturer_name.is_null()) { - device.manufacturerName = - blink::WebString::fromUTF8(info->manufacturer_name); - } - if (!info->product_name.is_null()) - device.productName = blink::WebString::fromUTF8(info->product_name); - if (!info->serial_number.is_null()) - device.serialNumber = blink::WebString::fromUTF8(info->serial_number); - device.activeConfiguration = info->active_configuration; - device.configurations = - blink::WebVector<blink::WebUSBDeviceInfo::Configuration>( - info->configurations.size()); - for (size_t i = 0; i < info->configurations.size(); ++i) { - device.configurations[i] = - mojo::ConvertTo<blink::WebUSBDeviceInfo::Configuration>( - info->configurations[i]); - } - return device; -} - -// static -device::usb::DeviceFilterPtr -TypeConverter<device::usb::DeviceFilterPtr, blink::WebUSBDeviceFilter>::Convert( - const blink::WebUSBDeviceFilter& web_filter) { - device::usb::DeviceFilterPtr filter = device::usb::DeviceFilter::New(); - filter->has_vendor_id = web_filter.hasVendorID; - filter->vendor_id = web_filter.vendorID; - filter->has_product_id = web_filter.hasProductID; - filter->product_id = web_filter.productID; - filter->has_class_code = web_filter.hasClassCode; - filter->class_code = web_filter.classCode; - filter->has_subclass_code = web_filter.hasSubclassCode; - filter->subclass_code = web_filter.subclassCode; - filter->has_protocol_code = web_filter.hasProtocolCode; - filter->protocol_code = web_filter.protocolCode; - return filter; -} - -// static -device::usb::EnumerationOptionsPtr -TypeConverter<device::usb::EnumerationOptionsPtr, - blink::WebUSBDeviceRequestOptions>:: - Convert(const blink::WebUSBDeviceRequestOptions& web_options) { - device::usb::EnumerationOptionsPtr options = - device::usb::EnumerationOptions::New(); - options->filters = mojo::Array<device::usb::DeviceFilterPtr>::New( - web_options.filters.size()); - for (size_t i = 0; i < web_options.filters.size(); ++i) { - options->filters[i] = - device::usb::DeviceFilter::From(web_options.filters[i]); - } - return options; -} - -} // namespace mojo diff --git a/content/renderer/usb/type_converters.h b/content/renderer/usb/type_converters.h deleted file mode 100644 index 3bdec8569968e..0000000000000 --- a/content/renderer/usb/type_converters.h +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/public/cpp/bindings/type_converter.h" - -#include "device/usb/public/interfaces/device.mojom.h" -#include "device/usb/public/interfaces/device_manager.mojom.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBDevice.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceFilter.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceInfo.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceRequestOptions.h" - -namespace mojo { - -template <> -struct TypeConverter<blink::WebUSBDevice::TransferDirection, - device::usb::TransferDirection> { - static blink::WebUSBDevice::TransferDirection Convert( - const device::usb::TransferDirection& direction); -}; - -template <> -struct TypeConverter<device::usb::TransferDirection, - blink::WebUSBDevice::TransferDirection> { - static device::usb::TransferDirection Convert( - const blink::WebUSBDevice::TransferDirection& direction); -}; - -template <> -struct TypeConverter<device::usb::ControlTransferType, - blink::WebUSBDevice::RequestType> { - static device::usb::ControlTransferType Convert( - const blink::WebUSBDevice::RequestType& direction); -}; - -template <> -struct TypeConverter<device::usb::ControlTransferRecipient, - blink::WebUSBDevice::RequestRecipient> { - static device::usb::ControlTransferRecipient Convert( - const blink::WebUSBDevice::RequestRecipient& direction); -}; - -template <> -struct TypeConverter<device::usb::ControlTransferParamsPtr, - blink::WebUSBDevice::ControlTransferParameters> { - static device::usb::ControlTransferParamsPtr Convert( - const blink::WebUSBDevice::ControlTransferParameters& parameters); -}; - -template <> -struct TypeConverter<blink::WebUSBDeviceInfo::Endpoint::Type, - device::usb::EndpointType> { - static blink::WebUSBDeviceInfo::Endpoint::Type Convert( - const device::usb::EndpointType& endpoint_type); -}; - -template <> -struct TypeConverter<blink::WebUSBDeviceInfo::Endpoint, - device::usb::EndpointInfoPtr> { - static blink::WebUSBDeviceInfo::Endpoint Convert( - const device::usb::EndpointInfoPtr& info); -}; - -template <> -struct TypeConverter<blink::WebUSBDeviceInfo::AlternateInterface, - device::usb::AlternateInterfaceInfoPtr> { - static blink::WebUSBDeviceInfo::AlternateInterface Convert( - const device::usb::AlternateInterfaceInfoPtr& info); -}; - -template <> -struct TypeConverter<blink::WebUSBDeviceInfo::Interface, - device::usb::InterfaceInfoPtr> { - static blink::WebUSBDeviceInfo::Interface Convert( - const device::usb::InterfaceInfoPtr& info); -}; - -template <> -struct TypeConverter<blink::WebUSBDeviceInfo::Configuration, - device::usb::ConfigurationInfoPtr> { - static blink::WebUSBDeviceInfo::Configuration Convert( - const device::usb::ConfigurationInfoPtr& info); -}; - -template <> -struct TypeConverter<blink::WebUSBDeviceInfo, device::usb::DeviceInfoPtr> { - static blink::WebUSBDeviceInfo Convert( - const device::usb::DeviceInfoPtr& info); -}; - -template <> -struct TypeConverter<device::usb::DeviceFilterPtr, blink::WebUSBDeviceFilter> { - static device::usb::DeviceFilterPtr Convert( - const blink::WebUSBDeviceFilter& web_filter); -}; - -template <> -struct TypeConverter<device::usb::EnumerationOptionsPtr, - blink::WebUSBDeviceRequestOptions> { - static device::usb::EnumerationOptionsPtr Convert( - const blink::WebUSBDeviceRequestOptions& web_options); -}; - -} // namespace mojo diff --git a/content/renderer/usb/web_usb_client_impl.cc b/content/renderer/usb/web_usb_client_impl.cc deleted file mode 100644 index 1c2401d002f9b..0000000000000 --- a/content/renderer/usb/web_usb_client_impl.cc +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/usb/web_usb_client_impl.h" - -#include <stddef.h> - -#include <memory> -#include <utility> - -#include "base/bind.h" -#include "base/callback.h" -#include "base/memory/ptr_util.h" -#include "base/move.h" -#include "base/stl_util.h" -#include "base/strings/utf_string_conversions.h" -#include "content/child/mojo/type_converters.h" -#include "content/child/scoped_web_callbacks.h" -#include "content/public/common/service_registry.h" -#include "content/renderer/usb/type_converters.h" -#include "content/renderer/usb/web_usb_device_impl.h" -#include "mojo/public/cpp/bindings/array.h" -#include "mojo/public/cpp/bindings/interface_request.h" -#include "third_party/WebKit/public/platform/WebCallbacks.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceFilter.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceInfo.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceRequestOptions.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBError.h" - -namespace content { - -namespace { - -const char kNoServiceError[] = "USB service unavailable."; - -// Generic default rejection handler for any WebUSB callbacks type. Assumes -// |CallbacksType| is a blink::WebCallbacks<T, const blink::WebUSBError&> -// for any type |T|. -template <typename CallbacksType> -void RejectCallbacksWithError(const blink::WebUSBError& error, - std::unique_ptr<CallbacksType> callbacks) { - callbacks->onError(error); -} - -// Create a new ScopedWebCallbacks for WebUSB client callbacks, defaulting to -// a "no service" rejection. -template <typename CallbacksType> -ScopedWebCallbacks<CallbacksType> MakeScopedUSBCallbacks( - CallbacksType* callbacks) { - return make_scoped_web_callbacks( - callbacks, - base::Bind(&RejectCallbacksWithError<CallbacksType>, - blink::WebUSBError(blink::WebUSBError::Error::NotFound, - base::ASCIIToUTF16(kNoServiceError)))); -} - -void OnGetDevicesComplete( - ScopedWebCallbacks<blink::WebUSBClientGetDevicesCallbacks> scoped_callbacks, - device::usb::DeviceManager* device_manager, - mojo::Array<device::usb::DeviceInfoPtr> results) { - // TODO(dcheng): This WebVector should hold smart pointers. - std::unique_ptr<blink::WebVector<blink::WebUSBDevice*>> devices( - new blink::WebVector<blink::WebUSBDevice*>(results.size())); - for (size_t i = 0; i < results.size(); ++i) { - device::usb::DevicePtr device; - device_manager->GetDevice(results[i]->guid, mojo::GetProxy(&device)); - (*devices)[i] = new WebUSBDeviceImpl( - std::move(device), - mojo::ConvertTo<blink::WebUSBDeviceInfo>(results[i])); - } - scoped_callbacks.PassCallbacks()->onSuccess(std::move(devices)); -} - -void OnRequestDevicesComplete( - ScopedWebCallbacks<blink::WebUSBClientRequestDeviceCallbacks> callbacks, - device::usb::DeviceManager* device_manager, - device::usb::DeviceInfoPtr result) { - auto scoped_callbacks = callbacks.PassCallbacks(); - if (result) { - device::usb::DevicePtr device; - device_manager->GetDevice(result->guid, mojo::GetProxy(&device)); - std::unique_ptr<blink::WebUSBDevice> web_usb_device(new WebUSBDeviceImpl( - std::move(device), mojo::ConvertTo<blink::WebUSBDeviceInfo>(result))); - - scoped_callbacks->onSuccess(std::move(web_usb_device)); - } else { - scoped_callbacks->onError( - blink::WebUSBError(blink::WebUSBError::Error::NotFound, - base::ASCIIToUTF16("No device selected."))); - } -} - -} // namespace - -WebUSBClientImpl::WebUSBClientImpl(content::ServiceRegistry* service_registry) - : service_registry_(service_registry) {} - -WebUSBClientImpl::~WebUSBClientImpl() {} - -void WebUSBClientImpl::getDevices( - blink::WebUSBClientGetDevicesCallbacks* callbacks) { - auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks); - GetDeviceManager()->GetDevices( - nullptr, - base::Bind(&OnGetDevicesComplete, base::Passed(&scoped_callbacks), - base::Unretained(device_manager_.get()))); -} - -void WebUSBClientImpl::requestDevice( - const blink::WebUSBDeviceRequestOptions& options, - blink::WebUSBClientRequestDeviceCallbacks* callbacks) { - if (!chooser_service_) { - service_registry_->ConnectToRemoteService( - mojo::GetProxy(&chooser_service_)); - } - - auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks); - - mojo::Array<device::usb::DeviceFilterPtr> device_filters = - mojo::Array<device::usb::DeviceFilterPtr>::From(options.filters); - - chooser_service_->GetPermission( - std::move(device_filters), - base::Bind(&OnRequestDevicesComplete, base::Passed(&scoped_callbacks), - base::Unretained(device_manager_.get()))); -} - -void WebUSBClientImpl::addObserver(Observer* observer) { - if (observers_.empty()) { - // Set up two sequential calls to GetDeviceChanges to avoid latency. - device::usb::DeviceManager* device_manager = GetDeviceManager(); - device_manager->GetDeviceChanges(base::Bind( - &WebUSBClientImpl::OnDeviceChangeNotification, base::Unretained(this))); - device_manager->GetDeviceChanges(base::Bind( - &WebUSBClientImpl::OnDeviceChangeNotification, base::Unretained(this))); - } - - observers_.insert(observer); -} - -void WebUSBClientImpl::removeObserver(Observer* observer) { - DCHECK(ContainsKey(observers_, observer)); - observers_.erase(observer); -} - -device::usb::DeviceManager* WebUSBClientImpl::GetDeviceManager() { - if (!device_manager_) - service_registry_->ConnectToRemoteService(mojo::GetProxy(&device_manager_)); - return device_manager_.get(); -} - -void WebUSBClientImpl::OnDeviceChangeNotification( - device::usb::DeviceChangeNotificationPtr notification) { - if (observers_.empty()) - return; - - device_manager_->GetDeviceChanges(base::Bind( - &WebUSBClientImpl::OnDeviceChangeNotification, base::Unretained(this))); - for (size_t i = 0; i < notification->devices_added.size(); ++i) { - const device::usb::DeviceInfoPtr& device_info = - notification->devices_added[i]; - for (auto observer : observers_) { - device::usb::DevicePtr device; - device_manager_->GetDevice(device_info->guid, mojo::GetProxy(&device)); - observer->onDeviceConnected(base::WrapUnique(new WebUSBDeviceImpl( - std::move(device), - mojo::ConvertTo<blink::WebUSBDeviceInfo>(device_info)))); - } - } - for (size_t i = 0; i < notification->devices_removed.size(); ++i) { - const device::usb::DeviceInfoPtr& device_info = - notification->devices_removed[i]; - for (auto observer : observers_) - observer->onDeviceDisconnected(base::WrapUnique(new WebUSBDeviceImpl( - nullptr, mojo::ConvertTo<blink::WebUSBDeviceInfo>(device_info)))); - } -} - -} // namespace content diff --git a/content/renderer/usb/web_usb_client_impl.h b/content/renderer/usb/web_usb_client_impl.h deleted file mode 100644 index 10fe314447eba..0000000000000 --- a/content/renderer/usb/web_usb_client_impl.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_USB_WEB_USB_CLIENT_IMPL_H_ -#define CONTENT_RENDERER_USB_WEB_USB_CLIENT_IMPL_H_ - -#include "base/macros.h" -#include "device/usb/public/interfaces/chooser_service.mojom.h" -#include "device/usb/public/interfaces/device_manager.mojom.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBClient.h" - -namespace content { - -class ServiceRegistry; - -class WebUSBClientImpl : public blink::WebUSBClient { - public: - explicit WebUSBClientImpl(ServiceRegistry* service_registry); - ~WebUSBClientImpl() override; - - private: - // blink::WebUSBClient implementation: - void getDevices(blink::WebUSBClientGetDevicesCallbacks* callbacks) override; - void requestDevice( - const blink::WebUSBDeviceRequestOptions& options, - blink::WebUSBClientRequestDeviceCallbacks* callbacks) override; - void addObserver(Observer* observer) override; - void removeObserver(Observer* observer) override; - - device::usb::DeviceManager* GetDeviceManager(); - void OnDeviceChangeNotification( - device::usb::DeviceChangeNotificationPtr notification); - - ServiceRegistry* const service_registry_; - device::usb::DeviceManagerPtr device_manager_; - device::usb::ChooserServicePtr chooser_service_; - std::set<Observer*> observers_; - - DISALLOW_COPY_AND_ASSIGN(WebUSBClientImpl); -}; - -} // namespace content - -#endif // CONTENT_RENDERER_USB_WEB_USB_CLIENT_IMPL_H_ diff --git a/content/renderer/usb/web_usb_device_impl.cc b/content/renderer/usb/web_usb_device_impl.cc deleted file mode 100644 index 3f82b135e015e..0000000000000 --- a/content/renderer/usb/web_usb_device_impl.cc +++ /dev/null @@ -1,421 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/usb/web_usb_device_impl.h" - -#include <utility> - -#include "base/bind.h" -#include "base/callback.h" -#include "base/strings/utf_string_conversions.h" -#include "content/child/mojo/type_converters.h" -#include "content/child/scoped_web_callbacks.h" -#include "content/renderer/usb/type_converters.h" -#include "services/shell/public/cpp/connect.h" -#include "services/shell/public/interfaces/connector.mojom.h" -#include "third_party/WebKit/public/platform/WebVector.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceInfo.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBTransferInfo.h" - -namespace content { - -namespace { - -const char kClaimInterfaceFailed[] = "Unable to claim interface."; -const char kClearHaltFailed[] = "Unable to clear endpoint."; -const char kDeviceAlreadyOpen[] = "Device has already been opened."; -const char kDeviceNoAccess[] = "Access denied."; -const char kDeviceUnavailable[] = "Device unavailable."; -const char kDeviceResetFailed[] = "Unable to reset the device."; -const char kReleaseInterfaceFailed[] = "Unable to release interface."; -const char kSetConfigurationFailed[] = "Unable to set device configuration."; -const char kSetInterfaceFailed[] = "Unable to set device interface."; -const char kTransferFailed[] = "Transfer failed."; - -// Generic default rejection handler for any WebUSB callbacks type. Assumes -// |CallbacksType| is a blink::WebCallbacks<T, const blink::WebUSBError&> -// for any type |T|. -template <typename CallbacksType> -void RejectWithError(const blink::WebUSBError& error, - std::unique_ptr<CallbacksType> callbacks) { - callbacks->onError(error); -} - -template <typename CallbacksType> -void RejectWithTransferError(std::unique_ptr<CallbacksType> callbacks) { - RejectWithError(blink::WebUSBError(blink::WebUSBError::Error::Network, - base::ASCIIToUTF16(kTransferFailed)), - std::move(callbacks)); -} - -// Create a new ScopedWebCallbacks for WebUSB device callbacks, defaulting to -// a "device unavailable" rejection. -template <typename CallbacksType> -ScopedWebCallbacks<CallbacksType> MakeScopedUSBCallbacks( - CallbacksType* callbacks) { - return make_scoped_web_callbacks( - callbacks, - base::Bind(&RejectWithError<CallbacksType>, - blink::WebUSBError(blink::WebUSBError::Error::NotFound, - base::ASCIIToUTF16(kDeviceUnavailable)))); -} - -void OnOpenDevice( - ScopedWebCallbacks<blink::WebUSBDeviceOpenCallbacks> callbacks, - device::usb::OpenDeviceError error) { - auto scoped_callbacks = callbacks.PassCallbacks(); - switch(error) { - case device::usb::OpenDeviceError::OK: - scoped_callbacks->onSuccess(); - break; - case device::usb::OpenDeviceError::ACCESS_DENIED: - scoped_callbacks->onError(blink::WebUSBError( - blink::WebUSBError::Error::Security, - base::ASCIIToUTF16(kDeviceNoAccess))); - break; - case device::usb::OpenDeviceError::ALREADY_OPEN: - scoped_callbacks->onError(blink::WebUSBError( - blink::WebUSBError::Error::InvalidState, - base::ASCIIToUTF16(kDeviceAlreadyOpen))); - break; - default: - NOTREACHED(); - } -} - -void OnDeviceClosed( - ScopedWebCallbacks<blink::WebUSBDeviceCloseCallbacks> callbacks) { - callbacks.PassCallbacks()->onSuccess(); -} - -void HandlePassFailDeviceOperation( - ScopedWebCallbacks<blink::WebCallbacks<void, const blink::WebUSBError&>> - callbacks, - const std::string& failure_message, - bool success) { - auto scoped_callbacks = callbacks.PassCallbacks(); - if (success) { - scoped_callbacks->onSuccess(); - } else { - RejectWithError(blink::WebUSBError(blink::WebUSBError::Error::Network, - base::ASCIIToUTF16(failure_message)), - std::move(scoped_callbacks)); - } -} - -void OnTransferIn( - ScopedWebCallbacks<blink::WebUSBDeviceTransferCallbacks> callbacks, - device::usb::TransferStatus status, - mojo::Array<uint8_t> data) { - auto scoped_callbacks = callbacks.PassCallbacks(); - blink::WebUSBTransferInfo::Status web_status; - switch (status) { - case device::usb::TransferStatus::COMPLETED: - web_status = blink::WebUSBTransferInfo::Status::Ok; - break; - case device::usb::TransferStatus::STALLED: - web_status = blink::WebUSBTransferInfo::Status::Stall; - break; - case device::usb::TransferStatus::BABBLE: - web_status = blink::WebUSBTransferInfo::Status::Babble; - break; - default: - RejectWithTransferError(std::move(scoped_callbacks)); - return; - } - std::unique_ptr<blink::WebUSBTransferInfo> info( - new blink::WebUSBTransferInfo()); - info->status.assign( - std::vector<blink::WebUSBTransferInfo::Status>(1, web_status)); - info->data.assign(data); - scoped_callbacks->onSuccess(std::move(info)); -} - -void OnTransferOut( - ScopedWebCallbacks<blink::WebUSBDeviceTransferCallbacks> callbacks, - size_t bytes_written, - device::usb::TransferStatus status) { - auto scoped_callbacks = callbacks.PassCallbacks(); - blink::WebUSBTransferInfo::Status web_status; - switch (status) { - case device::usb::TransferStatus::COMPLETED: - web_status = blink::WebUSBTransferInfo::Status::Ok; - break; - case device::usb::TransferStatus::STALLED: - web_status = blink::WebUSBTransferInfo::Status::Stall; - break; - default: - RejectWithTransferError(std::move(scoped_callbacks)); - return; - } - // TODO(rockot): Device::ControlTransferOut should expose the number of bytes - // actually transferred so we can send it from here. - std::unique_ptr<blink::WebUSBTransferInfo> info( - new blink::WebUSBTransferInfo()); - info->status.assign( - std::vector<blink::WebUSBTransferInfo::Status>(1, web_status)); - info->bytesTransferred.assign(std::vector<uint32_t>(1, bytes_written)); - scoped_callbacks->onSuccess(std::move(info)); -} - -void OnIsochronousTransferIn( - ScopedWebCallbacks<blink::WebUSBDeviceTransferCallbacks> callbacks, - mojo::Array<uint8_t> data, - mojo::Array<device::usb::IsochronousPacketPtr> packets) { - auto scoped_callbacks = callbacks.PassCallbacks(); - std::unique_ptr<blink::WebUSBTransferInfo> info( - new blink::WebUSBTransferInfo()); - info->data.assign(data); - info->status = - blink::WebVector<blink::WebUSBTransferInfo::Status>(packets.size()); - info->packetLength = blink::WebVector<uint32_t>(packets.size()); - info->bytesTransferred = blink::WebVector<uint32_t>(packets.size()); - for (size_t i = 0; i < packets.size(); ++i) { - switch (packets[i]->status) { - case device::usb::TransferStatus::COMPLETED: - info->status[i] = blink::WebUSBTransferInfo::Status::Ok; - break; - case device::usb::TransferStatus::STALLED: - info->status[i] = blink::WebUSBTransferInfo::Status::Stall; - break; - case device::usb::TransferStatus::BABBLE: - info->status[i] = blink::WebUSBTransferInfo::Status::Babble; - break; - default: - RejectWithTransferError(std::move(scoped_callbacks)); - return; - } - info->packetLength[i] = packets[i]->length; - info->bytesTransferred[i] = packets[i]->transferred_length; - } - scoped_callbacks->onSuccess(std::move(info)); -} - -void OnIsochronousTransferOut( - ScopedWebCallbacks<blink::WebUSBDeviceTransferCallbacks> callbacks, - mojo::Array<device::usb::IsochronousPacketPtr> packets) { - auto scoped_callbacks = callbacks.PassCallbacks(); - std::unique_ptr<blink::WebUSBTransferInfo> info( - new blink::WebUSBTransferInfo()); - info->status = - blink::WebVector<blink::WebUSBTransferInfo::Status>(packets.size()); - info->bytesTransferred = blink::WebVector<uint32_t>(packets.size()); - for (size_t i = 0; i < packets.size(); ++i) { - switch (packets[i]->status) { - case device::usb::TransferStatus::COMPLETED: - info->status[i] = blink::WebUSBTransferInfo::Status::Ok; - break; - case device::usb::TransferStatus::STALLED: - info->status[i] = blink::WebUSBTransferInfo::Status::Stall; - break; - default: - RejectWithTransferError(std::move(scoped_callbacks)); - return; - } - info->bytesTransferred[i] = packets[i]->transferred_length; - } - scoped_callbacks->onSuccess(std::move(info)); -} - -} // namespace - -WebUSBDeviceImpl::WebUSBDeviceImpl(device::usb::DevicePtr device, - const blink::WebUSBDeviceInfo& device_info) - : device_(std::move(device)), - device_info_(device_info), - weak_factory_(this) { - if (device_) - device_.set_connection_error_handler([this]() { device_.reset(); }); -} - -WebUSBDeviceImpl::~WebUSBDeviceImpl() {} - -const blink::WebUSBDeviceInfo& WebUSBDeviceImpl::info() const { - return device_info_; -} - -void WebUSBDeviceImpl::open(blink::WebUSBDeviceOpenCallbacks* callbacks) { - auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks); - if (device_) - device_->Open(base::Bind(&OnOpenDevice, base::Passed(&scoped_callbacks))); -} - -void WebUSBDeviceImpl::close(blink::WebUSBDeviceCloseCallbacks* callbacks) { - auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks); - if (device_) - device_->Close( - base::Bind(&OnDeviceClosed, base::Passed(&scoped_callbacks))); -} - -void WebUSBDeviceImpl::setConfiguration( - uint8_t configuration_value, - blink::WebUSBDeviceSetConfigurationCallbacks* callbacks) { - auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks); - if (device_) - device_->SetConfiguration( - configuration_value, - base::Bind(&HandlePassFailDeviceOperation, - base::Passed(&scoped_callbacks), kSetConfigurationFailed)); -} - -void WebUSBDeviceImpl::claimInterface( - uint8_t interface_number, - blink::WebUSBDeviceClaimInterfaceCallbacks* callbacks) { - auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks); - if (device_) - device_->ClaimInterface( - interface_number, - base::Bind(&HandlePassFailDeviceOperation, - base::Passed(&scoped_callbacks), kClaimInterfaceFailed)); -} - -void WebUSBDeviceImpl::releaseInterface( - uint8_t interface_number, - blink::WebUSBDeviceReleaseInterfaceCallbacks* callbacks) { - auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks); - if (device_) - device_->ReleaseInterface( - interface_number, - base::Bind(&HandlePassFailDeviceOperation, - base::Passed(&scoped_callbacks), kReleaseInterfaceFailed)); -} - -void WebUSBDeviceImpl::setInterface( - uint8_t interface_number, - uint8_t alternate_setting, - blink::WebUSBDeviceSetInterfaceAlternateSettingCallbacks* callbacks) { - auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks); - if (device_) - device_->SetInterfaceAlternateSetting( - interface_number, alternate_setting, - base::Bind(&HandlePassFailDeviceOperation, - base::Passed(&scoped_callbacks), kSetInterfaceFailed)); -} - -void WebUSBDeviceImpl::clearHalt( - uint8_t endpoint_number, - blink::WebUSBDeviceClearHaltCallbacks* callbacks) { - auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks); - if (device_) - device_->ClearHalt( - endpoint_number, - base::Bind(&HandlePassFailDeviceOperation, - base::Passed(&scoped_callbacks), kClearHaltFailed)); -} - -void WebUSBDeviceImpl::controlTransfer( - const blink::WebUSBDevice::ControlTransferParameters& parameters, - uint8_t* data, - size_t data_size, - unsigned int timeout, - blink::WebUSBDeviceTransferCallbacks* callbacks) { - auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks); - if (!device_) - return; - - device::usb::ControlTransferParamsPtr params = - device::usb::ControlTransferParams::From(parameters); - switch (parameters.direction) { - case WebUSBDevice::TransferDirection::In: - device_->ControlTransferIn( - std::move(params), data_size, timeout, - base::Bind(&OnTransferIn, base::Passed(&scoped_callbacks))); - break; - case WebUSBDevice::TransferDirection::Out: { - std::vector<uint8_t> bytes; - if (data) - bytes.assign(data, data + data_size); - mojo::Array<uint8_t> mojo_bytes; - mojo_bytes.Swap(&bytes); - device_->ControlTransferOut( - std::move(params), std::move(mojo_bytes), timeout, - base::Bind(&OnTransferOut, base::Passed(&scoped_callbacks), - data_size)); - break; - } - default: - NOTREACHED(); - } -} - -void WebUSBDeviceImpl::transfer( - blink::WebUSBDevice::TransferDirection direction, - uint8_t endpoint_number, - uint8_t* data, - size_t data_size, - unsigned int timeout, - blink::WebUSBDeviceTransferCallbacks* callbacks) { - auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks); - if (!device_) - return; - - switch (direction) { - case WebUSBDevice::TransferDirection::In: - device_->GenericTransferIn( - endpoint_number, data_size, timeout, - base::Bind(&OnTransferIn, base::Passed(&scoped_callbacks))); - break; - case WebUSBDevice::TransferDirection::Out: { - std::vector<uint8_t> bytes; - if (data) - bytes.assign(data, data + data_size); - mojo::Array<uint8_t> mojo_bytes; - mojo_bytes.Swap(&bytes); - device_->GenericTransferOut( - endpoint_number, std::move(mojo_bytes), timeout, - base::Bind(&OnTransferOut, base::Passed(&scoped_callbacks), - data_size)); - break; - } - default: - NOTREACHED(); - } -} - -void WebUSBDeviceImpl::isochronousTransfer( - blink::WebUSBDevice::TransferDirection direction, - uint8_t endpoint_number, - uint8_t* data, - size_t data_size, - blink::WebVector<uint32_t> packet_lengths, - unsigned int timeout, - blink::WebUSBDeviceTransferCallbacks* callbacks) { - auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks); - if (!device_) - return; - - switch (direction) { - case WebUSBDevice::TransferDirection::In: - device_->IsochronousTransferIn( - endpoint_number, mojo::Array<uint32_t>::From(packet_lengths), timeout, - base::Bind(&OnIsochronousTransferIn, - base::Passed(&scoped_callbacks))); - break; - case WebUSBDevice::TransferDirection::Out: { - std::vector<uint8_t> bytes; - if (data) - bytes.assign(data, data + data_size); - mojo::Array<uint8_t> mojo_bytes; - mojo_bytes.Swap(&bytes); - device_->IsochronousTransferOut( - endpoint_number, std::move(mojo_bytes), - mojo::Array<uint32_t>::From(packet_lengths), timeout, - base::Bind(&OnIsochronousTransferOut, - base::Passed(&scoped_callbacks))); - break; - } - default: - NOTREACHED(); - } -} - -void WebUSBDeviceImpl::reset(blink::WebUSBDeviceResetCallbacks* callbacks) { - auto scoped_callbacks = MakeScopedUSBCallbacks(callbacks); - if (device_) - device_->Reset(base::Bind(&HandlePassFailDeviceOperation, - base::Passed(&scoped_callbacks), - kDeviceResetFailed)); -} - -} // namespace content diff --git a/content/renderer/usb/web_usb_device_impl.h b/content/renderer/usb/web_usb_device_impl.h deleted file mode 100644 index 677a93650ce21..0000000000000 --- a/content/renderer/usb/web_usb_device_impl.h +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_USB_WEB_USB_DEVICE_IMPL_H_ -#define CONTENT_RENDERER_USB_WEB_USB_DEVICE_IMPL_H_ - -#include <stddef.h> -#include <stdint.h> - -#include <memory> - -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "device/usb/public/interfaces/device.mojom.h" -#include "device/usb/public/interfaces/device_manager.mojom.h" -#include "services/shell/public/interfaces/interface_provider.mojom.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBDevice.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceInfo.h" -#include "third_party/WebKit/public/platform/modules/webusb/WebUSBError.h" - -namespace mojo { -class Shell; -} - -namespace content { - -class WebUSBDeviceImpl : public blink::WebUSBDevice { - public: - WebUSBDeviceImpl(device::usb::DevicePtr device, - const blink::WebUSBDeviceInfo& device_info); - ~WebUSBDeviceImpl() override; - - private: - // blink::WebUSBDevice implementation: - const blink::WebUSBDeviceInfo& info() const override; - void open(blink::WebUSBDeviceOpenCallbacks* callbacks) override; - void close(blink::WebUSBDeviceCloseCallbacks* callbacks) override; - void setConfiguration( - uint8_t configuration_value, - blink::WebUSBDeviceSetConfigurationCallbacks* callbacks) override; - void claimInterface( - uint8_t interface_number, - blink::WebUSBDeviceClaimInterfaceCallbacks* callbacks) override; - void releaseInterface( - uint8_t interface_number, - blink::WebUSBDeviceReleaseInterfaceCallbacks* callbacks) override; - void setInterface(uint8_t interface_number, - uint8_t alternate_setting, - blink::WebUSBDeviceSetInterfaceAlternateSettingCallbacks* - callbacks) override; - void clearHalt(uint8_t endpoint_number, - blink::WebUSBDeviceClearHaltCallbacks* callbacks) override; - void controlTransfer( - const blink::WebUSBDevice::ControlTransferParameters& parameters, - uint8_t* data, - size_t data_size, - unsigned int timeout, - blink::WebUSBDeviceTransferCallbacks* callbacks) override; - void transfer(blink::WebUSBDevice::TransferDirection direction, - uint8_t endpoint_number, - uint8_t* data, - size_t data_size, - unsigned int timeout, - blink::WebUSBDeviceTransferCallbacks* callbacks) override; - void isochronousTransfer( - blink::WebUSBDevice::TransferDirection direction, - uint8_t endpoint_number, - uint8_t* data, - size_t data_size, - blink::WebVector<uint32_t> packet_lengths, - unsigned int timeout, - blink::WebUSBDeviceTransferCallbacks* callbacks) override; - void reset(blink::WebUSBDeviceResetCallbacks* callbacks) override; - - device::usb::DevicePtr device_; - blink::WebUSBDeviceInfo device_info_; - - base::WeakPtrFactory<WebUSBDeviceImpl> weak_factory_; - - DISALLOW_COPY_AND_ASSIGN(WebUSBDeviceImpl); -}; - -} // namespace content - -#endif // CONTENT_RENDERER_USB_WEB_USB_DEVICE_IMPL_H_ diff --git a/device/usb/public/interfaces/BUILD.gn b/device/usb/public/interfaces/BUILD.gn index 7f12a8402a8c5..5185cc5f48cc0 100644 --- a/device/usb/public/interfaces/BUILD.gn +++ b/device/usb/public/interfaces/BUILD.gn @@ -4,10 +4,12 @@ import("//mojo/public/tools/bindings/mojom.gni") +mojom_files = [ + "chooser_service.mojom", + "device.mojom", + "device_manager.mojom", +] + mojom("interfaces") { - sources = [ - "chooser_service.mojom", - "device.mojom", - "device_manager.mojom", - ] + sources = mojom_files } diff --git a/device/usb/usb.gyp b/device/usb/usb.gyp index bdac4ff94c9ac..02400fa62395d 100644 --- a/device/usb/usb.gyp +++ b/device/usb/usb.gyp @@ -5,6 +5,11 @@ { 'variables': { 'chromium_code': 1, + 'mojom_files': [ + 'public/interfaces/chooser_service.mojom', + 'public/interfaces/device.mojom', + 'public/interfaces/device_manager.mojom', + ], }, 'targets': [ { @@ -141,11 +146,19 @@ { 'target_name': 'device_usb_mojo_bindings', 'type': 'static_library', - 'sources': [ - 'public/interfaces/chooser_service.mojom', - 'public/interfaces/device.mojom', - 'public/interfaces/device_manager.mojom', + 'sources': [ '<@(mojom_files)' ], + 'includes': [ + '../../mojo/mojom_bindings_generator.gypi', ], + }, + { + 'target_name': 'device_usb_mojo_bindings_for_blink', + 'type': 'static_library', + 'sources': [ '<@(mojom_files)' ], + 'variables': { + 'mojom_variant': 'wtf', + 'for_blink': 'true', + }, 'includes': [ '../../mojo/mojom_bindings_generator.gypi', ], diff --git a/third_party/WebKit/LayoutTests/usb/usbDevice.html b/third_party/WebKit/LayoutTests/usb/usbDevice.html index 763228af9fe42..5ea54fbfcb3fa 100644 --- a/third_party/WebKit/LayoutTests/usb/usbDevice.html +++ b/third_party/WebKit/LayoutTests/usb/usbDevice.html @@ -244,7 +244,6 @@ usb_test(usb => { }); }, 'a non-existent interface cannot be claimed or released'); - usb_test(usb => { usb.mockDeviceManager.addMockDevice(usb.fakeDevices[0]); return navigator.usb.getDevices().then(devices => { diff --git a/third_party/WebKit/Source/modules/BUILD.gn b/third_party/WebKit/Source/modules/BUILD.gn index d6f38078e4861..56a3e530e484f 100644 --- a/third_party/WebKit/Source/modules/BUILD.gn +++ b/third_party/WebKit/Source/modules/BUILD.gn @@ -47,6 +47,7 @@ component("modules") { deps = [ ":make_modules_generated", "//device/battery:mojo_bindings", + "//device/usb/public/interfaces:interfaces_wtf", "//mojo/public/c/system:for_component", "//third_party/WebKit/Source/core", "//third_party/WebKit/public:mojo_bindings_wtf", diff --git a/third_party/WebKit/Source/modules/modules.gyp b/third_party/WebKit/Source/modules/modules.gyp index f10063bf759d5..863cf80642c90 100644 --- a/third_party/WebKit/Source/modules/modules.gyp +++ b/third_party/WebKit/Source/modules/modules.gyp @@ -40,6 +40,7 @@ 'target_name': 'modules', 'dependencies': [ '<(DEPTH)/device/battery/battery.gyp:device_battery_mojo_bindings', + '<(DEPTH)/device/usb/usb.gyp:device_usb_mojo_bindings_for_blink', '<(DEPTH)/mojo/mojo_edk.gyp:mojo_system_impl', '<(DEPTH)/mojo/mojo_public.gyp:mojo_cpp_bindings', '<(DEPTH)/third_party/icu/icu.gyp:icui18n', diff --git a/third_party/WebKit/Source/modules/modules.gypi b/third_party/WebKit/Source/modules/modules.gypi index c761fbf715a04..0841bcf5645c0 100644 --- a/third_party/WebKit/Source/modules/modules.gypi +++ b/third_party/WebKit/Source/modules/modules.gypi @@ -1907,14 +1907,10 @@ 'webusb/USBConfiguration.h', 'webusb/USBConnectionEvent.cpp', 'webusb/USBConnectionEvent.h', - 'webusb/USBController.cpp', - 'webusb/USBController.h', 'webusb/USBDevice.cpp', 'webusb/USBDevice.h', 'webusb/USBEndpoint.cpp', 'webusb/USBEndpoint.h', - 'webusb/USBError.cpp', - 'webusb/USBError.h', 'webusb/USBInTransferResult.h', 'webusb/USBInterface.cpp', 'webusb/USBInterface.h', diff --git a/third_party/WebKit/Source/modules/webusb/DEPS b/third_party/WebKit/Source/modules/webusb/DEPS new file mode 100644 index 0000000000000..1e6ebea116383 --- /dev/null +++ b/third_party/WebKit/Source/modules/webusb/DEPS @@ -0,0 +1,4 @@ +include_rules = [ + "+device/usb/public/interfaces", + "+mojo/public/cpp/bindings", +] diff --git a/third_party/WebKit/Source/modules/webusb/USB.cpp b/third_party/WebKit/Source/modules/webusb/USB.cpp index cd4b4aae28538..4811ea22af4f0 100644 --- a/third_party/WebKit/Source/modules/webusb/USB.cpp +++ b/third_party/WebKit/Source/modules/webusb/USB.cpp @@ -4,133 +4,138 @@ #include "modules/webusb/USB.h" -#include "bindings/core/v8/CallbackPromiseAdapter.h" #include "bindings/core/v8/ScriptPromise.h" #include "bindings/core/v8/ScriptPromiseResolver.h" #include "core/dom/DOMException.h" #include "core/dom/Document.h" #include "core/dom/ExceptionCode.h" +#include "device/usb/public/interfaces/device.mojom-wtf.h" #include "modules/EventTargetModules.h" #include "modules/webusb/USBConnectionEvent.h" -#include "modules/webusb/USBController.h" #include "modules/webusb/USBDevice.h" #include "modules/webusb/USBDeviceFilter.h" #include "modules/webusb/USBDeviceRequestOptions.h" -#include "modules/webusb/USBError.h" +#include "platform/MojoHelper.h" #include "platform/UserGestureIndicator.h" -#include "public/platform/Platform.h" -#include "public/platform/WebVector.h" -#include "public/platform/modules/webusb/WebUSBClient.h" -#include "public/platform/modules/webusb/WebUSBDeviceFilter.h" -#include "public/platform/modules/webusb/WebUSBDeviceRequestOptions.h" -#include "public/platform/modules/webusb/WebUSBError.h" +#include "public/platform/ServiceRegistry.h" +#include "wtf/Functional.h" + +namespace usb = device::usb::wtf; namespace blink { namespace { -void convertDeviceFilter(const USBDeviceFilter& filter, WebUSBDeviceFilter* webFilter) +const char kNoServiceError[] = "USB service unavailable."; + +usb::DeviceFilterPtr convertDeviceFilter(const USBDeviceFilter& filter) { - webFilter->hasVendorID = filter.hasVendorId(); - if (filter.hasVendorId()) - webFilter->vendorID = filter.vendorId(); - webFilter->hasProductID = filter.hasProductId(); - if (filter.hasProductId()) - webFilter->productID = filter.productId(); - webFilter->hasClassCode = filter.hasClassCode(); - if (filter.hasClassCode()) - webFilter->classCode = filter.classCode(); - webFilter->hasSubclassCode = filter.hasSubclassCode(); - if (filter.hasSubclassCode()) - webFilter->subclassCode = filter.subclassCode(); - webFilter->hasProtocolCode = filter.hasProtocolCode(); - if (filter.hasProtocolCode()) - webFilter->protocolCode = filter.protocolCode(); + auto mojoFilter = usb::DeviceFilter::New(); + mojoFilter->has_vendor_id = filter.hasVendorId(); + if (mojoFilter->has_vendor_id) + mojoFilter->vendor_id = filter.vendorId(); + mojoFilter->has_product_id = filter.hasProductId(); + if (mojoFilter->has_product_id) + mojoFilter->product_id = filter.productId(); + mojoFilter->has_class_code = filter.hasClassCode(); + if (mojoFilter->has_class_code) + mojoFilter->class_code = filter.classCode(); + mojoFilter->has_subclass_code = filter.hasSubclassCode(); + if (mojoFilter->has_subclass_code) + mojoFilter->subclass_code = filter.subclassCode(); + mojoFilter->has_protocol_code = filter.hasProtocolCode(); + if (mojoFilter->has_protocol_code) + mojoFilter->protocol_code = filter.protocolCode(); + return mojoFilter; } -void convertDeviceRequestOptions(const USBDeviceRequestOptions& options, WebUSBDeviceRequestOptions* webOptions) +bool isActive(ScriptPromiseResolver* resolver) { - DCHECK(options.hasFilters()); - webOptions->filters = WebVector<WebUSBDeviceFilter>(options.filters().size()); - for (size_t i = 0; i < options.filters().size(); ++i) { - convertDeviceFilter(options.filters()[i], &webOptions->filters[i]); - } + ExecutionContext* context = resolver->getExecutionContext(); + return context && !context->activeDOMObjectsAreStopped(); } -// Allows using a CallbackPromiseAdapter with a WebVector to resolve the -// getDevices() promise with a HeapVector owning USBDevices. -class DeviceArray { - STATIC_ONLY(DeviceArray); -public: - using WebType = OwnPtr<WebVector<WebUSBDevice*>>; - - static HeapVector<Member<USBDevice>> take(ScriptPromiseResolver* resolver, PassOwnPtr<WebVector<WebUSBDevice*>> webDevices) - { - HeapVector<Member<USBDevice>> devices; - for (const auto webDevice : *webDevices) - devices.append(USBDevice::create(adoptPtr(webDevice), resolver->getExecutionContext())); - return devices; - } -}; - } // namespace USB::USB(LocalFrame& frame) : ContextLifecycleObserver(frame.document()) - , m_client(USBController::from(frame).client()) { - ThreadState::current()->registerPreFinalizer(this); - if (m_client) - m_client->addObserver(this); + frame.serviceRegistry()->connectToRemoteService(mojo::GetProxy(&m_deviceManager)); + m_deviceManager.set_connection_error_handler([this]() { + m_deviceManager.reset(); + for (ScriptPromiseResolver* resolver : m_deviceManagerRequests) { + if (isActive(resolver)) + resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); + } + m_deviceManagerRequests.clear(); + }); + // Set up two sequential calls to GetDeviceChanges to avoid latency. + m_deviceManager->GetDeviceChanges(createBaseCallback(bind<usb::DeviceChangeNotificationPtr>(&USB::onDeviceChanges, this))); + m_deviceManager->GetDeviceChanges(createBaseCallback(bind<usb::DeviceChangeNotificationPtr>(&USB::onDeviceChanges, this))); } USB::~USB() { -} - -void USB::dispose() -{ - // Promptly clears a raw reference from content/ to an on-heap object - // so that content/ doesn't access it in a lazy sweeping phase. - if (m_client) - m_client->removeObserver(this); - m_client = nullptr; + DCHECK(!m_deviceManager); + DCHECK(m_deviceManagerRequests.isEmpty()); + DCHECK(!m_chooserService); + DCHECK(m_chooserServiceRequests.isEmpty()); } ScriptPromise USB::getDevices(ScriptState* scriptState) { - if (!m_client) - return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError)); - - String errorMessage; - if (!scriptState->getExecutionContext()->isSecureContext(errorMessage)) - return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(SecurityError, errorMessage)); - ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - m_client->getDevices(new CallbackPromiseAdapter<DeviceArray, USBError>(resolver)); - + if (!m_deviceManager) { + resolver->reject(DOMException::create(NotSupportedError)); + } else { + String errorMessage; + if (!scriptState->getExecutionContext()->isSecureContext(errorMessage)) { + resolver->reject(DOMException::create(SecurityError, errorMessage)); + } else { + m_deviceManagerRequests.add(resolver); + m_deviceManager->GetDevices(nullptr, createBaseCallback(bind<mojo::WTFArray<usb::DeviceInfoPtr>>(&USB::onGetDevices, this, resolver))); + } + } return promise; } ScriptPromise USB::requestDevice(ScriptState* scriptState, const USBDeviceRequestOptions& options) { - if (!m_client) - return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError)); - - String errorMessage; - if (!scriptState->getExecutionContext()->isSecureContext(errorMessage)) - return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(SecurityError, errorMessage)); - - if (!UserGestureIndicator::consumeUserGesture()) - return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(SecurityError, "Must be handling a user gesture to show a permission request.")); - ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - WebUSBDeviceRequestOptions webOptions; - convertDeviceRequestOptions(options, &webOptions); - m_client->requestDevice(webOptions, new CallbackPromiseAdapter<USBDevice, USBError>(resolver)); + if (!m_chooserService) { + LocalFrame* frame = getExecutionContext() ? toDocument(getExecutionContext())->frame() : nullptr; + if (!frame) { + resolver->reject(DOMException::create(NotSupportedError)); + return promise; + } + frame->serviceRegistry()->connectToRemoteService(mojo::GetProxy(&m_chooserService)); + m_chooserService.set_connection_error_handler([this]() { + m_chooserService.reset(); + for (ScriptPromiseResolver* resolver : m_chooserServiceRequests) { + if (isActive(resolver)) + resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); + } + m_chooserServiceRequests.clear(); + }); + } + String errorMessage; + if (!scriptState->getExecutionContext()->isSecureContext(errorMessage)) { + resolver->reject(DOMException::create(SecurityError, errorMessage)); + } else if (!UserGestureIndicator::consumeUserGesture()) { + resolver->reject(DOMException::create(SecurityError, "Must be handling a user gesture to show a permission request.")); + } else { + Vector<usb::DeviceFilterPtr> filters; + if (options.hasFilters()) { + filters.reserveCapacity(options.filters().size()); + for (const auto& filter : options.filters()) + filters.append(convertDeviceFilter(filter)); + } + m_chooserServiceRequests.add(resolver); + m_chooserService->GetPermission(std::move(filters), createBaseCallback(bind<usb::DeviceInfoPtr>(&USB::onGetPermission, this, resolver))); + } return promise; } @@ -146,25 +151,59 @@ const AtomicString& USB::interfaceName() const void USB::contextDestroyed() { - if (m_client) - m_client->removeObserver(this); - m_client = nullptr; + m_deviceManager.reset(); + m_deviceManagerRequests.clear(); + m_chooserService.reset(); + m_chooserServiceRequests.clear(); } -void USB::onDeviceConnected(std::unique_ptr<WebUSBDevice> device) +void USB::onGetDevices(ScriptPromiseResolver* resolver, mojo::WTFArray<usb::DeviceInfoPtr> deviceInfos) { - dispatchEvent(USBConnectionEvent::create(EventTypeNames::connect, USBDevice::create(adoptPtr(device.release()), getExecutionContext()))); + if (!isActive(resolver)) + return; + + HeapVector<Member<USBDevice>> devices; + for (auto& deviceInfo : deviceInfos.PassStorage()) { + usb::DevicePtr device; + m_deviceManager->GetDevice(deviceInfo->guid, mojo::GetProxy(&device)); + devices.append(USBDevice::create(std::move(deviceInfo), std::move(device), resolver->getExecutionContext())); + } + resolver->resolve(devices); + m_deviceManagerRequests.remove(resolver); } -void USB::onDeviceDisconnected(std::unique_ptr<WebUSBDevice> device) +void USB::onGetPermission(ScriptPromiseResolver* resolver, usb::DeviceInfoPtr deviceInfo) { - dispatchEvent(USBConnectionEvent::create(EventTypeNames::disconnect, USBDevice::create(adoptPtr(device.release()), getExecutionContext()))); + if (!isActive(resolver)) + return; + + if (deviceInfo) { + usb::DevicePtr device; + m_deviceManager->GetDevice(deviceInfo->guid, mojo::GetProxy(&device)); + resolver->resolve(USBDevice::create(std::move(deviceInfo), std::move(device), resolver->getExecutionContext())); + } else { + resolver->reject(DOMException::create(NotFoundError, "No device selected.")); + } +} + +void USB::onDeviceChanges(usb::DeviceChangeNotificationPtr notification) +{ + m_deviceManager->GetDeviceChanges(createBaseCallback(bind<usb::DeviceChangeNotificationPtr>(&USB::onDeviceChanges, this))); + for (auto& deviceInfo : notification->devices_added.PassStorage()) { + usb::DevicePtr device; + m_deviceManager->GetDevice(deviceInfo->guid, mojo::GetProxy(&device)); + dispatchEvent(USBConnectionEvent::create(EventTypeNames::connect, USBDevice::create(std::move(deviceInfo), std::move(device), getExecutionContext()))); + } + for (auto& deviceInfo : notification->devices_removed.PassStorage()) + dispatchEvent(USBConnectionEvent::create(EventTypeNames::disconnect, USBDevice::create(std::move(deviceInfo), nullptr, getExecutionContext()))); } DEFINE_TRACE(USB) { EventTargetWithInlineData::trace(visitor); ContextLifecycleObserver::trace(visitor); + visitor->trace(m_deviceManagerRequests); + visitor->trace(m_chooserServiceRequests); } } // namespace blink diff --git a/third_party/WebKit/Source/modules/webusb/USB.h b/third_party/WebKit/Source/modules/webusb/USB.h index e79cef9cbdfdd..4a47e756bec76 100644 --- a/third_party/WebKit/Source/modules/webusb/USB.h +++ b/third_party/WebKit/Source/modules/webusb/USB.h @@ -9,30 +9,29 @@ #include "bindings/core/v8/ScriptWrappable.h" #include "core/dom/ContextLifecycleObserver.h" #include "core/events/EventTarget.h" +#include "device/usb/public/interfaces/chooser_service.mojom-wtf.h" +#include "device/usb/public/interfaces/device_manager.mojom-wtf.h" #include "platform/heap/Handle.h" -#include "public/platform/modules/webusb/WebUSBClient.h" namespace blink { class LocalFrame; +class ScopedScriptPromiseResolver; class ScriptState; class USBDeviceRequestOptions; -class WebUSBDevice; class USB final : public EventTargetWithInlineData - , public ContextLifecycleObserver - , public WebUSBClient::Observer { + , public ContextLifecycleObserver { DEFINE_WRAPPERTYPEINFO(); USING_GARBAGE_COLLECTED_MIXIN(USB); - USING_PRE_FINALIZER(USB, dispose); public: static USB* create(LocalFrame& frame) { return new USB(frame); } - ~USB() override; + virtual ~USB(); // USB.idl ScriptPromise getDevices(ScriptState*); @@ -47,17 +46,21 @@ public: // ContextLifecycleObserver overrides. void contextDestroyed() override; - // WebUSBClient::Observer overrides. - void onDeviceConnected(std::unique_ptr<WebUSBDevice>) override; - void onDeviceDisconnected(std::unique_ptr<WebUSBDevice>) override; + device::usb::wtf::DeviceManager* deviceManager() const { return m_deviceManager.get(); } + + void onGetDevices(ScriptPromiseResolver*, mojo::WTFArray<device::usb::wtf::DeviceInfoPtr>); + void onGetPermission(ScriptPromiseResolver*, device::usb::wtf::DeviceInfoPtr); + void onDeviceChanges(device::usb::wtf::DeviceChangeNotificationPtr); DECLARE_VIRTUAL_TRACE(); private: explicit USB(LocalFrame& frame); - void dispose(); - WebUSBClient* m_client; + device::usb::wtf::DeviceManagerPtr m_deviceManager; + HeapHashSet<Member<ScriptPromiseResolver>> m_deviceManagerRequests; + device::usb::wtf::ChooserServicePtr m_chooserService; + HeapHashSet<Member<ScriptPromiseResolver>> m_chooserServiceRequests; }; } // namespace blink diff --git a/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.cpp b/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.cpp index 61f69605cc898..fb8acd65d5c42 100644 --- a/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.cpp +++ b/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.cpp @@ -17,8 +17,9 @@ USBAlternateInterface* USBAlternateInterface::create(const USBInterface* interfa USBAlternateInterface* USBAlternateInterface::create(const USBInterface* interface, size_t alternateSetting, ExceptionState& exceptionState) { - for (size_t i = 0; i < interface->info().alternates.size(); ++i) { - if (interface->info().alternates[i].alternateSetting == alternateSetting) + const auto& alternates = interface->info().alternates; + for (size_t i = 0; i < alternates.size(); ++i) { + if (alternates[i]->alternate_setting == alternateSetting) return USBAlternateInterface::create(interface, i); } exceptionState.throwRangeError("Invalid alternate setting."); @@ -33,36 +34,11 @@ USBAlternateInterface::USBAlternateInterface(const USBInterface* interface, size ASSERT(m_alternateIndex < m_interface->info().alternates.size()); } -const WebUSBDeviceInfo::AlternateInterface& USBAlternateInterface::info() const +const device::usb::wtf::AlternateInterfaceInfo& USBAlternateInterface::info() const { - const WebUSBDeviceInfo::Interface& interfaceInfo = m_interface->info(); + const device::usb::wtf::InterfaceInfo& interfaceInfo = m_interface->info(); ASSERT(m_alternateIndex < interfaceInfo.alternates.size()); - return interfaceInfo.alternates[m_alternateIndex]; -} - -uint8_t USBAlternateInterface::alternateSetting() const -{ - return info().alternateSetting; -} - -uint8_t USBAlternateInterface::interfaceClass() const -{ - return info().classCode; -} - -uint8_t USBAlternateInterface::interfaceSubclass() const -{ - return info().subclassCode; -} - -uint8_t USBAlternateInterface::interfaceProtocol() const -{ - return info().protocolCode; -} - -String USBAlternateInterface::interfaceName() const -{ - return info().interfaceName; + return *interfaceInfo.alternates[m_alternateIndex]; } HeapVector<Member<USBEndpoint>> USBAlternateInterface::endpoints() const diff --git a/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.h b/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.h index 17d4d4c5cef43..d6c49e13a5da3 100644 --- a/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.h +++ b/third_party/WebKit/Source/modules/webusb/USBAlternateInterface.h @@ -6,8 +6,8 @@ #define USBAlternateInterface_h #include "bindings/core/v8/ScriptWrappable.h" +#include "device/usb/public/interfaces/device.mojom-wtf.h" #include "platform/heap/Heap.h" -#include "public/platform/modules/webusb/WebUSBDeviceInfo.h" namespace blink { @@ -25,13 +25,13 @@ public: USBAlternateInterface(const USBInterface*, size_t alternateIndex); - const WebUSBDeviceInfo::AlternateInterface& info() const; + const device::usb::wtf::AlternateInterfaceInfo& info() const; - uint8_t alternateSetting() const; - uint8_t interfaceClass() const; - uint8_t interfaceSubclass() const; - uint8_t interfaceProtocol() const; - String interfaceName() const; + uint8_t alternateSetting() const { return info().alternate_setting; } + uint8_t interfaceClass() const { return info().class_code; } + uint8_t interfaceSubclass() const { return info().subclass_code; } + uint8_t interfaceProtocol() const { return info().protocol_code; } + String interfaceName() const { return info().interface_name; } HeapVector<Member<USBEndpoint>> endpoints() const; DECLARE_TRACE(); diff --git a/third_party/WebKit/Source/modules/webusb/USBConfiguration.cpp b/third_party/WebKit/Source/modules/webusb/USBConfiguration.cpp index 6a662c086cb26..cd6599393d7a7 100644 --- a/third_party/WebKit/Source/modules/webusb/USBConfiguration.cpp +++ b/third_party/WebKit/Source/modules/webusb/USBConfiguration.cpp @@ -5,6 +5,7 @@ #include "modules/webusb/USBConfiguration.h" #include "bindings/core/v8/ExceptionState.h" +#include "device/usb/public/interfaces/device.mojom-wtf.h" #include "modules/webusb/USBDevice.h" #include "modules/webusb/USBInterface.h" @@ -17,23 +18,15 @@ USBConfiguration* USBConfiguration::create(const USBDevice* device, size_t confi USBConfiguration* USBConfiguration::create(const USBDevice* device, size_t configurationValue, ExceptionState& exceptionState) { - for (size_t i = 0; i < device->info().configurations.size(); ++i) { - if (device->info().configurations[i].configurationValue == configurationValue) + const auto& configurations = device->info().configurations; + for (size_t i = 0; i < configurations.size(); ++i) { + if (configurations[i]->configuration_value == configurationValue) return new USBConfiguration(device, i); } exceptionState.throwRangeError("Invalid configuration value."); return nullptr; } -USBConfiguration* USBConfiguration::createFromValue(const USBDevice* device, uint8_t configurationValue) -{ - for (size_t i = 0; i < device->info().configurations.size(); ++i) { - if (device->info().configurations[i].configurationValue == configurationValue) - return new USBConfiguration(device, i); - } - return nullptr; -} - USBConfiguration::USBConfiguration(const USBDevice* device, size_t configurationIndex) : m_device(device) , m_configurationIndex(configurationIndex) @@ -52,19 +45,9 @@ size_t USBConfiguration::index() const return m_configurationIndex; } -const WebUSBDeviceInfo::Configuration& USBConfiguration::info() const +const device::usb::wtf::ConfigurationInfo& USBConfiguration::info() const { - return m_device->info().configurations[m_configurationIndex]; -} - -uint8_t USBConfiguration::configurationValue() const -{ - return info().configurationValue; -} - -String USBConfiguration::configurationName() const -{ - return info().configurationName; + return *m_device->info().configurations[m_configurationIndex]; } HeapVector<Member<USBInterface>> USBConfiguration::interfaces() const diff --git a/third_party/WebKit/Source/modules/webusb/USBConfiguration.h b/third_party/WebKit/Source/modules/webusb/USBConfiguration.h index 72299b031bd56..b753dc18f43de 100644 --- a/third_party/WebKit/Source/modules/webusb/USBConfiguration.h +++ b/third_party/WebKit/Source/modules/webusb/USBConfiguration.h @@ -6,8 +6,8 @@ #define USBConfiguration_h #include "bindings/core/v8/ScriptWrappable.h" +#include "device/usb/public/interfaces/device.mojom-wtf.h" #include "platform/heap/Handle.h" -#include "public/platform/modules/webusb/WebUSBDeviceInfo.h" namespace blink { @@ -22,16 +22,15 @@ class USBConfiguration public: static USBConfiguration* create(const USBDevice*, size_t configurationIndex); static USBConfiguration* create(const USBDevice*, size_t configurationValue, ExceptionState&); - static USBConfiguration* createFromValue(const USBDevice*, uint8_t configurationValue); USBConfiguration(const USBDevice*, size_t configurationIndex); const USBDevice* device() const; size_t index() const; - const WebUSBDeviceInfo::Configuration& info() const; + const device::usb::wtf::ConfigurationInfo& info() const; - uint8_t configurationValue() const; - String configurationName() const; + uint8_t configurationValue() const { return info().configuration_value; } + String configurationName() const { return info().configuration_name; } HeapVector<Member<USBInterface>> interfaces() const; DECLARE_TRACE(); diff --git a/third_party/WebKit/Source/modules/webusb/USBController.cpp b/third_party/WebKit/Source/modules/webusb/USBController.cpp deleted file mode 100644 index 68f21c52d135a..0000000000000 --- a/third_party/WebKit/Source/modules/webusb/USBController.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "modules/webusb/USBController.h" - -#include "platform/RuntimeEnabledFeatures.h" -#include "public/platform/modules/webusb/WebUSBClient.h" - -namespace blink { - -USBController::~USBController() -{ -} - -void USBController::provideTo(LocalFrame& frame, WebUSBClient* client) -{ - USBController* controller = new USBController(frame, client); - Supplement<LocalFrame>::provideTo(frame, supplementName(), controller); -} - -USBController& USBController::from(LocalFrame& frame) -{ - USBController* controller = static_cast<USBController*>(Supplement<LocalFrame>::from(frame, supplementName())); - ASSERT(controller); - return *controller; -} - -const char* USBController::supplementName() -{ - return "USBController"; -} - -USBController::USBController(LocalFrame& frame, WebUSBClient* client) - : LocalFrameLifecycleObserver(&frame) - , m_client(client) -{ -} - -void USBController::willDetachFrameHost() -{ - m_client = nullptr; -} - -DEFINE_TRACE(USBController) -{ - Supplement<LocalFrame>::trace(visitor); - LocalFrameLifecycleObserver::trace(visitor); -} - -} // namespace blink diff --git a/third_party/WebKit/Source/modules/webusb/USBController.h b/third_party/WebKit/Source/modules/webusb/USBController.h deleted file mode 100644 index ee59e3d082b14..0000000000000 --- a/third_party/WebKit/Source/modules/webusb/USBController.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef USBController_h -#define USBController_h - -#include "core/frame/LocalFrame.h" -#include "core/frame/LocalFrameLifecycleObserver.h" -#include "modules/ModulesExport.h" -#include "platform/heap/Handle.h" - -namespace blink { - -class WebUSBClient; - -class MODULES_EXPORT USBController final - : public GarbageCollectedFinalized<USBController> - , public Supplement<LocalFrame> - , public LocalFrameLifecycleObserver { - WTF_MAKE_NONCOPYABLE(USBController); - USING_GARBAGE_COLLECTED_MIXIN(USBController); -public: - virtual ~USBController(); - - WebUSBClient* client() { return m_client; } - - static void provideTo(LocalFrame&, WebUSBClient*); - static USBController& from(LocalFrame&); - static const char* supplementName(); - - DECLARE_VIRTUAL_TRACE(); - -private: - USBController(LocalFrame&, WebUSBClient*); - - // Inherited from LocalFrameLifecycleObserver. - void willDetachFrameHost() override; - - WebUSBClient* m_client; -}; - -} // namespace blink - -#endif // USBController_h diff --git a/third_party/WebKit/Source/modules/webusb/USBDevice.cpp b/third_party/WebKit/Source/modules/webusb/USBDevice.cpp index 0ef39681c9726..77934f5e1c982 100644 --- a/third_party/WebKit/Source/modules/webusb/USBDevice.cpp +++ b/third_party/WebKit/Source/modules/webusb/USBDevice.cpp @@ -4,7 +4,6 @@ #include "modules/webusb/USBDevice.h" -#include "bindings/core/v8/CallbackPromiseAdapter.h" #include "bindings/core/v8/ScriptPromise.h" #include "bindings/core/v8/ScriptPromiseResolver.h" #include "bindings/core/v8/ToV8.h" @@ -14,31 +13,58 @@ #include "core/dom/ExceptionCode.h" #include "modules/webusb/USBConfiguration.h" #include "modules/webusb/USBControlTransferParameters.h" -#include "modules/webusb/USBError.h" #include "modules/webusb/USBInTransferResult.h" #include "modules/webusb/USBIsochronousInTransferResult.h" #include "modules/webusb/USBIsochronousOutTransferResult.h" #include "modules/webusb/USBOutTransferResult.h" -#include "public/platform/modules/webusb/WebUSBTransferInfo.h" +#include "platform/MojoHelper.h" #include "wtf/Assertions.h" +namespace usb = device::usb::wtf; + namespace blink { namespace { const char kDeviceStateChangeInProgress[] = "An operation that changes the device state is in progress."; +const char kDeviceUnavailable[] = "Device unavailable."; const char kInterfaceNotFound[] = "The interface number provided is not supported by the device in its current configuration."; const char kInterfaceStateChangeInProgress[] = "An operation that changes interface state is in progress."; const char kOpenRequired[] = "The device must be opened first."; -String convertTransferStatus(const WebUSBTransferInfo::Status& status) +DOMException* convertFatalTransferStatus(const usb::TransferStatus& status) { switch (status) { - case WebUSBTransferInfo::Status::Ok: + case usb::TransferStatus::TRANSFER_ERROR: + return DOMException::create(NetworkError, "A transfer error has occured."); + case usb::TransferStatus::PERMISSION_DENIED: + return DOMException::create(SecurityError, "The transfer was not allowed."); + case usb::TransferStatus::TIMEOUT: + return DOMException::create(TimeoutError, "The transfer timed out."); + case usb::TransferStatus::CANCELLED: + return DOMException::create(AbortError, "The transfer was cancelled."); + case usb::TransferStatus::DISCONNECT: + return DOMException::create(NotFoundError, kDeviceUnavailable); + case usb::TransferStatus::COMPLETED: + case usb::TransferStatus::STALLED: + case usb::TransferStatus::BABBLE: + case usb::TransferStatus::SHORT_PACKET: + return nullptr; + default: + ASSERT_NOT_REACHED(); + return nullptr; + } +} + +String convertTransferStatus(const usb::TransferStatus& status) +{ + switch (status) { + case usb::TransferStatus::COMPLETED: + case usb::TransferStatus::SHORT_PACKET: return "ok"; - case WebUSBTransferInfo::Status::Stall: + case usb::TransferStatus::STALLED: return "stall"; - case WebUSBTransferInfo::Status::Babble: + case usb::TransferStatus::BABBLE: return "babble"; default: ASSERT_NOT_REACHED(); @@ -46,291 +72,52 @@ String convertTransferStatus(const WebUSBTransferInfo::Status& status) } } -class OpenClosePromiseAdapter : public WebCallbacks<void, const WebUSBError&> { -public: - OpenClosePromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver, bool desiredState) - : m_device(device) - , m_resolver(resolver) - , m_desiredState(desiredState) - { - } +mojo::WTFArray<uint8_t> convertBufferSource(const ArrayBufferOrArrayBufferView& buffer) +{ + ASSERT(!buffer.isNull()); + Vector<uint8_t> vector; + if (buffer.isArrayBuffer()) + vector.append(static_cast<uint8_t*>(buffer.getAsArrayBuffer()->data()), buffer.getAsArrayBuffer()->byteLength()); + else + vector.append(static_cast<uint8_t*>(buffer.getAsArrayBufferView()->baseAddress()), buffer.getAsArrayBufferView()->byteLength()); + return mojo::WTFArray<uint8_t>(std::move(vector)); +} - void onSuccess() override - { - if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) - return; - - m_device->onDeviceOpenedOrClosed(m_desiredState); - m_resolver->resolve(); - } - - void onError(const WebUSBError& e) override - { - if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) - return; - m_device->onDeviceOpenedOrClosed(!m_desiredState); - m_resolver->reject(USBError::take(m_resolver, e)); - } - -private: - Persistent<USBDevice> m_device; - Persistent<ScriptPromiseResolver> m_resolver; - bool m_desiredState; // true: open, false: closed -}; - -class SelectConfigurationPromiseAdapter : public WebCallbacks<void, const WebUSBError&> { -public: - SelectConfigurationPromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver, size_t configurationIndex) - : m_device(device) - , m_resolver(resolver) - , m_configurationIndex(configurationIndex) - { - } - - void onSuccess() override - { - if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) - return; - m_device->onConfigurationSelected(true /* success */, m_configurationIndex); - m_resolver->resolve(); - } - - void onError(const WebUSBError& e) override - { - if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) - return; - m_device->onConfigurationSelected(false /* failure */, m_configurationIndex); - m_resolver->reject(USBError::take(m_resolver, e)); - } - -private: - Persistent<USBDevice> m_device; - Persistent<ScriptPromiseResolver> m_resolver; - size_t m_configurationIndex; -}; - -class ClaimInterfacePromiseAdapter : public WebCallbacks<void, const WebUSBError&> { -public: - ClaimInterfacePromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver, size_t interfaceIndex, bool desiredState) - : m_device(device) - , m_resolver(resolver) - , m_interfaceIndex(interfaceIndex) - , m_desiredState(desiredState) - { - } - - void onSuccess() override - { - if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) - return; - m_device->onInterfaceClaimedOrUnclaimed(m_desiredState, m_interfaceIndex); - m_resolver->resolve(); - } - - void onError(const WebUSBError& e) override - { - if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) - return; - m_device->onInterfaceClaimedOrUnclaimed(!m_desiredState, m_interfaceIndex); - m_resolver->reject(USBError::take(m_resolver, e)); - } - -private: - Persistent<USBDevice> m_device; - Persistent<ScriptPromiseResolver> m_resolver; - size_t m_interfaceIndex; - bool m_desiredState; // true: claimed, false: unclaimed -}; - -class SelectAlternateInterfacePromiseAdapter : public WebCallbacks<void, const WebUSBError&> { -public: - SelectAlternateInterfacePromiseAdapter(USBDevice* device, ScriptPromiseResolver* resolver, size_t interfaceIndex, size_t alternateIndex) - : m_device(device) - , m_resolver(resolver) - , m_interfaceIndex(interfaceIndex) - , m_alternateIndex(alternateIndex) - { - } - - void onSuccess() override - { - if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) - return; - m_device->onAlternateInterfaceSelected(true /* success */, m_interfaceIndex, m_alternateIndex); - m_resolver->resolve(); - } - - void onError(const WebUSBError& e) override - { - if (!m_resolver->getExecutionContext() || m_resolver->getExecutionContext()->activeDOMObjectsAreStopped()) - return; - m_device->onAlternateInterfaceSelected(false /* failure */, m_interfaceIndex, m_alternateIndex); - m_resolver->reject(USBError::take(m_resolver, e)); - } - -private: - Persistent<USBDevice> m_device; - Persistent<ScriptPromiseResolver> m_resolver; - size_t m_interfaceIndex; - size_t m_alternateIndex; -}; - -class InputTransferResult { - WTF_MAKE_NONCOPYABLE(InputTransferResult); -public: - using WebType = OwnPtr<WebUSBTransferInfo>; - - static USBInTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTransferInfo> webTransferInfo) - { - ASSERT(webTransferInfo->status.size() == 1); - return USBInTransferResult::create(convertTransferStatus(webTransferInfo->status[0]), webTransferInfo->data); - } - -private: - InputTransferResult() = delete; -}; - -class OutputTransferResult { - WTF_MAKE_NONCOPYABLE(OutputTransferResult); -public: - using WebType = OwnPtr<WebUSBTransferInfo>; - - static USBOutTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTransferInfo> webTransferInfo) - { - ASSERT(webTransferInfo->status.size() == 1); - ASSERT(webTransferInfo->bytesTransferred.size() == 1); - return USBOutTransferResult::create(convertTransferStatus(webTransferInfo->status[0]), webTransferInfo->bytesTransferred[0]); - } - -private: - OutputTransferResult() = delete; -}; - -class IsochronousInputTransferResult { - WTF_MAKE_NONCOPYABLE(IsochronousInputTransferResult); - -public: - using WebType = OwnPtr<WebUSBTransferInfo>; - - static USBIsochronousInTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTransferInfo> webTransferInfo) - { - ASSERT(webTransferInfo->status.size() == webTransferInfo->packetLength.size() && webTransferInfo->packetLength.size() == webTransferInfo->bytesTransferred.size()); - DOMArrayBuffer* buffer = DOMArrayBuffer::create(webTransferInfo->data.data(), webTransferInfo->data.size()); - HeapVector<Member<USBIsochronousInTransferPacket>> packets(webTransferInfo->status.size()); - size_t byteOffset = 0; - for (size_t i = 0; i < webTransferInfo->status.size(); ++i) { - packets[i] = USBIsochronousInTransferPacket::create(convertTransferStatus(webTransferInfo->status[i]), DOMDataView::create(buffer, byteOffset, webTransferInfo->bytesTransferred[i])); - byteOffset += webTransferInfo->packetLength[i]; - } - return USBIsochronousInTransferResult::create(buffer, packets); - } -}; - -class IsochronousOutputTransferResult { - WTF_MAKE_NONCOPYABLE(IsochronousOutputTransferResult); - -public: - using WebType = OwnPtr<WebUSBTransferInfo>; - - static USBIsochronousOutTransferResult* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBTransferInfo> webTransferInfo) - { - ASSERT(webTransferInfo->status.size() == webTransferInfo->bytesTransferred.size()); - HeapVector<Member<USBIsochronousOutTransferPacket>> packets(webTransferInfo->status.size()); - for (size_t i = 0; i < webTransferInfo->status.size(); ++i) - packets[i] = USBIsochronousOutTransferPacket::create(convertTransferStatus(webTransferInfo->status[i]), webTransferInfo->bytesTransferred[i]); - return USBIsochronousOutTransferResult::create(packets); - } -}; - -class BufferSource { - WTF_MAKE_NONCOPYABLE(BufferSource); -public: - BufferSource(const ArrayBufferOrArrayBufferView& buffer) : m_buffer(buffer) - { - ASSERT(!m_buffer.isNull()); - } - - uint8_t* data() const - { - if (m_buffer.isArrayBuffer()) - return static_cast<uint8_t*>(m_buffer.getAsArrayBuffer()->data()); - return static_cast<uint8_t*>(m_buffer.getAsArrayBufferView()->baseAddress()); - } - - unsigned size() const - { - if (m_buffer.isArrayBuffer()) - return m_buffer.getAsArrayBuffer()->byteLength(); - return m_buffer.getAsArrayBufferView()->byteLength(); - } - -private: - const ArrayBufferOrArrayBufferView& m_buffer; -}; +bool isActive(ScriptPromiseResolver* resolver) +{ + ExecutionContext* context = resolver->getExecutionContext(); + return context && !context->activeDOMObjectsAreStopped(); +} } // namespace -// static -USBDevice* USBDevice::take(ScriptPromiseResolver* resolver, PassOwnPtr<WebUSBDevice> device) -{ - return USBDevice::create(device, resolver->getExecutionContext()); -} - -USBDevice::USBDevice(PassOwnPtr<WebUSBDevice> device, ExecutionContext* context) +USBDevice::USBDevice(usb::DeviceInfoPtr deviceInfo, usb::DevicePtr device, ExecutionContext* context) : ContextLifecycleObserver(context) - , m_device(device) + , m_deviceInfo(std::move(deviceInfo)) + , m_device(std::move(device)) , m_opened(false) , m_deviceStateChangeInProgress(false) , m_configurationIndex(-1) - , m_inEndpoints(15) - , m_outEndpoints(15) { - int configurationIndex = findConfigurationIndex(info().activeConfiguration); + if (m_device) { + m_device.set_connection_error_handler([this]() { + m_device.reset(); + m_opened = false; + for (ScriptPromiseResolver* resolver : m_deviceRequests) { + if (isActive(resolver)) + resolver->reject(DOMException::create(NotFoundError, kDeviceUnavailable)); + } + }); + } + int configurationIndex = findConfigurationIndex(info().active_configuration); if (configurationIndex != -1) onConfigurationSelected(true /* success */, configurationIndex); } -void USBDevice::onDeviceOpenedOrClosed(bool opened) +USBDevice::~USBDevice() { - m_opened = opened; - m_deviceStateChangeInProgress = false; -} - -void USBDevice::onConfigurationSelected(bool success, size_t configurationIndex) -{ - if (success) { - m_configurationIndex = configurationIndex; - size_t numInterfaces = info().configurations[m_configurationIndex].interfaces.size(); - m_claimedInterfaces.clearAll(); - m_claimedInterfaces.resize(numInterfaces); - m_interfaceStateChangeInProgress.clearAll(); - m_interfaceStateChangeInProgress.resize(numInterfaces); - m_selectedAlternates.resize(numInterfaces); - m_selectedAlternates.fill(0); - m_inEndpoints.clearAll(); - m_outEndpoints.clearAll(); - } - m_deviceStateChangeInProgress = false; -} - -void USBDevice::onInterfaceClaimedOrUnclaimed(bool claimed, size_t interfaceIndex) -{ - if (claimed) { - m_claimedInterfaces.set(interfaceIndex); - } else { - m_claimedInterfaces.clear(interfaceIndex); - m_selectedAlternates[interfaceIndex] = 0; - } - setEndpointsForInterface(interfaceIndex, claimed); - m_interfaceStateChangeInProgress.clear(interfaceIndex); -} - -void USBDevice::onAlternateInterfaceSelected(bool success, size_t interfaceIndex, size_t alternateIndex) -{ - if (success) - m_selectedAlternates[interfaceIndex] = alternateIndex; - setEndpointsForInterface(interfaceIndex, success); - m_interfaceStateChangeInProgress.clear(interfaceIndex); + DCHECK(!m_device); + DCHECK(m_deviceRequests.isEmpty()); } bool USBDevice::isInterfaceClaimed(size_t configurationIndex, size_t interfaceIndex) const @@ -352,10 +139,10 @@ USBConfiguration* USBDevice::configuration() const HeapVector<Member<USBConfiguration>> USBDevice::configurations() const { - HeapVector<Member<USBConfiguration>> configurations; size_t numConfigurations = info().configurations.size(); + HeapVector<Member<USBConfiguration>> configurations(numConfigurations); for (size_t i = 0; i < numConfigurations; ++i) - configurations.append(USBConfiguration::create(this, i)); + configurations[i] = USBConfiguration::create(this, i); return configurations; } @@ -368,7 +155,8 @@ ScriptPromise USBDevice::open(ScriptState* scriptState) resolver->resolve(); } else { m_deviceStateChangeInProgress = true; - m_device->open(new OpenClosePromiseAdapter(this, resolver, true /* open */)); + m_deviceRequests.add(resolver); + m_device->Open(createBaseCallback(bind<usb::OpenDeviceError>(&USBDevice::asyncOpen, this, resolver))); } } return promise; @@ -383,7 +171,8 @@ ScriptPromise USBDevice::close(ScriptState* scriptState) resolver->resolve(); } else { m_deviceStateChangeInProgress = true; - m_device->close(new OpenClosePromiseAdapter(this, resolver, false /* closed */)); + m_deviceRequests.add(resolver); + m_device->Close(createBaseCallback(bind(&USBDevice::asyncClose, this, resolver))); } } return promise; @@ -404,7 +193,8 @@ ScriptPromise USBDevice::selectConfiguration(ScriptState* scriptState, uint8_t c resolver->resolve(); } else { m_deviceStateChangeInProgress = true; - m_device->setConfiguration(configurationValue, new SelectConfigurationPromiseAdapter(this, resolver, configurationIndex)); + m_deviceRequests.add(resolver); + m_device->SetConfiguration(configurationValue, createBaseCallback(bind<bool>(&USBDevice::asyncSelectConfiguration, this, configurationIndex, resolver))); } } } @@ -425,7 +215,8 @@ ScriptPromise USBDevice::claimInterface(ScriptState* scriptState, uint8_t interf resolver->resolve(); } else { m_interfaceStateChangeInProgress.set(interfaceIndex); - m_device->claimInterface(interfaceNumber, new ClaimInterfacePromiseAdapter(this, resolver, interfaceIndex, true /* claim */)); + m_deviceRequests.add(resolver); + m_device->ClaimInterface(interfaceNumber, createBaseCallback(bind<bool>(&USBDevice::asyncClaimInterface, this, interfaceIndex, resolver))); } } return promise; @@ -448,7 +239,8 @@ ScriptPromise USBDevice::releaseInterface(ScriptState* scriptState, uint8_t inte // changing. setEndpointsForInterface(interfaceIndex, false); m_interfaceStateChangeInProgress.set(interfaceIndex); - m_device->releaseInterface(interfaceNumber, new ClaimInterfacePromiseAdapter(this, resolver, interfaceIndex, false /* release */)); + m_deviceRequests.add(resolver); + m_device->ReleaseInterface(interfaceNumber, createBaseCallback(bind<bool>(&USBDevice::asyncReleaseInterface, this, interfaceIndex, resolver))); } } return promise; @@ -470,7 +262,8 @@ ScriptPromise USBDevice::selectAlternateInterface(ScriptState* scriptState, uint // the change is in progress. setEndpointsForInterface(interfaceIndex, false); m_interfaceStateChangeInProgress.set(interfaceIndex); - m_device->setInterface(interfaceNumber, alternateSetting, new SelectAlternateInterfacePromiseAdapter(this, resolver, interfaceIndex, alternateIndex)); + m_deviceRequests.add(resolver); + m_device->SetInterfaceAlternateSetting(interfaceNumber, alternateSetting, createBaseCallback(bind<bool>(&USBDevice::asyncSelectAlternateInterface, this, interfaceNumber, alternateSetting, resolver))); } } return promise; @@ -481,9 +274,11 @@ ScriptPromise USBDevice::controlTransferIn(ScriptState* scriptState, const USBCo ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); if (ensureDeviceConfigured(resolver)) { - WebUSBDevice::ControlTransferParameters parameters; - if (convertControlTransferParameters(WebUSBDevice::TransferDirection::In, setup, ¶meters, resolver)) - m_device->controlTransfer(parameters, nullptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolver)); + auto parameters = convertControlTransferParameters(setup, resolver); + if (parameters) { + m_deviceRequests.add(resolver); + m_device->ControlTransferIn(std::move(parameters), length, 0, createBaseCallback(bind<usb::TransferStatus, mojo::WTFArray<uint8_t>>(&USBDevice::asyncControlTransferIn, this, resolver))); + } } return promise; } @@ -493,9 +288,11 @@ ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); if (ensureDeviceConfigured(resolver)) { - WebUSBDevice::ControlTransferParameters parameters; - if (convertControlTransferParameters(WebUSBDevice::TransferDirection::Out, setup, ¶meters, resolver)) - m_device->controlTransfer(parameters, nullptr, 0, 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); + auto parameters = convertControlTransferParameters(setup, resolver); + if (parameters) { + m_deviceRequests.add(resolver); + m_device->ControlTransferOut(std::move(parameters), mojo::WTFArray<uint8_t>(), 0, createBaseCallback(bind<usb::TransferStatus>(&USBDevice::asyncControlTransferOut, this, 0, resolver))); + } } return promise; } @@ -505,10 +302,12 @@ ScriptPromise USBDevice::controlTransferOut(ScriptState* scriptState, const USBC ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); if (ensureDeviceConfigured(resolver)) { - WebUSBDevice::ControlTransferParameters parameters; - if (convertControlTransferParameters(WebUSBDevice::TransferDirection::Out, setup, ¶meters, resolver)) { - BufferSource buffer(data); - m_device->controlTransfer(parameters, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); + auto parameters = convertControlTransferParameters(setup, resolver); + if (parameters) { + mojo::WTFArray<uint8_t> buffer = convertBufferSource(data); + unsigned transferLength = buffer.size(); + m_deviceRequests.add(resolver); + m_device->ControlTransferOut(std::move(parameters), std::move(buffer), 0, createBaseCallback(bind<usb::TransferStatus>(&USBDevice::asyncControlTransferOut, this, transferLength, resolver))); } } return promise; @@ -518,8 +317,10 @@ ScriptPromise USBDevice::clearHalt(ScriptState* scriptState, String direction, u { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (ensureEndpointAvailable(direction == "in", endpointNumber, resolver)) - m_device->clearHalt(endpointNumber, new CallbackPromiseAdapter<void, USBError>(resolver)); + if (ensureEndpointAvailable(direction == "in", endpointNumber, resolver)) { + m_deviceRequests.add(resolver); + m_device->ClearHalt(endpointNumber, createBaseCallback(bind<bool>(&USBDevice::asyncClearHalt, this, resolver))); + } return promise; } @@ -527,8 +328,10 @@ ScriptPromise USBDevice::transferIn(ScriptState* scriptState, uint8_t endpointNu { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) - m_device->transfer(WebUSBDevice::TransferDirection::In, endpointNumber, nullptr, length, 0, new CallbackPromiseAdapter<InputTransferResult, USBError>(resolver)); + if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { + m_deviceRequests.add(resolver); + m_device->GenericTransferIn(endpointNumber, length, 0, createBaseCallback(bind<usb::TransferStatus, mojo::WTFArray<uint8_t>>(&USBDevice::asyncTransferIn, this, resolver))); + } return promise; } @@ -537,8 +340,10 @@ ScriptPromise USBDevice::transferOut(ScriptState* scriptState, uint8_t endpointN ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { - BufferSource buffer(data); - m_device->transfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buffer.data(), buffer.size(), 0, new CallbackPromiseAdapter<OutputTransferResult, USBError>(resolver)); + mojo::WTFArray<uint8_t> buffer = convertBufferSource(data); + unsigned transferLength = buffer.size(); + m_deviceRequests.add(resolver); + m_device->GenericTransferOut(endpointNumber, std::move(buffer), 0, createBaseCallback(bind<usb::TransferStatus>(&USBDevice::asyncTransferOut, this, transferLength, resolver))); } return promise; } @@ -547,8 +352,10 @@ ScriptPromise USBDevice::isochronousTransferIn(ScriptState* scriptState, uint8_t { ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); - if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) - m_device->isochronousTransfer(WebUSBDevice::TransferDirection::In, endpointNumber, nullptr, 0, packetLengths, 0, new CallbackPromiseAdapter<IsochronousInputTransferResult, USBError>(resolver)); + if (ensureEndpointAvailable(true /* in */, endpointNumber, resolver)) { + m_deviceRequests.add(resolver); + m_device->IsochronousTransferIn(endpointNumber, mojo::WTFArray<uint32_t>(std::move(packetLengths)), 0, createBaseCallback(bind<mojo::WTFArray<uint8_t>, mojo::WTFArray<usb::IsochronousPacketPtr>>(&USBDevice::asyncIsochronousTransferIn, this, resolver))); + } return promise; } @@ -557,8 +364,8 @@ ScriptPromise USBDevice::isochronousTransferOut(ScriptState* scriptState, uint8_ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); if (ensureEndpointAvailable(false /* out */, endpointNumber, resolver)) { - BufferSource buffer(data); - m_device->isochronousTransfer(WebUSBDevice::TransferDirection::Out, endpointNumber, buffer.data(), buffer.size(), packetLengths, 0, new CallbackPromiseAdapter<IsochronousOutputTransferResult, USBError>(resolver)); + m_deviceRequests.add(resolver); + m_device->IsochronousTransferOut(endpointNumber, convertBufferSource(data), mojo::WTFArray<uint32_t>(std::move(packetLengths)), 0, createBaseCallback(bind<mojo::WTFArray<usb::IsochronousPacketPtr>>(&USBDevice::asyncIsochronousTransferOut, this, resolver))); } return promise; } @@ -568,32 +375,33 @@ ScriptPromise USBDevice::reset(ScriptState* scriptState) ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); ScriptPromise promise = resolver->promise(); if (ensureNoDeviceOrInterfaceChangeInProgress(resolver)) { - if (!m_opened) + if (!m_opened) { resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); - else - m_device->reset(new CallbackPromiseAdapter<void, USBError>(resolver)); + } else { + m_deviceRequests.add(resolver); + m_device->Reset(createBaseCallback(bind<bool>(&USBDevice::asyncReset, this, resolver))); + } } return promise; } void USBDevice::contextDestroyed() { - if (m_opened) { - m_device->close(new WebUSBDeviceCloseCallbacks()); - m_opened = false; - } + m_device.reset(); + m_deviceRequests.clear(); } DEFINE_TRACE(USBDevice) { ContextLifecycleObserver::trace(visitor); + visitor->trace(m_deviceRequests); } int USBDevice::findConfigurationIndex(uint8_t configurationValue) const { const auto& configurations = info().configurations; for (size_t i = 0; i < configurations.size(); ++i) { - if (configurations[i].configurationValue == configurationValue) + if (configurations[i]->configuration_value == configurationValue) return i; } return -1; @@ -602,9 +410,9 @@ int USBDevice::findConfigurationIndex(uint8_t configurationValue) const int USBDevice::findInterfaceIndex(uint8_t interfaceNumber) const { ASSERT(m_configurationIndex != -1); - const auto& interfaces = info().configurations[m_configurationIndex].interfaces; + const auto& interfaces = info().configurations[m_configurationIndex]->interfaces; for (size_t i = 0; i < interfaces.size(); ++i) { - if (interfaces[i].interfaceNumber == interfaceNumber) + if (interfaces[i]->interface_number == interfaceNumber) return i; } return -1; @@ -613,9 +421,9 @@ int USBDevice::findInterfaceIndex(uint8_t interfaceNumber) const int USBDevice::findAlternateIndex(size_t interfaceIndex, uint8_t alternateSetting) const { ASSERT(m_configurationIndex != -1); - const auto& alternates = info().configurations[m_configurationIndex].interfaces[interfaceIndex].alternates; + const auto& alternates = info().configurations[m_configurationIndex]->interfaces[interfaceIndex]->alternates; for (size_t i = 0; i < alternates.size(); ++i) { - if (alternates[i].alternateSetting == alternateSetting) + if (alternates[i]->alternate_setting == alternateSetting) return i; } return -1; @@ -623,7 +431,9 @@ int USBDevice::findAlternateIndex(size_t interfaceIndex, uint8_t alternateSettin bool USBDevice::ensureNoDeviceOrInterfaceChangeInProgress(ScriptPromiseResolver* resolver) const { - if (m_deviceStateChangeInProgress) + if (!m_device) + resolver->reject(DOMException::create(NotFoundError, kDeviceUnavailable)); + else if (m_deviceStateChangeInProgress) resolver->reject(DOMException::create(InvalidStateError, kDeviceStateChangeInProgress)); else if (anyInterfaceChangeInProgress()) resolver->reject(DOMException::create(InvalidStateError, kInterfaceStateChangeInProgress)); @@ -634,7 +444,9 @@ bool USBDevice::ensureNoDeviceOrInterfaceChangeInProgress(ScriptPromiseResolver* bool USBDevice::ensureDeviceConfigured(ScriptPromiseResolver* resolver) const { - if (m_deviceStateChangeInProgress) + if (!m_device) + resolver->reject(DOMException::create(NotFoundError, kDeviceUnavailable)); + else if (m_deviceStateChangeInProgress) resolver->reject(DOMException::create(InvalidStateError, kDeviceStateChangeInProgress)); else if (!m_opened) resolver->reject(DOMException::create(InvalidStateError, kOpenRequired)); @@ -686,65 +498,303 @@ bool USBDevice::anyInterfaceChangeInProgress() const return false; } -bool USBDevice::convertControlTransferParameters( - WebUSBDevice::TransferDirection direction, +usb::ControlTransferParamsPtr USBDevice::convertControlTransferParameters( const USBControlTransferParameters& parameters, - WebUSBDevice::ControlTransferParameters* webParameters, ScriptPromiseResolver* resolver) const { - webParameters->direction = direction; + auto mojoParameters = usb::ControlTransferParams::New(); if (parameters.requestType() == "standard") { - webParameters->type = WebUSBDevice::RequestType::Standard; + mojoParameters->type = usb::ControlTransferType::STANDARD; } else if (parameters.requestType() == "class") { - webParameters->type = WebUSBDevice::RequestType::Class; + mojoParameters->type = usb::ControlTransferType::CLASS; } else if (parameters.requestType() == "vendor") { - webParameters->type = WebUSBDevice::RequestType::Vendor; + mojoParameters->type = usb::ControlTransferType::VENDOR; } else { resolver->reject(DOMException::create(TypeMismatchError, "The control transfer requestType parameter is invalid.")); - return false; + return nullptr; } if (parameters.recipient() == "device") { - webParameters->recipient = WebUSBDevice::RequestRecipient::Device; + mojoParameters->recipient = usb::ControlTransferRecipient::DEVICE; } else if (parameters.recipient() == "interface") { size_t interfaceNumber = parameters.index() & 0xff; if (!ensureInterfaceClaimed(interfaceNumber, resolver)) - return false; - webParameters->recipient = WebUSBDevice::RequestRecipient::Interface; + return nullptr; + mojoParameters->recipient = usb::ControlTransferRecipient::INTERFACE; } else if (parameters.recipient() == "endpoint") { bool inTransfer = parameters.index() & 0x80; size_t endpointNumber = parameters.index() & 0x0f; if (!ensureEndpointAvailable(inTransfer, endpointNumber, resolver)) - return false; - webParameters->recipient = WebUSBDevice::RequestRecipient::Endpoint; + return nullptr; + mojoParameters->recipient = usb::ControlTransferRecipient::ENDPOINT; } else if (parameters.recipient() == "other") { - webParameters->recipient = WebUSBDevice::RequestRecipient::Other; + mojoParameters->recipient = usb::ControlTransferRecipient::OTHER; } else { resolver->reject(DOMException::create(TypeMismatchError, "The control transfer recipient parameter is invalid.")); - return false; + return nullptr; } - webParameters->request = parameters.request(); - webParameters->value = parameters.value(); - webParameters->index = parameters.index(); - return true; + mojoParameters->request = parameters.request(); + mojoParameters->value = parameters.value(); + mojoParameters->index = parameters.index(); + return mojoParameters; } void USBDevice::setEndpointsForInterface(size_t interfaceIndex, bool set) { - const auto& configuration = info().configurations[m_configurationIndex]; - const auto& interface = configuration.interfaces[interfaceIndex]; - const auto& alternate = interface.alternates[m_selectedAlternates[interfaceIndex]]; - for (const auto& endpoint : alternate.endpoints) { - if (endpoint.endpointNumber == 0 || endpoint.endpointNumber >= 16) + const auto& configuration = *info().configurations[m_configurationIndex]; + const auto& interface = *configuration.interfaces[interfaceIndex]; + const auto& alternate = *interface.alternates[m_selectedAlternates[interfaceIndex]]; + for (const auto& endpoint : alternate.endpoints.storage()) { + uint8_t endpointNumber = endpoint->endpoint_number; + if (endpointNumber == 0 || endpointNumber >= 16) continue; // Ignore endpoints with invalid indices. - auto& bitVector = endpoint.direction == WebUSBDevice::TransferDirection::In ? m_inEndpoints : m_outEndpoints; + auto& bitVector = endpoint->direction == usb::TransferDirection::INBOUND ? m_inEndpoints : m_outEndpoints; if (set) - bitVector.set(endpoint.endpointNumber - 1); + bitVector.set(endpointNumber - 1); else - bitVector.clear(endpoint.endpointNumber - 1); + bitVector.clear(endpointNumber - 1); } } +void USBDevice::asyncOpen(ScriptPromiseResolver* resolver, usb::OpenDeviceError error) +{ + m_deviceRequests.remove(resolver); + if (!isActive(resolver)) + return; + + switch (error) { + case usb::OpenDeviceError::ALREADY_OPEN: + ASSERT_NOT_REACHED(); + // fall through + case usb::OpenDeviceError::OK: + onDeviceOpenedOrClosed(true /* opened */); + resolver->resolve(); + return; + case usb::OpenDeviceError::ACCESS_DENIED: + onDeviceOpenedOrClosed(false /* not opened */); + resolver->reject(DOMException::create(SecurityError, "Access denied.")); + return; + } +} + +void USBDevice::asyncClose(ScriptPromiseResolver* resolver) +{ + m_deviceRequests.remove(resolver); + if (!isActive(resolver)) + return; + + onDeviceOpenedOrClosed(false /* closed */); + resolver->resolve(); +} + +void USBDevice::onDeviceOpenedOrClosed(bool opened) +{ + m_opened = opened; + m_deviceStateChangeInProgress = false; +} + +void USBDevice::asyncSelectConfiguration(size_t configurationIndex, ScriptPromiseResolver* resolver, bool success) +{ + m_deviceRequests.remove(resolver); + if (!isActive(resolver)) + return; + + onConfigurationSelected(success, configurationIndex); + if (success) + resolver->resolve(); + else + resolver->reject(DOMException::create(NetworkError, "Unable to set device configuration.")); +} + +void USBDevice::onConfigurationSelected(bool success, size_t configurationIndex) +{ + if (success) { + m_configurationIndex = configurationIndex; + size_t numInterfaces = info().configurations[m_configurationIndex]->interfaces.size(); + m_claimedInterfaces.clearAll(); + m_claimedInterfaces.resize(numInterfaces); + m_interfaceStateChangeInProgress.clearAll(); + m_interfaceStateChangeInProgress.resize(numInterfaces); + m_selectedAlternates.resize(numInterfaces); + m_selectedAlternates.fill(0); + m_inEndpoints.clearAll(); + m_outEndpoints.clearAll(); + } + m_deviceStateChangeInProgress = false; +} + +void USBDevice::asyncClaimInterface(size_t interfaceIndex, ScriptPromiseResolver* resolver, bool success) +{ + m_deviceRequests.remove(resolver); + if (!isActive(resolver)) + return; + + onInterfaceClaimedOrUnclaimed(success, interfaceIndex); + if (success) + resolver->resolve(); + else + resolver->reject(DOMException::create(NetworkError, "Unable to claim interface.")); +} + +void USBDevice::asyncReleaseInterface(size_t interfaceIndex, ScriptPromiseResolver* resolver, bool success) +{ + m_deviceRequests.remove(resolver); + if (!isActive(resolver)) + return; + + onInterfaceClaimedOrUnclaimed(!success, interfaceIndex); + if (success) + resolver->resolve(); + else + resolver->reject(DOMException::create(NetworkError, "Unable to release interface.")); +} + +void USBDevice::onInterfaceClaimedOrUnclaimed(bool claimed, size_t interfaceIndex) +{ + if (claimed) { + m_claimedInterfaces.set(interfaceIndex); + } else { + m_claimedInterfaces.clear(interfaceIndex); + m_selectedAlternates[interfaceIndex] = 0; + } + setEndpointsForInterface(interfaceIndex, claimed); + m_interfaceStateChangeInProgress.clear(interfaceIndex); +} + +void USBDevice::asyncSelectAlternateInterface(size_t interfaceIndex, size_t alternateIndex, ScriptPromiseResolver* resolver, bool success) +{ + m_deviceRequests.remove(resolver); + if (!isActive(resolver)) + return; + + if (success) + m_selectedAlternates[interfaceIndex] = alternateIndex; + setEndpointsForInterface(interfaceIndex, success); + m_interfaceStateChangeInProgress.clear(interfaceIndex); + + if (success) + resolver->resolve(); + else + resolver->reject(DOMException::create(NetworkError, "Unable to set device interface.")); +} + +void USBDevice::asyncControlTransferIn(ScriptPromiseResolver* resolver, usb::TransferStatus status, mojo::WTFArray<uint8_t> data) +{ + m_deviceRequests.remove(resolver); + if (!isActive(resolver)) + return; + + DOMException* error = convertFatalTransferStatus(status); + if (error) + resolver->reject(error); + else + resolver->resolve(USBInTransferResult::create(convertTransferStatus(status), data.PassStorage())); +} + +void USBDevice::asyncControlTransferOut(unsigned transferLength, ScriptPromiseResolver* resolver, usb::TransferStatus status) +{ + m_deviceRequests.remove(resolver); + if (!isActive(resolver)) + return; + + DOMException* error = convertFatalTransferStatus(status); + if (error) + resolver->reject(error); + else + resolver->resolve(USBOutTransferResult::create(convertTransferStatus(status), transferLength)); +} + +void USBDevice::asyncClearHalt(ScriptPromiseResolver* resolver, bool success) +{ + m_deviceRequests.remove(resolver); + if (!isActive(resolver)) + return; + + if (success) + resolver->resolve(); + else + resolver->reject(DOMException::create(NetworkError, "Unable to clear endpoint.")); +} + +void USBDevice::asyncTransferIn(ScriptPromiseResolver* resolver, usb::TransferStatus status, mojo::WTFArray<uint8_t> data) +{ + m_deviceRequests.remove(resolver); + if (!isActive(resolver)) + return; + + DOMException* error = convertFatalTransferStatus(status); + if (error) + resolver->reject(error); + else + resolver->resolve(USBInTransferResult::create(convertTransferStatus(status), data.PassStorage())); +} + +void USBDevice::asyncTransferOut(unsigned transferLength, ScriptPromiseResolver* resolver, usb::TransferStatus status) +{ + m_deviceRequests.remove(resolver); + if (!isActive(resolver)) + return; + + DOMException* error = convertFatalTransferStatus(status); + if (error) + resolver->reject(error); + else + resolver->resolve(USBOutTransferResult::create(convertTransferStatus(status), transferLength)); +} + +void USBDevice::asyncIsochronousTransferIn(ScriptPromiseResolver* resolver, mojo::WTFArray<uint8_t> data, mojo::WTFArray<usb::IsochronousPacketPtr> mojoPackets) +{ + m_deviceRequests.remove(resolver); + if (!isActive(resolver)) + return; + + DOMArrayBuffer* buffer = DOMArrayBuffer::create(data.storage().data(), data.storage().size()); + HeapVector<Member<USBIsochronousInTransferPacket>> packets; + packets.reserveCapacity(mojoPackets.size()); + size_t byteOffset = 0; + for (const auto& packet : mojoPackets.storage()) { + DOMException* error = convertFatalTransferStatus(packet->status); + if (error) { + resolver->reject(error); + return; + } + packets.append(USBIsochronousInTransferPacket::create(convertTransferStatus(packet->status), DOMDataView::create(buffer, byteOffset, packet->transferred_length))); + byteOffset += packet->length; + } + resolver->resolve(USBIsochronousInTransferResult::create(buffer, packets)); +} + +void USBDevice::asyncIsochronousTransferOut(ScriptPromiseResolver* resolver, mojo::WTFArray<usb::IsochronousPacketPtr> mojoPackets) +{ + m_deviceRequests.remove(resolver); + if (!isActive(resolver)) + return; + + HeapVector<Member<USBIsochronousOutTransferPacket>> packets; + packets.reserveCapacity(mojoPackets.size()); + for (const auto& packet : mojoPackets.storage()) { + DOMException* error = convertFatalTransferStatus(packet->status); + if (error) { + resolver->reject(error); + return; + } + packets.append(USBIsochronousOutTransferPacket::create(convertTransferStatus(packet->status), packet->transferred_length)); + } + resolver->resolve(USBIsochronousOutTransferResult::create(packets)); +} + +void USBDevice::asyncReset(ScriptPromiseResolver* resolver, bool success) +{ + m_deviceRequests.remove(resolver); + if (!isActive(resolver)) + return; + + if (success) + resolver->resolve(); + else + resolver->reject(DOMException::create(NetworkError, "Unable to reset the device.")); +} + } // namespace blink diff --git a/third_party/WebKit/Source/modules/webusb/USBDevice.h b/third_party/WebKit/Source/modules/webusb/USBDevice.h index 9b5154b85c006..17bff6b005cff 100644 --- a/third_party/WebKit/Source/modules/webusb/USBDevice.h +++ b/third_party/WebKit/Source/modules/webusb/USBDevice.h @@ -9,9 +9,8 @@ #include "bindings/core/v8/ScriptWrappable.h" #include "bindings/modules/v8/UnionTypesModules.h" #include "core/dom/ContextLifecycleObserver.h" +#include "device/usb/public/interfaces/device.mojom-wtf.h" #include "platform/heap/Handle.h" -#include "public/platform/modules/webusb/WebUSBDevice.h" -#include "public/platform/modules/webusb/WebUSBDeviceInfo.h" #include "wtf/BitVector.h" #include "wtf/Vector.h" @@ -29,42 +28,34 @@ class USBDevice USING_GARBAGE_COLLECTED_MIXIN(USBDevice); DEFINE_WRAPPERTYPEINFO(); public: - using WebType = OwnPtr<WebUSBDevice>; - - static USBDevice* create(PassOwnPtr<WebUSBDevice> device, ExecutionContext* context) + static USBDevice* create(device::usb::wtf::DeviceInfoPtr deviceInfo, device::usb::wtf::DevicePtr device, ExecutionContext* context) { - return new USBDevice(device, context); + return new USBDevice(std::move(deviceInfo), std::move(device), context); } - static USBDevice* take(ScriptPromiseResolver*, PassOwnPtr<WebUSBDevice>); + explicit USBDevice(device::usb::wtf::DeviceInfoPtr, device::usb::wtf::DevicePtr, ExecutionContext*); + virtual ~USBDevice(); - explicit USBDevice(PassOwnPtr<WebUSBDevice>, ExecutionContext*); - virtual ~USBDevice() { } - - const WebUSBDeviceInfo& info() const { return m_device->info(); } - void onDeviceOpenedOrClosed(bool); - void onConfigurationSelected(bool success, size_t configurationIndex); - void onInterfaceClaimedOrUnclaimed(bool claimed, size_t interfaceIndex); - void onAlternateInterfaceSelected(bool success, size_t interfaceIndex, size_t alternateIndex); + const device::usb::wtf::DeviceInfo& info() const { return *m_deviceInfo; } bool isInterfaceClaimed(size_t configurationIndex, size_t interfaceIndex) const; size_t selectedAlternateInterface(size_t interfaceIndex) const; - // IDL exposed interface: + // USBDevice.idl String guid() const { return info().guid; } - uint8_t usbVersionMajor() { return info().usbVersionMajor; } - uint8_t usbVersionMinor() { return info().usbVersionMinor; } - uint8_t usbVersionSubminor() { return info().usbVersionSubminor; } - uint8_t deviceClass() { return info().deviceClass; } - uint8_t deviceSubclass() const { return info().deviceSubclass; } - uint8_t deviceProtocol() const { return info().deviceProtocol; } - uint16_t vendorId() const { return info().vendorID; } - uint16_t productId() const { return info().productID; } - uint8_t deviceVersionMajor() const { return info().deviceVersionMajor; } - uint8_t deviceVersionMinor() const { return info().deviceVersionMinor; } - uint8_t deviceVersionSubminor() const { return info().deviceVersionSubminor; } - String manufacturerName() const { return info().manufacturerName; } - String productName() const { return info().productName; } - String serialNumber() const { return info().serialNumber; } + uint8_t usbVersionMajor() const { return info().usb_version_major; } + uint8_t usbVersionMinor() const { return info().usb_version_minor; } + uint8_t usbVersionSubminor() const { return info().usb_version_subminor; } + uint8_t deviceClass() const { return info().class_code; } + uint8_t deviceSubclass() const { return info().subclass_code; } + uint8_t deviceProtocol() const { return info().protocol_code; } + uint16_t vendorId() const { return info().vendor_id; } + uint16_t productId() const { return info().product_id; } + uint8_t deviceVersionMajor() const { return info().device_version_major; } + uint8_t deviceVersionMinor() const { return info().device_version_minor; } + uint8_t deviceVersionSubminor() const { return info().device_version_subminor; } + String manufacturerName() const { return info().manufacturer_name; } + String productName() const { return info().product_name; } + String serialNumber() const { return info().serial_number; } USBConfiguration* configuration() const; HeapVector<Member<USBConfiguration>> configurations() const; bool opened() const { return m_opened; } @@ -99,10 +90,30 @@ private: bool ensureInterfaceClaimed(uint8_t interfaceNumber, ScriptPromiseResolver*) const; bool ensureEndpointAvailable(bool inTransfer, uint8_t endpointNumber, ScriptPromiseResolver*) const; bool anyInterfaceChangeInProgress() const; - bool convertControlTransferParameters(WebUSBDevice::TransferDirection, const USBControlTransferParameters&, WebUSBDevice::ControlTransferParameters*, ScriptPromiseResolver*) const; + device::usb::wtf::ControlTransferParamsPtr convertControlTransferParameters(const USBControlTransferParameters&, ScriptPromiseResolver*) const; void setEndpointsForInterface(size_t interfaceIndex, bool set); - OwnPtr<WebUSBDevice> m_device; + void asyncOpen(ScriptPromiseResolver*, device::usb::wtf::OpenDeviceError); + void asyncClose(ScriptPromiseResolver*); + void onDeviceOpenedOrClosed(bool); + void asyncSelectConfiguration(size_t configurationIndex, ScriptPromiseResolver*, bool success); + void onConfigurationSelected(bool success, size_t configurationIndex); + void asyncClaimInterface(size_t interfaceIndex, ScriptPromiseResolver*, bool success); + void asyncReleaseInterface(size_t interfaceIndex, ScriptPromiseResolver*, bool success); + void onInterfaceClaimedOrUnclaimed(bool claimed, size_t interfaceIndex); + void asyncSelectAlternateInterface(size_t interfaceIndex, size_t alternateIndex, ScriptPromiseResolver*, bool success); + void asyncControlTransferIn(ScriptPromiseResolver*, device::usb::wtf::TransferStatus, mojo::WTFArray<uint8_t>); + void asyncControlTransferOut(unsigned, ScriptPromiseResolver*, device::usb::wtf::TransferStatus); + void asyncClearHalt(ScriptPromiseResolver*, bool success); + void asyncTransferIn(ScriptPromiseResolver*, device::usb::wtf::TransferStatus, mojo::WTFArray<uint8_t>); + void asyncTransferOut(unsigned, ScriptPromiseResolver*, device::usb::wtf::TransferStatus); + void asyncIsochronousTransferIn(ScriptPromiseResolver*, mojo::WTFArray<uint8_t>, mojo::WTFArray<device::usb::wtf::IsochronousPacketPtr>); + void asyncIsochronousTransferOut(ScriptPromiseResolver*, mojo::WTFArray<device::usb::wtf::IsochronousPacketPtr>); + void asyncReset(ScriptPromiseResolver*, bool success); + + device::usb::wtf::DeviceInfoPtr m_deviceInfo; + device::usb::wtf::DevicePtr m_device; + HeapHashSet<Member<ScriptPromiseResolver>> m_deviceRequests; bool m_opened; bool m_deviceStateChangeInProgress; int m_configurationIndex; diff --git a/third_party/WebKit/Source/modules/webusb/USBEndpoint.cpp b/third_party/WebKit/Source/modules/webusb/USBEndpoint.cpp index 970c4f58b7838..69879f4237996 100644 --- a/third_party/WebKit/Source/modules/webusb/USBEndpoint.cpp +++ b/third_party/WebKit/Source/modules/webusb/USBEndpoint.cpp @@ -7,30 +7,22 @@ #include "bindings/core/v8/ExceptionState.h" #include "core/dom/DOMException.h" #include "core/dom/ExceptionCode.h" +#include "device/usb/public/interfaces/device.mojom-wtf.h" #include "modules/webusb/USBAlternateInterface.h" -#include "public/platform/modules/webusb/WebUSBDevice.h" + +using device::usb::wtf::EndpointType; +using device::usb::wtf::TransferDirection; namespace blink { namespace { -bool convertDirectionFromEnum(const String& direction, WebUSBDevice::TransferDirection* webDirection) -{ - if (direction == "in") - *webDirection = WebUSBDevice::TransferDirection::In; - else if (direction == "out") - *webDirection = WebUSBDevice::TransferDirection::Out; - else - return false; - return true; -} - -String convertDirectionToEnum(const WebUSBDevice::TransferDirection& direction) +String convertDirectionToEnum(const TransferDirection& direction) { switch (direction) { - case WebUSBDevice::TransferDirection::In: + case TransferDirection::INBOUND: return "in"; - case WebUSBDevice::TransferDirection::Out: + case TransferDirection::OUTBOUND: return "out"; default: ASSERT_NOT_REACHED(); @@ -38,14 +30,14 @@ String convertDirectionToEnum(const WebUSBDevice::TransferDirection& direction) } } -String convertTypeToEnum(const WebUSBDeviceInfo::Endpoint::Type& type) +String convertTypeToEnum(const EndpointType& type) { switch (type) { - case WebUSBDeviceInfo::Endpoint::Type::Bulk: + case EndpointType::BULK: return "bulk"; - case WebUSBDeviceInfo::Endpoint::Type::Interrupt: + case EndpointType::INTERRUPT: return "interrupt"; - case WebUSBDeviceInfo::Endpoint::Type::Isochronous: + case EndpointType::ISOCHRONOUS: return "isochronous"; default: ASSERT_NOT_REACHED(); @@ -62,17 +54,14 @@ USBEndpoint* USBEndpoint::create(const USBAlternateInterface* alternate, size_t USBEndpoint* USBEndpoint::create(const USBAlternateInterface* alternate, size_t endpointNumber, const String& direction, ExceptionState& exceptionState) { - WebUSBDevice::TransferDirection webDirection; - if (!convertDirectionFromEnum(direction, &webDirection)) { - exceptionState.throwRangeError("Invalid endpoint direction."); - return nullptr; - } - for (size_t i = 0; i < alternate->info().endpoints.size(); ++i) { - const WebUSBDeviceInfo::Endpoint& endpoint = alternate->info().endpoints[i]; - if (endpoint.endpointNumber == endpointNumber && endpoint.direction == webDirection) + TransferDirection mojoDirection = direction == "in" ? TransferDirection::INBOUND : TransferDirection::OUTBOUND; + const auto& endpoints = alternate->info().endpoints; + for (size_t i = 0; i < endpoints.size(); ++i) { + const auto& endpoint = endpoints[i]; + if (endpoint->endpoint_number == endpointNumber && endpoint->direction == mojoDirection) return USBEndpoint::create(alternate, i); } - exceptionState.throwRangeError("Invalid endpoint number."); + exceptionState.throwRangeError("No such endpoint exists in the given alternate interface."); return nullptr; } @@ -84,16 +73,11 @@ USBEndpoint::USBEndpoint(const USBAlternateInterface* alternate, size_t endpoint ASSERT(m_endpointIndex < m_alternate->info().endpoints.size()); } -const WebUSBDeviceInfo::Endpoint& USBEndpoint::info() const +const device::usb::wtf::EndpointInfo& USBEndpoint::info() const { - const WebUSBDeviceInfo::AlternateInterface& alternateInfo = m_alternate->info(); + const device::usb::wtf::AlternateInterfaceInfo& alternateInfo = m_alternate->info(); ASSERT(m_endpointIndex < alternateInfo.endpoints.size()); - return alternateInfo.endpoints[m_endpointIndex]; -} - -uint8_t USBEndpoint::endpointNumber() const -{ - return info().endpointNumber; + return *alternateInfo.endpoints[m_endpointIndex]; } String USBEndpoint::direction() const @@ -106,11 +90,6 @@ String USBEndpoint::type() const return convertTypeToEnum(info().type); } -unsigned USBEndpoint::packetSize() const -{ - return info().packetSize; -} - DEFINE_TRACE(USBEndpoint) { visitor->trace(m_alternate); diff --git a/third_party/WebKit/Source/modules/webusb/USBEndpoint.h b/third_party/WebKit/Source/modules/webusb/USBEndpoint.h index fac5098d9fa58..b9b31e7abe412 100644 --- a/third_party/WebKit/Source/modules/webusb/USBEndpoint.h +++ b/third_party/WebKit/Source/modules/webusb/USBEndpoint.h @@ -6,8 +6,8 @@ #define USBEndpoint_h #include "bindings/core/v8/ScriptWrappable.h" +#include "device/usb/public/interfaces/device.mojom-wtf.h" #include "platform/heap/Heap.h" -#include "public/platform/modules/webusb/WebUSBDeviceInfo.h" namespace blink { @@ -24,12 +24,12 @@ public: USBEndpoint(const USBAlternateInterface*, size_t endpointIndex); - const WebUSBDeviceInfo::Endpoint& info() const; + const device::usb::wtf::EndpointInfo& info() const; - uint8_t endpointNumber() const; + uint8_t endpointNumber() const { return info().endpoint_number; } String direction() const; String type() const; - unsigned packetSize() const; + unsigned packetSize() const { return info().packet_size; } DECLARE_TRACE(); diff --git a/third_party/WebKit/Source/modules/webusb/USBError.cpp b/third_party/WebKit/Source/modules/webusb/USBError.cpp deleted file mode 100644 index 7fe34255bbd28..0000000000000 --- a/third_party/WebKit/Source/modules/webusb/USBError.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "modules/webusb/USBError.h" - -#include "core/dom/DOMException.h" -#include "core/dom/ExceptionCode.h" -#include "public/platform/modules/webusb/WebUSBError.h" - -namespace blink { - -DOMException* USBError::take(ScriptPromiseResolver*, const WebUSBError& webError) -{ - switch (webError.error) { - case WebUSBError::Error::InvalidState: - return DOMException::create(InvalidStateError, webError.message); - case WebUSBError::Error::Network: - return DOMException::create(NetworkError, webError.message); - case WebUSBError::Error::NotFound: - return DOMException::create(NotFoundError, webError.message); - case WebUSBError::Error::Security: - return DOMException::create(SecurityError, webError.message); - } - ASSERT_NOT_REACHED(); - return DOMException::create(UnknownError); -} - -} // namespace blink diff --git a/third_party/WebKit/Source/modules/webusb/USBError.h b/third_party/WebKit/Source/modules/webusb/USBError.h deleted file mode 100644 index dc0bb37c35390..0000000000000 --- a/third_party/WebKit/Source/modules/webusb/USBError.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef USBError_h -#define USBError_h - -#include "platform/heap/Handle.h" -#include "public/platform/modules/webusb/WebUSBError.h" -#include "wtf/PassOwnPtr.h" - -namespace blink { - -class DOMException; -class ScriptPromiseResolver; - -// USBError is used with CallbackPromiseAdapter to receive WebUSBError -// responses. See CallbackPromiseAdapter class comments. -class USBError { - WTF_MAKE_NONCOPYABLE(USBError); -public: - // Interface required by CallbackPromiseAdapter: - using WebType = const WebUSBError&; - static DOMException* take(ScriptPromiseResolver*, const WebUSBError&); - -private: - USBError() = delete; -}; - -} // namespace blink - -#endif // USBError_h diff --git a/third_party/WebKit/Source/modules/webusb/USBInTransferResult.h b/third_party/WebKit/Source/modules/webusb/USBInTransferResult.h index ca54b2098fadb..9645745bc71cc 100644 --- a/third_party/WebKit/Source/modules/webusb/USBInTransferResult.h +++ b/third_party/WebKit/Source/modules/webusb/USBInTransferResult.h @@ -9,7 +9,7 @@ #include "core/dom/DOMArrayBuffer.h" #include "core/dom/DOMDataView.h" #include "platform/heap/Handle.h" -#include "public/platform/modules/webusb/WebUSBTransferInfo.h" +#include "wtf/Vector.h" #include "wtf/text/WTFString.h" namespace blink { @@ -19,12 +19,12 @@ class USBInTransferResult final , public ScriptWrappable { DEFINE_WRAPPERTYPEINFO(); public: - static USBInTransferResult* create(const String& status, const WebVector<uint8_t> data) + static USBInTransferResult* create(const String& status, const Vector<uint8_t>& data) { return new USBInTransferResult(status, data); } - USBInTransferResult(const String& status, const WebVector<uint8_t> data) + USBInTransferResult(const String& status, const Vector<uint8_t>& data) : m_status(status) , m_data(DOMDataView::create(DOMArrayBuffer::create(data.data(), data.size()), 0, data.size())) { diff --git a/third_party/WebKit/Source/modules/webusb/USBInterface.cpp b/third_party/WebKit/Source/modules/webusb/USBInterface.cpp index 7b952e6693687..32e0bf50761de 100644 --- a/third_party/WebKit/Source/modules/webusb/USBInterface.cpp +++ b/third_party/WebKit/Source/modules/webusb/USBInterface.cpp @@ -5,6 +5,7 @@ #include "modules/webusb/USBInterface.h" #include "bindings/core/v8/ExceptionState.h" +#include "device/usb/public/interfaces/device.mojom-wtf.h" #include "modules/webusb/USBAlternateInterface.h" #include "modules/webusb/USBConfiguration.h" #include "modules/webusb/USBDevice.h" @@ -20,7 +21,7 @@ USBInterface* USBInterface::create(const USBConfiguration* configuration, size_t { const auto& interfaces = configuration->info().interfaces; for (size_t i = 0; i < interfaces.size(); ++i) { - if (interfaces[i].interfaceNumber == interfaceNumber) + if (interfaces[i]->interface_number == interfaceNumber) return new USBInterface(configuration->device(), configuration->index(), i); } exceptionState.throwRangeError("Invalid interface index."); @@ -33,12 +34,12 @@ USBInterface::USBInterface(const USBDevice* device, size_t configurationIndex, s , m_interfaceIndex(interfaceIndex) { ASSERT(m_configurationIndex < m_device->info().configurations.size()); - ASSERT(m_interfaceIndex < m_device->info().configurations[m_configurationIndex].interfaces.size()); + ASSERT(m_interfaceIndex < m_device->info().configurations[m_configurationIndex]->interfaces.size()); } -const WebUSBDeviceInfo::Interface& USBInterface::info() const +const device::usb::wtf::InterfaceInfo& USBInterface::info() const { - return m_device->info().configurations[m_configurationIndex].interfaces[m_interfaceIndex]; + return *m_device->info().configurations[m_configurationIndex]->interfaces[m_interfaceIndex]; } USBAlternateInterface* USBInterface::alternate() const @@ -56,11 +57,6 @@ HeapVector<Member<USBAlternateInterface>> USBInterface::alternates() const return alternates; } -uint8_t USBInterface::interfaceNumber() const -{ - return info().interfaceNumber; -} - bool USBInterface::claimed() const { return m_device->isInterfaceClaimed(m_configurationIndex, m_interfaceIndex); diff --git a/third_party/WebKit/Source/modules/webusb/USBInterface.h b/third_party/WebKit/Source/modules/webusb/USBInterface.h index 9a05014cda8e6..51be439a8c9c1 100644 --- a/third_party/WebKit/Source/modules/webusb/USBInterface.h +++ b/third_party/WebKit/Source/modules/webusb/USBInterface.h @@ -6,8 +6,8 @@ #define USBInterface_h #include "bindings/core/v8/ScriptWrappable.h" +#include "device/usb/public/interfaces/device.mojom-wtf.h" #include "platform/heap/Heap.h" -#include "public/platform/modules/webusb/WebUSBDeviceInfo.h" namespace blink { @@ -26,9 +26,9 @@ public: USBInterface(const USBDevice*, size_t configurationIndex, size_t interfaceIndex); - const WebUSBDeviceInfo::Interface& info() const; + const device::usb::wtf::InterfaceInfo& info() const; - uint8_t interfaceNumber() const; + uint8_t interfaceNumber() const { return info().interface_number; } USBAlternateInterface* alternate() const; HeapVector<Member<USBAlternateInterface>> alternates() const; bool claimed() const; diff --git a/third_party/WebKit/Source/modules/webusb/USBOutTransferResult.h b/third_party/WebKit/Source/modules/webusb/USBOutTransferResult.h index 27756ca0d20ae..04caa8d33ef16 100644 --- a/third_party/WebKit/Source/modules/webusb/USBOutTransferResult.h +++ b/third_party/WebKit/Source/modules/webusb/USBOutTransferResult.h @@ -6,9 +6,7 @@ #define USBOutTransferResult_h #include "bindings/core/v8/ScriptWrappable.h" -#include "core/dom/DOMArrayBuffer.h" #include "platform/heap/Handle.h" -#include "public/platform/modules/webusb/WebUSBTransferInfo.h" #include "wtf/text/WTFString.h" namespace blink { diff --git a/third_party/WebKit/Source/platform/MojoHelper.h b/third_party/WebKit/Source/platform/MojoHelper.h index eee0a2f0c709a..74f931d2fa4ad 100644 --- a/third_party/WebKit/Source/platform/MojoHelper.h +++ b/third_party/WebKit/Source/platform/MojoHelper.h @@ -13,6 +13,16 @@ namespace blink { +namespace internal { + +template <typename R, typename... Args> +R CallWTFFunction(Function<R(Args...)>* functor, Args... args) +{ + return (*functor)(std::forward<Args>(args)...); +} + +} + // Binds an instance of a class to its member function. Does not bind anything // else. Provides limited access to base::Bind() function. base::Bind() could // be dangerous if it's used across threads, so we don't want to allow general @@ -24,6 +34,12 @@ sameThreadBindForMojo(ReturnType (Class::*method)(Args...), Class* instance) return base::Bind(method, base::Unretained(instance)); } +template <typename R, typename... Args> +base::Callback<R(Args...)> createBaseCallback(PassOwnPtr<Function<R(Args...)>> functor) +{ + return base::Bind(&internal::CallWTFFunction<R, Args...>, base::Owned(functor.leakPtr())); +} + } // namespace blink namespace mojo { diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp index 83e913c1cda36..2e6a3a947b74e 100644 --- a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp +++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp @@ -166,7 +166,6 @@ #include "modules/screen_orientation/ScreenOrientationController.h" #include "modules/vr/VRController.h" #include "modules/wake_lock/ScreenWakeLock.h" -#include "modules/webusb/USBController.h" #include "platform/ScriptForbiddenScope.h" #include "platform/TraceEvent.h" #include "platform/UserGestureIndicator.h" @@ -1478,10 +1477,6 @@ void WebLocalFrameImpl::setCoreFrame(LocalFrame* frame) provideLocalFileSystemTo(*m_frame, LocalFileSystemClient::create()); provideNavigatorContentUtilsTo(*m_frame, NavigatorContentUtilsClientImpl::create(this)); - // Always provided so that availability of the API can be controlled by - // OriginTrials::webUSBEnabled(). - USBController::provideTo(*m_frame, m_client ? m_client->usbClient() : nullptr); - bool enableWebBluetooth = RuntimeEnabledFeatures::webBluetoothEnabled(); #if OS(CHROMEOS) || OS(ANDROID) enableWebBluetooth = true; diff --git a/third_party/WebKit/public/blink_headers.gypi b/third_party/WebKit/public/blink_headers.gypi index d8f53a3275e86..6fd632923d1c6 100644 --- a/third_party/WebKit/public/blink_headers.gypi +++ b/third_party/WebKit/public/blink_headers.gypi @@ -319,13 +319,6 @@ "platform/modules/websockets/WebSocketHandleClient.h", "platform/modules/websockets/WebSocketHandshakeRequestInfo.h", "platform/modules/websockets/WebSocketHandshakeResponseInfo.h", - "platform/modules/webusb/WebUSBClient.h", - "platform/modules/webusb/WebUSBDeviceFilter.h", - "platform/modules/webusb/WebUSBDevice.h", - "platform/modules/webusb/WebUSBDeviceInfo.h", - "platform/modules/webusb/WebUSBDeviceRequestOptions.h", - "platform/modules/webusb/WebUSBError.h", - "platform/modules/webusb/WebUSBTransferInfo.h", "web/WebAXEnums.h", "web/WebAXObject.h", "web/WebActiveWheelFlingParameters.h", diff --git a/third_party/WebKit/public/platform/modules/webusb/OWNERS b/third_party/WebKit/public/platform/modules/webusb/OWNERS deleted file mode 100644 index b16946a30b707..0000000000000 --- a/third_party/WebKit/public/platform/modules/webusb/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -reillyg@chromium.org -rockot@chromium.org diff --git a/third_party/WebKit/public/platform/modules/webusb/WebUSBClient.h b/third_party/WebKit/public/platform/modules/webusb/WebUSBClient.h deleted file mode 100644 index 2dee386511abc..0000000000000 --- a/third_party/WebKit/public/platform/modules/webusb/WebUSBClient.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef WebUSBClient_h -#define WebUSBClient_h - -#include "public/platform/WebCallbacks.h" -#include "public/platform/WebVector.h" - -namespace blink { - -class WebUSBDevice; -struct WebUSBDeviceRequestOptions; -struct WebUSBError; - -using WebUSBClientGetDevicesCallbacks = WebCallbacks<std::unique_ptr<WebVector<WebUSBDevice*>>, const WebUSBError&>; -using WebUSBClientRequestDeviceCallbacks = WebCallbacks<std::unique_ptr<WebUSBDevice>, const WebUSBError&>; - -class WebUSBClient { -public: - class Observer { - public: - virtual ~Observer() { } - - // Called when a device is connected to the system. - virtual void onDeviceConnected(std::unique_ptr<WebUSBDevice>) = 0; - - // Called when a device is disconnected from the system. - virtual void onDeviceDisconnected(std::unique_ptr<WebUSBDevice>) = 0; - }; - - virtual ~WebUSBClient() { } - - // Enumerates available devices. - // Ownership of the WebUSBClientGetDevicesCallbacks is transferred to the client. - virtual void getDevices(WebUSBClientGetDevicesCallbacks*) = 0; - - // Requests access to a device. - // Ownership of the WebUSBClientRequestDeviceCallbacks is transferred to the client. - virtual void requestDevice(const WebUSBDeviceRequestOptions&, WebUSBClientRequestDeviceCallbacks*) = 0; - - // Adds an observer of device changes to the WebUSBClient. - virtual void addObserver(Observer*) = 0; - - // Removes an observer of device changes from the WebUSBClient. - virtual void removeObserver(Observer*) = 0; -}; - -} // namespace blink - -#endif // WebUSBClient_h diff --git a/third_party/WebKit/public/platform/modules/webusb/WebUSBDevice.h b/third_party/WebKit/public/platform/modules/webusb/WebUSBDevice.h deleted file mode 100644 index 85812aef83e2b..0000000000000 --- a/third_party/WebKit/public/platform/modules/webusb/WebUSBDevice.h +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef WebUSBDevice_h -#define WebUSBDevice_h - -#include "public/platform/WebCallbacks.h" -#include "public/platform/WebVector.h" - -#include <memory> - -namespace blink { - -struct WebUSBDeviceInfo; -struct WebUSBError; -struct WebUSBTransferInfo; - -using WebUSBDeviceOpenCallbacks = WebCallbacks<void, const WebUSBError&>; -using WebUSBDeviceCloseCallbacks = WebCallbacks<void, const WebUSBError&>; -using WebUSBDeviceSetConfigurationCallbacks = WebCallbacks<void, const WebUSBError&>; -using WebUSBDeviceClaimInterfaceCallbacks = WebCallbacks<void, const WebUSBError&>; -using WebUSBDeviceReleaseInterfaceCallbacks = WebCallbacks<void, const WebUSBError&>; -using WebUSBDeviceResetCallbacks = WebCallbacks<void, const WebUSBError&>; -using WebUSBDeviceSetInterfaceAlternateSettingCallbacks = WebCallbacks<void, const WebUSBError&>; -using WebUSBDeviceClearHaltCallbacks = WebCallbacks<void, const WebUSBError&>; -using WebUSBDeviceTransferCallbacks = WebCallbacks<std::unique_ptr<WebUSBTransferInfo>, const WebUSBError&>; - -class WebUSBDevice { -public: - enum class TransferDirection { - In, - Out, - }; - - enum class RequestType { - Standard, - Class, - Vendor, - }; - - enum class RequestRecipient { - Device, - Interface, - Endpoint, - Other, - }; - - struct ControlTransferParameters { - TransferDirection direction; - RequestType type; - RequestRecipient recipient; - uint8_t request; - uint16_t value; - uint16_t index; - }; - - virtual ~WebUSBDevice() { } - - virtual const WebUSBDeviceInfo& info() const = 0; - - // Opens the device. - // Ownership of the WebUSBDeviceOpenCallbacks is transferred to the client. - virtual void open(WebUSBDeviceOpenCallbacks*) = 0; - - // Closes the device. - // Ownership of the WebUSBDeviceCloseCallbacks is transferred to the client. - virtual void close(WebUSBDeviceCloseCallbacks*) = 0; - - // Sets the active configuration for the device. - // Ownership of the WebUSBDeviceSetConfigurationCallbacks is transferred to the client. - virtual void setConfiguration(uint8_t configurationValue, WebUSBDeviceSetConfigurationCallbacks*) = 0; - - // Claims an interface in the active configuration. - // Ownership of the WebUSBDeviceClaimInterfaceCallbacks is transferred to the client. - virtual void claimInterface(uint8_t interfaceNumber, WebUSBDeviceClaimInterfaceCallbacks*) = 0; - - // Releases a claimed interface. - // Ownership of the WebUSBDeviceReleaseInterfaceCallbacks is transferred to the client. - virtual void releaseInterface(uint8_t interfaceNumber, WebUSBDeviceReleaseInterfaceCallbacks*) = 0; - - // Sets the alternate setting of an interface. - // Ownership of the WebUSBDeviceSetInterfaceAlternateSettingCallbacks is transferred to the client. - virtual void setInterface(uint8_t interfaceNumber, uint8_t alternateSetting, WebUSBDeviceSetInterfaceAlternateSettingCallbacks*) = 0; - - // Clears the halt condition on a specific endpoint. - // Ownership of the WebUSBDeviceClearHaltCallbacks is transferred to the client. - virtual void clearHalt(uint8_t endpointNumber, WebUSBDeviceClearHaltCallbacks*) = 0; - - // Initiates a control transfer. - // Ownership of the WebUSBDeviceTransferCallbacks is transferred to the client. - virtual void controlTransfer(const ControlTransferParameters&, uint8_t* data, size_t dataSize, unsigned timeout, WebUSBDeviceTransferCallbacks*) = 0; - - // Initiates a bulk or interrupt transfer. - // Ownership of the WebUSBDeviceTransferCallbacks is transferred to the client. - virtual void transfer(TransferDirection, uint8_t endpointNumber, uint8_t* data, size_t dataSize, unsigned timeout, WebUSBDeviceTransferCallbacks*) = 0; - - // Initiates an isochronous transfer. - // Ownership of the WebUSBDeviceTransferCallbacks is transferred to the client. - virtual void isochronousTransfer(TransferDirection, uint8_t endpointNumber, uint8_t* data, size_t dataSize, WebVector<unsigned> packetLengths, unsigned timeout, WebUSBDeviceTransferCallbacks*) = 0; - - // Resets the device. - // Ownership of the WebUSBDeviceResetCallbacks is transferred to the client. - virtual void reset(WebUSBDeviceResetCallbacks*) = 0; -}; - -} // namespace blink - -#endif // WebUSBDevice_h diff --git a/third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceFilter.h b/third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceFilter.h deleted file mode 100644 index 117cd1c49150b..0000000000000 --- a/third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceFilter.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef WebUSBDeviceFilter_h -#define WebUSBDeviceFilter_h - -#include "public/platform/WebCommon.h" - -namespace blink { - -// Filter which specifies what devices the API consumer wants to enumerate. -// Properties which are not present in a filter should be treated as wildcards. -struct WebUSBDeviceFilter { - WebUSBDeviceFilter() {} - - // Members corresponding to USBDeviceFilter properties specified in the IDL. - uint16_t vendorID; - uint16_t productID; - uint8_t classCode; - uint8_t subclassCode; - uint8_t protocolCode; - - // Presence flags for each of the above properties. - bool hasVendorID : 1; - bool hasProductID : 1; - bool hasClassCode : 1; - bool hasSubclassCode : 1; - bool hasProtocolCode : 1; -}; - -} // namespace blink - -#endif // WebUSBDeviceFilter_h diff --git a/third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceInfo.h b/third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceInfo.h deleted file mode 100644 index c59dd3b15526f..0000000000000 --- a/third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceInfo.h +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef WebUSBDeviceInfo_h -#define WebUSBDeviceInfo_h - -#include "public/platform/WebString.h" -#include "public/platform/WebVector.h" -#include "public/platform/modules/webusb/WebUSBDevice.h" - -namespace blink { - -struct WebUSBDeviceInfo { - struct Endpoint { - enum class Type { - Bulk, - Interrupt, - Isochronous - }; - - Endpoint() - : endpointNumber(0) - , direction(WebUSBDevice::TransferDirection::In) - , type(Type::Bulk) - , packetSize(0) - { - } - - uint8_t endpointNumber; - WebUSBDevice::TransferDirection direction; - Type type; - uint32_t packetSize; - }; - - struct AlternateInterface { - AlternateInterface() - : alternateSetting(0) - , classCode(0) - , subclassCode(0) - , protocolCode(0) - { - } - - uint8_t alternateSetting; - uint8_t classCode; - uint8_t subclassCode; - uint8_t protocolCode; - WebString interfaceName; - WebVector<Endpoint> endpoints; - }; - - struct Interface { - Interface() - : interfaceNumber(0) - { - } - - uint8_t interfaceNumber; - WebVector<AlternateInterface> alternates; - }; - - struct Configuration { - Configuration() - : configurationValue(0) - { - } - - uint8_t configurationValue; - WebString configurationName; - WebVector<Interface> interfaces; - }; - - WebUSBDeviceInfo() - : usbVersionMajor(0) - , usbVersionMinor(0) - , usbVersionSubminor(0) - , deviceClass(0) - , deviceSubclass(0) - , deviceProtocol(0) - , vendorID(0) - , productID(0) - , deviceVersionMajor(0) - , deviceVersionMinor(0) - , deviceVersionSubminor(0) - { - } - - WebString guid; - uint8_t usbVersionMajor; - uint8_t usbVersionMinor; - uint8_t usbVersionSubminor; - uint8_t deviceClass; - uint8_t deviceSubclass; - uint8_t deviceProtocol; - uint16_t vendorID; - uint16_t productID; - uint8_t deviceVersionMajor; - uint8_t deviceVersionMinor; - uint8_t deviceVersionSubminor; - WebString manufacturerName; - WebString productName; - WebString serialNumber; - uint8_t activeConfiguration; - WebVector<Configuration> configurations; -}; - -} // namespace blink - -#endif // WebUSBDeviceInfo_h diff --git a/third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceRequestOptions.h b/third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceRequestOptions.h deleted file mode 100644 index f4165843d8003..0000000000000 --- a/third_party/WebKit/public/platform/modules/webusb/WebUSBDeviceRequestOptions.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef WebUSBDeviceRequestOptions_h -#define WebUSBDeviceRequestOptions_h - -#include "public/platform/WebVector.h" -#include "public/platform/modules/webusb/WebUSBDeviceFilter.h" - -namespace blink { - -// Options which constrain the kind of devices the user is prompted to select. -struct WebUSBDeviceRequestOptions { - WebVector<WebUSBDeviceFilter> filters; -}; - -} // namespace blink - -#endif // WebUSBDeviceRequestOptions_h diff --git a/third_party/WebKit/public/platform/modules/webusb/WebUSBError.h b/third_party/WebKit/public/platform/modules/webusb/WebUSBError.h deleted file mode 100644 index bf45f03f63857..0000000000000 --- a/third_party/WebKit/public/platform/modules/webusb/WebUSBError.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef WebUSBError_h -#define WebUSBError_h - -#include "public/platform/WebString.h" - -namespace blink { - -// Error object used to create DOMExceptions when a Web USB request cannot be -// satisfied. -struct WebUSBError { - enum class Error { - InvalidState, - Network, - NotFound, - Security, - }; - - WebUSBError(Error error, const WebString& message) - : error(error) - , message(message) - { - } - - Error error; - WebString message; -}; - -} // namespace blink - -#endif // WebUSBError_h diff --git a/third_party/WebKit/public/platform/modules/webusb/WebUSBTransferInfo.h b/third_party/WebKit/public/platform/modules/webusb/WebUSBTransferInfo.h deleted file mode 100644 index c31f00ceda110..0000000000000 --- a/third_party/WebKit/public/platform/modules/webusb/WebUSBTransferInfo.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef WebUSBTransferInfo_h -#define WebUSBTransferInfo_h - -#include "public/platform/WebVector.h" - -namespace blink { - -struct WebUSBTransferInfo { - enum class Status { - Ok, - Stall, - Babble, - }; - - WebUSBTransferInfo() - { - } - - // Individual packet statuses. This vector has only one element if this is - // not an isochronous transfer. - WebVector<Status> status; - - // Data received, if this is an inbound transfer. - WebVector<uint8_t> data; - - // Requested length of each packet if this is an inbound isochronous - // transfer. - WebVector<uint32_t> packetLength; - - // Number of bytes written if this is an outbound transfer. This vector has - // only one element if this is not an isochronous transfer otherwise it is - // the number of bytes transferred in each isochronous packet (inbound or - // outbound). - WebVector<uint32_t> bytesTransferred; -}; - -} // namespace blink - -#endif // WebUSBTransferInfo_h diff --git a/third_party/WebKit/public/web/WebFrameClient.h b/third_party/WebKit/public/web/WebFrameClient.h index 44b98051b6cea..a9c516046632e 100644 --- a/third_party/WebKit/public/web/WebFrameClient.h +++ b/third_party/WebKit/public/web/WebFrameClient.h @@ -97,7 +97,6 @@ class WebScreenOrientationClient; class WebString; class WebURL; class WebURLResponse; -class WebUSBClient; class WebUserMediaClient; class WebVRClient; class WebWorkerContentSettingsClientProxy; @@ -710,9 +709,6 @@ public: // Bluetooth ----------------------------------------------------------- virtual WebBluetooth* bluetooth() { return 0; } - // WebUSB -------------------------------------------------------------- - virtual WebUSBClient* usbClient() { return nullptr; } - // Audio Output Devices API --------------------------------------------