Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(a11y): aria-live directive announcing the same text multiple times #13467

Conversation

crisbeto
Copy link
Member

@crisbeto crisbeto commented Oct 6, 2018

The CdkAriaLive directive uses a MutationObserver to monitor for DOM content changes and to announce them through the LiveAnnouncer. Since the MutationObserver also fires for things like attribute changes, the same text can be announced more than once. This is visible on the calendar where the same text is announced twice when changing views.

@crisbeto crisbeto added the target: patch This PR is targeted for the next patch release label Oct 6, 2018
@googlebot googlebot added the cla: yes PR author has agreed to Google's Contributor License Agreement label Oct 6, 2018
Copy link
Member

@devversion devversion left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@devversion devversion added pr: lgtm action: merge The PR is ready for merge by the caretaker labels Oct 6, 2018

// The `MutationObserver` fires also for attribute
// changes which we don't want to announce.
if (elementText !== this._previousAnnouncedText) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure about this, I could definitely see times when we would want to announce the same text twice in a row (e.g. if you have a list of some component that announces some text on focus and the user is tabbing through).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You wouldn't need to announce text on focus yourself since screen readers announce whatever focus lands on anyway. Another way we could avoid the issue is to debounce the content changes, or to clear the _previousAnnouncedText after a timeout.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I know that's not how we'd actually implement something like that, but the point is that I do think there are times we might want to announce the same text twice intentionally. Debouncing sounds like the best solution, or if that's too difficult then clearing the variable after a timeout.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setting up the debouncing should be pretty easy (we just need to pipe another operator), but thinking through it again, I'm not sure how this would happen in practice. In order for somebody to trigger the callback manually for the same text, they would have to swap out the content with a clone or change an attribute that doesn't affect the text content at all. It would look something like this which seems impractical:

someEl.innerHTML = 'something';

// later on
someEl.innerHTML = 'something';

// or
someEl.setAttribute('something', true);

Also note that these changes are to the CdkAriaLive directive, not the LiveAnnouncer service.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahh, I missed that it was for the directive only. In that case its probably fine, since the whole point is to announce something when the content changes. Sorry for the confusion.

@jelbourn jelbourn removed the action: merge The PR is ready for merge by the caretaker label Oct 8, 2018
@mmalerba mmalerba added the action: merge The PR is ready for merge by the caretaker label Oct 8, 2018
@crisbeto crisbeto force-pushed the live-announcer-directive-multiple-calls branch from aec14a9 to d9c9eaa Compare November 8, 2018 07:59
The `CdkAriaLive` directive uses a `MutationObserver` to monitor for DOM content changes and to announce them through the `LiveAnnouncer`. Since the `MutationObserver` also fires for things like attribute changes, the same text can be announced more than once. This is visible on the calendar where the same text is announced twice when changing views.
@vivian-hu-zz vivian-hu-zz merged commit a150494 into angular:master Nov 8, 2018
vivian-hu-zz pushed a commit that referenced this pull request Nov 12, 2018
#13467)

The `CdkAriaLive` directive uses a `MutationObserver` to monitor for DOM content changes and to announce them through the `LiveAnnouncer`. Since the `MutationObserver` also fires for things like attribute changes, the same text can be announced more than once. This is visible on the calendar where the same text is announced twice when changing views.
@angular-automatic-lock-bot
Copy link

This issue has been automatically locked due to inactivity.
Please file a new issue if you are encountering a similar or related problem.

Read more about our automatic conversation locking policy.

This action has been performed automatically by a bot.

@angular-automatic-lock-bot angular-automatic-lock-bot bot locked and limited conversation to collaborators Sep 10, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
action: merge The PR is ready for merge by the caretaker cla: yes PR author has agreed to Google's Contributor License Agreement target: patch This PR is targeted for the next patch release
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants