diff --git a/.circleci/config.yml b/.circleci/config.yml index 79b5214547..640909b197 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -174,7 +174,8 @@ jobs: steps: - checkout - restore_dependency_cache - - run: cd packages/webdriverio && npx browser-driver-manager@1.0.4 install chrome chromedriver --verbose + - browser-tools/install-chrome + - browser-tools/install-chromedriver - run: npm run coverage --prefix=packages/webdriverio reporter-earl: diff --git a/packages/playwright/package-lock.json b/packages/playwright/package-lock.json index 7e145e292f..7a640ae236 100644 --- a/packages/playwright/package-lock.json +++ b/packages/playwright/package-lock.json @@ -803,8 +803,7 @@ }, "node_modules/axe-test-fixtures": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#fdf716904202205c300f24c87c91643ccb6ee19a", - "integrity": "sha512-46WxVU13cwpwXcZFZqn+O7lhsdgJG3D+rbu0qUAJkJzxQ170BUbDhxy1N9T6b6upfv1+cBfo6ME5I3ziSPC1yA==", + "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#ddc6e711051f0f8b834b7c01f1f056b04cf39e70", "dev": true, "license": "MPL-2.0" }, @@ -4291,8 +4290,7 @@ "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==" }, "axe-test-fixtures": { - "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#fdf716904202205c300f24c87c91643ccb6ee19a", - "integrity": "sha512-46WxVU13cwpwXcZFZqn+O7lhsdgJG3D+rbu0qUAJkJzxQ170BUbDhxy1N9T6b6upfv1+cBfo6ME5I3ziSPC1yA==", + "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#ddc6e711051f0f8b834b7c01f1f056b04cf39e70", "dev": true, "from": "axe-test-fixtures@github:dequelabs/axe-test-fixtures#v1" }, diff --git a/packages/playwright/src/index.ts b/packages/playwright/src/index.ts index 64e2da12a5..00b9530d4e 100644 --- a/packages/playwright/src/index.ts +++ b/packages/playwright/src/index.ts @@ -183,7 +183,8 @@ export default class AxeBuilder { private async inject(frames: Frame[]): Promise { for (const iframe of frames) { - await iframe.evaluate(this.script()); + await iframe.evaluate(await this.script()); + await iframe.evaluate(await this.axeConfigure()); } } @@ -193,13 +194,7 @@ export default class AxeBuilder { */ private script(): string { - return ` - ${this.source} - axe.configure({ - ${this.legacyMode ? '' : 'allowedOrigins: [""],'} - branding: { application: 'playwright' } - }) - `; + return this.source; } private async runLegacy(context: SerialContextObject): Promise { @@ -285,7 +280,7 @@ export default class AxeBuilder { ); blankPage.evaluate(this.script()); - + blankPage.evaluate(await this.axeConfigure()); return await blankPage .evaluate(axeFinishRun, { partialResults, @@ -295,4 +290,21 @@ export default class AxeBuilder { await blankPage.close(); }); } + + private async axeConfigure(): Promise { + const hasRunPartial = await this.page.evaluate( + 'typeof window.axe?.runPartial === "function"' + ); + + return ` + ;axe.configure({ + ${ + !this.legacyMode && !hasRunPartial + ? 'allowedOrigins: [""],' + : 'allowedOrigins: [""],' + } + branding: { application: 'playwright' } + }) + `; + } } diff --git a/packages/playwright/tests/axe-playwright.spec.ts b/packages/playwright/tests/axe-playwright.spec.ts index 0d719d064c..5f191caa9e 100644 --- a/packages/playwright/tests/axe-playwright.spec.ts +++ b/packages/playwright/tests/axe-playwright.spec.ts @@ -63,7 +63,7 @@ describe('@axe-core/playwright', () => { }).analyze(); assert.equal(res?.status(), 200); - assert.strictEqual(results.testEngine.version, '4.0.3'); + assert.strictEqual(results.testEngine.version, '4.2.3'); assert.isNotNull(results); assert.isArray(results.violations); assert.isArray(results.incomplete); @@ -395,6 +395,7 @@ describe('@axe-core/playwright', () => { ['#shadow-root', '#shadow-frame'], 'input' ]); + assert.deepEqual(nodes[2].target, ['#slotted-frame', 'input']); }); @@ -707,7 +708,7 @@ describe('@axe-core/playwright', () => { }).analyze(); assert.equal(res?.status(), 200); - assert.strictEqual(results.testEngine.version, '4.0.3'); + assert.strictEqual(results.testEngine.version, '4.2.3'); assert.isNotNull(results); assert.isArray(results.violations); assert.isArray(results.incomplete); @@ -817,12 +818,55 @@ describe('@axe-core/playwright', () => { assert.equal(res?.status(), 200); assert.deepEqual(nodes[0].target, ['#light-frame', 'input']); - assert.deepEqual(nodes[1].target, ['#slotted-frame', 'input']); - assert.deepEqual(nodes[2].target, [ + assert.deepEqual(nodes[1].target, [ ['#shadow-root', '#shadow-frame'], 'input' ]); + assert.deepEqual(nodes[2].target, ['#slotted-frame', 'input']); }); }); }); + + describe('allowedOrigins', () => { + const getAllowedOrigins = async (): Promise => { + return await page.evaluate('axe._audit.allowedOrigins'); + }; + + it('should not set when running runPartial and not legacy mode', async () => { + await page.goto(`${addr}/index.html`); + await new AxeBuilder({ page }).analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, [addr]); + assert.lengthOf(allowedOrigins, 1); + }); + + it('should not set when running runPartial and legacy mode', async () => { + await page.goto(`${addr}/index.html`); + await new AxeBuilder({ page }).setLegacyMode(true).analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, [addr]); + assert.lengthOf(allowedOrigins, 1); + }); + + it('should not set when running legacy source and legacy mode', async () => { + await page.goto(`${addr}/index.html`); + await new AxeBuilder({ page, axeSource: axeLegacySource }) + .setLegacyMode(true) + .analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, [addr]); + assert.lengthOf(allowedOrigins, 1); + }); + + it('should set when running legacy source and not legacy mode', async () => { + await page.goto(`${addr}/index.html`); + await new AxeBuilder({ + page, + axeSource: axeLegacySource + }).analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, ['*']); + assert.lengthOf(allowedOrigins, 1); + }); + }); }); diff --git a/packages/puppeteer/package-lock.json b/packages/puppeteer/package-lock.json index eab1f88300..71da88b8ac 100644 --- a/packages/puppeteer/package-lock.json +++ b/packages/puppeteer/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "@axe-core/puppeteer", - "version": "4.4.3", + "version": "4.4.4", "license": "MPL-2.0", "dependencies": { "axe-core": "^4.4.2" @@ -34,7 +34,7 @@ "node": ">=6.4.0" }, "peerDependencies": { - "puppeteer": ">=1.10.0 <= 15" + "puppeteer": ">=1.10.0 <= 16" } }, "node_modules/@ampproject/remapping": { @@ -973,7 +973,7 @@ }, "node_modules/axe-test-fixtures": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#ecbc704faae02752354aae318f71078efc96ddb6", + "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#ddc6e711051f0f8b834b7c01f1f056b04cf39e70", "dev": true, "license": "MPL-2.0" }, @@ -4872,7 +4872,7 @@ "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==" }, "axe-test-fixtures": { - "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#ecbc704faae02752354aae318f71078efc96ddb6", + "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#ddc6e711051f0f8b834b7c01f1f056b04cf39e70", "dev": true, "from": "axe-test-fixtures@github:dequelabs/axe-test-fixtures#v1" }, diff --git a/packages/puppeteer/test/axePuppeteer.test.ts b/packages/puppeteer/test/axePuppeteer.test.ts index ad1c2ce390..fd253e04b1 100644 --- a/packages/puppeteer/test/axePuppeteer.test.ts +++ b/packages/puppeteer/test/axePuppeteer.test.ts @@ -907,7 +907,7 @@ describe('AxePuppeteer', function () { assert.equal(res?.status(), 200); assert.equal(results.violations[0].id, 'label'); assert.lengthOf(results.violations[0].nodes, 4); - assert.equal(results.testEngine.version, '4.0.3'); + assert.equal(results.testEngine.version, '4.2.3'); }); it('throws if the top level errors', done => { @@ -953,4 +953,44 @@ describe('AxePuppeteer', function () { assert.isUndefined(frameTested); }); }); + + describe('allowedOrigins', () => { + const getAllowedOrigins = async (): Promise => { + return (await page.evaluate( + 'axe._audit.allowedOrigins' + )) as unknown as string[]; + }; + + it('should not set when running runPartial and not legacy mode', async () => { + await page.goto(`${addr}/index.html`); + await new AxePuppeteer(page).analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, [addr]); + assert.lengthOf(allowedOrigins, 1); + }); + + it('should not set when running runPartial and legacy mode', async () => { + await page.goto(`${addr}/index.html`); + await new AxePuppeteer(page).setLegacyMode(true).analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, [addr]); + }); + + it('should not set when running legacy source and legacy mode', async () => { + await page.goto(`${addr}/index.html`); + await new AxePuppeteer(page, axeSource + axeForceLegacy) + .setLegacyMode(true) + .analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, [addr]); + }); + + it('should set when running legacy source and not legacy mode', async () => { + await page.goto(`${addr}/index.html`); + await new AxePuppeteer(page, axeSource + axeForceLegacy).analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, ['*']); + assert.lengthOf(allowedOrigins, 1); + }); + }); }); diff --git a/packages/reporter-earl/package-lock.json b/packages/reporter-earl/package-lock.json index 9fb0cb2376..70a0dd52ce 100644 --- a/packages/reporter-earl/package-lock.json +++ b/packages/reporter-earl/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "@axe-core/reporter-earl", - "version": "4.4.3", + "version": "4.4.4", "license": "MPL-2.0", "devDependencies": { "@types/clone": "^2.1.1", diff --git a/packages/webdriverio/package-lock.json b/packages/webdriverio/package-lock.json index 405864a5a5..fd3ea05ebb 100644 --- a/packages/webdriverio/package-lock.json +++ b/packages/webdriverio/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "@axe-core/webdriverio", - "version": "4.4.3", + "version": "4.4.4", "license": "MPL-2.0", "dependencies": { "axe-core": "^4.4.2", @@ -23,7 +23,7 @@ "@wdio/sync": "^7.16.3", "axe-test-fixtures": "github:dequelabs/axe-test-fixtures#v1", "chai": "^4.3.6", - "chromedriver": "^104.0.0", + "chromedriver": "^105.0.1", "delay": "^5.0.0", "express": "^4.18.1", "mocha": "^10.0.0", @@ -650,9 +650,9 @@ } }, "node_modules/@testim/chrome-version": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.2.tgz", - "integrity": "sha512-1c4ZOETSRpI0iBfIFUqU4KqwBAB2lHUAlBjZz/YqOHqwM9dTTzjV6Km0ZkiEiSCx/tLr1BtESIKyWWMww+RUqw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.3.tgz", + "integrity": "sha512-g697J3WxV/Zytemz8aTuKjTGYtta9+02kva3C1xc7KXB8GdbfE1akGJIsZLyY/FSh2QrnE+fiB7vmWU3XNcb6A==", "dev": true }, "node_modules/@tsconfig/node10": { @@ -1253,8 +1253,7 @@ }, "node_modules/axe-test-fixtures": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#ecbc704faae02752354aae318f71078efc96ddb6", - "integrity": "sha512-36p+/gJu7tRXjarz3CN2Sfya2IwuHRL4d3laNgn+RtZW1VViogHy6a/IULA5Rd5uS7UV7GlNCm3koAbm02T/Dg==", + "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#ddc6e711051f0f8b834b7c01f1f056b04cf39e70", "dev": true, "license": "MPL-2.0" }, @@ -1621,17 +1620,17 @@ } }, "node_modules/chromedriver": { - "version": "104.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-104.0.0.tgz", - "integrity": "sha512-zbHZutN2ATo19xA6nXwwLn+KueD/5w8ap5m4b6bCb8MIaRFnyDwMbFoy7oFAjlSMpCFL3KSaZRiWUwjj//N3yQ==", + "version": "105.0.1", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-105.0.1.tgz", + "integrity": "sha512-QqylH9mvl4Ybq3mmHsym7jeq/LhEi2sPtD8ffd9ixiDFdPRlh2F4vzrzK+myj1MiXb0TYJK7+OCcMEmsB3Sm/Q==", "dev": true, "hasInstallScript": true, "dependencies": { - "@testim/chrome-version": "^1.1.2", + "@testim/chrome-version": "^1.1.3", "axios": "^0.27.2", - "del": "^6.0.0", + "del": "^6.1.1", "extract-zip": "^2.0.1", - "https-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", "proxy-from-env": "^1.1.0", "tcp-port-used": "^1.0.1" }, @@ -2009,9 +2008,9 @@ } }, "node_modules/del": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.0.tgz", - "integrity": "sha512-OpcRktOt7G7HBfyxP0srBH4Djg4824EQORX8E1qvIhIzthNNArxxhrB/Mm7dRMiLi1nvFyUpDhzD2cTtbBhV8A==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dev": true, "dependencies": { "globby": "^11.0.1", @@ -2352,9 +2351,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6218,9 +6217,9 @@ } }, "@testim/chrome-version": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.2.tgz", - "integrity": "sha512-1c4ZOETSRpI0iBfIFUqU4KqwBAB2lHUAlBjZz/YqOHqwM9dTTzjV6Km0ZkiEiSCx/tLr1BtESIKyWWMww+RUqw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.3.tgz", + "integrity": "sha512-g697J3WxV/Zytemz8aTuKjTGYtta9+02kva3C1xc7KXB8GdbfE1akGJIsZLyY/FSh2QrnE+fiB7vmWU3XNcb6A==", "dev": true }, "@tsconfig/node10": { @@ -6740,8 +6739,7 @@ "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==" }, "axe-test-fixtures": { - "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#ecbc704faae02752354aae318f71078efc96ddb6", - "integrity": "sha512-36p+/gJu7tRXjarz3CN2Sfya2IwuHRL4d3laNgn+RtZW1VViogHy6a/IULA5Rd5uS7UV7GlNCm3koAbm02T/Dg==", + "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#ddc6e711051f0f8b834b7c01f1f056b04cf39e70", "dev": true, "from": "axe-test-fixtures@github:dequelabs/axe-test-fixtures#v1" }, @@ -6991,16 +6989,16 @@ } }, "chromedriver": { - "version": "104.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-104.0.0.tgz", - "integrity": "sha512-zbHZutN2ATo19xA6nXwwLn+KueD/5w8ap5m4b6bCb8MIaRFnyDwMbFoy7oFAjlSMpCFL3KSaZRiWUwjj//N3yQ==", + "version": "105.0.1", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-105.0.1.tgz", + "integrity": "sha512-QqylH9mvl4Ybq3mmHsym7jeq/LhEi2sPtD8ffd9ixiDFdPRlh2F4vzrzK+myj1MiXb0TYJK7+OCcMEmsB3Sm/Q==", "dev": true, "requires": { - "@testim/chrome-version": "^1.1.2", + "@testim/chrome-version": "^1.1.3", "axios": "^0.27.2", - "del": "^6.0.0", + "del": "^6.1.1", "extract-zip": "^2.0.1", - "https-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", "proxy-from-env": "^1.1.0", "tcp-port-used": "^1.0.1" } @@ -7286,9 +7284,9 @@ "dev": true }, "del": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.0.tgz", - "integrity": "sha512-OpcRktOt7G7HBfyxP0srBH4Djg4824EQORX8E1qvIhIzthNNArxxhrB/Mm7dRMiLi1nvFyUpDhzD2cTtbBhV8A==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dev": true, "requires": { "globby": "^11.0.1", @@ -7543,9 +7541,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", diff --git a/packages/webdriverio/package.json b/packages/webdriverio/package.json index 98fbf0a24a..b7bd717f68 100644 --- a/packages/webdriverio/package.json +++ b/packages/webdriverio/package.json @@ -50,7 +50,7 @@ "@wdio/sync": "^7.16.3", "axe-test-fixtures": "github:dequelabs/axe-test-fixtures#v1", "chai": "^4.3.6", - "chromedriver": "^104.0.0", + "chromedriver": "^105.0.1", "delay": "^5.0.0", "express": "^4.18.1", "mocha": "^10.0.0", diff --git a/packages/webdriverio/src/index.ts b/packages/webdriverio/src/index.ts index 94884ffda5..1d32354a15 100644 --- a/packages/webdriverio/src/index.ts +++ b/packages/webdriverio/src/index.ts @@ -9,7 +9,8 @@ import { axeGetFrameContext, axeRunPartial, axeFinishRun, - axeRunLegacy + axeRunLegacy, + configureAllowedOrigins } from './utils'; import type { Browser } from 'webdriverio'; @@ -175,12 +176,11 @@ export default class AxeBuilder { */ private get script(): string { return ` - ${this.axeSource} - axe.configure({ - ${this.legacyMode ? '' : `allowedOrigins: [''],`} - branding: { application: 'webdriverio' } - }) - `; + ${this.axeSource} + axe.configure({ + branding: { application: 'webdriverio' } + }) + `; } /** @@ -190,7 +190,14 @@ export default class AxeBuilder { browsingContext: WdioElement | null = null ): Promise { await this.setBrowsingContext(browsingContext); - await this.client.execute(this.script); + const runPartialSupported = await axeSourceInject( + this.client, + this.axeSource + ); + + if (!this.legacyMode && !runPartialSupported) { + await configureAllowedOrigins(this.client); + } const frames = (await this.client.$$(this.frameSelector())) || []; const iframes = @@ -224,6 +231,7 @@ export default class AxeBuilder { if (!runPartialSupported || this.legacyMode) { return await this.runLegacy(context); } + const partials = await this.runPartialRecursive(context); try { diff --git a/packages/webdriverio/src/test.ts b/packages/webdriverio/src/test.ts index d5987de5d1..c367cfe33a 100644 --- a/packages/webdriverio/src/test.ts +++ b/packages/webdriverio/src/test.ts @@ -153,7 +153,7 @@ describe('@axe-core/webdriverio', () => { describe('for versions without axe.runPartial', () => { describe('analyze', () => { - it('returns results axe-core4.0.3', async () => { + it('returns results axe-core4.2.3', async () => { await client.url(`${addr}/index.html`); const title = await client.getTitle(); const results = await new AxeBuilder({ @@ -374,7 +374,7 @@ describe('@axe-core/webdriverio', () => { assert.notEqual(title, 'Error'); assert.isNotNull(results); - assert.strictEqual(results.testEngine.version, '4.0.3'); + assert.strictEqual(results.testEngine.version, '4.2.3'); assert.isArray(results.violations); assert.isArray(results.incomplete); assert.isArray(results.passes); @@ -1297,6 +1297,59 @@ describe('@axe-core/webdriverio', () => { } }); }); + + describe('allowedOrigins', () => { + const promisify = (thenable: Promise): Promise => { + return new Promise((resolve, reject) => { + thenable.then(resolve, reject); + }); + }; + + const getAllowedOrigins = async (): Promise => { + return promisify( + client.executeAsync( + ` + var callback = arguments[arguments.length - 1]; + var allowedOrigins = axe._audit.allowedOrigins + callback(allowedOrigins); + ` + ) as any + ); + }; + + it('should not set when running runPartial and not legacy mode', async () => { + await client.url(`${addr}/index.html`); + const res = await new AxeBuilder({ client }).analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, [addr]); + }); + + it('should not set when running runPartial and legacy mode', async () => { + await client.url(`${addr}/index.html`); + await new AxeBuilder({ client }).setLegacyMode(true).analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, [addr]); + }); + + it('should not set when running legacy source and legacy mode', async () => { + await client.url(`${addr}/index.html`); + await new AxeBuilder({ client, axeSource: axeLegacySource }) + .setLegacyMode(true) + .analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, [addr]); + }); + + it('should set when running legacy source and not legacy mode', async () => { + await client.url(`${addr}/index.html`); + const res = await new AxeBuilder({ + client, + axeSource: axeLegacySource + }).analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, ['*']); + }); + }); }); } diff --git a/packages/webdriverio/src/utils.ts b/packages/webdriverio/src/utils.ts index 58680d6922..cf931622ed 100644 --- a/packages/webdriverio/src/utils.ts +++ b/packages/webdriverio/src/utils.ts @@ -92,7 +92,7 @@ export const axeSourceInject = async ( window.axe.configure({ branding: { application: 'webdriverio' } }); - var runPartial = typeof window.axe.runPartial === 'function'; + var runPartial = typeof window.axe?.runPartial === 'function'; callback(runPartial); `) ); @@ -183,6 +183,14 @@ export const axeFinishRun = ( ); }; +export const configureAllowedOrigins = (client: Browser<'async'>): Promise => { + return promisify( + client.execute(` + window.axe.configure({ allowedOrigins: [''] }) + `) + ); +}; + /** * JSON.parse wrapper with types * diff --git a/packages/webdriverjs/package-lock.json b/packages/webdriverjs/package-lock.json index c981c6c6cb..aa7a041bac 100644 --- a/packages/webdriverjs/package-lock.json +++ b/packages/webdriverjs/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "@axe-core/webdriverjs", - "version": "4.4.3", + "version": "4.4.4", "license": "MPL-2.0", "dependencies": { "axe-core": "^4.4.2" @@ -1054,8 +1054,7 @@ }, "node_modules/axe-test-fixtures": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#fdf716904202205c300f24c87c91643ccb6ee19a", - "integrity": "sha512-oRZ6d9CNqhbZC89Mi2KHpmg3LUqca9dOhvRH44PKsakg+8MsjHRXfi7bfNGsTkqmHE6+v6vH1COuYd5J9ZK2Ug==", + "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#ddc6e711051f0f8b834b7c01f1f056b04cf39e70", "dev": true, "license": "MPL-2.0" }, @@ -5937,8 +5936,7 @@ "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==" }, "axe-test-fixtures": { - "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#fdf716904202205c300f24c87c91643ccb6ee19a", - "integrity": "sha512-oRZ6d9CNqhbZC89Mi2KHpmg3LUqca9dOhvRH44PKsakg+8MsjHRXfi7bfNGsTkqmHE6+v6vH1COuYd5J9ZK2Ug==", + "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#ddc6e711051f0f8b834b7c01f1f056b04cf39e70", "dev": true, "from": "axe-test-fixtures@github:dequelabs/axe-test-fixtures#v1" }, diff --git a/packages/webdriverjs/src/index.ts b/packages/webdriverjs/src/index.ts index af60e21b4b..f1b74181b2 100644 --- a/packages/webdriverjs/src/index.ts +++ b/packages/webdriverjs/src/index.ts @@ -186,7 +186,7 @@ class AxeBuilder { private async runLegacy(context: ContextObject): Promise { const { driver, axeSource, builderOptions } = this; let config = this.config; - if (this.legacyMode !== true) { + if (!this.legacyMode) { config = { ...(config || {}), allowedOrigins: [''] diff --git a/packages/webdriverjs/tests/axe-webdriverjs.spec.ts b/packages/webdriverjs/tests/axe-webdriverjs.spec.ts index 9ecd6cbeae..9f438a9226 100644 --- a/packages/webdriverjs/tests/axe-webdriverjs.spec.ts +++ b/packages/webdriverjs/tests/axe-webdriverjs.spec.ts @@ -796,7 +796,7 @@ describe('@axe-core/webdriverjs', () => { assert.notEqual(title, 'Error'); assert.equal(results.violations[0].id, 'label'); assert.lengthOf(results.violations[0].nodes, 4); - assert.equal(results.testEngine.version, '4.0.3'); + assert.equal(results.testEngine.version, '4.2.3'); }); it('throws if the top level errors', done => { @@ -861,4 +861,42 @@ describe('@axe-core/webdriverjs', () => { assert.isUndefined(frameTested); }); }); + + describe('allowedOrigins', () => { + const getAllowedOrigins = async (): Promise => { + return await driver.executeScript('return axe._audit.allowedOrigins'); + }; + + it('should not set when running runPartial and not legacy mode', async () => { + await driver.get(`${addr}/index.html`); + await new AxeBuilder(driver).analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, [addr]); + assert.lengthOf(allowedOrigins, 1); + }); + + it('should not set when running runPartial and legacy mode', async () => { + await driver.get(`${addr}/index.html`); + await new AxeBuilder(driver).setLegacyMode(true).analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, [addr]); + }); + + it('should not set when running legacy source and legacy mode', async () => { + await driver.get(`${addr}/index.html`); + await new AxeBuilder(driver, axeSource + axeForceLegacy) + .setLegacyMode(true) + .analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, [addr]); + }); + + it('should set when running legacy source and not legacy mode', async () => { + await driver.get(`${addr}/index.html`); + await new AxeBuilder(driver, axeSource + axeForceLegacy).analyze(); + const allowedOrigins = await getAllowedOrigins(); + assert.deepEqual(allowedOrigins, ['*']); + assert.lengthOf(allowedOrigins, 1); + }); + }); });