<!DOCTYPE html>
<html>
<body>
<script src="../../resources/js-test-pre.js"></script>

<div id="detector"></div>

<style>
    #detector { width: 100px; }
    @media (resolution: 1.00dppx) { #detector { width: 10px; } }
    @media (resolution: 1.50dppx) { #detector { width: 15px; } }
    @media (resolution: 2.00dppx) { #detector { width: 20px; } }
    @media (resolution: 2.25dppx) { #detector { width: 23px; } }
    @media print and (min-resolution: 3dppx) { #detector { width: 30px; } }
</style>

<script>
    description("CSS3 media query test: resolution query with dppx. Using style element, @media css rule.")

    if (window.testRunner && window.internals) {
        window.testRunner.dumpAsText();
        window.testRunner.waitUntilDone();
        window.jsTestIsAsync = true;

        function setBackingScaleFactorPromise(factor) {
            return new Promise((resolve, reject) => {
                try {
                    testRunner.setBackingScaleFactor(factor, resolve);
                } catch(e) {
                    reject(e);
                }
            });
        }

        function resolutionFromStyle() {
            var width = getComputedStyle(document.getElementById("detector")).width;
            switch (width) {
                case "10px":
                    return 1;
                case "15px":
                    return 1.5;
                case "20px":
                    return 2;
                case "23px":
                    return 2.25;
                case "30px":
                    return 3;
                case "31px":
                    return 3.125;
                default:
                    return undefined;
            }
        }

        function appendMediaRule(rule) {
            var lastStyleSheet = document.styleSheets[document.styleSheets.length - 1];
            lastStyleSheet.insertRule(rule, lastStyleSheet.cssRules.length);
        }

        (async function() {
            shouldBe("matchMedia('(resolution: 0dpi)').matches", "false");
            shouldBe("matchMedia('(min-resolution: 0dpi)').matches", "false");
            shouldBe("matchMedia('(max-resolution: 0dpi)').matches", "false");

            await setBackingScaleFactorPromise(1.5);
            shouldBe("matchMedia('(resolution: 1.5dppx)').matches", "true");
            shouldBe("resolutionFromStyle()", "1.5");

            await setBackingScaleFactorPromise(2);
            shouldBe("matchMedia('(resolution: 2dppx)').matches", "true");
            shouldBe("resolutionFromStyle()", "2");

            await setBackingScaleFactorPromise(1);
            shouldBe("matchMedia('(resolution: 1dppx)').matches", "true");
            shouldBe("resolutionFromStyle()", "1");

            await setBackingScaleFactorPromise(2.25);
            shouldBe("matchMedia('(resolution: 2.25dppx)').matches", "true");
            shouldBe("resolutionFromStyle()", "2.25");
            shouldBe("matchMedia('(resolution)').matches", "true");
            shouldBe("matchMedia('(resolution: 216dpi)').matches", "true");
            shouldBe("matchMedia('(min-resolution: 216dpi)').matches", "true");
            shouldBe("matchMedia('(max-resolution: 216dpi)').matches", "true");

            await setBackingScaleFactorPromise(2.54);  // use 2.54 to give us integral dpcm
            shouldBe("matchMedia('(resolution: 96dpcm)').matches", "true");
            shouldBe("matchMedia('(min-resolution: 96dpcm)').matches", "true");
            shouldBe("matchMedia('(max-resolution: 96dpcm)').matches", "true");

            // Test printing.

            window.internals.settings.setMediaTypeOverride("print");
            shouldBe("matchMedia('(min-resolution: 300dpi)').matches", "true");
            shouldBe("matchMedia('(min-resolution: 118dpcm)').matches", "true");

            // Should match the one requiring 'print' media type.
            shouldBe("resolutionFromStyle()", "3");

            // As well as those matching 'all'.
            appendMediaRule("@media (resolution: 3.125dppx) { #detector { width: 31px; } }");
            shouldBe("resolutionFromStyle()", "3.125");
        })().then(() => finishJSTest());
    }
</script>

<script src="../../resources/js-test-post.js"></script>
</body>
</html>
