<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>video track width and height should be set correctly when only one constraint is passed to getDisplayMedia</title>
        <script src="../../resources/testharness.js"></script>
        <script src="../../resources/testharnessreport.js"></script>
    </head>
    <body>

        <script>
            if (window.internals)
                window.internals.settings.setScreenCaptureEnabled(true);

            function callGetDisplayMedia(options)
            {
                let promise;
                window.internals.withUserGesture(() => {
                    promise = navigator.mediaDevices.getDisplayMedia(options);
                });
                return promise;
            }

            let defaultWidth;
            let defaultHeight;
            promise_test(async () => {
                stream = await callGetDisplayMedia({ video: true });
                let settings = stream.getVideoTracks()[0].getSettings();
                defaultWidth = settings.width;
                defaultHeight = settings.height;
            }, "setup");
            
            promise_test((test) => {
                return callGetDisplayMedia({ video: { width: {ideal: 640} } })
                    .then((stream) => {
                        let settings = stream.getVideoTracks()[0].getSettings()
                        assert_equals(settings.height, Math.floor(640 * (defaultHeight / defaultWidth)));
                    })
            }, "height calculated correctly only width is specified");

            promise_test((test) => {

                return callGetDisplayMedia({ video: { height: {ideal: 240} } })
                    .then((stream) => {
                        let settings = stream.getVideoTracks()[0].getSettings()
                        assert_equals(settings.width, Math.floor(240 * (defaultWidth / defaultHeight)));
                    })
            }, "width calculated correctly only height is specified");

        </script>
    </body>
</html>
