From cb51be4e3ed69e8e8b3725cab5ad1a4671f64c0c Mon Sep 17 00:00:00 2001 From: Mikey Binns <38146638+mikeybinns@users.noreply.github.com> Date: Mon, 22 May 2023 16:36:05 +0100 Subject: [PATCH 1/6] fix(aria-allowed-attr): Add 'aria-required' to switch role (#4029) Related: #4027 --- lib/standards/aria-roles.js | 2 +- test/integration/rules/aria-allowed-attr/passes.html | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/standards/aria-roles.js b/lib/standards/aria-roles.js index 09d1b012b4..c49c6b3f4a 100644 --- a/lib/standards/aria-roles.js +++ b/lib/standards/aria-roles.js @@ -686,7 +686,7 @@ const ariaRoles = { switch: { type: 'widget', requiredAttrs: ['aria-checked'], - allowedAttrs: ['aria-readonly'], + allowedAttrs: ['aria-readonly', 'aria-required'], superclassRole: ['checkbox'], accessibleNameRequired: true, nameFromContent: true, diff --git a/test/integration/rules/aria-allowed-attr/passes.html b/test/integration/rules/aria-allowed-attr/passes.html index 61c0d3f069..702a41e5fe 100644 --- a/test/integration/rules/aria-allowed-attr/passes.html +++ b/test/integration/rules/aria-allowed-attr/passes.html @@ -1922,6 +1922,7 @@ aria-live="value" aria-owns="value" aria-relevant="value" + aria-required="value" > ok From 377f72b16a4db5272b6c056a070e977dc0589cf5 Mon Sep 17 00:00:00 2001 From: Wilco Fiers Date: Wed, 24 May 2023 13:36:06 +0200 Subject: [PATCH 2/6] fix(aria-required-children): set related nodes for invalid children (#4033) --- lib/core/utils/check-helper.js | 23 ++++-- test/core/utils/check-helper.js | 139 ++++++++++++++++++++++---------- 2 files changed, 111 insertions(+), 51 deletions(-) diff --git a/lib/core/utils/check-helper.js b/lib/core/utils/check-helper.js index 68e39f6a4b..0156e60e5a 100644 --- a/lib/core/utils/check-helper.js +++ b/lib/core/utils/check-helper.js @@ -1,5 +1,6 @@ import toArray from './to-array'; import DqElement from './dq-element'; +import AbstractVirtualNode from '../base/virtual-node/abstract-virtual-node'; /** * Helper to denote which checks are asyncronous and provide callbacks and pass data back to the CheckResult @@ -28,17 +29,23 @@ function checkHelper(checkResult, options, resolve, reject) { if (!window.Node) { return; } - - nodes = nodes instanceof window.Node ? [nodes] : toArray(nodes); - if ( - !nodes.every(node => node instanceof window.Node || node.actualNode) + nodes instanceof window.Node || + nodes instanceof AbstractVirtualNode ) { - return; + nodes = [nodes]; + } else { + nodes = toArray(nodes); } - - checkResult.relatedNodes = nodes.map(element => { - return new DqElement(element, options); + checkResult.relatedNodes = []; + nodes.forEach(node => { + if (node instanceof AbstractVirtualNode) { + node = node.actualNode; + } + if (node instanceof window.Node) { + const dqElm = new DqElement(node, options); + checkResult.relatedNodes.push(dqElm); + } }); } }; diff --git a/test/core/utils/check-helper.js b/test/core/utils/check-helper.js index c4608684e3..b40948859e 100644 --- a/test/core/utils/check-helper.js +++ b/test/core/utils/check-helper.js @@ -1,60 +1,61 @@ -describe('axe.utils.checkHelper', function () { - 'use strict'; - - var DqElement = axe.utils.DqElement; +describe('axe.utils.checkHelper', () => { + const { queryFixture } = axe.testUtils; + const DqElement = axe.utils.DqElement; function noop() {} - it('should be a function', function () { + it('should be a function', () => { assert.isFunction(axe.utils.checkHelper); }); - it('should accept 4 named parameters', function () { + it('should accept 4 named parameters', () => { assert.lengthOf(axe.utils.checkHelper, 4); }); - it('should return an object', function () { + it('should return an object', () => { assert.isObject(axe.utils.checkHelper()); }); - describe('return value', function () { - describe('async', function () { - it('should set isAsync property on returned object to `true` when called', function () { - var target = {}, + describe('return value', () => { + describe('async', () => { + it('should set isAsync property on returned object to `true` when called', () => { + const target = {}, helper = axe.utils.checkHelper(target, noop); helper.async(); assert.isTrue(helper.isAsync); }); - it('should call the third parameter of `axe.utils.checkHelper` when invoked', function () { + + it('should call the third parameter of `axe.utils.checkHelper` when invoked', () => { function fn() { success = true; } - var success = false, - helper = axe.utils.checkHelper({}, {}, fn); + let success = false; + const helper = axe.utils.checkHelper({}, {}, fn); - var done = helper.async(); + const done = helper.async(); done(); assert.isTrue(success); }); - it('should call the fourth parameter of `axe.utils.checkHelper` when returning an error', function () { - var success = false; + it('should call the fourth parameter of `axe.utils.checkHelper` when returning an error', () => { + let success = false; function reject(e) { success = true; assert.equal(e.message, 'Concrete donkey!'); } - var helper = axe.utils.checkHelper({}, {}, noop, reject); - var done = helper.async(); + const helper = axe.utils.checkHelper({}, {}, noop, reject); + const done = helper.async(); done(new Error('Concrete donkey!')); assert.isTrue(success); }); }); - describe('data', function () { - it('should set data property on target when called', function () { - var target = {}, + + describe('data', () => { + it('should set data property on target when called', () => { + const target = {}, expected = { monkeys: 'bananas' }, helper = axe.utils.checkHelper(target, noop); @@ -63,15 +64,17 @@ describe('axe.utils.checkHelper', function () { assert.equal(target.data, expected); }); }); - describe('relatedNodes', function () { - var fixture = document.getElementById('fixture'); - afterEach(function () { + + describe('relatedNodes', () => { + const fixture = document.getElementById('fixture'); + afterEach(() => { fixture.innerHTML = ''; }); - it('should accept NodeList', function () { + + it('should accept NodeList', () => { fixture.innerHTML = '
'; - var target = {}, - helper = axe.utils.checkHelper(target, noop); + const target = {}; + const helper = axe.utils.checkHelper(target, noop); helper.relatedNodes(fixture.children); assert.lengthOf(target.relatedNodes, 2); assert.instanceOf(target.relatedNodes[0], DqElement); @@ -79,19 +82,21 @@ describe('axe.utils.checkHelper', function () { assert.equal(target.relatedNodes[0].element, fixture.children[0]); assert.equal(target.relatedNodes[1].element, fixture.children[1]); }); - it('should accept a single Node', function () { + + it('should accept a single Node', () => { fixture.innerHTML = '
'; - var target = {}, - helper = axe.utils.checkHelper(target, noop); + const target = {}; + const helper = axe.utils.checkHelper(target, noop); helper.relatedNodes(fixture.firstChild); assert.lengthOf(target.relatedNodes, 1); assert.instanceOf(target.relatedNodes[0], DqElement); assert.equal(target.relatedNodes[0].element, fixture.firstChild); }); - it('should accept an Array', function () { + + it('should accept an Array', () => { fixture.innerHTML = '
'; - var target = {}, - helper = axe.utils.checkHelper(target, noop); + const target = {}; + const helper = axe.utils.checkHelper(target, noop); helper.relatedNodes(Array.prototype.slice.call(fixture.children)); assert.lengthOf(target.relatedNodes, 2); assert.instanceOf(target.relatedNodes[0], DqElement); @@ -99,11 +104,12 @@ describe('axe.utils.checkHelper', function () { assert.equal(target.relatedNodes[0].element, fixture.children[0]); assert.equal(target.relatedNodes[1].element, fixture.children[1]); }); - it('should accept an array-like Object', function () { + + it('should accept an array-like Object', () => { fixture.innerHTML = '
'; - var target = {}, - helper = axe.utils.checkHelper(target, noop); - var nodes = { + const target = {}; + const helper = axe.utils.checkHelper(target, noop); + const nodes = { 0: fixture.children[0], 1: fixture.children[1], length: 2 @@ -115,13 +121,60 @@ describe('axe.utils.checkHelper', function () { assert.equal(target.relatedNodes[0].element, fixture.children[0]); assert.equal(target.relatedNodes[1].element, fixture.children[1]); }); - it('should noop for non-node-like objects', function () { - var target = {}, - helper = axe.utils.checkHelper(target, noop); - var nodes = new axe.SerialVirtualNode({ + + it('should accept a VirtualNode', () => { + const vNode = queryFixture(''); + const target = {}; + const helper = axe.utils.checkHelper(target, noop); + helper.relatedNodes(vNode); + assert.lengthOf(target.relatedNodes, 1); + assert.instanceOf(target.relatedNodes[0], DqElement); + assert.equal(target.relatedNodes[0].element.nodeName, 'A'); + }); + + it('should accept an array of VirtualNodes', () => { + const vNode = queryFixture(` +
+ `); + const target = {}; + const helper = axe.utils.checkHelper(target, noop); + helper.relatedNodes(vNode.children); + assert.lengthOf(target.relatedNodes, 2); + assert.instanceOf(target.relatedNodes[0], DqElement); + assert.equal(target.relatedNodes[0].element.nodeName, 'A'); + assert.equal(target.relatedNodes[1].element.nodeName, 'B'); + }); + + it('should filter out non-nodes', () => { + const vNode = queryFixture(` +
+ `); + const target = {}; + const helper = axe.utils.checkHelper(target, noop); + const nodes = [ + null, + vNode, + true, + fixture.querySelector('b'), + 'hello world', + new axe.SerialVirtualNode({ + nodeName: 's' + }) + ]; + helper.relatedNodes(nodes); + assert.lengthOf(target.relatedNodes, 2); + assert.instanceOf(target.relatedNodes[0], DqElement); + assert.equal(target.relatedNodes[0].element.nodeName, 'A'); + assert.equal(target.relatedNodes[1].element.nodeName, 'B'); + }); + + it('should noop for non-node-like objects', () => { + const target = {}; + const helper = axe.utils.checkHelper(target, noop); + const nodes = new axe.SerialVirtualNode({ nodeName: 'div' }); - assert.doesNotThrow(function () { + assert.doesNotThrow(() => { helper.relatedNodes(nodes); }); assert.lengthOf(target.relatedNodes, 0); From 25859dd737e271f69e3912d69ede2a127d78caa4 Mon Sep 17 00:00:00 2001 From: Wilco Fiers Date: Wed, 24 May 2023 13:36:24 +0200 Subject: [PATCH 3/6] fix(tags): Add / correct several TTv5 tags (#4031) --- doc/rule-descriptions.md | 16 ++++++++-------- lib/rules/aria-hidden-focus.json | 2 +- lib/rules/frame-title-unique.json | 2 +- lib/rules/frame-title.json | 2 +- lib/rules/meta-refresh.json | 2 +- lib/rules/nested-interactive.json | 2 +- lib/rules/scrollable-region-focusable.json | 2 +- lib/rules/server-side-image-map.json | 4 +++- lib/rules/td-headers-attr.json | 10 +++++++++- 9 files changed, 26 insertions(+), 16 deletions(-) diff --git a/doc/rule-descriptions.md b/doc/rule-descriptions.md index 9a632695f0..684fa0bfe6 100644 --- a/doc/rule-descriptions.md +++ b/doc/rule-descriptions.md @@ -18,7 +18,7 @@ | [aria-allowed-attr](https://dequeuniversity.com/rules/axe/4.7/aria-allowed-attr?application=RuleDescription) | Ensures ARIA attributes are allowed for an element's role | Serious, Critical | cat.aria, wcag2a, wcag412 | failure, needs review | [5c01ea](https://act-rules.github.io/rules/5c01ea) | | [aria-command-name](https://dequeuniversity.com/rules/axe/4.7/aria-command-name?application=RuleDescription) | Ensures every ARIA button, link and menuitem has an accessible name | Serious | cat.aria, wcag2a, wcag412, ACT, TTv5, TT6.a | failure, needs review | [97a4e1](https://act-rules.github.io/rules/97a4e1) | | [aria-hidden-body](https://dequeuniversity.com/rules/axe/4.7/aria-hidden-body?application=RuleDescription) | Ensures aria-hidden='true' is not present on the document body. | Critical | cat.aria, wcag2a, wcag412 | failure | | -| [aria-hidden-focus](https://dequeuniversity.com/rules/axe/4.7/aria-hidden-focus?application=RuleDescription) | Ensures aria-hidden elements are not focusable nor contain focusable elements | Serious | cat.name-role-value, wcag2a, wcag412 | failure, needs review | [6cfa84](https://act-rules.github.io/rules/6cfa84) | +| [aria-hidden-focus](https://dequeuniversity.com/rules/axe/4.7/aria-hidden-focus?application=RuleDescription) | Ensures aria-hidden elements are not focusable nor contain focusable elements | Serious | cat.name-role-value, wcag2a, wcag412, TTv5, TT6.a | failure, needs review | [6cfa84](https://act-rules.github.io/rules/6cfa84) | | [aria-input-field-name](https://dequeuniversity.com/rules/axe/4.7/aria-input-field-name?application=RuleDescription) | Ensures every ARIA input field has an accessible name | Moderate, Serious | cat.aria, wcag2a, wcag412, ACT, TTv5, TT5.c | failure, needs review | [e086e5](https://act-rules.github.io/rules/e086e5) | | [aria-meter-name](https://dequeuniversity.com/rules/axe/4.7/aria-meter-name?application=RuleDescription) | Ensures every ARIA meter node has an accessible name | Serious | cat.aria, wcag2a, wcag111 | failure, needs review | | | [aria-progressbar-name](https://dequeuniversity.com/rules/axe/4.7/aria-progressbar-name?application=RuleDescription) | Ensures every ARIA progressbar node has an accessible name | Serious | cat.aria, wcag2a, wcag111 | failure, needs review | | @@ -42,8 +42,8 @@ | [duplicate-id](https://dequeuniversity.com/rules/axe/4.7/duplicate-id?application=RuleDescription) | Ensures every id attribute value is unique | Minor | cat.parsing, wcag2a, wcag411 | failure | [3ea0c8](https://act-rules.github.io/rules/3ea0c8) | | [form-field-multiple-labels](https://dequeuniversity.com/rules/axe/4.7/form-field-multiple-labels?application=RuleDescription) | Ensures form field does not have multiple label elements | Moderate | cat.forms, wcag2a, wcag332, TTv5, TT5.c | needs review | | | [frame-focusable-content](https://dequeuniversity.com/rules/axe/4.7/frame-focusable-content?application=RuleDescription) | Ensures <frame> and <iframe> elements with focusable content do not have tabindex=-1 | Serious | cat.keyboard, wcag2a, wcag211, TTv5, TT4.a | failure, needs review | [akn7bn](https://act-rules.github.io/rules/akn7bn) | -| [frame-title-unique](https://dequeuniversity.com/rules/axe/4.7/frame-title-unique?application=RuleDescription) | Ensures <iframe> and <frame> elements contain a unique title attribute | Serious | cat.text-alternatives, wcag412, wcag2a, TTv5, TT12.c | needs review | [4b1c6c](https://act-rules.github.io/rules/4b1c6c) | -| [frame-title](https://dequeuniversity.com/rules/axe/4.7/frame-title?application=RuleDescription) | Ensures <iframe> and <frame> elements have an accessible name | Serious | cat.text-alternatives, wcag2a, wcag412, section508, section508.22.i, TTv5, TT12.c | failure, needs review | [cae760](https://act-rules.github.io/rules/cae760) | +| [frame-title-unique](https://dequeuniversity.com/rules/axe/4.7/frame-title-unique?application=RuleDescription) | Ensures <iframe> and <frame> elements contain a unique title attribute | Serious | cat.text-alternatives, wcag412, wcag2a, TTv5, TT12.d | needs review | [4b1c6c](https://act-rules.github.io/rules/4b1c6c) | +| [frame-title](https://dequeuniversity.com/rules/axe/4.7/frame-title?application=RuleDescription) | Ensures <iframe> and <frame> elements have an accessible name | Serious | cat.text-alternatives, wcag2a, wcag412, section508, section508.22.i, TTv5, TT12.d | failure, needs review | [cae760](https://act-rules.github.io/rules/cae760) | | [html-has-lang](https://dequeuniversity.com/rules/axe/4.7/html-has-lang?application=RuleDescription) | Ensures every HTML document has a lang attribute | Serious | cat.language, wcag2a, wcag311, ACT, TTv5, TT11.a | failure | [b5c3f8](https://act-rules.github.io/rules/b5c3f8) | | [html-lang-valid](https://dequeuniversity.com/rules/axe/4.7/html-lang-valid?application=RuleDescription) | Ensures the lang attribute of the <html> element has a valid value | Serious | cat.language, wcag2a, wcag311, ACT, TTv5, TT11.a | failure | [bf051a](https://act-rules.github.io/rules/bf051a) | | [html-xml-lang-mismatch](https://dequeuniversity.com/rules/axe/4.7/html-xml-lang-mismatch?application=RuleDescription) | Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page | Moderate | cat.language, wcag2a, wcag311, ACT | failure | [5b7ae0](https://act-rules.github.io/rules/5b7ae0) | @@ -56,17 +56,17 @@ | [list](https://dequeuniversity.com/rules/axe/4.7/list?application=RuleDescription) | Ensures that lists are structured correctly | Serious | cat.structure, wcag2a, wcag131 | failure | | | [listitem](https://dequeuniversity.com/rules/axe/4.7/listitem?application=RuleDescription) | Ensures <li> elements are used semantically | Serious | cat.structure, wcag2a, wcag131 | failure | | | [marquee](https://dequeuniversity.com/rules/axe/4.7/marquee?application=RuleDescription) | Ensures <marquee> elements are not used | Serious | cat.parsing, wcag2a, wcag222, TTv5, TT2.b | failure | | -| [meta-refresh](https://dequeuniversity.com/rules/axe/4.7/meta-refresh?application=RuleDescription) | Ensures <meta http-equiv="refresh"> is not used for delayed refresh | Critical | cat.time-and-media, wcag2a, wcag221, TTv5, TT2.c | failure | [bc659a](https://act-rules.github.io/rules/bc659a), [bisz58](https://act-rules.github.io/rules/bisz58) | +| [meta-refresh](https://dequeuniversity.com/rules/axe/4.7/meta-refresh?application=RuleDescription) | Ensures <meta http-equiv="refresh"> is not used for delayed refresh | Critical | cat.time-and-media, wcag2a, wcag221, TTv5, TT8.a | failure | [bc659a](https://act-rules.github.io/rules/bc659a), [bisz58](https://act-rules.github.io/rules/bisz58) | | [meta-viewport](https://dequeuniversity.com/rules/axe/4.7/meta-viewport?application=RuleDescription) | Ensures <meta name="viewport"> does not disable text scaling and zooming | Critical | cat.sensory-and-visual-cues, wcag2aa, wcag144, ACT | failure | [b4f0c3](https://act-rules.github.io/rules/b4f0c3) | -| [nested-interactive](https://dequeuniversity.com/rules/axe/4.7/nested-interactive?application=RuleDescription) | Ensures interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies | Serious | cat.keyboard, wcag2a, wcag412, TTv5, TT4.a | failure, needs review | [307n5z](https://act-rules.github.io/rules/307n5z) | +| [nested-interactive](https://dequeuniversity.com/rules/axe/4.7/nested-interactive?application=RuleDescription) | Ensures interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies | Serious | cat.keyboard, wcag2a, wcag412, TTv5, TT6.a | failure, needs review | [307n5z](https://act-rules.github.io/rules/307n5z) | | [no-autoplay-audio](https://dequeuniversity.com/rules/axe/4.7/no-autoplay-audio?application=RuleDescription) | Ensures <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio | Moderate | cat.time-and-media, wcag2a, wcag142, ACT, TTv5, TT2.a | needs review | [80f0bf](https://act-rules.github.io/rules/80f0bf) | | [object-alt](https://dequeuniversity.com/rules/axe/4.7/object-alt?application=RuleDescription) | Ensures <object> elements have alternate text | Serious | cat.text-alternatives, wcag2a, wcag111, section508, section508.22.a | failure, needs review | [8fc3b6](https://act-rules.github.io/rules/8fc3b6) | | [role-img-alt](https://dequeuniversity.com/rules/axe/4.7/role-img-alt?application=RuleDescription) | Ensures [role='img'] elements have alternate text | Serious | cat.text-alternatives, wcag2a, wcag111, section508, section508.22.a, ACT, TTv5, TT7.a | failure, needs review | [23a2a8](https://act-rules.github.io/rules/23a2a8) | -| [scrollable-region-focusable](https://dequeuniversity.com/rules/axe/4.7/scrollable-region-focusable?application=RuleDescription) | Ensure elements that have scrollable content are accessible by keyboard | Serious | cat.keyboard, wcag2a, wcag211 | failure | [0ssw9k](https://act-rules.github.io/rules/0ssw9k) | +| [scrollable-region-focusable](https://dequeuniversity.com/rules/axe/4.7/scrollable-region-focusable?application=RuleDescription) | Ensure elements that have scrollable content are accessible by keyboard | Serious | cat.keyboard, wcag2a, wcag211, TTv5, TT4.a | failure | [0ssw9k](https://act-rules.github.io/rules/0ssw9k) | | [select-name](https://dequeuniversity.com/rules/axe/4.7/select-name?application=RuleDescription) | Ensures select element has an accessible name | Minor, Critical | cat.forms, wcag2a, wcag412, section508, section508.22.n, ACT, TTv5, TT5.c | failure, needs review | [e086e5](https://act-rules.github.io/rules/e086e5) | -| [server-side-image-map](https://dequeuniversity.com/rules/axe/4.7/server-side-image-map?application=RuleDescription) | Ensures that server-side image maps are not used | Minor | cat.text-alternatives, wcag2a, wcag211, section508, section508.22.f | needs review | | +| [server-side-image-map](https://dequeuniversity.com/rules/axe/4.7/server-side-image-map?application=RuleDescription) | Ensures that server-side image maps are not used | Minor | cat.text-alternatives, wcag2a, wcag211, section508, section508.22.f, TTv5, TT4.a | needs review | | | [svg-img-alt](https://dequeuniversity.com/rules/axe/4.7/svg-img-alt?application=RuleDescription) | Ensures <svg> elements with an img, graphics-document or graphics-symbol role have an accessible text | Serious | cat.text-alternatives, wcag2a, wcag111, section508, section508.22.a, ACT, TTv5, TT7.a | failure, needs review | [7d6734](https://act-rules.github.io/rules/7d6734) | -| [td-headers-attr](https://dequeuniversity.com/rules/axe/4.7/td-headers-attr?application=RuleDescription) | Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table | Serious | cat.tables, wcag2a, wcag131, section508, section508.22.g | failure, needs review | [a25f45](https://act-rules.github.io/rules/a25f45) | +| [td-headers-attr](https://dequeuniversity.com/rules/axe/4.7/td-headers-attr?application=RuleDescription) | Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table | Serious | cat.tables, wcag2a, wcag131, section508, section508.22.g, TTv5, TT14.b | failure, needs review | [a25f45](https://act-rules.github.io/rules/a25f45) | | [th-has-data-cells](https://dequeuniversity.com/rules/axe/4.7/th-has-data-cells?application=RuleDescription) | Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe | Serious | cat.tables, wcag2a, wcag131, section508, section508.22.g, TTv5, 14.b | failure, needs review | [d0f69e](https://act-rules.github.io/rules/d0f69e) | | [valid-lang](https://dequeuniversity.com/rules/axe/4.7/valid-lang?application=RuleDescription) | Ensures lang attributes have valid values | Serious | cat.language, wcag2aa, wcag312, ACT, TTv5, TT11.b | failure | [de46e4](https://act-rules.github.io/rules/de46e4) | | [video-caption](https://dequeuniversity.com/rules/axe/4.7/video-caption?application=RuleDescription) | Ensures <video> elements have captions | Critical | cat.text-alternatives, wcag2a, wcag122, section508, section508.22.a, TTv5, TT17.a | needs review | [eac66b](https://act-rules.github.io/rules/eac66b) | diff --git a/lib/rules/aria-hidden-focus.json b/lib/rules/aria-hidden-focus.json index e7dffce884..0115f19496 100755 --- a/lib/rules/aria-hidden-focus.json +++ b/lib/rules/aria-hidden-focus.json @@ -3,7 +3,7 @@ "selector": "[aria-hidden=\"true\"]", "matches": "aria-hidden-focus-matches", "excludeHidden": false, - "tags": ["cat.name-role-value", "wcag2a", "wcag412"], + "tags": ["cat.name-role-value", "wcag2a", "wcag412", "TTv5", "TT6.a"], "actIds": ["6cfa84"], "metadata": { "description": "Ensures aria-hidden elements are not focusable nor contain focusable elements", diff --git a/lib/rules/frame-title-unique.json b/lib/rules/frame-title-unique.json index 158feee30a..fe0f73d0da 100644 --- a/lib/rules/frame-title-unique.json +++ b/lib/rules/frame-title-unique.json @@ -2,7 +2,7 @@ "id": "frame-title-unique", "selector": "frame[title], iframe[title]", "matches": "frame-title-has-text-matches", - "tags": ["cat.text-alternatives", "wcag412", "wcag2a", "TTv5", "TT12.c"], + "tags": ["cat.text-alternatives", "wcag412", "wcag2a", "TTv5", "TT12.d"], "actIds": ["4b1c6c"], "metadata": { "description": "Ensures