diff --git a/lib/commons/standards/implicit-html-roles.js b/lib/commons/standards/implicit-html-roles.js index 890e31afca..aaa44b9226 100644 --- a/lib/commons/standards/implicit-html-roles.js +++ b/lib/commons/standards/implicit-html-roles.js @@ -10,6 +10,7 @@ import isRowHeader from '../table/is-row-header'; import sanitize from '../text/sanitize'; import isFocusable from '../dom/is-focusable'; import { closest } from '../../core/utils'; +import getExplicitRole from '../aria/get-explicit-role'; const sectioningElementSelector = getElementsByContentType('sectioning') @@ -156,7 +157,12 @@ const implicitHtmlRoles = { summary: 'button', table: 'table', tbody: 'rowgroup', - td: 'cell', + td: vNode => { + const table = closest(vNode, 'table'); + const role = getExplicitRole(table); + + return ['grid', 'treegrid'].includes(role) ? 'gridcell' : 'cell'; + }, textarea: 'textbox', tfoot: 'rowgroup', th: vNode => { diff --git a/test/commons/aria/implicit-role.js b/test/commons/aria/implicit-role.js index 613ec74ed2..2fb087931e 100644 --- a/test/commons/aria/implicit-role.js +++ b/test/commons/aria/implicit-role.js @@ -387,6 +387,20 @@ describe('aria.implicitRole', function() { assert.equal(implicitRole(node), 'cell'); }); + it('should return gridcell for "td" with grid parent', function() { + fixture.innerHTML = '
'; + var node = fixture.querySelector('#target'); + flatTreeSetup(fixture); + assert.equal(implicitRole(node), 'gridcell'); + }); + + it('should return gridcell for "td" with treegrid parent', function() { + fixture.innerHTML = '
'; + var node = fixture.querySelector('#target'); + flatTreeSetup(fixture); + assert.equal(implicitRole(node), 'gridcell'); + }); + it('should return rowheader for "th[scope=row]"', function() { fixture.innerHTML = '
'; var node = fixture.querySelector('#target'); diff --git a/test/integration/rules/aria-allowed-attr/passes.html b/test/integration/rules/aria-allowed-attr/passes.html index 506e4056b6..e8b729f294 100644 --- a/test/integration/rules/aria-allowed-attr/passes.html +++ b/test/integration/rules/aria-allowed-attr/passes.html @@ -1893,3 +1893,15 @@ I am RED! I am GREEN! + + + +
+ target 1 +
+ + + +
+ target 1 +
diff --git a/test/integration/rules/aria-allowed-attr/passes.json b/test/integration/rules/aria-allowed-attr/passes.json index 1656ed13e9..073e6af56a 100644 --- a/test/integration/rules/aria-allowed-attr/passes.json +++ b/test/integration/rules/aria-allowed-attr/passes.json @@ -78,6 +78,8 @@ ["#pass73"], ["#pass74"], ["#pass75"], - ["#pass76"] + ["#pass76"], + ["#pass77"], + ["#pass78"] ] }