
Recommendation: work the 30-row checklist below against Safari on macOS, capture one evidence screenshot per criterion, and export the filled table as a dated PDF. For a defensible audit, run it on a Mac that has working audio for VoiceOver and a real, up-to-date Safari — a Figment M-series Mac (from $95/month; physical plan, exact chip, RAM and macOS confirmed in the quote) is the practical fit. Figment's $29 virtual Intel macOS runs Safari and Accessibility Inspector, but has no audio and no GPU acceleration, so VoiceOver listening steps and some rendering-dependent focus checks are better done on the M-series plan.
WCAG 2.2 is the current W3C Recommendation, first published 5 October 2023 and revised 12 December 2024 — see the W3C WCAG 2.2 Recommendation for the authoritative text. It adds nine success criteria over WCAG 2.1. Several of them — Focus Not Obscured, Dragging Movements, Target Size, Accessible Authentication — have Safari-specific behaviour that automated tooling will not catch on its own. This checklist walks through 30 criteria with one Safari-scoped test method per row, one evidence screenshot per row, and a Status column you fill in and export as a dated PDF.
The nine criteria added in WCAG 2.2, with the ones that need hands-on Safari testing marked ★:
| Criterion | Level | Why it matters on Safari |
|---|---|---|
| 2.4.11 Focus Not Obscured (Min) ★ | AA | Sticky headers and cookie banners regularly obscure the focus ring |
| 2.4.12 Focus Not Obscured (Enh) | AAA | Stricter: the entire focused component must stay visible |
| 2.4.13 Focus Appearance ★ | AAA | Default Safari focus rings may not meet area and contrast thresholds |
| 2.5.7 Dragging Movements ★ | AA | Sortable lists, sliders and carousels often use drag-only pointer APIs |
| 2.5.8 Target Size (Minimum) ★ | AA | Measure CSS box model in Web Inspector against the 24×24 CSS px rule |
| 3.2.6 Consistent Help | A | Help mechanism position tested across several pages |
| 3.3.7 Redundant Entry | A | Repeat-step forms should not re-ask for the same data |
| 3.3.8 Accessible Authentication (Min) ★ | AA | CAPTCHA alternatives; test with VoiceOver |
| 3.3.9 Accessible Authentication (Enh) | AAA | Stricter: no cognitive function test at all |
Before you start the audit, configure Safari and macOS so keyboard tests behave correctly:
Note on audio: VoiceOver speech is the primary evidence for Non-text Content (1.1.1), Link Purpose (2.4.4), Label in Name (2.5.3) and Accessible Authentication. Figment's $29 virtual Intel macOS has no audio device; if you use it for the audit, capture the VoiceOver caption panel in screenshots instead of relying on spoken output, or run those rows on an M-series plan.
Fill the Status column with Pass / Fail / NA. ★ marks criteria new in WCAG 2.2.
| ID | Level | Criterion | Safari test method | Expected result | Screenshot | Status |
|---|---|---|---|---|---|---|
| 1.1.1 | A | Non-text Content | VoiceOver on each image; VO+Right to walk; watch caption panel | Alt text announced; decorative images silent | evidence/1.1.1.png | |
| 1.3.1 | A | Info and Relationships | VO+U → Headings; Accessibility Inspector hierarchy | Semantic roles correct; headings nested logically | evidence/1.3.1.png | |
| 1.3.4 | AA | Orientation | Safari Responsive Design Mode → portrait and landscape | Content usable in both orientations | evidence/1.3.4.png | |
| 1.4.1 | A | Use of Color | System Settings → Accessibility → Display → Colour Filters → Greyscale | No information carried by colour alone | evidence/1.4.1.png | |
| 1.4.3 | AA | Contrast (Minimum) | Accessibility Inspector → Audit tab | Normal text ≥4.5:1; large text ≥3:1 | evidence/1.4.3.png | |
| 1.4.4 | AA | Resize Text | ⌘+ to 200% zoom | No text clipped or overlapping | evidence/1.4.4.png | |
| 1.4.10 | AA | Reflow | Responsive Design Mode → 320 CSS px wide | No horizontal scroll at 320 px | evidence/1.4.10.png | |
| 1.4.11 | AA | Non-text Contrast | Web Inspector: measure control vs background | UI component contrast ≥3:1 | evidence/1.4.11.png | |
| 1.4.12 | AA | Text Spacing | Inject bookmarklet: letter 0.12em, word 0.16em, line 1.5, paragraph 2em | No content clipped or hidden | evidence/1.4.12.png | |
| 1.4.13 | AA | Content on Hover or Focus | Hover tooltip; press Esc; move pointer onto tooltip | Dismissible, hoverable, persistent | evidence/1.4.13.png | |
| 2.1.1 | A | Keyboard | Tab through all interactive elements; activate with Enter/Space | Operable by keyboard alone | evidence/2.1.1.png | |
| 2.1.2 | A | No Keyboard Trap | Enter modals; try Shift+Tab and Esc | Focus always escapable | evidence/2.1.2.png | |
| 2.1.4 | A | Character Key Shortcuts | Test any single-character shortcuts | Can be disabled or remapped | evidence/2.1.4.png | |
| 2.4.1 | A | Bypass Blocks | Tab from first element | Skip link visible and functional | evidence/2.4.1.png | |
| 2.4.2 | A | Page Titled | Read Safari tab title on each page | Descriptive, unique per page | evidence/2.4.2.png | |
| 2.4.3 | A | Focus Order | Tab across page; trace order | Matches visual/reading order | evidence/2.4.3.png | |
| 2.4.4 | A | Link Purpose | VO+U → Links rotor; read each in isolation | Each link unambiguous out of context | evidence/2.4.4.png | |
| 2.4.6 | AA | Headings and Labels | VO+U → Headings; inspect form labels | Headings meaningful; labels match controls | evidence/2.4.6.png | |
| 2.4.7 | AA | Focus Visible | Tab through page | Visible focus indicator on every element | evidence/2.4.7.png | |
| 2.4.11 ★ | AA | Focus Not Obscured (Min) | Tab near sticky headers and floating footers | At least part of focus visible | evidence/2.4.11.png | |
| 2.4.13 ★ | AAA | Focus Appearance | Web Inspector: measure outline area; contrast check | Area ≥ perimeter × 2px; contrast ≥3:1 | evidence/2.4.13.png | |
| 2.5.3 | A | Label in Name | VoiceOver on labelled controls | Accessible name contains visible label text | evidence/2.5.3.png | |
| 2.5.7 ★ | AA | Dragging Movements | Identify drag UIs; test single-pointer alternative | Alternative pointer path exists | evidence/2.5.7.png | |
| 2.5.8 ★ | AA | Target Size (Minimum) | Web Inspector box model on each control | ≥24×24 CSS px or adequate spacing | evidence/2.5.8.png | |
| 3.1.1 | A | Language of Page | View source; check <html lang> | Correct BCP 47 tag; VoiceOver voice matches | evidence/3.1.1.png | |
| 3.2.6 ★ | A | Consistent Help | Compare help mechanism on 3+ pages | Same relative order on each page | evidence/3.2.6.png | |
| 3.3.7 ★ | A | Redundant Entry | Multi-step form; revisit earlier step | Prior data auto-populated or not re-asked | evidence/3.3.7.png | |
| 3.3.8 ★ | AA | Accessible Authentication (Min) | Attempt login; look for cognitive test | Accessible alternative, or no CAPTCHA | evidence/3.3.8.png | |
| 4.1.2 | A | Name, Role, Value | Accessibility Inspector hover on controls | Correct role, state and name | evidence/4.1.2.png | |
| 4.1.3 | AA | Status Messages | Trigger toast/validation; listen with VoiceOver | Announced without focus change | evidence/4.1.3.png |
Take a region screenshot (⌘⇧4) immediately after completing each test step. Name the file to match the Screenshot column (evidence/1.1.1.png, etc.) and store them in audit-YYYY-MM-DD/evidence/. Dated folders make cross-release comparison trivial:
diff -rq audit-2026-10-01/evidence audit-2026-11-10/evidence
For VoiceOver rows, enable the VoiceOver caption panel (VoiceOver Utility → General → Show captions) so spoken output is visible in the screenshot, not only audible.
Add a document header above the table in the Markdown file before export:
**Audit report:** WCAG 2.2 — Safari on macOS
**Date:** 2026-11-10
**Auditor:**
**Product version:**
**macOS / Safari version:**
**Scope:** [URL or component list]
**Conformance target:** WCAG 2.2 Level AA
Then produce a PDF. Either option works; pick what you already have:
# Option A: pandoc with a LaTeX engine
brew install pandoc basictex
pandoc audit-report.md \
--from gfm \
--pdf-engine=xelatex \
-V geometry:margin=2cm \
-o "Safari-WCAG22-Audit-$(date +%Y-%m-%d).pdf"
# Option B: print from Safari
# Render the Markdown in a viewer, then File → Print → Save as PDF.
# Set the Print dialog header/footer to include the date.
Entry monthly prices as listed on each vendor's current pricing page (hardware is not identical across rows — read the quote before deciding):
| Option | Entry price | What you get |
|---|---|---|
| Figment virtual Intel macOS | $29/mo | 2 vCPU, 8 GiB RAM, 80 GiB disk; no audio, no GPU; browser-console access |
| Figment M-series (physical) | from $95/mo | Request a quote for exact chip, RAM, disk and macOS version |
| CloudMac M4, 16 GB / 256 GB | $99.99/mo | Monthly; the 256 GB row shows Reserve now, 512 GB/1 TB are Fully reserved |
| CloudMac M4 annual | $999/yr ≈ $83.25/mo | $141/yr less than 12 × $95; 256 GB row the same reservation note |
| MacStadium M2.S | $109/mo | 8 GB / 256 GB; support and network included; 99.99% uptime claim on page |
| MacStadium M4.S | $149/mo | 16 GB / 256 GB |
Two notes on this table so nobody has to re-derive them: $999 ÷ 12 = $83.25/month, and 12 × $95 − $999 = $141/year. CloudMac's annual is cheaper than Figment's unspecified M-series entry on an annual horizon; the gap narrows or reverses once you want the specific managed CI work Figment's $249 Managed Build Mac includes (one M-series Mac, CI setup, backups, monitoring, 30 minutes monthly support). For a one-off accessibility audit with no CI, the lowest cheap-and-correct option is often a single month on any of these — just confirm audio and live Safari before you commit, and read each vendor's tax, setup and term as shown in its own offer.
Install only Xcode (for Accessibility Inspector) and the browser under test. Disable all extensions. Pin the macOS and Safari version in your header block so successive audits are directly comparable. Screenshots taken on a machine with nothing else running capture the page state cleanly without stray windows leaking into the region capture.
Request a configuration at /mac-hosting/start or compare plans at /mac-hosting.