Commit 326aeef7 authored by Ken Rockot's avatar Ken Rockot Committed by Chromium LUCI CQ

Migrate webmidi WPT to Mojo JS modules

Bug: 1004256
Change-Id: Id69210a2c22bd64da82492fae5da41f4eaf0da98
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2636851
Commit-Queue: Ken Rockot <rockot@google.com>
Reviewed-by: default avatarTakashi Toyoshima <toyoshim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#845281}
parent fee0a321
...@@ -3,11 +3,10 @@ ...@@ -3,11 +3,10 @@
<script src=/resources/testharness.js></script> <script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script> <script src=/resources/testharnessreport.js></script>
<script src=../resources/feature-policy-permissions-test.js></script> <script src=../resources/feature-policy-permissions-test.js></script>
<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> <script type="module">
<script src="/gen/media/midi/midi_service.mojom.js"></script> import {MockMIDIService} from '/wpt_internal/webmidi/resources/mock-midiservice.js';
<script src="/wpt_internal/webmidi/resources/mock-midiservice.js"></script>
<script> const mock = new MockMIDIService();
'use strict';
run_permission_default_header_policy_tests( run_permission_default_header_policy_tests(
location.protocol + '//localhost:' + location.port, location.protocol + '//localhost:' + location.port,
......
<!DOCTYPE html> <!DOCTYPE html>
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> <script type="module">
<script src="/gen/media/midi/midi_service.mojom.js"></script> import {PortState} from '/gen/media/midi/midi_service.mojom.m.js';
<script src="resources/mock-midiservice.js"></script> import {MockMIDIService} from './resources/mock-midiservice.js';
<script src="resources/permissions-helper.js"></script> import {setMidiPermission} from './resources/permissions-helper.js';
<script>
const mock = new MockMIDIService();
async_test(t => { async_test(t => {
let noteOn = [ 0x90, 0x45, 0x7f ]; let noteOn = [ 0x90, 0x45, 0x7f ];
...@@ -13,9 +15,9 @@ async_test(t => { ...@@ -13,9 +15,9 @@ async_test(t => {
setMidiPermission({}, 'granted').then(() => { setMidiPermission({}, 'granted').then(() => {
return navigator.requestMIDIAccess(); return navigator.requestMIDIAccess();
}).then(a => { }).then(a => {
var started = false; let started = false;
var receivedMessages = 0; let receivedMessages = 0;
var receiveMessage = e => { let receiveMessage = e => {
t.step(() => { t.step(() => {
assert_array_equals( assert_array_equals(
e.data, noteOn, 'received message should be noteOn'); e.data, noteOn, 'received message should be noteOn');
...@@ -32,24 +34,22 @@ async_test(t => { ...@@ -32,24 +34,22 @@ async_test(t => {
started = true; started = true;
// Set an event handler respectively for newly connected ports. // Set an event handler respectively for newly connected ports.
var inputs = a.inputs.values(); const inputs = a.inputs.values();
inputs.next(); inputs.next();
inputs.next().value.onmidimessage = receiveMessage; inputs.next().value.onmidimessage = receiveMessage;
inputs.next().value.onmidimessage = receiveMessage; inputs.next().value.onmidimessage = receiveMessage;
// Send a message respectively, and see if it is loopbacked. // Send a message respectively, and see if it is loopbacked.
var outputs = a.outputs.values(); const outputs = a.outputs.values();
outputs.next(); outputs.next();
outputs.next().value.send(noteOn); outputs.next().value.send(noteOn);
outputs.next().value.send(noteOn); outputs.next().value.send(noteOn);
}; };
output = a.outputs.values().next().value; mock.addInputPort(PortState.CONNECTED);
mock.addOutputPort(PortState.CONNECTED);
mockMIDIService.addInputPort(midi.mojom.PortState.CONNECTED); mock.addInputPort(PortState.OPENED);
mockMIDIService.addOutputPort(midi.mojom.PortState.CONNECTED); mock.addOutputPort(PortState.OPENED);
mockMIDIService.addInputPort(midi.mojom.PortState.OPENED);
mockMIDIService.addOutputPort(midi.mojom.PortState.OPENED);
}).catch(e => assert_unreached(e)); }).catch(e => assert_unreached(e));
}); });
}, "Test if newly connected ports work correctly"); }, "Test if newly connected ports work correctly");
......
...@@ -3,14 +3,15 @@ ...@@ -3,14 +3,15 @@
<head> <head>
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="/gen/media/midi/midi_service.mojom.js"></script>
<script src="resources/mock-midiservice.js"></script>
<script src="resources/permissions-helper.js"></script>
<script src="resources/state-check-utils.js"></script>
</head> </head>
<body> <body>
<script> <script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
import {setMidiPermission} from './resources/permissions-helper.js';
import {checkStateTransition} from './resources/state-check-utils.js';
const mock = new MockMIDIService();
async function checkAccess(access) { async function checkAccess(access) {
const inputPort = access.inputs.values().next().value; const inputPort = access.inputs.values().next().value;
const outputPort = access.outputs.values().next().value; const outputPort = access.outputs.values().next().value;
......
...@@ -3,13 +3,12 @@ ...@@ -3,13 +3,12 @@
<head> <head>
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="/gen/media/midi/midi_service.mojom.js"></script>
<script src="resources/mock-midiservice.js"></script>
<script src="resources/permissions-helper.js"></script>
</head>
<body> <body>
<script> <script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
import {setMidiPermission} from './resources/permissions-helper.js';
const mock = new MockMIDIService();
const testData = [ const testData = [
// Complete messages. // Complete messages.
......
<!doctype html> <!doctype html>
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="/gen/media/midi/midi_service.mojom.js"></script>
<script src="resources/mock-midiservice.js"></script>
<script src="resources/permissions-helper.js"></script>
<p>Regression test to check if non-zero timestamp works well.</p> <p>Regression test to check if non-zero timestamp works well.</p>
<script> <script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
import {setMidiPermission} from './resources/permissions-helper.js';
const mock = new MockMIDIService();
promise_test(async () => { promise_test(async () => {
await setMidiPermission({sysex: true}, 'granted'); await setMidiPermission({sysex: true}, 'granted');
let access = await navigator.requestMIDIAccess({sysex: true}); let access = await navigator.requestMIDIAccess({sysex: true});
......
...@@ -3,14 +3,14 @@ ...@@ -3,14 +3,14 @@
<head> <head>
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="/gen/media/midi/midi_service.mojom.js"></script>
<script src="resources/mock-midiservice.js"></script>
<script src="resources/permissions-helper.js"></script>
<script src="resources/state-check-utils.js"></script>
</head> </head>
<body> <body>
<script> <script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
import {setMidiPermission} from './resources/permissions-helper.js';
import {checkStateTransition} from './resources/state-check-utils.js';
const mock = new MockMIDIService();
async function runTests(port) { async function runTests(port) {
await checkStateTransition({ await checkStateTransition({
port: port, port: port,
......
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
<head> <head>
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="/gen/media/midi/midi_service.mojom.js"></script>
<script src="resources/mock-midiservice.js"></script>
<script src="resources/permissions-helper.js"></script>
</head> </head>
<body> <body>
<script> <script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
import {setMidiPermission} from './resources/permissions-helper.js';
const mock = new MockMIDIService();
promise_test(async _ => { promise_test(async _ => {
await setMidiPermission({sysex: true}, 'granted'); await setMidiPermission({sysex: true}, 'granted');
......
...@@ -3,18 +3,19 @@ ...@@ -3,18 +3,19 @@
<head> <head>
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="/gen/media/midi/midi_service.mojom.js"></script>
<script src="resources/mock-midiservice.js"></script>
<script src="resources/permissions-helper.js"></script>
</head> </head>
<body> <body>
<script> <script type="module">
import {Result} from '/gen/media/midi/midi_service.mojom.m.js';
import {MockMIDIService} from './resources/mock-midiservice.js';
import {setMidiPermission} from './resources/permissions-helper.js';
const mock = new MockMIDIService();
promise_test(async t => { promise_test(async t => {
await setMidiPermission({}, 'granted'); await setMidiPermission({}, 'granted');
mockMIDIService.setStartSessionResult(midi.mojom.Result.INITIALIZATION_ERROR); mock.setStartSessionResult(Result.INITIALIZATION_ERROR);
return promise_rejects_dom(t, 'InvalidStateError', return promise_rejects_dom(t, 'InvalidStateError',
navigator.requestMIDIAccess()); navigator.requestMIDIAccess());
}, 'initialization failure causes requestMIDIAccess to fail'); }, 'initialization failure causes requestMIDIAccess to fail');
......
...@@ -3,12 +3,12 @@ ...@@ -3,12 +3,12 @@
<head> <head>
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="/gen/media/midi/midi_service.mojom.js"></script>
<script src="resources/mock-midiservice.js"></script>
</head> </head>
<body> <body>
<script> <script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
const mock = new MockMIDIService();
promise_test(async _ => { promise_test(async _ => {
const iframe = document.createElement('iframe'); const iframe = document.createElement('iframe');
document.body.appendChild(iframe); document.body.appendChild(iframe);
......
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
<head> <head>
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="/gen/media/midi/midi_service.mojom.js"></script>
<script src="resources/mock-midiservice.js"></script>
<script src="resources/permissions-helper.js"></script>
</head> </head>
<body> <body>
<script> <script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
import {setMidiPermission} from './resources/permissions-helper.js';
const mock = new MockMIDIService();
const options = [ const options = [
{}, {},
{ sysex: false }, { sysex: false },
......
<!DOCTYPE html> <!DOCTYPE html>
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> <script type="module">
<script src="/gen/media/midi/midi_service.mojom.js"></script> import {MockMIDIService} from './resources/mock-midiservice.js';
<script src="resources/mock-midiservice.js"></script> import {setMidiPermission} from './resources/permissions-helper.js';
<script src="resources/permissions-helper.js"></script>
<script> const mock = new MockMIDIService();
promise_test(async () => { promise_test(async () => {
// Obtain the first MIDIAccess instance without a sysex permission. // Obtain the first MIDIAccess instance without a sysex permission.
await setMidiPermission({}, 'granted'); await setMidiPermission({}, 'granted');
...@@ -25,7 +25,7 @@ promise_test(async () => { ...@@ -25,7 +25,7 @@ promise_test(async () => {
// See if a sysex message can be sent correctly over the second instance. // See if a sysex message can be sent correctly over the second instance.
const sysex_loopback_inport = sysex_access.inputs.values().next().value; const sysex_loopback_inport = sysex_access.inputs.values().next().value;
received_data = await new Promise((resolve, reject) => { const received_data = await new Promise((resolve, reject) => {
sysex_loopback_inport.onmidimessage = e => resolve(e.data); sysex_loopback_inport.onmidimessage = e => resolve(e.data);
const sysex_outport = sysex_access.outputs.values().next().value; const sysex_outport = sysex_access.outputs.values().next().value;
sysex_outport.send(sysex_message); sysex_outport.send(sysex_message);
......
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
<head> <head>
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="/gen/media/midi/midi_service.mojom.js"></script>
<script src="resources/mock-midiservice.js"></script>
<script src="resources/permissions-helper.js"></script>
</head> </head>
<body> <body>
<script> <script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
import {setMidiPermission} from './resources/permissions-helper.js';
const mock = new MockMIDIService();
function checkInputMap(inputs) { function checkInputMap(inputs) {
let input; let input;
for (const i of inputs.values()) { for (const i of inputs.values()) {
......
'use strict' import {MidiSessionReceiver, MidiSessionProvider, MidiSessionProviderReceiver, PortState, Result} from '/gen/media/midi/midi_service.mojom.m.js';
let MICROSECONDS_TO_MILLISECONDS = 0.001; const MICROSECONDS_TO_MILLISECONDS = 0.001;
class MockMIDIService { export class MockMIDIService {
constructor() { constructor() {
this.next_input_port_index_ = 0; this.next_input_port_index_ = 0;
this.next_output_port_index_ = 0; this.next_output_port_index_ = 0;
this.start_session_result_ = midi.mojom.Result.OK; this.start_session_result_ = Result.OK;
this.interceptor_ = new MojoInterfaceInterceptor( this.interceptor_ = new MojoInterfaceInterceptor(
midi.mojom.MidiSessionProvider.name); MidiSessionProvider.$interfaceName);
this.binding_ = new mojo.Binding(midi.mojom.MidiSessionProvider, this); this.receiver_ = new MidiSessionProviderReceiver(this);
this.session_binding_ = new mojo.Binding(midi.mojom.MidiSession, this); this.sessionReceiver_ = new MidiSessionReceiver(this);
this.interceptor_.oninterfacerequest = e => { this.interceptor_.oninterfacerequest =
this.binding_.bind(e.handle); e => this.receiver_.$.bindHandle(e.handle);
};
this.interceptor_.start(); this.interceptor_.start();
} }
...@@ -23,39 +22,40 @@ class MockMIDIService { ...@@ -23,39 +22,40 @@ class MockMIDIService {
} }
addInputPort(portState) { addInputPort(portState) {
this.client_.addInputPort(new midi.mojom.PortInfo({ this.client_.addInputPort({
id: `MockInputID-${this.next_input_port_index_++}`, id: `MockInputID-${this.next_input_port_index_++}`,
manufacturer: 'MockInputManufacturer', manufacturer: 'MockInputManufacturer',
name: 'MockInputName', name: 'MockInputName',
version: 'MockInputVersion', version: 'MockInputVersion',
state: portState state: portState
})); });
} }
addOutputPort(portState) { addOutputPort(portState) {
this.client_.addOutputPort(new midi.mojom.PortInfo({ this.client_.addOutputPort({
id: `MockOutputID-${this.next_output_port_index_++}`, id: `MockOutputID-${this.next_output_port_index_++}`,
manufacturer: 'MockOutputManufacturer', manufacturer: 'MockOutputManufacturer',
name: 'MockOutputName', name: 'MockOutputName',
version: 'MockOutputVersion', version: 'MockOutputVersion',
state: portState state: portState
})); });
} }
startSession(request, client) { startSession(receiver, client) {
this.client_ = client; this.client_ = client;
this.session_binding_.bind(request); this.sessionReceiver_.$.bindHandle(receiver.handle);
this.addInputPort(midi.mojom.PortState.CONNECTED); this.addInputPort(PortState.CONNECTED);
this.addOutputPort(midi.mojom.PortState.CONNECTED); this.addOutputPort(PortState.CONNECTED);
this.client_.sessionStarted(this.start_session_result_); this.client_.sessionStarted(this.start_session_result_);
} }
sendData(port, data, timestamp) { sendData(port, data, timestamp) {
if (timestamp.internalValue > internals.currentTimeTicks()) { if (timestamp.internalValue > BigInt(internals.currentTimeTicks())) {
const delayMicroseconds = Number(
timestamp.internalValue - BigInt(internals.currentTimeTicks()));
setTimeout( setTimeout(
this.sendData.bind(this, port, data, timestamp), () => this.sendData(port, data, timestamp),
(timestamp.internalValue - internals.currentTimeTicks()) delayMicroseconds * MICROSECONDS_TO_MILLISECONDS);
* MICROSECONDS_TO_MILLISECONDS);
return; return;
} }
if (port < this.next_input_port_index_) { if (port < this.next_input_port_index_) {
...@@ -63,13 +63,3 @@ class MockMIDIService { ...@@ -63,13 +63,3 @@ class MockMIDIService {
} }
} }
} }
let mockMIDIService = undefined;
try { mockMIDIService = new MockMIDIService(); }
catch (err) {
// InvalidModificationError can be thrown if an interceptor has already been
// created in the same process. In this case, we just rely on the mock
// that's already been created.
if (err.name != "InvalidModificationError")
throw err;
}
function setMidiPermission(options, state) { export function setMidiPermission(options, state) {
const sysex = options.sysex ?? false; const sysex = options.sysex ?? false;
return internals.setPermission( return internals.setPermission(
{name: 'midi', sysex: sysex}, state, location.origin, location.origin); {name: 'midi', sysex: sysex}, state, location.origin, location.origin);
......
async function checkStateTransition(options) { export async function checkStateTransition(options) {
const port = options.port; const port = options.port;
const access = options.access; const access = options.access;
assert_equals(options.initialconnection, port.connection); assert_equals(options.initialconnection, port.connection);
......
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
<head> <head>
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="/gen/media/midi/midi_service.mojom.js"></script>
<script src="resources/mock-midiservice.js"></script>
<script src="resources/permissions-helper.js"></script>
</head> </head>
<body> <body>
<script> <script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
import {setMidiPermission} from './resources/permissions-helper.js';
const mock = new MockMIDIService();
promise_test(async _ => { promise_test(async _ => {
await setMidiPermission({sysex: true}, 'granted'); await setMidiPermission({sysex: true}, 'granted');
const access = await navigator.requestMIDIAccess({sysex: true}); const access = await navigator.requestMIDIAccess({sysex: true});
......
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
<head> <head>
<script src="/resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="/gen/media/midi/midi_service.mojom.js"></script>
<script src="resources/mock-midiservice.js"></script>
<script src="resources/permissions-helper.js"></script>
</head> </head>
<body> <body>
<script> <script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
import {setMidiPermission} from './resources/permissions-helper.js';
const mock = new MockMIDIService();
// See https://www.midi.org/specifications/item/table-1-summary-of-midi-message // See https://www.midi.org/specifications/item/table-1-summary-of-midi-message
const systemMessages = (function(messages) { const systemMessages = (function(messages) {
// Prepare various combinations of messages from input message array. // Prepare various combinations of messages from input message array.
......
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