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!
+
+
+
+
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"]
]
}