| <!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()"); | |
| // 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> |