Commit 84866d34 authored by Aaron Leventhal's avatar Aaron Leventhal Committed by Commit Bot

Expose default state for submit buttons in HTML

Bug: 904428
Change-Id: I944fe959a6eb8ac00a4226e879a22a09a22a40c2
Reviewed-on: https://chromium-review.googlesource.com/c/1331144
Commit-Queue: Aaron Leventhal <aleventhal@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Reviewed-by: default avatarNektarios Paisios <nektar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#607899}
parent 5a787e35
......@@ -353,9 +353,9 @@ TEST_F('ChromeVoxBackgroundTest', 'BrailleRouting', function() {
this.runWithLoadedTree(
function() {/*!
<p>start</p>
<button id="btn1">Click me</button>
<button type="button" id="btn1">Click me</button>
<p>Some text</p>
<button id="btn2">Focus me</button>
<button type="button" id="btn2">Focus me</button>
<p>Some more text</p>
<input type="text" id ="text" value="Edit me">
<script>
......
......@@ -36,7 +36,7 @@ var allTests = [
var okButton = contentChildren[0];
assertEq('Ok', okButton.name);
state = RemoveUntestedStates(okButton.state);
assertEq({focusable: true}, state);
assertEq({default: true, focusable: true}, state);
assertEq(undefined, okButton.restriction);
var userNameInput = contentChildren[1];
assertEq(undefined, userNameInput.restriction);
......@@ -47,7 +47,7 @@ var allTests = [
assertEq('Cancel',
cancelButton.name);
state = RemoveUntestedStates(cancelButton.state);
assertEq({focusable: true}, state);
assertEq({default: true, focusable: true}, state);
assertEq(undefined, cancelButton.restriction);
// Traversal.
......
......@@ -322,6 +322,11 @@ IN_PROC_BROWSER_TEST_F(DumpAccessibilityEventsTest,
RunEventTest(FILE_PATH_LITERAL("description-change-indirect.html"));
}
IN_PROC_BROWSER_TEST_F(DumpAccessibilityEventsTest,
AccessibilityEventsDisabledStateChanged) {
RunEventTest(FILE_PATH_LITERAL("disabled-state-changed.html"));
}
IN_PROC_BROWSER_TEST_F(DumpAccessibilityEventsTest,
AccessibilityEventsExpandedChange) {
RunEventTest(FILE_PATH_LITERAL("expanded-change.html"));
......
......@@ -160,7 +160,6 @@ void DumpAccessibilityTreeTest::AddDefaultFilters(
AddFilter(filters, "BUSY");
AddFilter(filters, "CHECKED");
AddFilter(filters, "COLLAPSED");
AddFilter(filters, "DEFAULT");
AddFilter(filters, "EXPANDED");
AddFilter(filters, "FLOATING");
AddFilter(filters, "FOCUSABLE");
......@@ -212,7 +211,6 @@ void DumpAccessibilityTreeTest::AddDefaultFilters(
AddFilter(filters, "check*");
AddFilter(filters, "descript*");
AddFilter(filters, "collapsed");
AddFilter(filters, "default");
AddFilter(filters, "haspopup");
AddFilter(filters, "horizontal");
AddFilter(filters, "invisible");
......
......@@ -28,6 +28,9 @@ void AXStateFromBlink(const blink::WebAXObject& o, ui::AXNodeData* dst) {
if (o.IsAutofillAvailable())
dst->AddState(ax::mojom::State::kAutofillAvailable);
if (o.IsDefault())
dst->AddState(ax::mojom::State::kDefault);
if (o.IsHovered())
dst->AddState(ax::mojom::State::kHovered);
......
EVENT_OBJECT_STATECHANGE on <input#b1> role=ROLE_SYSTEM_PUSHBUTTON name="Button 1 turns disabled on" UNAVAILABLE
EVENT_OBJECT_STATECHANGE on <input#b2> role=ROLE_SYSTEM_PUSHBUTTON name="Button 2 turns disabled off" DEFAULT,FOCUSABLE
<!-- On a submit button, changing the disabled state should also change its default state -->
<!DOCTYPE html>
<html>
<body>
<input id="b1" type="submit" value="Button 1 turns disabled on">
<input id="b2" type="submit" disabled value="Button 2 turns disabled off">
<script>
function go() {
document.getElementById('b1').disabled = true;
document.getElementById('b2').disabled = false;
}
</script>
</body>
</html>
[document web]
++[form]
++++[push button] name='Submit'
++++[push button] name='Submit' default
rootWebArea
++form
++++button name='Submit'
\ No newline at end of file
++++button default name='Submit'
ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
++IA2_ROLE_FORM
++++ROLE_SYSTEM_PUSHBUTTON name='Submit' FOCUSABLE
++++ROLE_SYSTEM_PUSHBUTTON name='Submit' DEFAULT FOCUSABLE
<!--
@BLINK-ALLOW:default
@AURALINUX-ALLOW:default
@WIN-ALLOW:DEFAULT
@MAC-ALLOW:AXRole*
@MAC-ALLOW:AXSubrole*
-->
......
[document web]
++[section]
++++[push button] name='Submit' xml-roles:button
++++[push button] name='Submit' default xml-roles:button
rootWebArea
++genericContainer
++++button name='Submit'
\ No newline at end of file
++++button default name='Submit'
ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
++IA2_ROLE_SECTION
++++ROLE_SYSTEM_PUSHBUTTON name='Submit' FOCUSABLE xml-roles:button
++++ROLE_SYSTEM_PUSHBUTTON name='Submit' DEFAULT FOCUSABLE xml-roles:button
<!--
@BLINK-ALLOW:default
@MAC-ALLOW:AXRole*
@WIN-ALLOW:DEFAULT
@WIN-ALLOW:xml-roles*
@AURALINUX-ALLOW:default
@AURALINUX-ALLOW:xml-roles*
-->
<!DOCTYPE html>
......
[document web] focusable focused
++[form]
++++[entry] editable focusable selectable-text text-input-type:text
++++[push button] name='Submit' focusable
++++[push button] name='Submit' focusable default
......@@ -2,4 +2,4 @@ rootWebArea
++form
++++textField
++++++genericContainer
++++button name='Submit'
\ No newline at end of file
++++button default name='Submit'
ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
++IA2_ROLE_FORM
++++ROLE_SYSTEM_TEXT FOCUSABLE
++++ROLE_SYSTEM_PUSHBUTTON name='Submit' FOCUSABLE
++++ROLE_SYSTEM_PUSHBUTTON name='Submit' DEFAULT FOCUSABLE
<!--
@BLINK-ALLOW:default
@WIN-ALLOW:DEFAULT
@MAC-ALLOW:AXRole*
@AURALINUX-ALLOW:default
@AURALINUX-ALLOW:focus*
@AURALINUX-ALLOW:editable
@AURALINUX-ALLOW:text-input-type*
......
......@@ -18,7 +18,7 @@
++++++[push button] name='File:'
++++[label]
++++++[text] name='Image: '
++++++[push button] name='Image:'
++++++[push button] name='Image:' default
++++[label]
++++++[text] name='Number: '
++++++[spin button] name='Number:' selectable-text text-input-type:number
......@@ -37,7 +37,7 @@
++++++[entry] name='Search:' selectable-text text-input-type:search
++++[label]
++++++[text] name='Submit: '
++++++[push button] name='Submit:'
++++++[push button] name='Submit:' default
++++[label]
++++++[text] name='Tel: '
++++++[entry] name='Tel:' selectable-text text-input-type:tel
......
rootWebArea
++genericContainer
++++labelText
++++++staticText name='Default: '
++++++++inlineTextBox name='Default: '
++++++textField name='Default:'
++++++++genericContainer
++++labelText
++++++staticText name='Button: '
++++++++inlineTextBox name='Button: '
++++++button name='Button:'
++++checkBox name='Checkbox:' checkedState=false
++++labelText
++++++staticText name='Color: '
++++++++inlineTextBox name='Color: '
++++++colorWell name='Color:' value='#000000'
++++labelText
++++++staticText name='Email: '
++++++++inlineTextBox name='Email: '
++++++textField name='Email:'
++++++++genericContainer
++++labelText
++++++staticText name='File: '
++++++++inlineTextBox name='File: '
++++++button name='File:' value='No file chosen'
++++labelText
++++++staticText name='Image: '
++++++++inlineTextBox name='Image: '
++++++button default name='Image:'
++++labelText
++++++staticText name='Number: '
++++++++inlineTextBox name='Number: '
++++++spinButton name='Number:'
++++++++genericContainer
++++labelText
++++++staticText name='Password: '
++++++++inlineTextBox name='Password: '
++++++textField protected name='Password:'
++++++++genericContainer
++++radioButton name='Radio:' checkedState=false
++++labelText
++++++staticText name='Range: '
++++++++inlineTextBox name='Range: '
++++++slider horizontal name='Range:' value='50' valueForRange=50.00 minValueForRange=0.00 maxValueForRange=100.00
++++++++sliderThumb
++++labelText
++++++staticText name='Reset: '
++++++++inlineTextBox name='Reset: '
++++++button name='Reset:'
++++labelText
++++++staticText name='Search: '
++++++++inlineTextBox name='Search: '
++++++textField name='Search:'
++++++++genericContainer
++++labelText
++++++staticText name='Submit: '
++++++++inlineTextBox name='Submit: '
++++++button default name='Submit:'
++++labelText
++++++staticText name='Tel: '
++++++++inlineTextBox name='Tel: '
++++++textField name='Tel:'
++++++++genericContainer
++++labelText
++++++staticText name='Text: '
++++++++inlineTextBox name='Text: '
++++++textField name='Text:'
++++++++genericContainer
++++labelText
++++++staticText name='Url: '
++++++++inlineTextBox name='Url: '
++++++textField name='Url:'
++++++++genericContainer
......@@ -18,7 +18,7 @@ ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
++++++ROLE_SYSTEM_PUSHBUTTON name='File:' value='No file chosen' FOCUSABLE
++++IA2_ROLE_LABEL
++++++ROLE_SYSTEM_STATICTEXT name='Image: '
++++++ROLE_SYSTEM_PUSHBUTTON name='Image:' FOCUSABLE
++++++ROLE_SYSTEM_PUSHBUTTON name='Image:' DEFAULT FOCUSABLE
++++IA2_ROLE_LABEL
++++++ROLE_SYSTEM_STATICTEXT name='Number: '
++++++ROLE_SYSTEM_SPINBUTTON name='Number:' FOCUSABLE text-input-type:number
......@@ -37,7 +37,7 @@ ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
++++++ROLE_SYSTEM_TEXT name='Search:' FOCUSABLE text-input-type:search
++++IA2_ROLE_LABEL
++++++ROLE_SYSTEM_STATICTEXT name='Submit: '
++++++ROLE_SYSTEM_PUSHBUTTON name='Submit:' FOCUSABLE
++++++ROLE_SYSTEM_PUSHBUTTON name='Submit:' DEFAULT FOCUSABLE
++++IA2_ROLE_LABEL
++++++ROLE_SYSTEM_STATICTEXT name='Tel: '
++++++ROLE_SYSTEM_TEXT name='Tel:' FOCUSABLE text-input-type:tel
......
<!--
@BLINK-ALLOW:default
@WIN-ALLOW:DEFAULT
@WIN-ALLOW:text-input-type*
@AURALINUX-ALLOW:default
@AURALINUX-ALLOW:text-input-type*
@AURALINUX-DENY:checkable
@AURALINUX-DENY:last-defined
......
......@@ -122,6 +122,7 @@ class WebAXObject {
BLINK_EXPORT bool IsCheckable() const;
BLINK_EXPORT bool IsClickable() const;
BLINK_EXPORT bool IsControl() const;
BLINK_EXPORT bool IsDefault() const;
BLINK_EXPORT WebAXExpanded IsExpanded() const;
BLINK_EXPORT bool IsFocused() const;
BLINK_EXPORT bool IsHovered() const;
......
......@@ -305,6 +305,20 @@ static bool IsLinkable(const AXObject& object) {
object.GetLayoutObject()->IsText();
}
bool AXLayoutObject::IsDefault() const {
if (IsDetached())
return false;
// Checks for any kind of disabled, including aria-disabled.
if (Restriction() == kDisabled)
return false;
const HTMLFormControlElement* control =
ToHTMLFormControlElementOrNull(GetNode());
// This does not check for disabled or whether it is the first submit button.
return control && control->CanBeSuccessfulSubmitButton();
}
// Requires layoutObject to be present because it relies on style
// user-modify. Don't move this logic to AXNodeObject.
bool AXLayoutObject::IsEditable() const {
......
......@@ -80,6 +80,7 @@ class MODULES_EXPORT AXLayoutObject : public AXNodeObject {
// Check object role or purpose.
bool IsAutofillAvailable() override { return is_autofill_available_; }
bool IsDefault() const override;
bool IsEditable() const override;
bool IsRichlyEditable() const override;
bool IsLinked() const override;
......
......@@ -473,6 +473,7 @@ class MODULES_EXPORT AXObject : public GarbageCollectedFinalized<AXObject> {
return RoleValue() == ax::mojom::Role::kColorWell;
}
virtual bool IsControl() const { return false; }
virtual bool IsDefault() const { return false; }
virtual bool IsEmbeddedObject() const { return false; }
virtual bool IsFieldset() const { return false; }
virtual bool IsHeading() const { return false; }
......
......@@ -1063,6 +1063,8 @@ void AXObjectCacheImpl::HandleAttributeChanged(const QualifiedName& attr_name,
MaybeNewRelationTarget(element, Get(element));
else if (attr_name == kTabindexAttr)
FocusableChanged(element);
else if (attr_name == kDisabledAttr)
MarkAXObjectDirty(Get(element), false);
if (!attr_name.LocalName().StartsWith("aria-"))
return;
......
......@@ -266,6 +266,13 @@ bool WebAXObject::IsControl() const {
return private_->IsControl();
}
bool WebAXObject::IsDefault() const {
if (IsDetached())
return false;
return private_->IsDefault();
}
WebAXRestriction WebAXObject::Restriction() const {
if (IsDetached())
return kWebAXRestrictionNone;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment