Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .github/actions/find/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,18 @@ https://primer.style/octicons/

**Optional** Stringified JSON object containing `username`, `password`, `cookies`, and/or `localStorage` from an authenticated session. For example: `{"username":"some-user","password":"correct-horse-battery-staple","cookies":[{"name":"theme-preference","value":"light","domain":"primer.style","path":"/"}],"localStorage":{"https://primer.style":{"theme-preference":"light"}}}`

#### `reduced_motion`

**Optional** Playwright
[`reducedMotion`](https://playwright.dev/docs/api/class-browser#browser-new-context-option-reduced-motion)
configuration option.

#### `color_scheme`

**Optional** Playwright
[`colorScheme`](https://playwright.dev/docs/api/class-browser#browser-new-context-option-color-scheme)
configuration option.

### Outputs

#### `findings`
Expand Down
6 changes: 6 additions & 0 deletions .github/actions/find/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ inputs:
description: "Whether to capture screenshots of scanned pages and include links to them in the issue"
required: false
default: "false"
reduced_motion:
description: "Playwright reducedMotion setting: https://playwright.dev/docs/api/class-browser#browser-new-page-option-reduced-motion"
required: false
color_scheme:
description: "Playwright colorScheme setting: https://playwright.dev/docs/api/class-browser#browser-new-context-option-color-scheme"
required: false

outputs:
findings:
Expand Down
1 change: 1 addition & 0 deletions .github/actions/find/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 8 additions & 2 deletions .github/actions/find/src/findForUrl.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type {Finding} from './types.d.js'
import type {ColorSchemePreference, Finding, ReducedMotionPreference} from './types.d.js'
import {AxeBuilder} from '@axe-core/playwright'
import playwright from 'playwright'
import {AuthContext} from './AuthContext.js'
Expand All @@ -8,12 +8,18 @@ export async function findForUrl(
url: string,
authContext?: AuthContext,
includeScreenshots: boolean = false,
reducedMotion?: ReducedMotionPreference,
colorScheme?: ColorSchemePreference,
): Promise<Finding[]> {
const browser = await playwright.chromium.launch({
headless: true,
executablePath: process.env.CI ? '/usr/bin/google-chrome' : undefined,
})
const contextOptions = authContext?.toPlaywrightBrowserContextOptions() ?? {}
const contextOptions = {
...(authContext?.toPlaywrightBrowserContextOptions() ?? {}),
...(reducedMotion ? {reducedMotion} : {}),
...(colorScheme ? {colorScheme} : {}),
}
const context = await browser.newContext(contextOptions)
const page = await context.newPage()
await page.goto(url)
Expand Down
24 changes: 22 additions & 2 deletions .github/actions/find/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type {AuthContextInput} from './types.js'
import type {AuthContextInput, ColorSchemePreference, ReducedMotionPreference} from './types.js'
import * as core from '@actions/core'
import {AuthContext} from './AuthContext.js'
import {findForUrl} from './findForUrl.js'
Expand All @@ -11,11 +11,31 @@ export default async function () {
const authContext = new AuthContext(authContextInput)

const includeScreenshots = core.getInput('include_screenshots', {required: false}) !== 'false'
const reducedMotionInput = core.getInput('reduced_motion', {required: false})
let reducedMotion: ReducedMotionPreference | undefined
if (reducedMotionInput) {
if (!['reduce', 'no-preference', null].includes(reducedMotionInput)) {
throw new Error(
"Input 'reduced_motion' must be one of: 'reduce', 'no-preference', or null per Playwright documentation.",
)
}
reducedMotion = reducedMotionInput as ReducedMotionPreference
}
const colorSchemeInput = core.getInput('color_scheme', {required: false})
let colorScheme: ColorSchemePreference | undefined
if (colorSchemeInput) {
if (!['light', 'dark', 'no-preference', null].includes(colorSchemeInput)) {
throw new Error(
"Input 'color_scheme' must be one of: 'light', 'dark', 'no-preference', or null per Playwright documentation.",
)
}
colorScheme = colorSchemeInput as ColorSchemePreference
}

const findings = []
for (const url of urls) {
core.info(`Preparing to scan ${url}`)
const findingsForUrl = await findForUrl(url, authContext, includeScreenshots)
const findingsForUrl = await findForUrl(url, authContext, includeScreenshots, reducedMotion, colorScheme)
if (findingsForUrl.length === 0) {
core.info(`No accessibility gaps were found on ${url}`)
continue
Expand Down
4 changes: 4 additions & 0 deletions .github/actions/find/src/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,7 @@ export type AuthContextInput = {
cookies?: Cookie[]
localStorage?: LocalStorage
}

export type ReducedMotionPreference = 'reduce' | 'no-preference' | null

export type ColorSchemePreference = 'light' | 'dark' | 'no-preference' | null
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ jobs:
# auth_context: # Optional: Stringified JSON object for complex authentication
# skip_copilot_assignment: false # Optional: Set to true to skip assigning issues to GitHub Copilot (or if you don't have GitHub Copilot)
# include_screenshots: false # Optional: Set to true to capture screenshots and include links to them in filed issues
# reduced_motion: no-preference # Optional: Playwright reduced motion configuration option
# color_scheme: light # Optional: Playwright color scheme configuration option
```

> 👉 Update all `REPLACE_THIS` placeholders with your actual values. See [Action Inputs](#action-inputs) for details.
Expand Down Expand Up @@ -115,6 +117,8 @@ Trigger the workflow manually or automatically based on your configuration. The
| `auth_context` | No | If scanned pages require authentication, a stringified JSON object containing username, password, cookies, and/or localStorage from an authenticated session | `{"username":"some-user","password":"***","cookies":[...]}` |
| `skip_copilot_assignment` | No | Whether to skip assigning filed issues to GitHub Copilot. Set to `true` if you don't have GitHub Copilot or prefer to handle issues manually | `true` |
| `include_screenshots` | No | Whether to capture screenshots of scanned pages and include links to them in filed issues. Screenshots are stored on the `gh-cache` branch of the repository running the workflow. Default: `false` | `true` |
| `reduced_motion` | No | Playwright `reducedMotion` setting for scan contexts. Allowed values: `reduce`, `no-preference` | `reduce` |
| `color_scheme` | No | Playwright `colorScheme` setting for scan contexts. Allowed values: `light`, `dark`, `no-preference` | `dark` |

---

Expand Down Expand Up @@ -148,11 +152,11 @@ The a11y scanner leverages GitHub Copilot coding agent, which can be configured

💬 We welcome your feedback! To submit feedback or report issues, please create an issue in this repository. For more information on contributing, please refer to the [CONTRIBUTING](./CONTRIBUTING.md) file.

## License
## License

📄 This project is licensed under the terms of the MIT open source license. Please refer to the [LICENSE](./LICENSE) file for the full terms.

## Maintainers
Copy link
Contributor

Choose a reason for hiding this comment

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

autoformatting stripped spaces in VSCode.

## Maintainers

🔧 Please refer to the [CODEOWNERS](./.github/CODEOWNERS) file for more information.

Expand Down
8 changes: 8 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ inputs:
description: "Whether to capture screenshots and include links to them in the issue"
required: false
default: "false"
reduced_motion:
description: "Playwright reducedMotion setting: https://playwright.dev/docs/api/class-browser#browser-new-page-option-reduced-motion"
required: false
color_scheme:
description: "Playwright colorScheme setting: https://playwright.dev/docs/api/class-browser#browser-new-context-option-color-scheme"
required: false

outputs:
results:
Expand Down Expand Up @@ -85,6 +91,8 @@ runs:
urls: ${{ inputs.urls }}
auth_context: ${{ inputs.auth_context || steps.auth.outputs.auth_context }}
include_screenshots: ${{ inputs.include_screenshots }}
reduced_motion: ${{ inputs.reduced_motion }}
color_scheme: ${{ inputs.color_scheme }}
- name: File
id: file
uses: ./../../_actions/github/accessibility-scanner/current/.github/actions/file
Expand Down