Commit 3277cf07 authored by Reilly Grant's avatar Reilly Grant Committed by Commit Bot

Add USBDeviceRequestEvent to WebUSB Test API polyfill

This event is fired when the navigator.usb.requestDevice() method is
called and allows us to remove the navigator.usb.test.lastFilters and
navigator.usb.test.chosenDevice attributes which may be more difficult
for other implementations to support.

https: //github.com/WICG/webusb/pull/98
Change-Id: I122b3512f12b68bb36fee6d9e9abc2a4d11c5ea0
Reviewed-on: https://chromium-review.googlesource.com/530091
Commit-Queue: Reilly Grant <reillyg@chromium.org>
Reviewed-by: default avatarJeffrey Yasskin <jyasskin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#490821}
parent 72e361be
......@@ -379,31 +379,46 @@ class FakeDeviceManager {
}
}
class USBDeviceRequestEvent {
constructor(deviceFilters, resolve) {
this.filters = convertMojoDeviceFilters(deviceFilters);
this.resolveFunc_ = resolve;
}
respondWith(value) {
// Wait until |value| resolves (if it is a Promise). This function returns
// no value.
Promise.resolve(value).then(fakeDevice => {
let device = internal.deviceManager.devices_.get(fakeDevice);
let result = null;
if (device) {
result = fakeDeviceInitToDeviceInfo(device.guid, device.info);
}
this.resolveFunc_({ result: result });
}, () => {
this.resolveFunc_({ result: null });
});
}
}
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 });
}
return new Promise(resolve => {
if (navigator.usb.test.onrequestdevice) {
navigator.usb.test.onrequestdevice(
new USBDeviceRequestEvent(deviceFilters, resolve));
} else {
resolve({ result: null });
}
});
}
}
......@@ -438,7 +453,9 @@ class CrossFrameHandleProxy {
}
class USBTest {
constructor() {}
constructor() {
this.onrequestdevice = undefined;
}
initialize() {
if (internal.initialized)
......@@ -499,20 +516,6 @@ class USBTest {
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().');
......@@ -522,7 +525,6 @@ class USBTest {
return new Promise(resolve => {
setTimeout(() => {
internal.deviceManager.removeAllDevices();
internal.chooser.setChosenDevice(null);
resolve();
}, 0);
});
......
......@@ -50,7 +50,10 @@ usb_test(() => {
usb_test(() => {
return getFakeDevice().then(({ device, fakeDevice }) => {
navigator.usb.test.chosenDevice = fakeDevice;
navigator.usb.test.onrequestdevice = event => {
navigator.usb.test.onrequestdevice = undefined;
event.respondWith(fakeDevice);
}
return callWithTrustedClick(() => {
return navigator.usb.requestDevice({ filters: [] }).then(chosenDevice => {
assert_equals(chosenDevice, device);
......@@ -61,7 +64,10 @@ usb_test(() => {
usb_test(() => {
return getFakeDevice().then(({ device, fakeDevice }) => {
navigator.usb.test.chosenDevice = fakeDevice;
navigator.usb.test.onrequestdevice = event => {
navigator.usb.test.onrequestdevice = undefined;
event.respondWith(fakeDevice);
}
return callWithTrustedClick(() => {
return navigator.usb.requestDevice({ filters: [] }).then(chosenDevice => {
assert_equals(chosenDevice, device);
......@@ -80,6 +86,17 @@ usb_test(() => {
{ vendorId: 5678, productId: 0xF00F }
];
navigator.usb.test.onrequestdevice = event => {
navigator.usb.test.onrequestdevice = undefined;
assert_equals(event.filters.length, expectedFilters.length);
for (var i = 0; i < event.filters.length; ++i) {
assert_object_equals(event.filters[i], expectedFilters[i]);
}
event.respondWith(null);
}
return callWithTrustedClick(() => {
return navigator.usb.requestDevice({ filters: expectedFilters })
.then(device => {
......@@ -87,10 +104,6 @@ usb_test(() => {
})
.catch(error => {
assert_equals(error.code, DOMException.NOT_FOUND_ERR);
let actualFilters = navigator.usb.test.lastFilters;
assert_equals(actualFilters.length, expectedFilters.length);
for (var i = 0; i < actualFilters.length; ++i)
assert_object_equals(actualFilters[i], expectedFilters[i]);
});
});
}, 'filters are sent correctly');
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment