| <!DOCTYPE html> |
| <html> |
| <head> |
| <meta charset="utf-8"> |
| <title>Mute screen capture, make sure page state updates correctly.</title> |
| <script src="../../resources/testharness.js"></script> |
| <script src="../../resources/testharnessreport.js"></script> |
| <script> |
| |
| if (window.testRunner) |
| testRunner.setUserMediaPermission(true); |
| |
| function callGetDisplayMedia(options) |
| { |
| let promise; |
| window.internals.withUserGesture(() => { |
| promise = navigator.mediaDevices.getDisplayMedia(options); |
| }); |
| return promise; |
| } |
| |
| async function waitForPageStateChange(numberOfTries, originalState) |
| { |
| return new Promise(async (resolve) => { |
| while (numberOfTries) { |
| if (internals.pageMediaState() != originalState) { |
| resolve(true); |
| return; |
| } |
| |
| await new Promise(resolve => { setTimeout(resolve, 10) }); |
| --numberOfTries; |
| } |
| |
| resolve(false); |
| }); |
| } |
| |
| promise_test(async (test) => { |
| await new Promise(async (resolve, reject) => { |
| let stream = await callGetDisplayMedia({ video: true }); |
| let pageMediaState = internals.pageMediaState(); |
| |
| assert_false(pageMediaState.includes('HasMutedDisplayCaptureDevice'), 'page state does not include HasMutedDisplayCaptureDevice'); |
| assert_false(pageMediaState.includes('HasMutedVideoCaptureDevice'), 'page state does not include HasMutedVideoCaptureDevice'); |
| assert_false(pageMediaState.includes('HasMutedAudioCaptureDevice'), 'page state does not include HasMutedAudioCaptureDevice'); |
| |
| let track = stream.getVideoTracks()[0]; |
| track.onunmute = () => { assert_unreached("Got 'unmute' event unexpectedly!") }; |
| |
| track.onmute = async (evt) => { |
| |
| if (!await waitForPageStateChange(10, pageMediaState)) |
| assert_unreached(`Page state did not change from ${pageMediaState}`); |
| |
| track.onunmute = async (evt) => { |
| if (!await waitForPageStateChange(10, pageMediaState)) |
| assert_unreached(`Page state did not change from ${pageMediaState}`); |
| |
| pageMediaState = internals.pageMediaState(); |
| assert_false(pageMediaState.includes('HasMutedDisplayCaptureDevice'), 'page state does not include HasMutedDisplayCaptureDevice'); |
| assert_true(pageMediaState.includes('HasActiveDisplayCaptureDevice'), 'page state includes HasActiveDisplayCaptureDevice'); |
| resolve() |
| } |
| |
| pageMediaState = internals.pageMediaState(); |
| assert_true(pageMediaState.includes('HasMutedDisplayCaptureDevice'), 'page state includes HasMutedDisplayCaptureDevice'); |
| assert_false(pageMediaState.includes('HasActiveDisplayCaptureDevice'), 'page state does not include HasActiveDisplayCaptureDevice'); |
| internals.setMediaStreamTrackMuted(track, false) |
| } |
| |
| pageMediaState = internals.pageMediaState(); |
| internals.setMediaStreamTrackMuted(track, true); |
| |
| setTimeout(() => reject("Muted state did not change in .5 second"), 500); |
| }); |
| }, "Mute video track during screen capture"); |
| |
| </script> |
| </head> |
| <body> |
| </body> |
| </html> |