|
|
|
|
@ -155,7 +155,7 @@ function input_implicit_role(attribute_map: Map<string, Attribute>) {
|
|
|
|
|
const list_attribute_exists = attribute_map.has('list');
|
|
|
|
|
|
|
|
|
|
if (list_attribute_exists && combobox_if_list.has(type)) {
|
|
|
|
|
return 'combobox';
|
|
|
|
|
return 'combobox';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return input_type_to_implicit_role.get(type);
|
|
|
|
|
@ -170,11 +170,11 @@ function menuitem_implicit_role(attribute_map: Map<string, Attribute>) {
|
|
|
|
|
|
|
|
|
|
function get_implicit_role(name: string, attribute_map: Map<string, Attribute>) : (string | undefined) {
|
|
|
|
|
if (name === 'menuitem') {
|
|
|
|
|
return menuitem_implicit_role(attribute_map);
|
|
|
|
|
return menuitem_implicit_role(attribute_map);
|
|
|
|
|
} else if (name === 'input') {
|
|
|
|
|
return input_implicit_role(attribute_map);
|
|
|
|
|
return input_implicit_role(attribute_map);
|
|
|
|
|
} else {
|
|
|
|
|
return a11y_implicit_semantics.get(name);
|
|
|
|
|
return a11y_implicit_semantics.get(name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -551,7 +551,7 @@ export default class Element extends Node {
|
|
|
|
|
|
|
|
|
|
// aria-activedescendant-has-tabindex
|
|
|
|
|
if (name === 'aria-activedescendant' && !is_interactive_element(this.name, attribute_map) && !attribute_map.has('tabindex')) {
|
|
|
|
|
component.warn(attribute, compiler_warnings.a11y_aria_activedescendant_has_tabindex);
|
|
|
|
|
component.warn(attribute, compiler_warnings.a11y_aria_activedescendant_has_tabindex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -669,22 +669,22 @@ export default class Element extends Node {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// role-supports-aria-props
|
|
|
|
|
const role = attribute_map.get('role');
|
|
|
|
|
const role_value = (role ? role.get_static_value() : get_implicit_role(this.name, attribute_map)) as ARIARoleDefintionKey;
|
|
|
|
|
if (typeof role_value === 'string' && roles.has(role_value)) {
|
|
|
|
|
const { props } = roles.get(role_value);
|
|
|
|
|
const invalid_aria_props = new Set(aria.keys().filter(attribute => !(attribute in props)));
|
|
|
|
|
const is_implicit = role_value && role === undefined;
|
|
|
|
|
|
|
|
|
|
attributes
|
|
|
|
|
.filter(prop => prop.type !== 'Spread')
|
|
|
|
|
.forEach(prop => {
|
|
|
|
|
if (invalid_aria_props.has(prop.name as ARIAProperty)) {
|
|
|
|
|
component.warn(prop, compiler_warnings.a11y_role_supports_aria_props(prop.name, role_value, is_implicit, this.name));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
// role-supports-aria-props
|
|
|
|
|
const role = attribute_map.get('role');
|
|
|
|
|
const role_value = (role ? role.get_static_value() : get_implicit_role(this.name, attribute_map)) as ARIARoleDefintionKey;
|
|
|
|
|
if (typeof role_value === 'string' && roles.has(role_value)) {
|
|
|
|
|
const { props } = roles.get(role_value);
|
|
|
|
|
const invalid_aria_props = new Set(aria.keys().filter(attribute => !(attribute in props)));
|
|
|
|
|
const is_implicit = role_value && role === undefined;
|
|
|
|
|
|
|
|
|
|
attributes
|
|
|
|
|
.filter(prop => prop.type !== 'Spread')
|
|
|
|
|
.forEach(prop => {
|
|
|
|
|
if (invalid_aria_props.has(prop.name as ARIAProperty)) {
|
|
|
|
|
component.warn(prop, compiler_warnings.a11y_role_supports_aria_props(prop.name, role_value, is_implicit, this.name));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
validate_special_cases() {
|
|
|
|
|
|