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

<p id="description"></p>

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

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

<div id="console"></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.");

function runTest() {
    window.jsTestIsAsync = true;

    window.selectNotificationCount = 0;
    window.sliderNotificationCount = 0;
    window.globalNotificationCount = 0;

    if (window.accessibilityController) {
        document.getElementById("select").focus();
        window.select = accessibilityController.focusedElement;
        select.addNotificationListener(function(notification) {
            selectNotificationCount++;
            debug("SELECT " + notification);
        });

        document.getElementById("slider").focus();
        window.slider = accessibilityController.focusedElement;
        slider.addNotificationListener(function(notification) {
            sliderNotificationCount++;
            debug("SLIDER " + notification);
        });

        accessibilityController.addNotificationListener(function(element, notification) {
            if (element.isEqual(slider) || element.isEqual(select)) {
                globalNotificationCount++;
                debug("GLOBAL " + notification + " on element with role " + element.role);
            }
        });
    }

    // Ensure these elements exist in the AX tree otherwise notifications won't be generated.
    accessibilityController.accessibleElementById("select");
    accessibilityController.accessibleElementById("slider");

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

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

    window.setTimeout(function() {
        shouldBe("selectNotificationCount", "1");
        shouldBe("sliderNotificationCount", "1");
        shouldBe("globalNotificationCount", "2");

        if (window.accessibilityController) {
            accessibilityController.removeNotificationListener();
            select.removeNotificationListener();
            slider.removeNotificationListener();
        }

        finishJSTest();
    }, 10);
}

runTest();

</script>

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