Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
AX: Ignore the aria-required if equivalent HTML attribute is present
https://bugs.webkit.org/show_bug.cgi?id=258548
rdar://problem/111370591

Reviewed by Tyler Wilcock.

Modify to prioritize the HTML attribute when both `aria-required` and
`required` attribute are present.

* LayoutTests/accessibility/aria-required-expected.txt:
* LayoutTests/accessibility/aria-required.html:
* Source/WebCore/accessibility/AccessibilityNodeObject.cpp:
(WebCore::AccessibilityNodeObject::isRequired const):

Canonical link: https://commits.webkit.org/265552@main
  • Loading branch information
hs85jeong authored and twilco committed Jun 27, 2023
1 parent 56a6777 commit 640ead3
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 17 deletions.
11 changes: 6 additions & 5 deletions LayoutTests/accessibility/aria-required-expected.txt
Expand Up @@ -3,30 +3,31 @@ This tests that aria-required is a usable attribute.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


Elements to test: 35
Elements to test: 36

PASS textfield isRequired is false
PASS textfield_required isRequired is true
PASS textfield_required_ariarequired isRequired is true
PASS textfield_ariarequiredfalse isRequired is false
PASS textfield5 isRequired is true
PASS textfield_required_ariarequiredfalse isRequired is true
PASS textfield_requiredfalse_ariarequiredtrue isRequired is true
PASS checkbox isRequired is false
PASS checkbox_required isRequired is true
PASS checkbox_required_ariarequired isRequired is true
PASS checkbox_ariarequiredfalse isRequired is false
PASS checkbox_required_ariarequiredfalse isRequired is false
PASS checkbox_required_ariarequiredfalse isRequired is true
PASS checkbox_requiredfalse_ariarequiredtrue isRequired is true
PASS select isRequired is false
PASS select_required isRequired is true
PASS select_required_ariarequired isRequired is true
PASS select_ariarequiredfalse isRequired is false
PASS select_required_ariarequiredfalse isRequired is false
PASS select_required_ariarequiredfalse isRequired is true
PASS select_requiredfalse_ariarequiredtrue isRequired is true
PASS textarea isRequired is false
PASS textarea_required isRequired is true
PASS textarea_required_ariarequired isRequired is true
PASS textarea_ariarequiredfalse isRequired is false
PASS textarea_required_ariarequiredfalse isRequired is false
PASS textarea_required_ariarequiredfalse isRequired is true
PASS textarea_requiredfalse_ariarequiredtrue isRequired is true
PASS listbox_ariarequiredtrue isRequired is true
PASS listbox_ariarequiredfalse isRequired is false
Expand Down
12 changes: 5 additions & 7 deletions LayoutTests/accessibility/aria-required.html
Expand Up @@ -14,10 +14,8 @@
<input type="text" required aria-required="true" id="textfield_required_ariarequired" data-expectedrequired="true">
<input type="text" aria-required="false" id="textfield_ariarequiredfalse" data-expectedrequired="false">
<!-- these last ones conflict with implicit value of @required, so host language attr should win -->
<input type="text" aria-required="textfield_required_ariarequiredfalse" required id="textfield5" data-expectedrequired="true">
<!-- BLOCKED by http://webkit.org/b/119988
<input type="text" aria-required="true" id="textfield_requiredfalse_ariarequiredtrue" data-expectedrequired="false">
-->
<input type="text" aria-required="false" required id="textfield_required_ariarequiredfalse" data-expectedrequired="true">
<input type="text" aria-required="true" id="textfield_requiredfalse_ariarequiredtrue" data-expectedrequired="true">


<!-- checkboxes -->
Expand All @@ -26,7 +24,7 @@
<input type="checkbox" required aria-required="true" id="checkbox_required_ariarequired" data-expectedrequired="true">
<input type="checkbox" aria-required="false" id="checkbox_ariarequiredfalse" data-expectedrequired="false">
<!-- these last ones conflict with implicit value of @required, so ARIA should win -->
<input type="checkbox" aria-required="false" required id="checkbox_required_ariarequiredfalse" data-expectedrequired="false">
<input type="checkbox" aria-required="false" required id="checkbox_required_ariarequiredfalse" data-expectedrequired="true">
<input type="checkbox" aria-required="true" id="checkbox_requiredfalse_ariarequiredtrue" data-expectedrequired="true">


Expand All @@ -36,7 +34,7 @@
<select required aria-required="true" id="select_required_ariarequired" data-expectedrequired="true"><option>test</option></select>
<select aria-required="false" id="select_ariarequiredfalse" data-expectedrequired="false"><option>test</option></select>
<!-- these last ones conflict with implicit value of @required, so ARIA should win -->
<select aria-required="false" required id="select_required_ariarequiredfalse" data-expectedrequired="false"><option>test</option></select>
<select aria-required="false" required id="select_required_ariarequiredfalse" data-expectedrequired="true"><option>test</option></select>
<select aria-required="true" id="select_requiredfalse_ariarequiredtrue" data-expectedrequired="true"><option>test</option></select>


Expand All @@ -46,7 +44,7 @@
<textarea required aria-required="true" id="textarea_required_ariarequired" data-expectedrequired="true"></textarea>
<textarea aria-required="false" id="textarea_ariarequiredfalse" data-expectedrequired="false"></textarea>
<!-- these last ones conflict with implicit value of @required, so ARIA should win -->
<textarea aria-required="false" required id="textarea_required_ariarequiredfalse" data-expectedrequired="false"></textarea>
<textarea aria-required="false" required id="textarea_required_ariarequiredfalse" data-expectedrequired="true"></textarea>
<textarea aria-required="true" id="textarea_requiredfalse_ariarequiredtrue" data-expectedrequired="true"></textarea>


Expand Down
9 changes: 4 additions & 5 deletions Source/WebCore/accessibility/AccessibilityNodeObject.cpp
Expand Up @@ -823,17 +823,16 @@ bool AccessibilityNodeObject::isMultiSelectable() const

bool AccessibilityNodeObject::isRequired() const
{
// Explicit aria-required values should trump native required attributes.
auto* formControlElement = dynamicDowncast<HTMLFormControlElement>(node());
if (formControlElement && formControlElement->isRequired())
return true;

const AtomString& requiredValue = getAttribute(aria_requiredAttr);
if (equalLettersIgnoringASCIICase(requiredValue, "true"_s))
return true;
if (equalLettersIgnoringASCIICase(requiredValue, "false"_s))
return false;

Node* n = this->node();
if (is<HTMLFormControlElement>(n))
return downcast<HTMLFormControlElement>(*n).isRequired();

return false;
}

Expand Down

0 comments on commit 640ead3

Please sign in to comment.