| Index: third_party/WebKit/LayoutTests/usb/resources/webusb-test-impl.js
|
| diff --git a/third_party/WebKit/LayoutTests/usb/resources/webusb-test-impl.js b/third_party/WebKit/LayoutTests/usb/resources/webusb-test-impl.js
|
| deleted file mode 100644
|
| index 97eac819978f9047667058d100a1b55475caf501..0000000000000000000000000000000000000000
|
| --- a/third_party/WebKit/LayoutTests/usb/resources/webusb-test-impl.js
|
| +++ /dev/null
|
| @@ -1,519 +0,0 @@
|
| -'use strict';
|
| -
|
| -// This polyfill library implements the WebUSB Test API as specified here:
|
| -// https://wicg.github.io/webusb/test/
|
| -
|
| -(() => {
|
| -
|
| -// These variables are logically members of the USBTest class but are defined
|
| -// here to hide them from being visible as fields of navigator.usb.test.
|
| -let internal = {
|
| - intialized: false,
|
| -
|
| - deviceManager: null,
|
| - deviceManagerInterceptor: null,
|
| - deviceManagerCrossFrameProxy: null,
|
| -
|
| - chooser: null,
|
| - chooserInterceptor: null,
|
| - chooserCrossFrameProxy: null,
|
| -};
|
| -
|
| -function fakeDeviceInitToDeviceInfo(guid, init) {
|
| - let deviceInfo = {
|
| - guid: guid + "",
|
| - usbVersionMajor: init.usbVersionMajor,
|
| - usbVersionMinor: init.usbVersionMinor,
|
| - usbVersionSubminor: init.usbVersionSubminor,
|
| - classCode: init.deviceClass,
|
| - subclassCode: init.deviceSubclass,
|
| - protocolCode: init.deviceProtocol,
|
| - vendorId: init.vendorId,
|
| - productId: init.productId,
|
| - deviceVersionMajor: init.deviceVersionMajor,
|
| - deviceVersionMinor: init.deviceVersionMinor,
|
| - deviceVersionSubminor: init.deviceVersionSubminor,
|
| - manufacturerName: init.manufacturerName,
|
| - productName: init.productName,
|
| - serialNumber: init.serialNumber,
|
| - activeConfiguration: init.activeConfigurationValue,
|
| - configurations: []
|
| - };
|
| - init.configurations.forEach(config => {
|
| - var configInfo = {
|
| - configurationValue: config.configurationValue,
|
| - configurationName: config.configurationName,
|
| - interfaces: []
|
| - };
|
| - config.interfaces.forEach(iface => {
|
| - var interfaceInfo = {
|
| - interfaceNumber: iface.interfaceNumber,
|
| - alternates: []
|
| - };
|
| - iface.alternates.forEach(alternate => {
|
| - var alternateInfo = {
|
| - alternateSetting: alternate.alternateSetting,
|
| - classCode: alternate.interfaceClass,
|
| - subclassCode: alternate.interfaceSubclass,
|
| - protocolCode: alternate.interfaceProtocol,
|
| - interfaceName: alternate.interfaceName,
|
| - endpoints: []
|
| - };
|
| - alternate.endpoints.forEach(endpoint => {
|
| - var endpointInfo = {
|
| - endpointNumber: endpoint.endpointNumber,
|
| - packetSize: endpoint.packetSize,
|
| - };
|
| - switch (endpoint.direction) {
|
| - case "in":
|
| - endpointInfo.direction = device.mojom.UsbTransferDirection.INBOUND;
|
| - break;
|
| - case "out":
|
| - endpointInfo.direction = device.mojom.UsbTransferDirection.OUTBOUND;
|
| - break;
|
| - }
|
| - switch (endpoint.type) {
|
| - case "bulk":
|
| - endpointInfo.type = device.mojom.UsbTransferType.BULK;
|
| - break;
|
| - case "interrupt":
|
| - endpointInfo.type = device.mojom.UsbTransferType.INTERRUPT;
|
| - break;
|
| - case "isochronous":
|
| - endpointInfo.type = device.mojom.UsbTransferType.ISOCHRONOUS;
|
| - break;
|
| - }
|
| - alternateInfo.endpoints.push(endpointInfo);
|
| - });
|
| - interfaceInfo.alternates.push(alternateInfo);
|
| - });
|
| - configInfo.interfaces.push(interfaceInfo);
|
| - });
|
| - deviceInfo.configurations.push(configInfo);
|
| - });
|
| - return deviceInfo;
|
| -}
|
| -
|
| -function convertMojoDeviceFilters(input) {
|
| - let output = [];
|
| - input.forEach(filter => {
|
| - output.push(convertMojoDeviceFilter(filter));
|
| - });
|
| - return output;
|
| -}
|
| -
|
| -function convertMojoDeviceFilter(input) {
|
| - let output = {};
|
| - if (input.hasVendorId)
|
| - output.vendorId = input.vendorId;
|
| - if (input.hasProductId)
|
| - output.productId = input.productId;
|
| - if (input.hasClassCode)
|
| - output.classCode = input.classCode;
|
| - if (input.hasSubclassCode)
|
| - output.subclassCode = input.subclassCode;
|
| - if (input.hasProtocolCode)
|
| - output.protocolCode = input.protocolCode;
|
| - if (input.serialNumber)
|
| - output.serialNumber = input.serialNumber;
|
| - return output;
|
| -}
|
| -
|
| -class FakeDevice {
|
| - constructor(deviceInit) {
|
| - this.info_ = deviceInit;
|
| - this.opened_ = false;
|
| - this.currentConfiguration_ = null;
|
| - this.claimedInterfaces_ = new Map();
|
| - }
|
| -
|
| - getConfiguration() {
|
| - if (this.currentConfiguration_) {
|
| - return Promise.resolve({
|
| - value: this.currentConfiguration_.configurationValue });
|
| - } else {
|
| - return Promise.resolve({ value: 0 });
|
| - }
|
| - }
|
| -
|
| - open() {
|
| - assert_false(this.opened_);
|
| - this.opened_ = true;
|
| - return Promise.resolve({ error: device.mojom.UsbOpenDeviceError.OK });
|
| - }
|
| -
|
| - close() {
|
| - assert_true(this.opened_);
|
| - this.opened_ = false;
|
| - return Promise.resolve();
|
| - }
|
| -
|
| - setConfiguration(value) {
|
| - assert_true(this.opened_);
|
| -
|
| - let selectedConfiguration = this.info_.configurations.find(
|
| - configuration => configuration.configurationValue == value);
|
| - // Blink should never request an invalid configuration.
|
| - assert_not_equals(selectedConfiguration, undefined);
|
| - this.currentConfiguration_ = selectedConfiguration;
|
| - return Promise.resolve({ success: true });
|
| - }
|
| -
|
| - claimInterface(interfaceNumber) {
|
| - assert_true(this.opened_);
|
| - assert_false(this.currentConfiguration_ == null, 'device configured');
|
| - assert_false(this.claimedInterfaces_.has(interfaceNumber),
|
| - 'interface already claimed');
|
| -
|
| - // Blink should never request an invalid interface.
|
| - assert_true(this.currentConfiguration_.interfaces.some(
|
| - iface => iface.interfaceNumber == interfaceNumber));
|
| - this.claimedInterfaces_.set(interfaceNumber, 0);
|
| - return Promise.resolve({ success: true });
|
| - }
|
| -
|
| - releaseInterface(interfaceNumber) {
|
| - assert_true(this.opened_);
|
| - assert_false(this.currentConfiguration_ == null, 'device configured');
|
| - assert_true(this.claimedInterfaces_.has(interfaceNumber));
|
| - this.claimedInterfaces_.delete(interfaceNumber);
|
| - return Promise.resolve({ success: true });
|
| - }
|
| -
|
| - setInterfaceAlternateSetting(interfaceNumber, alternateSetting) {
|
| - assert_true(this.opened_);
|
| - assert_false(this.currentConfiguration_ == null, 'device configured');
|
| - assert_true(this.claimedInterfaces_.has(interfaceNumber));
|
| -
|
| - let iface = this.currentConfiguration_.interfaces.find(
|
| - iface => iface.interfaceNumber == interfaceNumber);
|
| - // Blink should never request an invalid interface or alternate.
|
| - assert_false(iface == undefined);
|
| - assert_true(iface.alternates.some(
|
| - x => x.alternateSetting == alternateSetting));
|
| - this.claimedInterfaces_.set(interfaceNumber, alternateSetting);
|
| - return Promise.resolve({ success: true });
|
| - }
|
| -
|
| - reset() {
|
| - assert_true(this.opened_);
|
| - return Promise.resolve({ success: true });
|
| - }
|
| -
|
| - clearHalt(endpoint) {
|
| - assert_true(this.opened_);
|
| - assert_false(this.currentConfiguration_ == null, 'device configured');
|
| - // TODO(reillyg): Assert that endpoint is valid.
|
| - return Promise.resolve({ success: true });
|
| - }
|
| -
|
| - controlTransferIn(params, length, timeout) {
|
| - assert_true(this.opened_);
|
| - assert_false(this.currentConfiguration_ == null, 'device configured');
|
| - return Promise.resolve({
|
| - status: device.mojom.UsbTransferStatus.OK,
|
| - data: [length >> 8, length & 0xff, params.request, params.value >> 8,
|
| - params.value & 0xff, params.index >> 8, params.index & 0xff]
|
| - });
|
| - }
|
| -
|
| - controlTransferOut(params, data, timeout) {
|
| - assert_true(this.opened_);
|
| - assert_false(this.currentConfiguration_ == null, 'device configured');
|
| - return Promise.resolve({
|
| - status: device.mojom.UsbTransferStatus.OK,
|
| - bytesWritten: data.byteLength
|
| - });
|
| - }
|
| -
|
| - genericTransferIn(endpointNumber, length, timeout) {
|
| - assert_true(this.opened_);
|
| - assert_false(this.currentConfiguration_ == null, 'device configured');
|
| - // TODO(reillyg): Assert that endpoint is valid.
|
| - let data = new Array(length);
|
| - for (let i = 0; i < length; ++i)
|
| - data[i] = i & 0xff;
|
| - return Promise.resolve({
|
| - status: device.mojom.UsbTransferStatus.OK,
|
| - data: data
|
| - });
|
| - }
|
| -
|
| - genericTransferOut(endpointNumber, data, timeout) {
|
| - assert_true(this.opened_);
|
| - assert_false(this.currentConfiguration_ == null, 'device configured');
|
| - // TODO(reillyg): Assert that endpoint is valid.
|
| - return Promise.resolve({
|
| - status: device.mojom.UsbTransferStatus.OK,
|
| - bytesWritten: data.byteLength
|
| - });
|
| - }
|
| -
|
| - isochronousTransferIn(endpointNumber, packetLengths, timeout) {
|
| - assert_true(this.opened_);
|
| - assert_false(this.currentConfiguration_ == null, 'device configured');
|
| - // TODO(reillyg): Assert that endpoint is valid.
|
| - let data = new Array(packetLengths.reduce((a, b) => a + b, 0));
|
| - let dataOffset = 0;
|
| - let packets = new Array(packetLengths.length);
|
| - for (let i = 0; i < packetLengths.length; ++i) {
|
| - for (let j = 0; j < packetLengths[i]; ++j)
|
| - data[dataOffset++] = j & 0xff;
|
| - packets[i] = {
|
| - length: packetLengths[i],
|
| - transferredLength: packetLengths[i],
|
| - status: device.mojom.UsbTransferStatus.OK
|
| - };
|
| - }
|
| - return Promise.resolve({ data: data, packets: packets });
|
| - }
|
| -
|
| - isochronousTransferOut(endpointNumber, data, packetLengths, timeout) {
|
| - assert_true(this.opened_);
|
| - assert_false(this.currentConfiguration_ == null, 'device configured');
|
| - // TODO(reillyg): Assert that endpoint is valid.
|
| - let packets = new Array(packetLengths.length);
|
| - for (let i = 0; i < packetLengths.length; ++i) {
|
| - packets[i] = {
|
| - length: packetLengths[i],
|
| - transferredLength: packetLengths[i],
|
| - status: device.mojom.UsbTransferStatus.OK
|
| - };
|
| - }
|
| - return Promise.resolve({ packets: packets });
|
| - }
|
| -}
|
| -
|
| -class FakeDeviceManager {
|
| - constructor() {
|
| - this.bindingSet_ = new mojo.BindingSet(device.mojom.UsbDeviceManager);
|
| - this.devices_ = new Map();
|
| - this.devicesByGuid_ = new Map();
|
| - this.client_ = null;
|
| - this.nextGuid_ = 0;
|
| - }
|
| -
|
| - addBinding(handle) {
|
| - this.bindingSet_.addBinding(this, handle);
|
| - }
|
| -
|
| - addDevice(fakeDevice, info) {
|
| - let device = {
|
| - fakeDevice: fakeDevice,
|
| - guid: (this.nextGuid_++).toString(),
|
| - info: info,
|
| - bindingArray: []
|
| - };
|
| - this.devices_.set(fakeDevice, device);
|
| - this.devicesByGuid_.set(device.guid, device);
|
| - if (this.client_)
|
| - this.client_.onDeviceAdded(fakeDeviceInitToDeviceInfo(device.guid, info));
|
| - }
|
| -
|
| - removeDevice(fakeDevice) {
|
| - let device = this.devices_.get(fakeDevice);
|
| - if (!device)
|
| - throw new Error('Cannot remove unknown device.');
|
| -
|
| - for (var binding of device.bindingArray)
|
| - binding.close();
|
| - this.devices_.delete(device.fakeDevice);
|
| - this.devicesByGuid_.delete(device.guid);
|
| - if (this.client_) {
|
| - this.client_.onDeviceRemoved(
|
| - fakeDeviceInitToDeviceInfo(device.guid, device.info));
|
| - }
|
| - }
|
| -
|
| - removeAllDevices() {
|
| - this.devices_.forEach(device => {
|
| - for (var binding of device.bindingArray)
|
| - binding.close();
|
| - this.client_.onDeviceRemoved(
|
| - fakeDeviceInitToDeviceInfo(device.guid, device.info));
|
| - });
|
| - this.devices_.clear();
|
| - this.devicesByGuid_.clear();
|
| - }
|
| -
|
| - getDevices(options) {
|
| - let devices = [];
|
| - this.devices_.forEach(device => {
|
| - devices.push(fakeDeviceInitToDeviceInfo(device.guid, device.info));
|
| - });
|
| - return Promise.resolve({ results: devices });
|
| - }
|
| -
|
| - getDevice(guid, request) {
|
| - let device = this.devicesByGuid_.get(guid);
|
| - if (device) {
|
| - let binding = new mojo.Binding(
|
| - window.device.mojom.UsbDevice, new FakeDevice(device.info), request);
|
| - binding.setConnectionErrorHandler(() => {
|
| - if (device.fakeDevice.onclose)
|
| - device.fakeDevice.onclose();
|
| - });
|
| - device.bindingArray.push(binding);
|
| - } else {
|
| - request.close();
|
| - }
|
| - }
|
| -
|
| - setClient(client) {
|
| - this.client_ = client;
|
| - }
|
| -}
|
| -
|
| -class FakeChooserService {
|
| - constructor() {
|
| - this.bindingSet_ = new mojo.BindingSet(device.mojom.UsbChooserService);
|
| - this.chosenDevice_ = null;
|
| - this.lastFilters_ = null;
|
| - }
|
| -
|
| - addBinding(handle) {
|
| - this.bindingSet_.addBinding(this, handle);
|
| - }
|
| -
|
| - setChosenDevice(fakeDevice) {
|
| - this.chosenDevice_ = fakeDevice;
|
| - }
|
| -
|
| - getPermission(deviceFilters) {
|
| - this.lastFilters_ = convertMojoDeviceFilters(deviceFilters);
|
| - let device = internal.deviceManager.devices_.get(this.chosenDevice_);
|
| - if (device) {
|
| - return Promise.resolve({
|
| - result: fakeDeviceInitToDeviceInfo(device.guid, device.info)
|
| - });
|
| - } else {
|
| - return Promise.resolve({ result: null });
|
| - }
|
| - }
|
| -}
|
| -
|
| -// Unlike FakeDevice this class is exported to callers of USBTest.addFakeDevice.
|
| -class FakeUSBDevice {
|
| - constructor() {
|
| - this.onclose = null;
|
| - }
|
| -
|
| - disconnect() {
|
| - setTimeout(() => internal.deviceManager.removeDevice(this), 0);
|
| - }
|
| -}
|
| -
|
| -// A helper for forwarding MojoHandle instances from one frame to another.
|
| -class CrossFrameHandleProxy {
|
| - constructor(callback) {
|
| - let {handle0, handle1} = Mojo.createMessagePipe();
|
| - this.sender_ = handle0;
|
| - this.receiver_ = handle1;
|
| - this.receiver_.watch({readable: true}, () => {
|
| - let message = this.receiver_.readMessage();
|
| - assert_equals(message.buffer.byteLength, 0);
|
| - assert_equals(message.handles.length, 1);
|
| - callback(message.handles[0]);
|
| - });
|
| - }
|
| -
|
| - forwardHandle(handle) {
|
| - this.sender_.writeMessage(new ArrayBuffer, [handle]);
|
| - }
|
| -}
|
| -
|
| -class USBTest {
|
| - constructor() {}
|
| -
|
| - initialize() {
|
| - if (internal.initialized)
|
| - return Promise.resolve();
|
| -
|
| - internal.deviceManager = new FakeDeviceManager();
|
| - internal.deviceManagerInterceptor =
|
| - new MojoInterfaceInterceptor(device.mojom.UsbDeviceManager.name);
|
| - internal.deviceManagerInterceptor.oninterfacerequest =
|
| - e => internal.deviceManager.addBinding(e.handle);
|
| - internal.deviceManagerInterceptor.start();
|
| - internal.deviceManagerCrossFrameProxy = new CrossFrameHandleProxy(
|
| - handle => internal.deviceManager.addBinding(handle));
|
| -
|
| - internal.chooser = new FakeChooserService();
|
| - internal.chooserInterceptor =
|
| - new MojoInterfaceInterceptor(device.mojom.UsbChooserService.name);
|
| - internal.chooserInterceptor.oninterfacerequest =
|
| - e => internal.chooser.addBinding(e.handle);
|
| - internal.chooserInterceptor.start();
|
| - internal.chooserCrossFrameProxy = new CrossFrameHandleProxy(
|
| - handle => internal.chooser.addBinding(handle));
|
| -
|
| - internal.initialized = true;
|
| - return Promise.resolve();
|
| - }
|
| -
|
| - attachToWindow(otherWindow) {
|
| - if (!internal.initialized)
|
| - throw new Error('Call initialize() before attachToWindow().');
|
| -
|
| - otherWindow.deviceManagerInterceptor =
|
| - new otherWindow.MojoInterfaceInterceptor(
|
| - device.mojom.UsbDeviceManager.name);
|
| - otherWindow.deviceManagerInterceptor.oninterfacerequest =
|
| - e => internal.deviceManagerCrossFrameProxy.forwardHandle(e.handle);
|
| - otherWindow.deviceManagerInterceptor.start();
|
| -
|
| - otherWindow.chooserInterceptor =
|
| - new otherWindow.MojoInterfaceInterceptor(
|
| - device.mojom.UsbChooserService.name);
|
| - otherWindow.chooserInterceptor.oninterfacerequest =
|
| - e => internal.chooserCrossFrameProxy.forwardHandle(e.handle);
|
| - otherWindow.chooserInterceptor.start();
|
| - return Promise.resolve();
|
| - }
|
| -
|
| - addFakeDevice(deviceInit) {
|
| - if (!internal.initialized)
|
| - throw new Error('Call initialize() before addFakeDevice().');
|
| -
|
| - // |addDevice| and |removeDevice| are called in a setTimeout callback so
|
| - // that tests do not rely on the device being immediately available which
|
| - // may not be true for all implementations of this test API.
|
| - let fakeDevice = new FakeUSBDevice();
|
| - setTimeout(
|
| - () => internal.deviceManager.addDevice(fakeDevice, deviceInit), 0);
|
| - return fakeDevice;
|
| - }
|
| -
|
| - set chosenDevice(fakeDevice) {
|
| - if (!internal.initialized)
|
| - throw new Error('Call initialize() before setting chosenDevice.');
|
| -
|
| - internal.chooser.setChosenDevice(fakeDevice);
|
| - }
|
| -
|
| - get lastFilters() {
|
| - if (!internal.initialized)
|
| - throw new Error('Call initialize() before getting lastFilters.');
|
| -
|
| - return internal.chooser.lastFilters_;
|
| - }
|
| -
|
| - reset() {
|
| - if (!internal.initialized)
|
| - throw new Error('Call initialize() before reset().');
|
| -
|
| - // Reset the mocks in a setTimeout callback so that tests do not rely on
|
| - // the fact that this polyfill can do this synchronously.
|
| - return new Promise(resolve => {
|
| - setTimeout(() => {
|
| - internal.deviceManager.removeAllDevices();
|
| - internal.chooser.setChosenDevice(null);
|
| - resolve();
|
| - }, 0);
|
| - });
|
| - }
|
| -}
|
| -
|
| -navigator.usb.test = new USBTest();
|
| -
|
| -})();
|
|
|