| <!doctype html> |
| <meta charset=utf-8> |
| <title>getDisplayMedia</title> |
| <meta name="timeout" content="long"> |
| <button id="button">User gesture</button> |
| <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> |
| <video id="display"></video> |
| <script> |
| 'use strict'; |
| |
| const stopTracks = stream => stream.getTracks().forEach(track => track.stop()); |
| |
| async function getDisplayMedia(constraints) { |
| const p = new Promise(r => button.onclick = r); |
| await test_driver.click(button); |
| await p; |
| return navigator.mediaDevices.getDisplayMedia(constraints); |
| } |
| |
| promise_test( async t => { |
| const v = document.getElementById('display'); |
| v.autoplay = true; |
| // work around firefox bug 1586505, orthogonal to what's being tested |
| const frames = () => v.mozPaintedFrames ?? v.getVideoPlaybackQuality()?.totalVideoFrames; |
| const target_rate = 5; |
| const stream = await getDisplayMedia({video: {width:160, frameRate: target_rate}}); |
| t.add_cleanup(() => stopTracks(stream)); |
| v.srcObject = stream; |
| const intitial_time = v.currentTime; |
| const initial_frame_count = frames(); |
| await new Promise(r => t.step_timeout(r, 10000)); |
| const total_elapsed_frames = frames() - initial_frame_count; |
| const total_elapsed_time = v.currentTime - intitial_time; |
| const average_fps = total_elapsed_frames / total_elapsed_time; |
| assert_greater_than_equal(average_fps, target_rate * 0.50); |
| assert_less_than_equal(average_fps, target_rate * 1.75); |
| }, "getDisplayMedia() must adhere to frameRate if set"); |
| |
| </script> |