summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webusb/resources/usb-helpers.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/webusb/resources/usb-helpers.js')
-rw-r--r--testing/web-platform/tests/webusb/resources/usb-helpers.js104
1 files changed, 104 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webusb/resources/usb-helpers.js b/testing/web-platform/tests/webusb/resources/usb-helpers.js
new file mode 100644
index 0000000000..cb6aaadf98
--- /dev/null
+++ b/testing/web-platform/tests/webusb/resources/usb-helpers.js
@@ -0,0 +1,104 @@
+'use strict';
+
+// These tests rely on the User Agent providing an implementation of the
+// WebUSB Testing API (https://wicg.github.io/webusb/test/).
+//
+// In Chromium-based browsers this implementation is provided by a polyfill
+// in order to reduce the amount of test-only code shipped to users. To enable
+// these tests the browser must be run with these options:
+//
+// --enable-blink-features=MojoJS,MojoJSTest
+
+(() => {
+ // Load scripts needed by the test API on context creation.
+ if (isChromiumBased) {
+ loadScript('/resources/chromium/webusb-child-test.js');
+ }
+})();
+
+function usb_test(func, name, properties) {
+ promise_test(async (t) => {
+ assert_implements(navigator.usb, 'missing navigator.usb');
+ if (navigator.usb.test === undefined) {
+ // Try loading a polyfill for the WebUSB Testing API.
+ if (isChromiumBased) {
+ await loadScript('/resources/chromium/webusb-test.js');
+ }
+ }
+ assert_implements(navigator.usb.test, 'missing navigator.usb.test after initialization');
+
+ await navigator.usb.test.initialize();
+ try {
+ await func(t);
+ } finally {
+ await navigator.usb.test.reset();
+ }
+ }, name, properties);
+}
+
+// Returns a promise that is resolved when the next USBConnectionEvent of the
+// given type is received.
+function connectionEventPromise(eventType) {
+ return new Promise(resolve => {
+ let eventHandler = e => {
+ assert_true(e instanceof USBConnectionEvent);
+ navigator.usb.removeEventListener(eventType, eventHandler);
+ resolve(e.device);
+ };
+ navigator.usb.addEventListener(eventType, eventHandler);
+ });
+}
+
+// Creates a fake device and returns a promise that resolves once the
+// 'connect' event is fired for the fake device. The promise is resolved with
+// an object containing the fake USB device and the corresponding USBDevice.
+function getFakeDevice() {
+ let promise = connectionEventPromise('connect');
+ let fakeDevice = navigator.usb.test.addFakeDevice(fakeDeviceInit);
+ return promise.then(device => {
+ return { device: device, fakeDevice: fakeDevice };
+ });
+}
+
+// Disconnects the given device and returns a promise that is resolved when it
+// is done.
+function waitForDisconnect(fakeDevice) {
+ let promise = connectionEventPromise('disconnect');
+ fakeDevice.disconnect();
+ return promise;
+}
+
+function assertDeviceInfoEquals(usbDevice, deviceInit) {
+ for (var property in deviceInit) {
+ if (property == 'activeConfigurationValue') {
+ if (deviceInit.activeConfigurationValue == 0) {
+ assert_equals(usbDevice.configuration, null);
+ } else {
+ assert_equals(usbDevice.configuration.configurationValue,
+ deviceInit.activeConfigurationValue);
+ }
+ } else if (Array.isArray(deviceInit[property])) {
+ assert_equals(usbDevice[property].length, deviceInit[property].length);
+ for (var i = 0; i < usbDevice[property].length; ++i)
+ assertDeviceInfoEquals(usbDevice[property][i], deviceInit[property][i]);
+ } else {
+ assert_equals(usbDevice[property], deviceInit[property], property);
+ }
+ }
+}
+
+function callWithTrustedClick(callback) {
+ return new Promise(resolve => {
+ let button = document.createElement('button');
+ button.textContent = 'click to continue test';
+ button.style.display = 'block';
+ button.style.fontSize = '20px';
+ button.style.padding = '10px';
+ button.onclick = () => {
+ resolve(callback());
+ document.body.removeChild(button);
+ };
+ document.body.appendChild(button);
+ test_driver.click(button);
+ });
+}