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 { ...@@ -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 { class FakeChooserService {
constructor() { constructor() {
this.bindingSet_ = new mojo.BindingSet(device.mojom.UsbChooserService); this.bindingSet_ = new mojo.BindingSet(device.mojom.UsbChooserService);
this.chosenDevice_ = null;
this.lastFilters_ = null;
} }
addBinding(handle) { addBinding(handle) {
this.bindingSet_.addBinding(this, handle); this.bindingSet_.addBinding(this, handle);
} }
setChosenDevice(fakeDevice) {
this.chosenDevice_ = fakeDevice;
}
getPermission(deviceFilters) { getPermission(deviceFilters) {
this.lastFilters_ = convertMojoDeviceFilters(deviceFilters); return new Promise(resolve => {
let device = internal.deviceManager.devices_.get(this.chosenDevice_); if (navigator.usb.test.onrequestdevice) {
if (device) { navigator.usb.test.onrequestdevice(
return Promise.resolve({ new USBDeviceRequestEvent(deviceFilters, resolve));
result: fakeDeviceInitToDeviceInfo(device.guid, device.info) } else {
}); resolve({ result: null });
} else { }
return Promise.resolve({ result: null }); });
}
} }
} }
...@@ -438,7 +453,9 @@ class CrossFrameHandleProxy { ...@@ -438,7 +453,9 @@ class CrossFrameHandleProxy {
} }
class USBTest { class USBTest {
constructor() {} constructor() {
this.onrequestdevice = undefined;
}
initialize() { initialize() {
if (internal.initialized) if (internal.initialized)
...@@ -499,20 +516,6 @@ class USBTest { ...@@ -499,20 +516,6 @@ class USBTest {
return fakeDevice; 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() { reset() {
if (!internal.initialized) if (!internal.initialized)
throw new Error('Call initialize() before reset().'); throw new Error('Call initialize() before reset().');
...@@ -522,7 +525,6 @@ class USBTest { ...@@ -522,7 +525,6 @@ class USBTest {
return new Promise(resolve => { return new Promise(resolve => {
setTimeout(() => { setTimeout(() => {
internal.deviceManager.removeAllDevices(); internal.deviceManager.removeAllDevices();
internal.chooser.setChosenDevice(null);
resolve(); resolve();
}, 0); }, 0);
}); });
......
...@@ -50,7 +50,10 @@ usb_test(() => { ...@@ -50,7 +50,10 @@ usb_test(() => {
usb_test(() => { usb_test(() => {
return getFakeDevice().then(({ device, fakeDevice }) => { 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 callWithTrustedClick(() => {
return navigator.usb.requestDevice({ filters: [] }).then(chosenDevice => { return navigator.usb.requestDevice({ filters: [] }).then(chosenDevice => {
assert_equals(chosenDevice, device); assert_equals(chosenDevice, device);
...@@ -61,7 +64,10 @@ usb_test(() => { ...@@ -61,7 +64,10 @@ usb_test(() => {
usb_test(() => { usb_test(() => {
return getFakeDevice().then(({ device, fakeDevice }) => { 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 callWithTrustedClick(() => {
return navigator.usb.requestDevice({ filters: [] }).then(chosenDevice => { return navigator.usb.requestDevice({ filters: [] }).then(chosenDevice => {
assert_equals(chosenDevice, device); assert_equals(chosenDevice, device);
...@@ -80,6 +86,17 @@ usb_test(() => { ...@@ -80,6 +86,17 @@ usb_test(() => {
{ vendorId: 5678, productId: 0xF00F } { 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 callWithTrustedClick(() => {
return navigator.usb.requestDevice({ filters: expectedFilters }) return navigator.usb.requestDevice({ filters: expectedFilters })
.then(device => { .then(device => {
...@@ -87,10 +104,6 @@ usb_test(() => { ...@@ -87,10 +104,6 @@ usb_test(() => {
}) })
.catch(error => { .catch(error => {
assert_equals(error.code, DOMException.NOT_FOUND_ERR); 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'); }, '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