test_midi_device_explicit_open_close.html (4107B)
1 <html> 2 <head> 3 <title>WebMIDI Device Open/Close Test</title> 4 <script src="/tests/SimpleTest/SimpleTest.js"></script> 5 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 6 <script type="application/javascript" src="MIDITestUtils.js"></script> 7 </head> 8 9 <body onload="runTests()"> 10 <script class="testbody" type="application/javascript"> 11 SimpleTest.waitForExplicitFinish(); 12 13 async function runTests() { 14 await MIDITestUtils.permissionSetup(true); 15 16 let access; 17 try { 18 access = await navigator.requestMIDIAccess({ "sysex": false }) 19 } catch (e) { 20 ok(false, "MIDI Access Request Failed!"); 21 SimpleTest.finish(); 22 } 23 24 ok(true, "MIDI Access Request successful"); 25 let input = access.inputs.get(await MIDITestUtils.inputInfo.id); 26 let portEventRes; 27 let accessEventRes; 28 let portEventPromise = new Promise((resolve) => { portEventRes = resolve; }); 29 let accessEventPromise = new Promise((resolve) => { accessEventRes = resolve; }); 30 let shouldClose = false; 31 let checkPort = (event) => { 32 ok(input === event.port, "input port object and event port object are same object"); 33 ok(true, "port connection event fired"); 34 ok(event.port.connection === (!shouldClose ? "open" : "closed"), "connection registered correctly"); 35 }; 36 let inputEventHandler = (event) => { 37 checkPort(event); 38 portEventRes(); 39 }; 40 let accessEventHandler = (event) => { 41 checkPort(event); 42 accessEventRes(); 43 }; 44 input.addEventListener("statechange", inputEventHandler); 45 access.addEventListener("statechange", accessEventHandler); 46 await input.open(); 47 ok(true, "connection successful"); 48 ok(input.connection === "open", "connection registered as open"); 49 await Promise.all([portEventPromise, accessEventPromise]); 50 input.removeEventListener("statechange", inputEventHandler); 51 access.removeEventListener("statechange", accessEventHandler); 52 ok(true, "MIDI Port Open Test finished."); 53 ok(true, "Testing open failure"); 54 let out_access; 55 try { 56 out_access = await navigator.requestMIDIAccess({ "sysex": false }); 57 } catch (e) { 58 ok(false, "MIDI Access Request Failed!"); 59 SimpleTest.finish(); 60 } 61 let outputEventHandler = (event) => { 62 ok(output_opened === event.port, "output port object and event port object are same object"); 63 ok(true, "access connection event fired"); 64 ok(event.port.connection === "closed", "connection registered as closed"); 65 }; 66 out_access.addEventListener("statechange", outputEventHandler); 67 let output_opened = out_access.outputs.get(await MIDITestUtils.alwaysClosedTestOutputInfo.id); 68 try { 69 await output_opened.open(); 70 ok(false, "Should've failed to open port!"); 71 } catch(err) { 72 is(err.name, "InvalidAccessError", "error name " + err.name + " should be InvalidAccessError"); 73 ok(output_opened.connection == "closed", "connection registered as closed"); 74 ok(true, "Port not opened, test succeeded"); 75 } finally { 76 out_access.removeEventListener("statechange", outputEventHandler); 77 } 78 ok(true, "Starting MIDI port closing test"); 79 portEventPromise = new Promise((resolve) => { portEventRes = resolve; }); 80 accessEventPromise = new Promise((resolve) => { accessEventRes = resolve; }); 81 input.addEventListener("statechange", inputEventHandler); 82 access.addEventListener("statechange", accessEventHandler); 83 shouldClose = true; 84 await input.close(); 85 ok(input.connection === "closed", "connection registered as closed"); 86 await Promise.all([portEventPromise, accessEventPromise]); 87 input.removeEventListener("statechange", inputEventHandler); 88 access.removeEventListener("statechange", accessEventHandler); 89 SimpleTest.finish(); 90 } 91 </script> 92 </body> 93 </html>