blob: 41038abbc18cbceb326c0512f282c59ee58a86ec [file] [edit]
<!DOCTYPE html>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
function with_iframe(url, allow) {
let frame = document.createElement('iframe');
frame.src = url;
frame.setAttribute('allow', allow);
return new Promise(resolve => {
frame.onload = () => { resolve(frame); };
document.body.appendChild(frame);
});
}
// The frame posts its result from its own load event. Listen before creating the frame: with the
// frame in another process, its message and its load notification arrive as separate IPCs, so a
// listener installed after awaiting the load can miss the message.
function nextMessage() {
return new Promise(resolve => window.addEventListener("message", event => resolve(event.data), { once: true }));
}
promise_test(async () => {
navigator.audioSession.type = "play-and-record";
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const message1 = nextMessage();
const frame1 = await with_iframe("http://localhost:8080/webrtc/resources/audioSessionFrame.html", "microphone:'none'");
const result1 = await message1;
frame1.remove();
const message2 = nextMessage();
const frame2 = await with_iframe("http://localhost:8080/webrtc/resources/audioSessionFrame.html", "microphone");
const result2 = await message2;
frame2.remove();
assert_equals(result1.type, "auto");
assert_equals(result1.state, "inactive");
assert_equals(result2.type, "play-and-record");
assert_equals(result2.state, "active");
stream.getTracks().forEach(t => t.stop());
}, "Allow audioSession in iframes where microphone is allowed");
</script>
</body>