chromium/third_party/blink/web_tests/accessibility/other-aria-attribute-change-sends-notification.html

<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
</head>
<body>

<div id="container">
  <button id="aria-busy" aria-busy="false">Busy</button>
  <button id="aria-disabled" aria-disabled="false">Disabled</button>
  <button id="aria-readonly" aria-readonly="false">Readonly</button>
  <button id="aria-required" aria-required="false">Required</button>
</div>

<script>
async_test((t) => {
    function accessibleElementById(id) {
        return accessibilityController.accessibleElementById(id);
    }
    accessibilityController.addNotificationListener(t.step_func((target, notification) => {
        if (notification == "LoadComplete") {
            // Wait until LoadComplete so that we don't process MarkDirty events
            // related to document load.
            window.setTimeout(t.step_func(() => {
                assert_unreached('Did not receive all expected notifications within 1000ms');
            }), 1000);

            var expectedNotifications = ['aria-busy',
                'aria-disabled',
                'aria-readonly',
                'aria-required'
            ];

            var gotSuccessfulNotification = t.step_func((id) => {
                console.log('gotSuccessfulNotification: ' + id);
                assert_not_equals(expectedNotifications.length, 0);
                assert_equals(id, expectedNotifications.shift());

                if (expectedNotifications.length > 0)
                    return;

                console.log('All notifications received successfully.');
                accessibleElementById('aria-busy').removeNotificationListener();
                accessibleElementById('aria-disabled').removeNotificationListener();
                accessibleElementById('aria-readonly').removeNotificationListener();
                accessibleElementById('aria-required').removeNotificationListener();

                t.done();
            });

            accessibleElementById('aria-busy').addNotificationListener(t.step_func((notification) => {
                console.log('Got ' + notification + ' notification on aria-busy');
                if (notification === 'MarkDirty')
                    gotSuccessfulNotification('aria-busy');
            }));
            document.getElementById('aria-busy').setAttribute('aria-busy', 'true');

            accessibleElementById('aria-disabled').addNotificationListener(t.step_func((notification) => {
                console.log('Got ' + notification + ' notification on aria-disabled');
                if (notification === 'MarkDirty')
                    gotSuccessfulNotification('aria-disabled');
            }));
            document.getElementById('aria-disabled').setAttribute('aria-disabled', 'true');

            accessibleElementById('aria-readonly').addNotificationListener(t.step_func((notification) => {
                console.log('Got ' + notification + ' notification on aria-readonly');
                if (notification === 'MarkDirty')
                    gotSuccessfulNotification('aria-readonly');
            }));
            document.getElementById('aria-readonly').setAttribute('aria-readonly', 'true');

            accessibleElementById('aria-required').addNotificationListener(t.step_func((notification) => {
                console.log('Got ' + notification + ' notification on aria-required');
                if (notification === 'MarkDirty')
                    gotSuccessfulNotification('aria-required');
            }));
            document.getElementById('aria-required').setAttribute('aria-required', 'true');

        }
    }));
}, "This test ensures that a change to any ARIA attribute, not just a state, sends a notification.");


</script>

</body>
</html>