'use strict'; // These tests rely on the User Agent providing an implementation of the // FakeSerialService interface which replaces the platform-specific // implementation of the Web Serial API with one that can be automated from // Javascript for testing purposes. // // 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 let fakeSerialService = undefined; // Returns a SerialPort instance and associated FakeSerialPort instance. async function getFakeSerialPort(fake) { let token = fake.addPort(); let fakePort = fake.getFakePort(token); let ports = await navigator.serial.getPorts(); assert_equals(ports.length, 1); let port = ports[0]; assert_true(port instanceof SerialPort); return { port, fakePort }; } function serial_test(func, name, properties) { promise_test(async (test) => { assert_implements(navigator.serial, 'missing navigator.serial'); if (fakeSerialService === undefined) { // Try loading a polyfill for the fake serial service. if (isChromiumBased) { const fakes = await import('/resources/chromium/fake-serial.js'); fakeSerialService = fakes.fakeSerialService; } } assert_implements(fakeSerialService, 'missing fakeSerialService after initialization'); fakeSerialService.start(); try { await func(test, fakeSerialService); } finally { fakeSerialService.stop(); fakeSerialService.reset(); } }, name, properties); } function trustedClick() { 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 = () => { document.body.removeChild(button); resolve(); }; document.body.appendChild(button); test_driver.click(button); }); }