Skip to content
This repository has been archived by the owner on Sep 5, 2024. It is now read-only.

select: does not work well with VoiceOver #10967

Closed
jelbourn opened this issue Nov 3, 2017 · 8 comments · Fixed by #11761
Closed

select: does not work well with VoiceOver #10967

jelbourn opened this issue Nov 3, 2017 · 8 comments · Fixed by #11761
Assignees
Labels
a11y This issue is related to accessibility for: internal contributor The team will address this issue and community PRs are not requested. g3: reported The issue was reported by an internal or external product team. has: Pull Request A PR has been created to address this issue os: iOS This issue is specific to iOS P1: urgent Urgent issues that should be addressed in the next minor or patch release. resolution: fixed type: bug
Milestone

Comments

@jelbourn
Copy link
Member

jelbourn commented Nov 3, 2017

The component does not act as one whole form control; we may want to explore changing this from role="listbox" to "combobox" to get better results with VoiceOver specifically. Will be tricky to not mess up NVDA and JAWS at the same time.

@jelbourn jelbourn added the a11y This issue is related to accessibility label Nov 3, 2017
@Splaktar Splaktar added - needs: Pull Request needs: investigation The cause of this issue is not well understood and needs to be investigated by the team or community P1: urgent Urgent issues that should be addressed in the next minor or patch release. labels Dec 13, 2017
@benjiallen
Copy link

  • Component with issue
    • <md-select>
  • Overview of the Issues
    • Given I am using iOS VoiceOver, and an option within <md-select> has not been selected, when I try to "swipe right" to select the element, then focus jumps from the component to the label and makes it difficult to activate the control i.e., I need to “double tap” to get focus to the select and then “double tap” again to activate the control
    • Selects do not show up in the VoiceOver rotor. Given I select "form controls" from the VoiceOver rotor, when I try to "swipe down" to select an md-select then VoiceOver will skip the md-select
  • AngularJS Material Version
    • 1.1.5
  • Browsers and Operating System
    • iOS 11.2.1, Safari, VoiceOver
  • Reproduce the Error

@benjiallen
Copy link

Adding more issues with VoiceOver and md-select

  • What is the issue? *
    • In iOS VoiceOver, once an md-select with multiple selections is expanded, there is no way to collapse the list nor navigate to elements beyond the last option in the expanded option list. "Swiping right" past the last item in the md-select takes you outside of the viewport and into the browser chrome i.e., focus is moved to the back button
  • What is the expected behavior?
    • There should be a method for closing the select menu once the user has made a selection
    • After you reach the end of the list "swiping right" should move focus to the top of the list
  • CodePen (or steps to reproduce the issue): *
  • AngularJS Versions: *
    • AngularJS Version: 1.5.5
    • AngularJS Material Version: 1.1.5
  • Additional Information:
    • Browser Type: * Safari and VoiceOver
    • Browser Version: * Latest that comes with iOS
    • OS: * iOS 11.2.1
    • Stack Traces: N/A

@Splaktar Splaktar modified the milestones: 1.1.6, 1.1.7 Jan 17, 2018
@Splaktar Splaktar modified the milestones: 1.1.7, 1.1.8 Jan 29, 2018
@Splaktar Splaktar modified the milestones: 1.1.8, 1.1.9 Mar 16, 2018
@Splaktar Splaktar changed the title Select does not work well with VoiceOver select: does not work well with VoiceOver Mar 27, 2018
@Splaktar Splaktar self-assigned this Mar 27, 2018
@Splaktar Splaktar modified the milestones: 1.1.9, 1.1.10 Apr 19, 2018
@Splaktar Splaktar modified the milestones: 1.1.10, 1.1.11 Jun 19, 2018
@Splaktar Splaktar modified the milestones: 1.1.11, 1.1.12 Sep 24, 2018
@Splaktar Splaktar modified the milestones: 1.1.12, 1.1.13 Jan 3, 2019
@Splaktar Splaktar added g3: reported The issue was reported by an internal or external product team. type: bug os: iOS This issue is specific to iOS labels Jan 16, 2019
@Splaktar Splaktar modified the milestones: 1.1.13, 1.1.14 Feb 10, 2019
@Splaktar Splaktar added the for: internal contributor The team will address this issue and community PRs are not requested. label Jun 23, 2019
Splaktar added a commit that referenced this issue Jun 24, 2019
move to WAI-ARIA's Collapsible Dropdown Listbox practice
only set `aria-checked` for selects with `multiple`
- manually remove `aria-checked` set by ngAria due to ngValue usage
apply `md-focused` class to the option with focus
implement `aria-activedescendant`

Fixes #10748. Fixes #10967.
Splaktar added a commit that referenced this issue Jul 5, 2019
move to WAI-ARIA's Collapsible Dropdown Listbox practice
only set `aria-checked` for selects with `multiple`
- manually remove `aria-checked` set by ngAria due to ngValue usage
apply `md-focused` class to the option with focus
implement `aria-activedescendant` and `aria-multiselectable`
improve `ng-multiple` implementation
- account for `multiple` attribute on `md-select-menu`
- put `aria-multiselectable` on the correct element
remove unused `deregisterCollectionWatch()`
fix overloaded variable names

Fixes #10748. Fixes #10967.
Splaktar added a commit that referenced this issue Jul 14, 2019
move to WAI-ARIA's Collapsible Dropdown Listbox practice
only set `aria-checked` for selects with `multiple`
- manually remove `aria-checked` set by ngAria due to ngValue usage
apply `md-focused` class to the option with focus
implement `aria-activedescendant` and `aria-multiselectable`
improve `ng-multiple` implementation
- account for `multiple` attribute on `md-select-menu`
- put `aria-multiselectable` on the correct element
remove unused `deregisterCollectionWatch()`
fix overloaded variable names

Fixes #10748. Fixes #10967.
Splaktar added a commit that referenced this issue Jul 15, 2019
move to WAI-ARIA's Collapsible Dropdown Listbox practice
only set `aria-checked` for selects with `multiple`
- manually remove `aria-checked` set by ngAria due to ngValue usage
apply `md-focused` class to the option with focus
implement `aria-activedescendant` and `aria-multiselectable`
improve `ng-multiple` implementation
- account for `multiple` attribute on `md-select-menu`
- put `aria-multiselectable` on the correct element
remove unused `deregisterCollectionWatch()`
fix overloaded variable names

Fixes #10748. Fixes #10967.
@Splaktar
Copy link
Member

After some significant investigation, it doesn't appear that the WAI-ARIA Collapsible Dropdown Listbox pattern is well supported across screen readers (especially VoiceOver and NVDA).

I'm currently exploring other patterns and options.

Splaktar added a commit that referenced this issue Jul 24, 2019
move to WAI-ARIA's Collapsible Dropdown Listbox practice
- https://www.w3.org/TR/2019/NOTE-wai-aria-practices-1.1-20190207/examples/listbox/listbox-collapsible.html
- don't apply aria-required to md-select
  as it isn't compatible with the button role
- the md-content element is now the listbox
    - has the appropriate attributes and a unique id
    - and receives focus when the pop-up panel opens
    - aria-owns now points to this listbox element so that indexes work
- option focus is handled via `aria-activedescendant`
- remove `aria-expanded` when collapsed
- remove `aria-disabled` attribute when not disabled
manually remove `aria-checked` set by ngAria due to ngValue usage
apply `md-focused` class to the option with focus
improve `ng-multiple` implementation
- account for `multiple` attribute on `md-select-menu`
remove unused `deregisterCollectionWatch()`
fix overloaded variable names
don't set aria-selected="false" on options in single selection mode
stop labels and values from being announced multiple times
add JSDoc/Closure Compiler details and types
refinements for VoiceOver users
clean up watchers, observers, and event handlers on $destroy
fix a case where the initial selection model could contain two values
- for the empty option, i.e. "" and "None"
- deselection was only clearing the first one in single selection mode
reduce duplicated code for focusing option nodes
improve keyboard option scrolling behavior
eliminate duplicate call to `autoFocus()`

TODO: Escape doesn't set the model back to the previous value

Fixes #10748. Fixes #10967.
@Splaktar
Copy link
Member

After experimenting with and testing a number of approaches, I've pushed a big update to PR #11761 that provides a refined version of the WAI-ARIA Collapsible Dropdown Listbox pattern. It seems to be working considerably better in VoiceOver on macOS and testing on other platforms/screen readers is in progress.

More testing, review, and feedback is needed. There are also some known issues listed in the PR under TODO.

Single Selection

I believe that the selection issues mentioned in #10967 (comment) should be addressed. I haven't yet tested with the VoiceOver rotor.

Multiple Selection

As far as escaping a multiple selection pop-up panel mentioned in #10967 (comment), even on desktop it's not straightforward to get out of a multiple selection pop-up panel. You need to either tab out or use the Escape key to exit with the keyboard. With the mouse, you can click the backdrop. It would be nice if there was some guidance for working with multiple selection drop downs like this in the Material Design spec, but as far as I can tell, there is not. This sounds like a topic to raise with @jelbourn for consultation with the UX team as this also affects Angular Material.

Splaktar added a commit that referenced this issue Jul 29, 2019
move to WAI-ARIA's Collapsible Dropdown Listbox practice
- https://www.w3.org/TR/2019/NOTE-wai-aria-practices-1.1-20190207/examples/listbox/listbox-collapsible.html
- don't apply `aria-required` to `md-select`
  as it isn't compatible with the button role
- the `md-content` element is now the listbox
    - has the appropriate attributes and a unique id
    - and receives focus when the pop-up panel opens
    - `aria-owns` now points to this listbox element so that indexes work
- option focus is handled via `aria-activedescendant`
- remove `aria-expanded` when collapsed
- remove `aria-disabled` attribute when not disabled
manually remove `aria-checked` set by ngAria due to ngValue usage
apply `md-focused` class to the option with focus
improve `ng-multiple` implementation
- account for `multiple` attribute on `md-select-menu`
remove unused `deregisterCollectionWatch()`
fix overloaded variable names
don't set `aria-selected="false"` on options in single selection mode
stop labels and values from being announced multiple times
add JSDoc/Closure Compiler details and types
refinements for VoiceOver users
clean up watchers, observers, and event handlers on $destroy
fix a case where the initial selection model could contain two values
- for the empty option, i.e. "" and "None"
- deselection was only clearing the first one in single selection mode
reduce duplicated code for focusing option nodes
improve keyboard option scrolling behavior
eliminate duplicate call to `autoFocus()`

Fixes #10748. Fixes #10967.
Splaktar added a commit that referenced this issue Jul 29, 2019
move to WAI-ARIA's Collapsible Dropdown Listbox practice
- https://www.w3.org/TR/2019/NOTE-wai-aria-practices-1.1-20190207/examples/listbox/listbox-collapsible.html
- don't apply `aria-required` to `md-select`
  as it isn't compatible with the button role
- the `md-content` element is now the listbox
    - has the appropriate attributes and a unique id
    - and receives focus when the pop-up panel opens
    - `aria-owns` now points to this listbox element so that indexes work
- option focus is handled via `aria-activedescendant`
- remove `aria-expanded` when collapsed
- remove `aria-disabled` attribute when not disabled
manually remove `aria-checked` set by ngAria due to ngValue usage
apply `md-focused` class to the option with focus
improve `ng-multiple` implementation
- account for `multiple` attribute on `md-select-menu`
remove unused `deregisterCollectionWatch()`
fix overloaded variable names
don't set `aria-selected="false"` on options in single selection mode
stop labels and values from being announced multiple times
add JSDoc/Closure Compiler details and types
refinements for VoiceOver users
clean up watchers, observers, and event handlers on $destroy
fix a case where the initial selection model could contain two values
- for the empty option, i.e. "" and "None"
- deselection was only clearing the first one in single selection mode
reduce duplicated code for focusing option nodes
improve keyboard option scrolling behavior
eliminate duplicate call to `autoFocus()`

Fixes #10748. Fixes #10967.
Splaktar added a commit that referenced this issue Jul 29, 2019
move to WAI-ARIA's Collapsible Dropdown Listbox practice
- https://www.w3.org/TR/2019/NOTE-wai-aria-practices-1.1-20190207/examples/listbox/listbox-collapsible.html
- don't apply `aria-required` to `md-select`
  as it isn't compatible with the button role
- the `md-content` element is now the listbox
    - has the appropriate attributes and a unique id
    - and receives focus when the pop-up panel opens
    - `aria-owns` now points to this listbox element so that indexes work
- option focus is handled via `aria-activedescendant`
- remove `aria-expanded` when collapsed
- remove `aria-disabled` attribute when not disabled
manually remove `aria-checked` set by ngAria due to ngValue usage
apply `md-focused` class to the option with focus
improve `ng-multiple` implementation
- account for `multiple` attribute on `md-select-menu`
remove unused `deregisterCollectionWatch()`
fix overloaded variable names
don't set `aria-selected="false"` on options in single selection mode
stop labels and values from being announced multiple times
add JSDoc/Closure Compiler details and types
refinements for VoiceOver users
clean up watchers, observers, and event handlers on $destroy
fix a case where the initial selection model could contain two values
- for the empty option, i.e. "" and "None"
- deselection was only clearing the first one in single selection mode
reduce duplicated code for focusing option nodes
improve keyboard option scrolling behavior
eliminate duplicate call to `autoFocus()`

Fixes #10748. Fixes #10967.
Splaktar added a commit that referenced this issue Jul 29, 2019
move to WAI-ARIA's Collapsible Dropdown Listbox practice
- https://www.w3.org/TR/2019/NOTE-wai-aria-practices-1.1-20190207/examples/listbox/listbox-collapsible.html
- don't apply `aria-required` to `md-select`
  as it isn't compatible with the button role
- the `md-content` element is now the listbox
    - has the appropriate attributes and a unique id
    - and receives focus when the pop-up panel opens
    - `aria-owns` now points to this listbox element so that indexes work
- option focus is handled via `aria-activedescendant`
- remove `aria-expanded` when collapsed
- remove `aria-disabled` attribute when not disabled
manually remove `aria-checked` set by ngAria due to ngValue usage
apply `md-focused` class to the option with focus
improve `ng-multiple` implementation
- account for `multiple` attribute on `md-select-menu`
remove unused `deregisterCollectionWatch()`
fix overloaded variable names
don't set `aria-selected="false"` on options in single selection mode
stop labels and values from being announced multiple times
add JSDoc/Closure Compiler details and types
refinements for VoiceOver users
clean up watchers, observers, and event handlers on $destroy
fix a case where the initial selection model could contain two values
- for the empty option, i.e. "" and "None"
- deselection was only clearing the first one in single selection mode
reduce duplicated code for focusing option nodes
improve keyboard option scrolling behavior
eliminate duplicate call to `autoFocus()`

Fixes #10748. Fixes #10967.
Splaktar added a commit that referenced this issue Aug 5, 2019
- move to [WAI-ARIA's Collapsible Dropdown Listbox practice](https://www.w3.org/TR/2019/NOTE-wai-aria-practices-1.1-20190207/examples/listbox/listbox-collapsible.html)
  - don't apply aria-required to md-select
  - as it isn't compatible with the button role
  - the md-content element is now the listbox
      - has the appropriate attributes and a unique id
      - and receives focus when the pop-up panel opens
      - aria-owns now points to this listbox so that indexes work
  - option focus is handled via `aria-activedescendant`
  - remove `aria-expanded` when collapsed
  - remove `aria-disabled` attribute when not disabled
-  manually remove `aria-checked` set by ngAria due to ngValue usage
-  apply `md-focused` class to the option with focus
- improve `ng-multiple` implementation
  - account for `multiple` attribute on `md-select-menu`
- remove unused `deregisterCollectionWatch()`
- fix overloaded variable names
- don't set aria-selected="false" on options in single selection mode
- stop labels and values from being announced multiple times
- add JSDoc/Closure Compiler details and types
- refinements for VoiceOver users
- clean up watchers, observers, and event handlers on $destroy
- fix a case where the initial selection model could contain two values
  - for the empty option, i.e. "" and "None"
  - deselection was only clearing the first one in single selection mode
- reduce duplicated code for focusing option nodes
- improve keyboard option scrolling behavior
- eliminate duplicate call to `autoFocus()`
- fix docs css to not interfere with autocomplete suggestion styling

Fixes #10748. Fixes #10967.
@Splaktar Splaktar added the has: Pull Request A PR has been created to address this issue label Aug 5, 2019
Splaktar added a commit that referenced this issue Aug 12, 2019
- move to [WAI-ARIA's Collapsible Dropdown Listbox practice](https://www.w3.org/TR/2019/NOTE-wai-aria-practices-1.1-20190207/examples/listbox/listbox-collapsible.html)
  - don't apply aria-required to md-select
  - as it isn't compatible with the button role
  - the md-content element is now the listbox
      - has the appropriate attributes and a unique id
      - and receives focus when the pop-up panel opens
      - aria-owns now points to this listbox so that indexes work
  - option focus is handled via `aria-activedescendant`
  - remove `aria-expanded` when collapsed
  - remove `aria-disabled` attribute when not disabled
-  manually remove `aria-checked` set by ngAria due to ngValue usage
-  apply `md-focused` class to the option with focus
- improve `ng-multiple` implementation
  - account for `multiple` attribute on `md-select-menu`
- remove unused `deregisterCollectionWatch()`
- fix overloaded variable names
- don't set aria-selected="false" on options in single selection mode
- stop labels and values from being announced multiple times
- add JSDoc/Closure Compiler details and types
- refinements for VoiceOver users
- clean up watchers, observers, and event handlers on $destroy
- fix a case where the initial selection model could contain two values
  - for the empty option, i.e. "" and "None"
  - deselection was only clearing the first one in single selection mode
- reduce duplicated code for focusing option nodes
- improve keyboard option scrolling behavior
- eliminate duplicate call to `autoFocus()`
- fix docs css to not interfere with autocomplete suggestion styling

Fixes #10748. Fixes #10967.
@Splaktar Splaktar modified the milestones: 1.1.20, 1.1.21 Aug 15, 2019
Splaktar added a commit that referenced this issue Sep 7, 2019
- move to [WAI-ARIA's Collapsible Dropdown Listbox practice](https://www.w3.org/TR/2019/NOTE-wai-aria-practices-1.1-20190207/examples/listbox/listbox-collapsible.html)
  - don't apply aria-required to md-select
  - as it isn't compatible with the button role
  - the md-content element is now the listbox
      - has the appropriate attributes and a unique id
      - and receives focus when the pop-up panel opens
      - aria-owns now points to this listbox so that indexes work
  - option focus is handled via `aria-activedescendant`
  - remove `aria-expanded` when collapsed
  - remove `aria-disabled` attribute when not disabled
-  manually remove `aria-checked` set by ngAria due to ngValue usage
-  apply `md-focused` class to the option with focus
- improve `ng-multiple` implementation
  - account for `multiple` attribute on `md-select-menu`
- remove unused `deregisterCollectionWatch()`
- fix overloaded variable names
- don't set aria-selected="false" on options in single selection mode
- stop labels and values from being announced multiple times
- add JSDoc/Closure Compiler details and types
- refinements for VoiceOver users
- clean up watchers, observers, and event handlers on $destroy
- fix a case where the initial selection model could contain two values
  - for the empty option, i.e. "" and "None"
  - deselection was only clearing the first one in single selection mode
- reduce duplicated code for focusing option nodes
- improve keyboard option scrolling behavior
- eliminate duplicate call to `autoFocus()`
- fix docs css to not interfere with autocomplete suggestion styling

Fixes #10748. Fixes #10967.
@Splaktar Splaktar modified the milestones: 1.1.21, 1.1.22 Oct 22, 2019
Splaktar added a commit that referenced this issue Mar 6, 2020
- move to [WAI-ARIA's Collapsible Dropdown Listbox practice](https://www.w3.org/TR/2019/NOTE-wai-aria-practices-1.1-20190207/examples/listbox/listbox-collapsible.html)
  - don't apply aria-required to md-select
  - as it isn't compatible with the button role
  - the md-content element is now the listbox
      - has the appropriate attributes and a unique id
      - and receives focus when the pop-up panel opens
      - aria-owns now points to this listbox so that indexes work
  - option focus is handled via `aria-activedescendant`
  - remove `aria-expanded` when collapsed
  - remove `aria-disabled` attribute when not disabled
-  manually remove `aria-checked` set by ngAria due to ngValue usage
-  apply `md-focused` class to the option with focus
- improve `ng-multiple` implementation
  - account for `multiple` attribute on `md-select-menu`
- remove unused `deregisterCollectionWatch()`
- fix overloaded variable names
- don't set aria-selected="false" on options in single selection mode
- stop labels and values from being announced multiple times
- add JSDoc/Closure Compiler details and types
- refinements for VoiceOver users
- clean up watchers, observers, and event handlers on $destroy
- fix a case where the initial selection model could contain two values
  - for the empty option, i.e. "" and "None"
  - deselection was only clearing the first one in single selection mode
- reduce duplicated code for focusing option nodes
- improve keyboard option scrolling behavior
- eliminate duplicate call to `autoFocus()`
- fix docs css to not interfere with autocomplete suggestion styling

Fixes #10748. Fixes #10967.
Splaktar added a commit that referenced this issue Mar 6, 2020
- move to [WAI-ARIA's Collapsible Dropdown Listbox practice](https://www.w3.org/TR/2019/NOTE-wai-aria-practices-1.1-20190207/examples/listbox/listbox-collapsible.html)
  - don't apply aria-required to md-select
  - as it isn't compatible with the button role
  - the md-content element is now the listbox
      - has the appropriate attributes and a unique id
      - and receives focus when the pop-up panel opens
      - aria-owns now points to this listbox so that indexes work
  - option focus is handled via `aria-activedescendant`
  - remove `aria-expanded` when collapsed
  - remove `aria-disabled` attribute when not disabled
-  manually remove `aria-checked` set by ngAria due to ngValue usage
-  apply `md-focused` class to the option with focus
- improve `ng-multiple` implementation
  - account for `multiple` attribute on `md-select-menu`
- remove unused `deregisterCollectionWatch()`
- fix overloaded variable names
- don't set aria-selected="false" on options in single selection mode
- stop labels and values from being announced multiple times
- add JSDoc/Closure Compiler details and types
- refinements for VoiceOver users
- clean up watchers, observers, and event handlers on $destroy
- fix a case where the initial selection model could contain two values
  - for the empty option, i.e. "" and "None"
  - deselection was only clearing the first one in single selection mode
- reduce duplicated code for focusing option nodes
- improve keyboard option scrolling behavior
- eliminate duplicate call to `autoFocus()`
- fix docs css to not interfere with autocomplete suggestion styling

Fixes #10748. Fixes #10967.
Splaktar added a commit that referenced this issue Mar 10, 2020
- move to [WAI-ARIA's Collapsible Dropdown Listbox practice](https://www.w3.org/TR/2019/NOTE-wai-aria-practices-1.1-20190207/examples/listbox/listbox-collapsible.html)
  - don't apply aria-required to md-select
  - as it isn't compatible with the button role
  - the md-content element is now the listbox
      - has the appropriate attributes and a unique id
      - and receives focus when the pop-up panel opens
      - aria-owns now points to this listbox so that indexes work
  - option focus is handled via `aria-activedescendant`
  - remove `aria-expanded` when collapsed
  - remove `aria-disabled` attribute when not disabled
-  manually remove `aria-checked` set by ngAria due to ngValue usage
-  apply `md-focused` class to the option with focus
- improve `ng-multiple` implementation
  - account for `multiple` attribute on `md-select-menu`
- remove unused `deregisterCollectionWatch()`
- fix overloaded variable names
- don't set aria-selected="false" on options in single selection mode
- stop labels and values from being announced multiple times
- add JSDoc/Closure Compiler details and types
- refinements for VoiceOver users
- clean up watchers, observers, and event handlers on $destroy
- fix a case where the initial selection model could contain two values
  - for the empty option, i.e. "" and "None"
  - deselection was only clearing the first one in single selection mode
- reduce duplicated code for focusing option nodes
- improve keyboard option scrolling behavior
- eliminate duplicate call to `autoFocus()`
- fix docs css to not interfere with autocomplete suggestion styling

Fixes #10748. Fixes #10967.
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
a11y This issue is related to accessibility for: internal contributor The team will address this issue and community PRs are not requested. g3: reported The issue was reported by an internal or external product team. has: Pull Request A PR has been created to address this issue os: iOS This issue is specific to iOS P1: urgent Urgent issues that should be addressed in the next minor or patch release. resolution: fixed type: bug
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants