<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function prepareAndRunTest()
{
    window.snapshotElement = document.getElementById("element-to-snapshot");

    runTest();
}

function test()
{
    // A PNG file starts with the bytes 89 50 4E 47 0D 01 1A 0A, followed by the
    // IHDR chunk that contains the size. IHDR's content starts with a 4-byte width
    // and a 4-byte height, so a PNG's width and height are always bytes 16-24.
    function sizeOfPNGFromDataURL(dataURL) {
        let base64 = dataURL.substr(dataURL.indexOf(',') + 1);
        const header = atob(base64.slice(0, 50)).slice(16, 24);
        const uint8 = Uint8Array.from(header, c => c.charCodeAt(0));
        const dataView = new DataView(uint8.buffer);

        return {width: dataView.getInt32(0), height: dataView.getInt32(4)};
    }

    let documentNode;

    let suite = InspectorTest.createAsyncSuite("Page.snapshotNode");

    suite.addTestCase({
        name: "SnapshotPreservesPageResolution",
        description: "Verify that a node snapshot is not scaled down to CSS pixels.",
        async test() {
            let targetNodeId = await WI.domManager.querySelector(documentNode.id, "#element-to-snapshot");
            let {dataURL} = await PageAgent.snapshotNode(targetNodeId);
            let devicePixelRatio = await InspectorTest.evaluateInPage(`window.devicePixelRatio`);
            let elementBounds = await InspectorTest.evaluateInPage(`window.snapshotElement.getBoundingClientRect()`)
                .then((object) => object.fetchProperties(["width", "height"]));

            // Peek into the data URL's raw PNG data to get the size. For various reasons,
            // setting the 'src' attribute of an <img> element is unreliable under WKTR.
            let screenshotSize = sizeOfPNGFromDataURL(dataURL);

            // On a @2x machine, the screenshot should be twice the real pixel size as the CSS pixel size.
            InspectorTest.expectEqual(screenshotSize.width, elementBounds.width * devicePixelRatio, "Screenshot's width in pixels should be (CSS pixel width) * devicePixelRatio.");
            InspectorTest.expectEqual(screenshotSize.height, elementBounds.height * devicePixelRatio, "Screenshot's height in pixels should be (CSS pixel height) * devicePixelRatio.");
        }
    });

    WI.domManager.requestDocument((node) => {
        documentNode = node;
        suite.runTestCasesAndFinish();
    });
}
</script>
</head>
<body onload="prepareAndRunTest()">
<p id="element-to-snapshot" style="height: 198px; width: 198px; border: 1px solid black;">Test for Page.snapshotNode on HiDPI systems.</p>
</body>
</html>
