User agent reliability for VoiceOver Mac Screen reader compatibility
Screen Readers
Nov 26, 2024
Shows how well VoiceOver Mac supports ARIA and WCAG sufficient techniques.
Latest version tested
VoiceOver macOS 14.6 with Safari 17.6
- All tests: 109 pass of 125 tests (87%)
- ARIA tests: 43 pass of 47 tests (91%)
- WCAG tests: 74 pass of 86 tests (86%)
Reliability trend
Failing tests
Test | Mode | What the user hears | Notes | |
---|---|---|---|---|
Page with xml:lang set on the html and p elements | Reading | Act-if tay-bill. Ray-day-oh. | Pronounced as English. Ignores xml:lang. | |
application/xhtml+xml page with mismatching lang and xml:lang on the html element | Reading | Ga-raj. Doo-ble. Damm. Un, zway, dray. | Speech pronounced as lang=fr, but CSS matches :lang(de). | |
audio with aria-label attribute | Reading | Nothing | Nothing voiced for audio - no indication it exists | |
audio with aria-labelledby attribute | Reading | Nothing | Nothing voiced for audio - no indication it exists | |
audio with title attribute | Reading | Nothing | Nothing voiced for audio - no indication it exists | |
a element placeholder link with no event handler or href attribute | Reading | Placeholder text, clickable | Announced as clickable, but no event handler so nothing happens when clicked | |
iframe with fallback content | Reading | Frame one | Meaningless frame title read out. | |
abbr with title | Reading | T L N | ABBR expansion ignored. | |
button containing img with title attribute | Reading | Button | Reads "button" without saying what button does. | |
button containing img with title attribute | Tabbing | Button | Reads "button" without saying what button does. | |
img with figcaption | Reading | Violet, taken on 12/11/2010, figure. One thousand, two hundred and thirty four PNG, image. Violet, taken on 12/11/2010. End of, Violet, taken on 12/11/2010, figure. | Reads out meaningless filename and FIGCAPTION. | |
area with aria-labelledby attribute | Reading | This is alt text, image map. In, this is alt text, image map, 2 items, link, comma left underscore arrow HTM. Link, comma right underscore arrow HTM | reads out filename instead of ARIA-LABELLEDBY | |
area with aria-labelledby attribute | Tabbing | Link, comma left underscore arrow HTM. Link, comma right underscore arrow HTM | Reads out filename instead of ARIA-LABELLEDBY | |
Data table with td headers attribute | Reading | Table, 7 columns, 3 rows. Spans 2 rows, homework, column 1 of 7. Spans 3 columns, exams, column 2 of 7. Spans 3 columns, projects, column 5 of 7. Row 2 of 3, exams, one, column 2 of 7. Two column 3 of 7. Final column 4 of 7. Projects, one, column 5 of 7. Two column 6 of 7. Final column 7 of 7. Row 3 of 3, homework, fifteen percent, column 1 of 7. Exams and one, fifteen percent, column 2 of 7. Two, fifteen percent, column 3 of 7. Final, twenty percent, column 4 of 7. Projects and one, ten percent, column 5 of 7. Two, ten percent, column 6 of 7. Final, fifteen percent, column 7 of 7. | Table incomprehensible - HEADERS relationships not announced correctly. | |
PDF18 Document with doc title | Reading | Slash SR_PDF_doc_title.pdf | Voices full URL. URL displayed in browser tab instead of title. | |
PDF16 Document default language set to French | Reading | Act-if tay-bill | Pronounced as English, document language ignored |
Passing tests
Test | Mode | What the user hears | Notes | |
---|---|---|---|---|
Page with lang set on the html and p elements | Reading | Act-eef tab-le. Rah-di-oh. | Pronounced as French and German. | |
text/html page with mismatching lang and xml:lang on the html element | Reading | Ga-raj. Doo-ble. Damm. Un, deux, trois. | Speech pronounced as lang=fr, and CSS matches :lang(fr). | |
Match lang subtags | Reading | Dam-he. Dam-he. Dam-he. | All pronounced as German. | |
ARIA role=heading | Heading | Heading level 1, first level heading. Heading level 2, second level heading. | ||
Heading is img with alt | Heading | Heading level 2, second level alt, image. | ||
applet with title attribute | Reading | Nothing | Safari on macOS no longer supports applets, and does not render them on screen | |
applet with fallback content | Reading | Fallback content for applet | Safari on macOS no longer supports applets | |
applet with aria-label attribute | Reading | Aria label for applet, empty group | Safari on macOS no longer supports applets | |
applet with aria-labelledby attribute | Reading | This is ARIA-LABELLEDBY text, empty group | Safari on macOS no longer supports applets | |
applet inside figure with figcaption element | Reading | Figure caption for applet, figure. Figure caption for applet. End of, figure caption for applet, figure. | Safari on macOS no longer supports applets | |
embed with title attribute | Reading | Nothing | Nothing displayed on screen and nothing voiced for object | |
embed inside figure with figcaption | Reading | Figure caption for embed, figure. Figure caption for embed. End of, figure caption for embed, figure. | ||
embed with aria-label attribute | Reading | Nothing | Nothing displayed on screen and nothing voiced for object | |
embed with aria-labelledby attribute | Reading | Nothing | Nothing displayed on screen and nothing voiced for object | |
object with fallback content | Reading | Fallback content for object | ||
object with title attribute | Reading | Nothing | Nothing displayed on screen and nothing voiced for object | |
object with aria-label attribute | Reading | Nothing | Nothing displayed on screen and nothing voiced for object | |
object with aria-labelledby attribute | Reading | Nothing | Nothing displayed on screen and nothing voiced for object | |
video with aria-label attribute | Reading | Video aria label, empty video playback. | ||
video with aria-labelledby attribute | Reading | This is ARIA-LABELLEDBY text, empty video playback. | ||
video with title attribute | Reading | Video title, empty video playback. | ||
a element placeholder link with no event handler or href attribute | Tabbing | Nothing | Skipped when tabbing, as expected | |
iframe with fallback content | Tabbing | Entering frame, link, example hyperlink. Leaving frame. | ||
iframe with title attribute | Reading | This is an IFRAME title, frame. | IFRAME TITLE attribute read. | |
iframe with title attribute | Tabbing | Entering this is an IFRAME title frame, link, example hyperlink. Leaving this is an IFRAME title. | ||
Interactive iframe with role=presentation and no accessible name | Reading | This is an. Link, example hyperlink. In the target page. | role=presentation makes frame seamless | |
Interactive iframe with role=presentation and no accessible name | Tabbing | Link, example hyperlink, article | ||
Interactive iframe with role=presentation and title attribute | Reading | This is an. Example hyperlink, link. In the target page. | role=presentation makes frame seamless | |
Interactive iframe with role=presentation and title attribute | Tabbing | Link, example hyperlink | ||
Interactive iframe with role=presentation and aria-label attribute | Reading | This is an. Example hyperlink, link. In the target page. | role=presentation makes frame seamless | |
Interactive iframe with role=presentation and aria-label attribute | Tabbing | Link, example hyperlink | ||
button containing img with alt | Reading | This is image alt, button | ||
button containing img with alt | Tabbing | This is image alt, button | ||
button containing img with aria-label | Reading | This is image aria label, button | ||
button containing img with aria-label | Tabbing | This is image aria label, button | ||
button containing img with aria-labelledby | Reading | This is aria labelled by, button | ||
button containing img with aria-labelledby | Tabbing | This is aria labelled by, button | ||
button with title containing img with null alt | Reading | This is button title, button | ||
button with title containing img with null alt | Tabbing | This is button title, button | ||
button with aria-label containing img with null alt | Reading | This is button aria label, button | ||
button with aria-label containing img with null alt | Tabbing | This is button aria label, button | ||
input type=image with alt | Reading | This is image button alt text, button | ||
input type=image with alt | Tabbing | This is image button alt text, button | ||
input type=image with title attribute | Reading | This is image button title text, button | ||
input type=image with title attribute | Tabbing | This is image button title text, button | ||
input type=image with aria-label attribute | Reading | This is image button aria label text, button | ||
input type=image with aria-label attribute | Tabbing | This is image button aria label text, button | ||
input type=image with aria-labelledby attribute | Reading | This is image button aria-labelled by text, button | ||
input type=image with aria-labelledby attribute | Tabbing | This is image button aria-labelled by text, button | ||
input type=text with aria-describedby attribute | Reading | First name. First name, a bit of instructions for this field linked with aria describedby, edit text | ||
input type=text with aria-describedby attribute | Tabbing | First name, a bit of instructions for this field linked with aria describedby, edit text. | ||
input type=text with title attribute | Reading | Enter search text, edit text | ||
input type=text with title attribute | Tabbing | Enter search text, edit text | ||
input type=text with aria-label attribute | Reading | Enter search text, edit text | ||
input type=text with aria-label attribute | Tabbing | Enter search text, edit text | ||
input type=text with aria-labelledby attribute | Reading | Enter search text. Enter search text, edit text | ||
input type=text with aria-labelledby attribute | Tabbing | Enter search text, edit text | ||
input type=text with label for | Reading | Enter search text. Enter search text, edit text | ||
input type=text with label for | Tabbing | Enter search text, edit text | ||
input type=text inside label with text before control | Reading | Enter search text. Enter search text, enter search text, edit text | ||
input type=text inside label with text before control | Tabbing | Enter search text, enter search text, edit text | ||
input type=text inside label with text after control | Reading | Enter search text, enter search text, edit text. Enter search text | ||
input type=text inside label with text after control | Tabbing | Enter search text, enter search text, edit text | ||
input type=text inside label with text before and after control | Reading | Enter search text. Enter search text, blanks not allowed, enter search text and one more item, edit text. Blanks not allowed | ||
input type=text inside label with text before and after control | Tabbing | Enter search text, blanks not allowed, enter search text and one more item, edit text | ||
fieldset containing links | Reading | Legend for enclosed links, group. Legend for enclosed links. Link, home. Link, about. Link, contact. End of, legend for enclosed links, group. | ||
fieldset containing links | Tabbing | Link home, legend for enclosed links, legend for enclosed links, group. Link about, legend for enclosed links. Link contact, legend for enclosed links. | Legend read out for every link. | |
Yes/No radio buttons inside fieldset element | Reading | I agree to terms and conditions, group. I agree to terms and conditions. Yes, selected radio button, one of two. Yes. No, radio button, two of two. No. End of, I agree to terms and conditions, group. Sign me up to the newsletter, group. Sign me up to the newsletter. Yes, selected radio button, one of two. Yes. No, radio button, two of two. No. End of, sign me up to the newsletter, group. | ||
Yes/No radio buttons inside fieldset element | Tabbing | Yes, selected radio button, one of two, I agree to terms and conditions, I agree to terms and conditions group. Yes, selected radio button, one of two, sign me up to the newsletter, sign me up to the newsletter group. | ||
img with null alt | Reading | Nothing | Ignored as expected | |
img with alt | Reading | This is alt text, image | ||
img with title | Reading | This is title text, image | ||
img with aria-label | Reading | This is an aria label, image | ||
img with aria-labelledby | Reading | This is an aria labelled by, image. This is an aria labelled by | ||
area and img with alt attributes | Reading | This is alt text, image map. In, this is alt text, image map, 2 items, link, this is left alt text. Link, this is right alt text. | ||
area and img with alt attributes | Tabbing | Link, this is left alt text. Link, this is right alt text | ||
area with alt attribute and img with null alt | Reading | Link, this is left alt text. Link, this is right alt text. | ||
area with alt attribute and img with null alt | Tabbing | Link, this is left alt text. Link, this is right alt text. | ||
area with title attribute | Reading | This is alt text, image map. In, this is alt text, image map, 2 items, link, this is left title text. Link, this is right title text | ||
area with title attribute | Tabbing | Link, this is left title text. Link, this is right title text | ||
area with aria-label attribute | Reading | This is alt text, image map. In, this is alt text, image map, 2 items, link, this is left aria label text. Link, this is right aria label text | ||
area with aria-label attribute | Tabbing | Link, this is left aria label text. Link, this is right aria label text | ||
Link containing img with alt | Reading | Link image, this is a link alt | ||
Link containing img with alt | Tabbing | Link image, this is a link alt | ||
Link containing img with title | Reading | Link image, this is an image title | ||
Link containing img with title | Tabbing | Link image, this is an image title | ||
Click Here link with title attribute | Reading | Link, click here, this is a link title | ||
Click Here link with title attribute | Tabbing | Link, click here, this is a link title | ||
Link text replaced by aria-label attribute | Reading | Link, this is an aria label | ||
Link text replaced by aria-label attribute | Tabbing | Link, this is an aria label | ||
Link text replaced by aria-labelledby attribute | Reading | Link, this is an aria labelled by. This is an aria labelled by | ||
Link text replaced by aria-labelledby attribute | Tabbing | Link, this is an aria labelled | ||
Click Here link with aria-describedby attribute | Reading | Link, click here, this is an aria described by. This is an aria described by | ||
Click Here link with aria-describedby attribute | Tabbing | Link, click here, this is an aria described by. | ||
Layout table with single cell | Reading | This is some text. | Treated as a layout table. | |
Layout table with role=presentation | Reading | Example. Navigation. Links. Content. | Table treated as layout table - not announced as table. | |
Data table with role=grid | Reading | Table, 2 columns, 2 rows. Morning, column 1 of 2. Afternoon, column 2 of 2. Row 2 of 2, morning, free, column 1 of 2. Afternoon, busy, column 2 of 2. | ||
Data table with role=table | Reading | Table, 1 column, 1 row. This is some text, column 1 of 1. | ||
Data table with summary and th | Reading | Table two columns, two rows, data table summary. Morning, column one of two. Afternoon, column two of two. Row two of two, morning, free, column one of two. Afternoon, busy, column two of two. | ||
Data table with caption and th | Reading | Data table caption, table, two columns, two rows. Morning, column one of two. Afternoon, column two of two. Row two of two morning, free, column one of two. Afternoon, busy, column two of two. | ||
Data table with role=columnheader headers but no th | Reading | Table two columns, two rows. Morning, column one of two. Afternoon, column two of two. Row two of two, morning, free, column one of two. Afternoon, busy, column two of two. | ||
Data table with th cell headers | Reading | Table, 2 columns, 2 rows. Morning, column 1 of 2. Afternoon, column 2 of 2. Row 2 of 2, morning, free, column 1 of 2. Afternoon, busy, column 2 of 2. | ||
Data table with th scope on cell headers | Reading | Contact information, table, 5 columns, 4 rows. Blank, column 1 of 5. Name, column 2 of 5. Phone number, column 3 of 5. Fax number, column 4 of 5. City, column 5 of 5. Row 2 of 4, one, column 1 of 5. Name, Joel Garner, column 2 of 5. Phone, 412 212 5421, column 3 of 5. Fax, 412 212 5400, column 4 of 5. City, Pittsburgh, column 5 of 5. Row 3 of 4, two, column 1 of 5. Name, Clive Lloyd, column 2 of 5. Phone, 410 306 1420, column 3 of 5. Fax, 410 306 5400, column 4 of 5. City, Baltimore, column 5 of 5. | ||
PDF9 Document with headings | Reading | Heading level 1, Heading 1. Heading level 2, heading 1.2. | ||
PDF1 Image with alt text | Reading | This is alt text, image | ||
PDF4 Decorative image marked as artifact | Reading | Nothing | Image ignored as expected | |
PDF19 Phrase language set to German | Reading | Rah-di-oh | Pronounced as German | |
PDF6 Table with header markup | Reading | Table, no selection. Morning, column 1, row 1. Afternoon, column 2, row 1. Morning, free. Afternoon, busy. | ||
PDF6 Table with header markup and alt text | Reading | Table, no selection. Morning, column 1, row 1. Afternoon, column 2, row 1. Morning, free. Afternoon, busy. |