From 10766ecf5489ff359b691cc12af1ff23b8e4f9a8 Mon Sep 17 00:00:00 2001 From: sideshowbarker Date: Fri, 20 Dec 2024 18:00:52 +0900 Subject: [PATCH] LibWeb: Ignore role=none for focusable & has-global-ARIA-attribute cases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change causes explicit role=none and role=presentation attribute values to be ignored in cases where the elements for which those values are specified are either focusable, or have global ARIA attributes — per https://w3c.github.io/aria/#conflict_resolution_presentation_none. --- Libraries/LibWeb/ARIA/ARIAMixin.cpp | 21 +++++++--- .../role/role_none_conflict_resolution.txt | 12 ++++++ .../role/role_none_conflict_resolution.html | 38 +++++++++++++++++++ 3 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/wpt-import/wai-aria/role/role_none_conflict_resolution.txt create mode 100644 Tests/LibWeb/Text/input/wpt-import/wai-aria/role/role_none_conflict_resolution.html diff --git a/Libraries/LibWeb/ARIA/ARIAMixin.cpp b/Libraries/LibWeb/ARIA/ARIAMixin.cpp index e4860be465f..b3ed3bf3a43 100644 --- a/Libraries/LibWeb/ARIA/ARIAMixin.cpp +++ b/Libraries/LibWeb/ARIA/ARIAMixin.cpp @@ -37,11 +37,6 @@ Optional ARIAMixin::role_from_role_attribute_value() const // computedrole image" test in https://wpt.fyi/results/wai-aria/role/synonym-roles.html expects "image", not "img". if (role == Role::img) return Role::image; - // NOTE: Per https://w3c.github.io/aria/#presentation, "the working group introduced none as the preferred - // synonym to the presentation role"; further, https://wpt.fyi/results/wai-aria/role/synonym-roles.html has a - // "synonym presentation role == computedrole none" test that expects "none", not "presentation". - if (role == Role::presentation) - return Role::none; // https://w3c.github.io/core-aam/#roleMappingComputedRole // When an element has a role but is not contained in the required context (for example, an orphaned listitem // without the required accessible parent of role list), User Agents MUST ignore the role token, and return the @@ -138,6 +133,22 @@ Optional ARIAMixin::role_from_role_attribute_value() const if ((role == ARIA::Role::form || role == ARIA::Role::region) && to_element()->accessible_name(to_element()->document(), DOM::ShouldComputeRole::No).value().is_empty()) continue; + if (role == ARIA::Role::none || role == ARIA::Role::presentation) { + // https://w3c.github.io/aria/#conflict_resolution_presentation_none + // If an element is focusable, user agents MUST ignore the none/presentation + // role and expose the element with its implicit role. + if (to_element()->is_focusable()) + continue; + // If an element has global WAI-ARIA states or properties, user agents MUST + // ignore the none/presentation role and instead expose the element's implicit role. + if (has_global_aria_attribute()) + continue; + // NOTE: Per https://w3c.github.io/aria/#presentation, "the working group introduced 'none' as the preferred + // synonym to the presentation role"; further, https://wpt.fyi/results/wai-aria/role/synonym-roles.html has + // a "synonym presentation role == computedrole none" test that expects "none", not "presentation". + if (role == Role::presentation) + return Role::none; + } // 4. Use the first such substring in textual order that matches the name of a non-abstract WAI-ARIA role. if (!is_abstract_role(*role)) return *role; diff --git a/Tests/LibWeb/Text/expected/wpt-import/wai-aria/role/role_none_conflict_resolution.txt b/Tests/LibWeb/Text/expected/wpt-import/wai-aria/role/role_none_conflict_resolution.txt new file mode 100644 index 00000000000..48c5793055e --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/wai-aria/role/role_none_conflict_resolution.txt @@ -0,0 +1,12 @@ +Harness status: OK + +Found 7 tests + +7 Pass +Pass heading role none with global attr aria-label +Pass p role none with global attr aria-label (prohibited role) +Pass focusable heading role none with tabindex=0 +Pass focusable heading role none with tabindex=-1 +Pass p role none without global attr aria-label (prohibited role) +Pass non-focusable heading role none +Pass none with non-global \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/wpt-import/wai-aria/role/role_none_conflict_resolution.html b/Tests/LibWeb/Text/input/wpt-import/wai-aria/role/role_none_conflict_resolution.html new file mode 100644 index 00000000000..4a62b4aae14 --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/wai-aria/role/role_none_conflict_resolution.html @@ -0,0 +1,38 @@ + + + + Role None Conflict Resolution Verification Tests + + + + + + + + + +

Verifies conflict resolution requirements for the ARIA none and presentation roles.

+ + +

x

+ + +

x

+

x

+ + +

x

+

x

+

x

+ + +

Sample Content

+ + + + + +