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 @@
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.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 src="/gen/media/midi/midi_service.mojom.js"></script>
<script src="/wpt_internal/webmidi/resources/mock-midiservice.js"></script>
<script>
'use strict';
<script type="module">
import {MockMIDIService} from '/wpt_internal/webmidi/resources/mock-midiservice.js';
const mock = new MockMIDIService();
run_permission_default_header_policy_tests(
location.protocol + '//localhost:' + location.port,
......
<!DOCTYPE html>
<script src="/resources/testharness.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>
<script type="module">
import {PortState} 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();
async_test(t => {
let noteOn = [ 0x90, 0x45, 0x7f ];
......@@ -13,9 +15,9 @@ async_test(t => {
setMidiPermission({}, 'granted').then(() => {
return navigator.requestMIDIAccess();
}).then(a => {
var started = false;
var receivedMessages = 0;
var receiveMessage = e => {
let started = false;
let receivedMessages = 0;
let receiveMessage = e => {
t.step(() => {
assert_array_equals(
e.data, noteOn, 'received message should be noteOn');
......@@ -32,24 +34,22 @@ async_test(t => {
started = true;
// Set an event handler respectively for newly connected ports.
var inputs = a.inputs.values();
const inputs = a.inputs.values();
inputs.next();
inputs.next().value.onmidimessage = receiveMessage;
inputs.next().value.onmidimessage = receiveMessage;
// Send a message respectively, and see if it is loopbacked.
var outputs = a.outputs.values();
const outputs = a.outputs.values();
outputs.next();
outputs.next().value.send(noteOn);
outputs.next().value.send(noteOn);
};
output = a.outputs.values().next().value;
mockMIDIService.addInputPort(midi.mojom.PortState.CONNECTED);
mockMIDIService.addOutputPort(midi.mojom.PortState.CONNECTED);
mockMIDIService.addInputPort(midi.mojom.PortState.OPENED);
mockMIDIService.addOutputPort(midi.mojom.PortState.OPENED);
mock.addInputPort(PortState.CONNECTED);
mock.addOutputPort(PortState.CONNECTED);
mock.addInputPort(PortState.OPENED);
mock.addOutputPort(PortState.OPENED);
}).catch(e => assert_unreached(e));
});
}, "Test if newly connected ports work correctly");
......
......@@ -3,14 +3,15 @@
<head>
<script src="/resources/testharness.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>
<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) {
const inputPort = access.inputs.values().next().value;
const outputPort = access.outputs.values().next().value;
......
......@@ -3,13 +3,12 @@
<head>
<script src="/resources/testharness.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>
<script>
<script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
import {setMidiPermission} from './resources/permissions-helper.js';
const mock = new MockMIDIService();
const testData = [
// Complete messages.
......
<!doctype html>
<script src="/resources/testharness.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>
<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 () => {
await setMidiPermission({sysex: true}, 'granted');
let access = await navigator.requestMIDIAccess({sysex: true});
......
......@@ -3,14 +3,14 @@
<head>
<script src="/resources/testharness.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>
<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) {
await checkStateTransition({
port: port,
......
......@@ -3,13 +3,13 @@
<head>
<script src="/resources/testharness.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>
<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 _ => {
await setMidiPermission({sysex: true}, 'granted');
......
......@@ -3,18 +3,19 @@
<head>
<script src="/resources/testharness.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>
<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 => {
await setMidiPermission({}, 'granted');
mockMIDIService.setStartSessionResult(midi.mojom.Result.INITIALIZATION_ERROR);
mock.setStartSessionResult(Result.INITIALIZATION_ERROR);
return promise_rejects_dom(t, 'InvalidStateError',
navigator.requestMIDIAccess());
}, 'initialization failure causes requestMIDIAccess to fail');
......
......@@ -3,12 +3,12 @@
<head>
<script src="/resources/testharness.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>
<body>
<script>
<script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
const mock = new MockMIDIService();
promise_test(async _ => {
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
......
......@@ -3,13 +3,13 @@
<head>
<script src="/resources/testharness.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>
<script>
<script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
import {setMidiPermission} from './resources/permissions-helper.js';
const mock = new MockMIDIService();
const options = [
{},
{ sysex: false },
......
<!DOCTYPE html>
<script src="/resources/testharness.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>
<script type="module">
import {MockMIDIService} from './resources/mock-midiservice.js';
import {setMidiPermission} from './resources/permissions-helper.js';
const mock = new MockMIDIService();
promise_test(async () => {
// Obtain the first MIDIAccess instance without a sysex permission.
await setMidiPermission({}, 'granted');
......@@ -25,7 +25,7 @@ promise_test(async () => {
// See if a sysex message can be sent correctly over the second instance.
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);
const sysex_outport = sysex_access.outputs.values().next().value;
sysex_outport.send(sysex_message);
......
......@@ -3,13 +3,13 @@
<head>
<script src="/resources/testharness.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>
<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) {
let input;
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() {
this.next_input_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(
midi.mojom.MidiSessionProvider.name);
this.binding_ = new mojo.Binding(midi.mojom.MidiSessionProvider, this);
this.session_binding_ = new mojo.Binding(midi.mojom.MidiSession, this);
this.interceptor_.oninterfacerequest = e => {
this.binding_.bind(e.handle);
};
MidiSessionProvider.$interfaceName);
this.receiver_ = new MidiSessionProviderReceiver(this);
this.sessionReceiver_ = new MidiSessionReceiver(this);
this.interceptor_.oninterfacerequest =
e => this.receiver_.$.bindHandle(e.handle);
this.interceptor_.start();
}
......@@ -23,39 +22,40 @@ class MockMIDIService {
}
addInputPort(portState) {
this.client_.addInputPort(new midi.mojom.PortInfo({
this.client_.addInputPort({
id: `MockInputID-${this.next_input_port_index_++}`,
manufacturer: 'MockInputManufacturer',
name: 'MockInputName',
version: 'MockInputVersion',
state: portState
}));
});
}
addOutputPort(portState) {
this.client_.addOutputPort(new midi.mojom.PortInfo({
this.client_.addOutputPort({
id: `MockOutputID-${this.next_output_port_index_++}`,
manufacturer: 'MockOutputManufacturer',
name: 'MockOutputName',
version: 'MockOutputVersion',
state: portState
}));
});
}
startSession(request, client) {
startSession(receiver, client) {
this.client_ = client;
this.session_binding_.bind(request);
this.addInputPort(midi.mojom.PortState.CONNECTED);
this.addOutputPort(midi.mojom.PortState.CONNECTED);
this.sessionReceiver_.$.bindHandle(receiver.handle);
this.addInputPort(PortState.CONNECTED);
this.addOutputPort(PortState.CONNECTED);
this.client_.sessionStarted(this.start_session_result_);
}
sendData(port, data, timestamp) {
if (timestamp.internalValue > internals.currentTimeTicks()) {
if (timestamp.internalValue > BigInt(internals.currentTimeTicks())) {
const delayMicroseconds = Number(
timestamp.internalValue - BigInt(internals.currentTimeTicks()));
setTimeout(
this.sendData.bind(this, port, data, timestamp),
(timestamp.internalValue - internals.currentTimeTicks())
* MICROSECONDS_TO_MILLISECONDS);
() => this.sendData(port, data, timestamp),
delayMicroseconds * MICROSECONDS_TO_MILLISECONDS);
return;
}
if (port < this.next_input_port_index_) {
......@@ -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;
return internals.setPermission(
{name: 'midi', sysex: sysex}, state, location.origin, location.origin);
......
async function checkStateTransition(options) {
export async function checkStateTransition(options) {
const port = options.port;
const access = options.access;
assert_equals(options.initialconnection, port.connection);
......
......@@ -3,13 +3,13 @@
<head>
<script src="/resources/testharness.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>
<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 _ => {
await setMidiPermission({sysex: true}, 'granted');
const access = await navigator.requestMIDIAccess({sysex: true});
......
......@@ -3,13 +3,13 @@
<head>
<script src="/resources/testharness.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>
<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
const systemMessages = (function(messages) {
// 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