diff --git a/src/compiler/compile/nodes/Element.ts b/src/compiler/compile/nodes/Element.ts index 19e5630262..6122ba473a 100644 --- a/src/compiler/compile/nodes/Element.ts +++ b/src/compiler/compile/nodes/Element.ts @@ -70,6 +70,47 @@ const a11y_labelable = new Set([ 'textarea' ]); +const a11y_nested_implicit_semantics = new Map([ + ['header', 'banner'], + ['footer', 'contentinfo'] +]); + +const a11y_implicit_semantics = new Map([ + ['a', 'link'], + ['article', 'article'], + ['aside', 'complementary'], + ['body', 'document'], + ['datalist', 'listbox'], + ['dd', 'definition'], + ['dfn', 'term'], + ['details', 'group'], + ['dt', 'term'], + ['fieldset', 'group'], + ['form', 'form'], + ['h1', 'heading'], + ['h2', 'heading'], + ['h3', 'heading'], + ['h4', 'heading'], + ['h5', 'heading'], + ['h6', 'heading'], + ['hr', 'separator'], + ['li', 'listitem'], + ['menu', 'list'], + ['nav', 'navigation'], + ['ol', 'list'], + ['optgroup', 'group'], + ['output', 'status'], + ['progress', 'progressbar'], + ['section', 'region'], + ['summary', 'button'], + ['tbody', 'rowgroup'], + ['textarea', 'textbox'], + ['tfoot', 'rowgroup'], + ['thead', 'rowgroup'], + ['tr', 'row'], + ['ul', 'list'] +]); + const invisible_elements = new Set(['meta', 'html', 'script', 'style']); const valid_modifiers = new Set([ @@ -370,56 +411,16 @@ export default class Element extends Node { } // no-redundant-roles - const implicit_semantics = new Map([ - ['a', 'link'], - ['article', 'article'], - ['aside', 'complementary'], - ['body', 'document'], - ['datalist', 'listbox'], - ['dd', 'definition'], - ['dfn', 'term'], - ['details', 'group'], - ['dt', 'term'], - ['fieldset', 'group'], - ['form', 'form'], - ['h1', 'heading'], - ['h2', 'heading'], - ['h3', 'heading'], - ['h4', 'heading'], - ['h5', 'heading'], - ['h6', 'heading'], - ['hr', 'separator'], - ['li', 'listitem'], - ['menu', 'list'], - ['nav', 'navigation'], - ['ol', 'list'], - ['optgroup', 'group'], - ['output', 'status'], - ['progress', 'progressbar'], - ['section', 'region'], - ['summary', 'button'], - ['tbody', 'rowgroup'], - ['textarea', 'textbox'], - ['tfoot', 'rowgroup'], - ['thead', 'rowgroup'], - ['tr', 'row'], - ['ul', 'list'] - ]); - - const has_redundant_role = value === implicit_semantics.get(this.name); + const has_redundant_role = value === a11y_implicit_semantics.get(this.name); if (this.name === value || has_redundant_role) { component.warn(attribute, compiler_warnings.a11y_no_redundant_roles(value)); } // Footers and headers are special cases, and should not have redundant roles unless they are the children of sections or articles. - const nested_implicit_semantics = new Map([ - ['header', 'banner'], - ['footer', 'contentinfo'] - ]); const is_parent_section_or_article = is_parent(this.parent, ['section', 'article']); if (!is_parent_section_or_article) { - const has_nested_redundant_role = value === nested_implicit_semantics.get(this.name); + const has_nested_redundant_role = value === a11y_nested_implicit_semantics.get(this.name); if (has_nested_redundant_role) { component.warn(attribute, compiler_warnings.a11y_no_redundant_roles(value)); }