From 35731a6f2d9f2fe84ce29be990aea3959f6c1e14 Mon Sep 17 00:00:00 2001 From: Andrea Fercia Date: Mon, 31 Aug 2026 16:09:56 +0200 Subject: [PATCH 1/8] Try adding axe-core. --- package-lock.json | 44 +++++++++++++++++++++++---- package.json | 1 + tests/e2e/specs/accessibility.spec.js | 38 +++++++++++++++++++++++ 3 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 tests/e2e/specs/accessibility.spec.js diff --git a/package-lock.json b/package-lock.json index f1d7ebd89b2c4..f4c2ae59a3e1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,6 +40,7 @@ "wicg-inert": "3.1.3" }, "devDependencies": { + "@axe-core/playwright": "4.13.0", "@lodder/grunt-postcss": "^3.1.1", "@playwright/test": "1.61.1", "@pmmmwh/react-refresh-webpack-plugin": "0.6.2", @@ -120,6 +121,19 @@ "dev": true, "license": "ISC" }, + "node_modules/@axe-core/playwright": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.13.0.tgz", + "integrity": "sha512-6YLx+kxXu5GJceG4ozFg+33a2EMTdjYwWGloJ3sb9Kta5pp+ZNS53uxGVog5JetIY8s++P5UrtX+cri+u0VAVg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "axe-core": "~4.13.0" + }, + "peerDependencies": { + "playwright-core": ">= 1.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", @@ -9258,10 +9272,11 @@ "dev": true }, "node_modules/axe-core": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", - "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.13.0.tgz", + "integrity": "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==", "dev": true, + "license": "MPL-2.0", "engines": { "node": ">=4" } @@ -31645,10 +31660,27 @@ "dev": true }, "node_modules/to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-buffer/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/to-object-path": { diff --git a/package.json b/package.json index 9bb1fd5d0af5b..e5aab6562286b 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "last 2 Opera versions" ], "devDependencies": { + "@axe-core/playwright": "4.13.0", "@lodder/grunt-postcss": "^3.1.1", "@playwright/test": "1.61.1", "@pmmmwh/react-refresh-webpack-plugin": "0.6.2", diff --git a/tests/e2e/specs/accessibility.spec.js b/tests/e2e/specs/accessibility.spec.js new file mode 100644 index 0000000000000..252cdf20e806e --- /dev/null +++ b/tests/e2e/specs/accessibility.spec.js @@ -0,0 +1,38 @@ +import { test, expect } from '@wordpress/e2e-test-utils-playwright'; +const AxeBuilder = require( '@axe-core/playwright' ).default; + +test.describe( 'PHP Page Accessibility Tests', () => { + test( 'should not have any automatically detectable accessibility violations', async ( { admin, page, requestUtils } ) => { + + // await requestUtils.login(); + // await page.goto( 'http://localhost:8889/wp-admin/edit.php'); + await admin.visitAdminPage( '/edit.php' ); + + // 2. Run the axe scan on the rendered page + const scanResults = await new AxeBuilder({ page }).analyze(); + + // 3. Format and print violations individually if any are found + if (scanResults.violations.length > 0) { + console.log(`\n❌ Found ${scanResults.violations.length} accessibility violation(s):\n`); + + scanResults.violations.forEach((violation, index) => { + console.log(`--- Violation #${index + 1} ---`); + console.log(`Rule ID: ${violation.id}`); + console.log(`Impact: ${violation.impact.toUpperCase()}`); + console.log(`Failure: ${violation.description}`); + console.log(`Help Link: ${violation.helpUrl}`); + + // List every specific HTML element failing this rule + console.log('Failing Elements:'); + violation.nodes.forEach((node) => { + console.log(` - Target Selector: ${node.target.join(', ')}`); + console.log(` HTML Snippet: ${node.html}`); + }); + console.log('\n'); + }); + } + + // 3. Assert that the violations list is empty + expect(scanResults.violations).toEqual([]); + }); +}); From 086cb45ae6389158575d91de11b726df7b8fa51e Mon Sep 17 00:00:00 2001 From: Andrea Fercia Date: Tue, 1 Sep 2026 11:57:52 +0200 Subject: [PATCH 2/8] Clean up. --- package-lock.json | 2 +- package.json | 2 +- src/js/media/views/attachments/browser.js | 3 +- tests/e2e/specs/accessibility.spec.js | 91 +++++++++++++++-------- 4 files changed, 62 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index f4c2ae59a3e1e..aac97ae19872a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,7 @@ "wicg-inert": "3.1.3" }, "devDependencies": { - "@axe-core/playwright": "4.13.0", + "@axe-core/playwright": "^4.13.0", "@lodder/grunt-postcss": "^3.1.1", "@playwright/test": "1.61.1", "@pmmmwh/react-refresh-webpack-plugin": "0.6.2", diff --git a/package.json b/package.json index e5aab6562286b..9db40d6eff0ba 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "last 2 Opera versions" ], "devDependencies": { - "@axe-core/playwright": "4.13.0", + "@axe-core/playwright": "^4.13.0", "@lodder/grunt-postcss": "^3.1.1", "@playwright/test": "1.61.1", "@pmmmwh/react-refresh-webpack-plugin": "0.6.2", diff --git a/src/js/media/views/attachments/browser.js b/src/js/media/views/attachments/browser.js index 889978eaf78ec..2a58eaee7cf3c 100644 --- a/src/js/media/views/attachments/browser.js +++ b/src/js/media/views/attachments/browser.js @@ -241,7 +241,8 @@ AttachmentsBrowser = View.extend(/** @lends wp.media.view.AttachmentsBrowser.pro }).render() ); // DateFilter is a