Commit 86d6a59a authored by Dominic Mazzoni's avatar Dominic Mazzoni Committed by Commit Bot

Android accessibility: prefer "hint" for text fields labels.

Android's AccessibilityNodeInfo does not have a separate field
for the value of a text field, but it does have a "hint" field.

Suppose a text field has some accessible label - like a
aria-label or a placeholder. Previously Chrome exposed that
as the field's text if the field was empty, and the hint if
the field had user-entered text. This is confusing because
once the user starts entering text, the label jumps from the
text to the hint.

Instead, always expose the label as the hint, and let the
text be empty initially.

BUG=828969
TBR=aleventhal@chromium.org

Change-Id: I4052a811d645a42b3fecf8e2e1a4b089a7da75b8
Reviewed-on: https://chromium-review.googlesource.com/994132Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Commit-Queue: Dominic Mazzoni <dmazzoni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#549257}
parent 248c6b08
...@@ -1432,15 +1432,7 @@ bool BrowserAccessibilityAndroid::IsIframe() const { ...@@ -1432,15 +1432,7 @@ bool BrowserAccessibilityAndroid::IsIframe() const {
} }
bool BrowserAccessibilityAndroid::ShouldExposeValueAsName() const { bool BrowserAccessibilityAndroid::ShouldExposeValueAsName() const {
base::string16 value = GetValue();
if (value.empty())
return false;
if (HasState(ax::mojom::State::kEditable))
return true;
switch (GetRole()) { switch (GetRole()) {
case ax::mojom::Role::kPopUpButton:
case ax::mojom::Role::kTextField: case ax::mojom::Role::kTextField:
case ax::mojom::Role::kTextFieldWithComboBox: case ax::mojom::Role::kTextFieldWithComboBox:
return true; return true;
...@@ -1448,6 +1440,16 @@ bool BrowserAccessibilityAndroid::ShouldExposeValueAsName() const { ...@@ -1448,6 +1440,16 @@ bool BrowserAccessibilityAndroid::ShouldExposeValueAsName() const {
break; break;
} }
if (HasState(ax::mojom::State::kEditable))
return true;
base::string16 value = GetValue();
if (value.empty())
return false;
if (GetRole() == ax::mojom::Role::kPopUpButton)
return true;
return false; return false;
} }
......
android.webkit.WebView focusable scrollable android.webkit.WebView focusable scrollable
++android.view.View name='State' ++android.view.View name='State'
++android.widget.EditText clickable editable_text focusable focused name='State' input_type=1 ++android.widget.EditText clickable editable_text focusable focused hint='State' input_type=1
++android.widget.ListView role_description='list box' clickable collection item_count=2 row_count=2 ++android.widget.ListView role_description='list box' clickable collection item_count=2 row_count=2
++++android.view.View clickable collection_item focusable name='Alabama' ++++android.view.View clickable collection_item focusable name='Alabama'
++++android.view.View clickable collection_item focusable selected name='Alaska' item_index=1 row_index=1 ++++android.view.View clickable collection_item focusable selected name='Alaska' item_index=1 row_index=1
\ No newline at end of file
...@@ -5,14 +5,14 @@ android.webkit.WebView focusable focused scrollable ...@@ -5,14 +5,14 @@ android.webkit.WebView focusable focused scrollable
++++android.widget.EditText clickable editable_text focusable has_non_empty_value name='Readonly-true input' input_type=1 text_change_added_count=19 ++++android.widget.EditText clickable editable_text focusable has_non_empty_value name='Readonly-true input' input_type=1 text_change_added_count=19
++android.view.View clickable focusable name='Readonly-false plain div' ++android.view.View clickable focusable name='Readonly-false plain div'
++android.view.View clickable focusable name='Readonly-true plain div' ++android.view.View clickable focusable name='Readonly-true plain div'
++android.view.View clickable editable_text focusable multiline name='Readonly-false contenteditable div' ++android.view.View clickable editable_text focusable multiline hint='Readonly-false contenteditable div'
++android.view.View clickable editable_text focusable multiline name='Readonly-true contenteditable div' ++android.view.View clickable editable_text focusable multiline hint='Readonly-true contenteditable div'
++android.widget.EditText clickable editable_text focusable name='Readonly-false role unimplemented textbox' ++android.widget.EditText clickable editable_text focusable hint='Readonly-false role unimplemented textbox'
++android.widget.EditText clickable editable_text focusable name='Readonly-true role unimplemented textbox' ++android.widget.EditText clickable editable_text focusable hint='Readonly-true role unimplemented textbox'
++android.widget.EditText clickable editable_text focusable name='Readonly-false contenteditable textbox' ++android.widget.EditText clickable editable_text focusable hint='Readonly-false contenteditable textbox'
++android.widget.EditText clickable editable_text focusable name='Readonly-true contenteditable textbox' ++android.widget.EditText clickable editable_text focusable hint='Readonly-true contenteditable textbox'
++android.widget.CheckBox role_description='checkbox' checkable clickable name='Readonly checkbox' ++android.widget.CheckBox role_description='checkbox' checkable clickable name='Readonly checkbox'
++android.widget.EditText clickable editable_text focusable name='Readonly combobox' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='Readonly combobox' input_type=1
++android.widget.ListView role_description='list box' clickable collection name='Readonly listbox' ++android.widget.ListView role_description='list box' clickable collection name='Readonly listbox'
++android.view.View role_description='radio group' name='Readonly radiogroup' ++android.view.View role_description='radio group' name='Readonly radiogroup'
++android.widget.SeekBar role_description='slider' range name='Readonly slider' item_index=50 item_count=100 range_max=100 range_current_value=50 ++android.widget.SeekBar role_description='slider' range name='Readonly slider' item_index=50 item_count=100 range_max=100 range_current_value=50
...@@ -20,4 +20,4 @@ android.webkit.WebView focusable focused scrollable ...@@ -20,4 +20,4 @@ android.webkit.WebView focusable focused scrollable
++android.view.MenuItem role_description='checkbox' checkable clickable name='Readonly menuitemcheckbox' ++android.view.MenuItem role_description='checkbox' checkable clickable name='Readonly menuitemcheckbox'
++android.view.MenuItem role_description='radio button' checkable clickable name='Readonly menuitemradio' ++android.view.MenuItem role_description='radio button' checkable clickable name='Readonly menuitemradio'
++android.widget.EditText role_description='search text field' clickable editable_text name='Readonly searchbox' ++android.widget.EditText role_description='search text field' clickable editable_text name='Readonly searchbox'
++android.widget.CheckBox role_description='switch' checkable clickable name='Readonly switch' ++android.widget.CheckBox role_description='switch' checkable clickable name='Readonly switch'
\ No newline at end of file
android.webkit.WebView focusable focused scrollable android.webkit.WebView focusable focused scrollable
++android.widget.EditText clickable editable_text focusable name='aria-placeholder1' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='aria-placeholder1' input_type=1
++android.widget.EditText clickable editable_text focusable name='placeholder2' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='placeholder2' input_type=1
++android.widget.EditText clickable editable_text focusable name='aria-label3' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='aria-label3' input_type=1
++android.widget.EditText clickable editable_text focusable name='aria-label4' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='aria-label4' input_type=1
++android.widget.EditText clickable editable_text focusable name='aria-label5' hint='aria-description5' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='aria-label5 aria-description5' input_type=1
++android.view.View name='aria-description5' ++android.view.View name='aria-description5'
++android.widget.EditText clickable editable_text focusable name='aria-placeholder6' hint='title6' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='aria-placeholder6 title6' input_type=1
\ No newline at end of file \ No newline at end of file
android.webkit.WebView focusable focused scrollable android.webkit.WebView focusable focused scrollable
++android.view.View clickable editable_text focusable multiline name='label' ++android.view.View clickable editable_text focusable multiline hint='label'
++android.view.View clickable editable_text focusable multiline hint='description' ++android.view.View clickable editable_text focusable multiline hint='description'
++android.view.View clickable editable_text focusable multiline name='title' ++android.view.View clickable editable_text focusable multiline hint='title'
++android.view.View name='description' ++android.view.View name='description'
\ No newline at end of file
android.webkit.WebView focusable scrollable android.webkit.WebView focusable scrollable
++android.view.View ++android.view.View
++++android.widget.EditText clickable editable_text focusable focused name='Name' input_type=1 ++++android.widget.EditText clickable editable_text focusable focused hint='Name' input_type=1
\ No newline at end of file
android.webkit.WebView focusable focused scrollable android.webkit.WebView focusable focused scrollable
++android.widget.EditText clickable editable_text focusable name='Title0' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='Title0' input_type=1
++android.widget.EditText clickable editable_text focusable name='Label1' hint='Title1' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='Label1 Title1' input_type=1
++android.widget.EditText clickable editable_text focusable name='AriaLabel2' hint='Title2' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='AriaLabel2 Title2' input_type=1
++android.widget.EditText clickable editable_text focusable name='LabelledBy3' hint='Title3' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='LabelledBy3 Title3' input_type=1
++android.widget.EditText clickable editable_text focusable name='Placeholder4' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='Placeholder4' input_type=1
++android.widget.EditText clickable editable_text focusable name='ARIA Placeholder4a' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='ARIA Placeholder4a' input_type=1
++android.widget.EditText clickable editable_text focusable name='Placeholder4b' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='Placeholder4b' input_type=1
++android.widget.EditText clickable editable_text focusable name='Placeholder5' hint='Title5' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='Placeholder5 Title5' input_type=1
++android.widget.EditText clickable editable_text focusable name='LabelledBy6' hint='DescribedBy6' input_type=1 ++android.widget.EditText clickable editable_text focusable hint='LabelledBy6 DescribedBy6' input_type=1
\ No newline at end of file \ No newline at end of file
android.webkit.WebView focusable scrollable android.webkit.WebView focusable scrollable
++android.view.View ++android.view.View
++++android.widget.EditText clickable editable_text focusable focused name='Name' input_type=1 ++++android.widget.EditText clickable editable_text focusable focused hint='Name' input_type=1
\ No newline at end of file
android.webkit.WebView focusable focused scrollable android.webkit.WebView focusable focused scrollable
++android.view.View ++android.view.View
++++android.view.View name='l1' ++++android.view.View name='l1'
++++android.widget.EditText clickable editable_text focusable name='l1' input_type=1 ++++android.widget.EditText clickable editable_text focusable hint='l1' input_type=1
++++android.view.View name='l2' ++++android.view.View name='l2'
++++android.widget.EditText clickable editable_text focusable has_non_empty_value name='value' hint='l2' input_type=1 text_change_added_count=5 ++++android.widget.EditText clickable editable_text focusable has_non_empty_value name='value' hint='l2' input_type=1 text_change_added_count=5
++++android.widget.EditText clickable editable_text focusable name='l2' input_type=1 ++++android.widget.EditText clickable editable_text focusable hint='l2' input_type=1
++++android.widget.EditText clickable editable_text focusable has_non_empty_value name='value *' hint='l2' input_type=1 text_change_added_count=8 ++++android.widget.EditText clickable editable_text focusable has_non_empty_value name='value *' hint='l2' input_type=1 text_change_added_count=8
++++android.view.View name='Email' ++++android.view.View name='Email'
++++android.view.View ++++android.view.View
++++android.widget.EditText clickable editable_text focusable name='Email' input_type=1 ++++android.widget.EditText clickable editable_text focusable hint='Email' input_type=1
++++android.widget.EditText clickable editable_text focusable has_non_empty_value name='value' hint='Email' input_type=1 text_change_added_count=5 ++++android.widget.EditText clickable editable_text focusable has_non_empty_value name='value' hint='Email' input_type=1 text_change_added_count=5
++++android.widget.EditText clickable editable_text focusable multiline name='l5' ++++android.widget.EditText clickable editable_text focusable multiline hint='l5'
++++android.widget.EditText clickable editable_text focusable has_non_empty_value multiline name='Value' hint='l6' text_change_added_count=5 ++++android.widget.EditText clickable editable_text focusable has_non_empty_value multiline name='Value' hint='l6' text_change_added_count=5
++++android.widget.EditText clickable editable_text focusable has_non_empty_value name='value' hint='Name Description' input_type=1 text_change_added_count=5 ++++android.widget.EditText clickable editable_text focusable has_non_empty_value name='value' hint='Name Description' input_type=1 text_change_added_count=5
\ No newline at end of file
...@@ -2,7 +2,7 @@ android.webkit.WebView focusable focused scrollable ...@@ -2,7 +2,7 @@ android.webkit.WebView focusable focused scrollable
++android.view.View ++android.view.View
++++android.view.View ++++android.view.View
++++++android.view.View name='Default: ' ++++++android.view.View name='Default: '
++++++android.widget.EditText clickable editable_text focusable name='Default: ' input_type=1 ++++++android.widget.EditText clickable editable_text focusable hint='Default: ' input_type=1
++++android.view.View ++++android.view.View
++++++android.view.View name='Button: ' ++++++android.view.View name='Button: '
++++++android.widget.Button role_description='button' clickable focusable name='Button: ' ++++++android.widget.Button role_description='button' clickable focusable name='Button: '
...@@ -12,7 +12,7 @@ android.webkit.WebView focusable focused scrollable ...@@ -12,7 +12,7 @@ android.webkit.WebView focusable focused scrollable
++++++android.widget.Spinner role_description='color picker' clickable focusable name='#000000' ++++++android.widget.Spinner role_description='color picker' clickable focusable name='#000000'
++++android.view.View ++++android.view.View
++++++android.view.View name='Email: ' ++++++android.view.View name='Email: '
++++++android.widget.EditText clickable editable_text focusable name='Email: ' input_type=209 ++++++android.widget.EditText clickable editable_text focusable hint='Email: ' input_type=209
++++android.view.View ++++android.view.View
++++++android.view.View name='File: ' ++++++android.view.View name='File: '
++++++android.widget.Button role_description='button' clickable focusable name='File: ' ++++++android.widget.Button role_description='button' clickable focusable name='File: '
...@@ -21,10 +21,10 @@ android.webkit.WebView focusable focused scrollable ...@@ -21,10 +21,10 @@ android.webkit.WebView focusable focused scrollable
++++++android.widget.Button role_description='button' clickable focusable name='Image: ' ++++++android.widget.Button role_description='button' clickable focusable name='Image: '
++++android.view.View ++++android.view.View
++++++android.view.View name='Number: ' ++++++android.view.View name='Number: '
++++++android.widget.EditText role_description='spin button' clickable editable_text focusable name='Number: ' input_type=2 ++++++android.widget.EditText role_description='spin button' clickable editable_text focusable hint='Number: ' input_type=2
++++android.view.View ++++android.view.View
++++++android.view.View name='Password: ' ++++++android.view.View name='Password: '
++++++android.widget.EditText clickable editable_text focusable password name='Password: ' input_type=225 ++++++android.widget.EditText clickable editable_text focusable password hint='Password: ' input_type=225
++++android.widget.RadioButton role_description='radio button' checkable clickable focusable name='Radio: ' ++++android.widget.RadioButton role_description='radio button' checkable clickable focusable name='Radio: '
++++android.view.View ++++android.view.View
++++++android.view.View name='Range: ' ++++++android.view.View name='Range: '
...@@ -34,16 +34,16 @@ android.webkit.WebView focusable focused scrollable ...@@ -34,16 +34,16 @@ android.webkit.WebView focusable focused scrollable
++++++android.widget.Button role_description='button' clickable focusable name='Reset: ' ++++++android.widget.Button role_description='button' clickable focusable name='Reset: '
++++android.view.View ++++android.view.View
++++++android.view.View name='Search: ' ++++++android.view.View name='Search: '
++++++android.widget.EditText clickable editable_text focusable name='Search: ' input_type=1 ++++++android.widget.EditText clickable editable_text focusable hint='Search: ' input_type=1
++++android.view.View ++++android.view.View
++++++android.view.View name='Submit: ' ++++++android.view.View name='Submit: '
++++++android.widget.Button role_description='button' clickable focusable name='Submit: ' ++++++android.widget.Button role_description='button' clickable focusable name='Submit: '
++++android.view.View ++++android.view.View
++++++android.view.View name='Tel: ' ++++++android.view.View name='Tel: '
++++++android.widget.EditText clickable editable_text focusable name='Tel: ' input_type=3 ++++++android.widget.EditText clickable editable_text focusable hint='Tel: ' input_type=3
++++android.view.View ++++android.view.View
++++++android.view.View name='Text: ' ++++++android.view.View name='Text: '
++++++android.widget.EditText clickable editable_text focusable name='Text: ' input_type=1 ++++++android.widget.EditText clickable editable_text focusable hint='Text: ' input_type=1
++++android.view.View ++++android.view.View
++++++android.view.View name='Url: ' ++++++android.view.View name='Url: '
++++++android.widget.EditText clickable editable_text focusable name='Url: ' input_type=17 ++++++android.widget.EditText clickable editable_text focusable hint='Url: ' input_type=17
\ No newline at end of file \ No newline at end of file
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