mirror of
https://github.com/servo/servo.git
synced 2025-06-25 09:34:32 +01:00
85 lines
3.3 KiB
HTML
85 lines
3.3 KiB
HTML
<!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.ogv";
|
|
|
|
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>
|