| <!doctype html> |
| <head> |
| <title>Test setSinkId() before and after selectAudioOutput()</title> |
| <link rel="help" href="https://www.w3.org/TR/audio-output/#dom-htmlmediaelement-setsinkid"> |
| </head> |
| <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> |
| "use strict"; |
| |
| let deviceId; |
| promise_test(async t => { |
| await test_driver.bless('transient activation for selectAudioOutput()'); |
| ({deviceId} = await navigator.mediaDevices.selectAudioOutput()); |
| |
| const audio = new Audio(); |
| const p1 = audio.setSinkId(deviceId); |
| assert_equals(audio.sinkId, "", "before it resolves, setSinkId is unchanged"); |
| let r = await p1; |
| assert_equals(r, undefined, "setSinkId resolves with undefined"); |
| assert_equals(audio.sinkId, deviceId, "when it resolves, setSinkId updates sinkId to the requested deviceId"); |
| |
| r = await audio.setSinkId(deviceId); |
| assert_equals(r, undefined, "resetting sinkid on same current value should always work"); |
| |
| r = await audio.setSinkId(""); |
| assert_equals(r, undefined, "resetting sinkid on default audio output should always work"); |
| }, "setSinkId() after selectAudioOutput()"); |
| |
| const src = "/media/movie_5.webm"; |
| |
| promise_test(async t => { |
| assert_not_equals(deviceId, undefined, "selectAudioOutput() resolved"); |
| const video = document.createElement('video'); |
| try { |
| document.body.appendChild(video); |
| video.src = src; |
| await new Promise(r => video.onloadeddata = r); |
| await video.setSinkId(deviceId); |
| assert_equals(video.sinkId, deviceId, "sinkId after setSinkId()"); |
| } finally { |
| video.remove(); |
| } |
| }, "setSinkId() on video after loadeddata"); |
| |
| promise_test(async t => { |
| assert_not_equals(deviceId, undefined, "selectAudioOutput() resolved"); |
| const video = document.createElement('video'); |
| try { |
| video.src = src; |
| video.autoplay = true; |
| video.loop = true; |
| await new Promise(r => video.onplay = r); |
| await video.setSinkId(deviceId); |
| assert_equals(video.sinkId, deviceId, "sinkId after setSinkId()"); |
| } finally { |
| video.pause(); |
| } |
| }, "setSinkId() on video after play"); |
| |
| // Use the same sinkId in another same-origin top-level browsing context. |
| // "the identifier MUST be the same in documents of the same origin in |
| // top-level browsing contexts." |
| // https://w3c.github.io/mediacapture-main/#dom-mediadeviceinfo-deviceid |
| promise_test(async t => { |
| assert_not_equals(deviceId, undefined, "selectAudioOutput() resolved"); |
| const proxy = window.open('/common/blank.html'); |
| t.add_cleanup(() => proxy.close()); |
| await new Promise(r => proxy.onload = r); |
| const pAudio = new proxy.Audio(); |
| await promise_rejects_dom(t, "NotFoundError", proxy.DOMException, |
| pAudio.setSinkId(deviceId), |
| "before selectAudioOutput()"); |
| await test_driver.bless('transient activation for selectAudioOutput()', |
| null, proxy); |
| const { deviceId: pDeviceId } = |
| await proxy.navigator.mediaDevices.selectAudioOutput({deviceId}); |
| assert_equals(pDeviceId, deviceId, |
| "deviceIds should be same in each browsing context"); |
| await pAudio.setSinkId(deviceId); |
| assert_equals(pAudio.sinkId, deviceId, "sinkId after setSinkId()"); |
| }, "setSinkId() with deviceID from another window"); |
| </script> |