Commit 89102421 authored by Ovidio Henriquez's avatar Ovidio Henriquez Committed by Commit Bot

Reland "Multi-global WebUSB WPT for window and worker"

This is a reland of 1ff37758

Original change's description:
> Multi-global WebUSB WPT for window and worker
>
> This change updates the existing web platform tests for WebUSB to use
> multi-global tests to test the API in the supported contexts. The
> change updates the following tests:
> * idlharness
> * usb
> * usbConnectionEvent
>
> Bug: 841510
> Change-Id: I6b118aa4121109cd6a48054c2ebc69b831660afc
> Reviewed-on: https://chromium-review.googlesource.com/1087209
> Reviewed-by: Reilly Grant <reillyg@chromium.org>
> Commit-Queue: Ovidio Henriquez <odejesush@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#564981}

Bug: 841510
Change-Id: Ie354fdd54a4cd94a4801ee634c8d3263e0aa6e93
Reviewed-on: https://chromium-review.googlesource.com/1089647
Commit-Queue: Ovidio Henriquez <odejesush@chromium.org>
Reviewed-by: default avatarChong Zhang <chongz@chromium.org>
Reviewed-by: default avatarReilly Grant <reillyg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#567290}
parent 1ae77fba
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
// META: script=/webusb/resources/fake-devices.js
// META: script=/webusb/resources/usb-helpers.js
// META: global=sharedworker
'use strict'; 'use strict';
importScripts('/resources/testharness.js');
importScripts('/resources/WebIDLParser.js');
importScripts('/resources/idlharness.js');
importScripts('/webusb/resources/fake-devices.js');
importScripts('/webusb/resources/usb-helpers.js');
// Object instances used by the IDL test. // Object instances used by the IDL test.
var usbDevice; var usbDevice;
...@@ -37,8 +37,13 @@ usb_test(async () => { ...@@ -37,8 +37,13 @@ usb_test(async () => {
usbConnectionEvent = usbConnectionEvent =
new USBConnectionEvent('connect', { device: usbDevice }) new USBConnectionEvent('connect', { device: usbDevice })
if (self.GLOBAL.isWindow()) {
idl_array.add_objects({ Navigator: ['navigator'] });
} else if (self.GLOBAL.isWorker()) {
idl_array.add_objects({ WorkerNavigator: ['navigator'] });
}
idl_array.add_objects({ idl_array.add_objects({
WorkerNavigator: ['navigator'],
USB: ['navigator.usb'], USB: ['navigator.usb'],
USBAlternateInterface: ['usbAlternateInterface'], USBAlternateInterface: ['usbAlternateInterface'],
USBConfiguration: ['usbConfiguration'], USBConfiguration: ['usbConfiguration'],
...@@ -55,6 +60,6 @@ usb_test(async () => { ...@@ -55,6 +60,6 @@ usb_test(async () => {
}); });
idl_array.test(); idl_array.test();
}, 'WebUSB on Workers IDL test'); }, 'WebUSB IDL test');
done(); done();
This is a testharness.js-based test. This is a testharness.js-based test.
PASS WebUSB on Workers IDL test PASS WebUSB IDL test
PASS Partial interface Navigator: original interface defined PASS Partial interface Navigator: original interface defined
PASS Partial interface Navigator: valid exposure set PASS Partial interface Navigator: valid exposure set
PASS Partial interface WorkerNavigator: original interface defined PASS Partial interface WorkerNavigator: original interface defined
......
This is a testharness.js-based test. This is a testharness.js-based test.
PASS WebUSB on Workers IDL test PASS WebUSB IDL test
PASS Partial interface Navigator: original interface defined PASS Partial interface Navigator: original interface defined
PASS Partial interface Navigator: valid exposure set PASS Partial interface Navigator: valid exposure set
PASS Partial interface WorkerNavigator: original interface defined PASS Partial interface WorkerNavigator: original interface defined
......
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8>
<title>WebUSB IDL test</title>
<link rel="help" href="https://wicg.github.io/webusb/">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/resources/WebIDLParser.js></script>
<script src=/resources/idlharness.js></script>
<script src=resources/fake-devices.js></script>
<script src=resources/usb-helpers.js></script>
</head>
<body>
<script>
'use strict';
// Object instances used by the IDL test.
var usbDevice;
var usbConfiguration;
var usbInterface;
var usbAlternateInterface;
var usbEndpoint;
var usbConnectionEvent;
usb_test(async () => {
const idl = await fetch('/interfaces/webusb.idl').then(r => r.text());
const html = await fetch('/interfaces/html.idl').then(r => r.text());
const dom = await fetch('/interfaces/dom.idl').then(r => r.text());
const idl_array = new IdlArray();
idl_array.add_idls(idl);
idl_array.add_dependency_idls(html);
idl_array.add_dependency_idls(dom);
// Untested IDL interfaces
idl_array.add_untested_idls('dictionary PermissionDescriptor {};');
idl_array.add_untested_idls('interface PermissionStatus {};');
let {device} = await getFakeDevice();
usbDevice = device;
usbConfiguration = usbDevice.configurations[0];
usbInterface = usbConfiguration.interfaces[0];
usbAlternateInterface = usbInterface.alternates[0];
usbEndpoint = usbAlternateInterface.endpoints[0];
usbConnectionEvent =
new USBConnectionEvent('connect', { device: usbDevice })
idl_array.add_objects({
Navigator: ['navigator'],
USB: ['navigator.usb'],
USBAlternateInterface: ['usbAlternateInterface'],
USBConfiguration: ['usbConfiguration'],
USBConnectionEvent: ['usbConnectionEvent'],
USBDevice: ['usbDevice'],
USBEndpoint: ['usbEndpoint'],
USBInterface: ['usbInterface'],
USBInTransferResult: ['new USBInTransferResult("ok")'],
USBOutTransferResult: ['new USBOutTransferResult("ok")'],
USBIsochronousInTransferResult: ['new USBIsochronousInTransferResult([])'],
USBIsochronousOutTransferResult: ['new USBIsochronousOutTransferResult([])'],
USBIsochronousInTransferPacket: ['new USBIsochronousInTransferPacket("ok")'],
USBIsochronousOutTransferPacket: ['new USBIsochronousOutTransferPacket("ok")'],
});
idl_array.test();
}, 'WebUSB IDL test');
</script>
</body>
</html>
// META: script=/webusb/resources/fake-devices.js
// META: script=/webusb/resources/usb-helpers.js
// META: global=sharedworker
'use strict'; 'use strict';
importScripts('/resources/testharness.js');
importScripts('/webusb/resources/fake-devices.js');
importScripts('/webusb/resources/usb-helpers.js');
let usbDevice, devicesFirstTime, fakeDevice, removedDevice; let usbDevice, devicesFirstTime, fakeDevice, removedDevice;
test(() => {
assert_true(navigator.usb instanceof USB,
'navigator.usb should be defined as a USB object');
assert_true(navigator.usb.getDevices instanceof Function,
'navigator.usb.getDevices should be defined as a function');
assert_equals(typeof navigator.usb.requestDevice, 'undefined',
'navigator.usb.requestDevice should not be defined');
}, 'Web workers should have the WebUSB API exposed as defined in the spec.');
usb_test(() => getFakeDevice() usb_test(() => getFakeDevice()
.then(_ => usbDevice = _.device) .then(_ => usbDevice = _.device)
.then(() => navigator.usb.getDevices()) .then(() => navigator.usb.getDevices())
......
<!DOCTYPE html> // META: script=/resources/testdriver.js
<script src="/resources/testharness.js"></script> // META: script=/resources/testdriver-vendor.js
<script src="/resources/testharnessreport.js"></script> // META: script=/webusb/resources/fake-devices.js
<script src="/resources/testdriver.js"></script> // META: script=/webusb/resources/usb-helpers.js
<script src="/resources/testdriver-vendor.js"></script>
<script src="resources/fake-devices.js"></script>
<script src="resources/usb-helpers.js"></script>
<script>
'use strict'; 'use strict';
usb_test(() => {
return getFakeDevice().then(({ device }) => {
return navigator.usb.getDevices().then(devices => {
assert_equals(devices.length, 1);
assert_equals(device, devices[0]);
assertDeviceInfoEquals(devices[0], fakeDeviceInit);
});
});
}, 'getDevices returns devices that are connected');
usb_test(() => {
return getFakeDevice().then(() => {
return navigator.usb.getDevices().then(devicesFirstTime => {
assert_equals(devicesFirstTime.length, 1);
return navigator.usb.getDevices().then(devicesSecondTime => {
assert_array_equals(devicesSecondTime, devicesFirstTime);
});
});
});
}, 'getDevices returns the same objects for each USB device');
usb_test(() => { usb_test(() => {
return navigator.usb.requestDevice({ filters: [] }) return navigator.usb.requestDevice({ filters: [] })
.then(device => { .then(device => {
...@@ -55,7 +30,7 @@ usb_test(() => { ...@@ -55,7 +30,7 @@ usb_test(() => {
navigator.usb.test.onrequestdevice = event => { navigator.usb.test.onrequestdevice = event => {
navigator.usb.test.onrequestdevice = undefined; navigator.usb.test.onrequestdevice = undefined;
event.respondWith(fakeDevice); 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);
...@@ -69,7 +44,7 @@ usb_test(() => { ...@@ -69,7 +44,7 @@ usb_test(() => {
navigator.usb.test.onrequestdevice = event => { navigator.usb.test.onrequestdevice = event => {
navigator.usb.test.onrequestdevice = undefined; navigator.usb.test.onrequestdevice = undefined;
event.respondWith(fakeDevice); 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);
...@@ -97,7 +72,7 @@ usb_test(() => { ...@@ -97,7 +72,7 @@ usb_test(() => {
} }
event.respondWith(null); event.respondWith(null);
} };
return callWithTrustedClick(() => { return callWithTrustedClick(() => {
return navigator.usb.requestDevice({ filters: expectedFilters }) return navigator.usb.requestDevice({ filters: expectedFilters })
...@@ -110,32 +85,11 @@ usb_test(() => { ...@@ -110,32 +85,11 @@ usb_test(() => {
}); });
}, 'filters are sent correctly'); }, 'filters are sent correctly');
usb_test(() => {
return getFakeDevice().then(({ device }) => {
assertDeviceInfoEquals(device, fakeDeviceInit);
return device.open().then(() => device.close());
});
}, 'onconnect event is trigged by adding a device');
usb_test(usb => {
return getFakeDevice().then(({ device, fakeDevice }) => {
return waitForDisconnect(fakeDevice).then(removedDevice => {
assertDeviceInfoEquals(removedDevice, fakeDeviceInit);
assert_equals(removedDevice, device);
return removedDevice.open().then(() => {
assert_unreachable('should not be able to open a disconnected device');
}, error => {
assert_equals(error.code, DOMException.NOT_FOUND_ERR);
});
});
});
}, 'ondisconnect event is triggered by removing a device');
usb_test(() => { usb_test(() => {
return getFakeDevice().then(({ device, fakeDevice }) => { return getFakeDevice().then(({ device, fakeDevice }) => {
navigator.usb.test.onrequestdevice = event => { navigator.usb.test.onrequestdevice = event => {
event.respondWith(fakeDevice); event.respondWith(fakeDevice);
} };
return callWithTrustedClick(() => { return callWithTrustedClick(() => {
let first = navigator.usb.requestDevice({ filters: [] }); let first = navigator.usb.requestDevice({ filters: [] });
let second = navigator.usb.requestDevice({ filters: [] }); let second = navigator.usb.requestDevice({ filters: [] });
...@@ -150,4 +104,3 @@ usb_test(() => { ...@@ -150,4 +104,3 @@ usb_test(() => {
}); });
}); });
}, 'multiple requestDevice calls are allowed per user activation'); }, 'multiple requestDevice calls are allowed per user activation');
</script>
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<script> <script>
'use strict'; 'use strict';
service_worker_test('/webusb/resources/usb.serviceworker.js', service_worker_test('/webusb/usb.serviceworker.js',
'Ensure that WebUSB is inaccessible from a service worker.'); 'Ensure that WebUSB is inaccessible from a service worker.');
</script> </script>
// META: script=/webusb/resources/fake-devices.js
// META: script=/webusb/resources/usb-helpers.js
// META: global=sharedworker
'use strict';
usb_test(() => getFakeDevice()
.then(({ device }) => {
let evt = new USBConnectionEvent('connect', { device: device });
assert_equals(evt.type, 'connect');
assert_equals(evt.device, device);
}),
'Can construct a USBConnectionEvent with a device');
test(t => {
assert_throws(TypeError(),
() => new USBConnectionEvent('connect', { device: null }));
assert_throws(TypeError(),
() => new USBConnectionEvent('connect', {}));
}, 'Cannot construct a USBConnectionEvent without a device');
done();
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/fake-devices.js"></script>
<script src="resources/usb-helpers.js"></script>
<script>
'use strict';
usb_test(() => {
return getFakeDevice().then(({ device }) => {
let evt = new USBConnectionEvent('connect', { device: device });
assert_equals(evt.type, 'connect');
assert_equals(evt.device, device);
});
}, 'Can construct a USBConnectionEvent with a device');
test(t => {
assert_throws(TypeError(), () =>
new USBConnectionEvent('connect', { device: null }));
assert_throws(TypeError(), () => new USBConnectionEvent('connect', {}));
}, 'Cannot construct a USBConnectionEvent without a device');
</script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
'use strict';
fetch_tests_from_worker(new Worker(
'/webusb/resources/idlharness.dedicatedworker.sharedworker.js'));
</script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
'use strict';
fetch_tests_from_worker(new SharedWorker(
'/webusb/resources/idlharness.dedicatedworker.sharedworker.js'));
</script>
\ No newline at end of file
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
'use strict';
fetch_tests_from_worker(new Worker(
'/webusb/resources/usb.dedicatedworker.sharedworker.js'));
</script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
'use strict';
fetch_tests_from_worker(new SharedWorker(
'/webusb/resources/usb.dedicatedworker.sharedworker.js'));
</script>
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