<!doctype html> <html> <head> <title>enumerateDevices: test that enumerateDevices is present</title> <link rel="author" title="Dr Alex Gouaillard" href="mailto:agouaillard@gmail.com"/> <link rel="help" href="https://w3c.github.io/mediacapture-main/#enumerating-devices"> <meta name='assert' content='Check that the enumerateDevices() method is present.'/> </head> <body> <h1 class="instructions">Description</h1> <p class="instructions">This test checks for the presence of the <code>navigator.mediaDevices.enumerateDevices()</code> method.</p> <div id='log'></div> <script src=/resources/testharness.js></script> <script src=/resources/testharnessreport.js></script> <script src=/resources/testdriver.js></script> <script src=/resources/testdriver-vendor.js></script> <script src=permission-helper.js></script> <script> "use strict"; //NOTE ALEX: for completion, a test for ondevicechange event is missing. promise_test(async () => { assert_not_equals(navigator.mediaDevices.enumerateDevices, undefined, "navigator.mediaDevices.enumerateDevices exists"); const deviceList = await navigator.mediaDevices.enumerateDevices(); for (const mediaInfo of deviceList) { assert_not_equals(mediaInfo.kind, undefined, "mediaInfo's kind should exist."); assert_equals(mediaInfo.deviceId, "", "mediaInfo's deviceId should exist and be empty if getUserMedia was never called successfully."); assert_equals(mediaInfo.label, "", "mediaInfo's label should exist and be empty if getUserMedia was never called successfully."); assert_equals(mediaInfo.groupId, "", "mediaInfo's groupId should exist and be empty if getUserMedia was never called successfully."); assert_in_array(mediaInfo.kind, ["videoinput", "audioinput", "audiooutput"]); } assert_less_than_equal(deviceList.filter((item) => { return item.kind == "audioinput"; }).length, 1, "there should be zero or one audio input device "); assert_less_than_equal(deviceList.filter((item) => { return item.kind == "videoinput"; }).length, 1, "there should be zero or one video input device "); }, "mediaDevices.enumerateDevices() is present and working - before capture"); promise_test(async () => { await setMediaPermission("granted", ["microphone"]); await navigator.mediaDevices.getUserMedia({ audio : true }); const deviceList = await navigator.mediaDevices.enumerateDevices(); for (const mediaInfo of deviceList) { assert_not_equals(mediaInfo.kind, undefined, "mediaInfo's kind should exist."); assert_not_equals(mediaInfo.deviceId, "", "mediaInfo's deviceId should exist and not be empty."); assert_in_array(mediaInfo.kind, ["videoinput", "audioinput", "audiooutput"]); } }, "mediaDevices.enumerateDevices() is present and working - after capture"); promise_test(async () => { const deviceList = await navigator.mediaDevices.enumerateDevices(); for (const mediaInfo of deviceList) { if (mediaInfo.kind == "audioinput" || mediaInfo.kind == "videoinput") { assert_true(mediaInfo instanceof InputDeviceInfo); } else if ( mediaInfo.kind == "audiooutput" ) { assert_true(mediaInfo instanceof MediaDeviceInfo); } else { assert_unreached("mediaInfo.kind should be one of 'audioinput', 'videoinput', or 'audiooutput'.") } } }, "InputDeviceInfo is supported"); </script> </body> </html>