<script src="../../../resources/js-test-pre.js"></script>
<script src="../resources/media-controls-loader.js" type="text/javascript"></script>
<body>
<script type="text/javascript">

description("Testing an <code>Button</code> has a scale transform when pressed.");

window.jsTestIsAsync = true;

const button = new Button({ layoutDelegate: { layoutTraits: LayoutTraits.macOS } });
button.iconName = Icons.Pause;
document.body.appendChild(button.element);

let x, y;

button.image.element.addEventListener("transitionend", event => {
    shouldBeEqualToString("window.getComputedStyle(button.image.element).transform", "matrix(0.89, 0, 0, 0.89, 0, 0)");
    if ("createTouch" in document) {
        testRunner.runUIScript(`
            uiController.liftUpAtPoint(${x}, ${y}, 1, function() {
                uiController.uiScriptComplete("Done");
            })`, finishJSTest);
    } else {
        eventSender.mouseUp();
        finishJSTest();
    }
});

scheduler.frameDidFire = function()
{
    const bounds = button.element.getBoundingClientRect();
    if (bounds.height === 0)
        return;

    scheduler.frameDidFire = null;

    if ("testRunner" in window) {
        x = bounds.left + 1;
        y = bounds.top + 1;
        if ("createTouch" in document) {
            testRunner.runUIScript(`
                uiController.touchDownAtPoint(${x}, ${y}, 1, function() {
                    uiController.uiScriptComplete("Done");
                })`);
        } else {
            eventSender.mouseMoveTo(x, y);
            eventSender.mouseDown();
        }
    } else
        debug("This test is designed to run in DRT.");
}

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