<html>
<head>
<script src="../resources/js-test.js"></script>
<script src="../resources/accessibility-helper.js"></script>
</head>
<body>

<select id="select" value="Select"></select>

<div id="slider" tabindex="0" role="slider" aria-valuenow="5">Slider</div>

<script>
    description("This tests that a notification listener on an element only listens to that one element, and that a global notification listener listens to all notifications.");

    if (window.accessibilityController) {
        window.jsTestIsAsync = true;

        setTimeout(async () => {
            window.selectNotificationCount = 0;
            window.sliderNotificationCount = 0;
            window.globalNotificationCount = 0;

            let select = await waitForElementById("select");
            select.addNotificationListener((notification) => {
                selectNotificationCount++;
                debug(`SELECT ${notification}`);
            });

            let slider = accessibilityController.accessibleElementById("slider");
            slider.addNotificationListener((notification) => {
                sliderNotificationCount++;
                debug(`SLIDER ${notification}`);
            });

            accessibilityController.addNotificationListener((element, notification) => {
                if (element.isEqual(slider) || element.isEqual(select)) {
                    globalNotificationCount++;
                    debug(`GLOBAL ${notification} on element with role ${element.role}`);
                }
            });

            // This should trigger a "invalid status changed" notification on the select.
            document.getElementById("select").setAttribute("aria-invalid", "true");
            await expectAsyncExpression("selectNotificationCount", 1);

            // This should trigger a "value changed" notification on the slider.
            document.getElementById("slider").setAttribute("aria-valuenow", "6");
            await expectAsyncExpression("sliderNotificationCount", 1);

            await expectAsyncExpression("globalNotificationCount", 2);

            accessibilityController.removeNotificationListener();
            select.removeNotificationListener();
            slider.removeNotificationListener();
            finishJSTest();
        }, 0);
    }
</script>
</body>
</html>
