Chromium Code Reviews| Index: third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp |
| diff --git a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp |
| index eb389e086c2e0d601ae68e914321c49eadd939c2..519d956fc3097f51139a4c759be5800aa06bb291 100644 |
| --- a/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp |
| +++ b/third_party/WebKit/Source/modules/accessibility/AXNodeObject.cpp |
| @@ -540,6 +540,13 @@ AccessibilityRole AXNodeObject::NativeAccessibilityRoleIgnoringAria() const { |
| return select_element.IsMultiple() ? kListBoxRole : kPopUpButtonRole; |
| } |
| + if (isHTMLOptionElement(*GetNode())) { |
| + HTMLSelectElement* select_element = |
| + toHTMLOptionElement(GetNode())->OwnerSelectElement(); |
| + return select_element->IsMultiple() ? kListBoxOptionRole |
| + : kMenuListOptionRole; |
| + } |
| + |
| if (isHTMLTextAreaElement(*GetNode())) |
| return kTextFieldRole; |
| @@ -1289,6 +1296,15 @@ bool AXNodeObject::CanSetFocusAttribute() const { |
| if (IsDisabledFormControl(node)) |
| return false; |
| + // Check for options here because AXListBoxOption and AXMenuListOption |
| + // don't help when the <option> is canvas fallback, and because |
| + // a common case for aria-owns from a textbox that points to a list |
| + // does not change the hierarchy (textboxes don't suport children) |
| + if ((RoleValue() == kListBoxOptionRole || |
| + RoleValue() == kMenuListOptionRole) && |
| + IsEnabled()) |
| + return true; |
| + |
| return node->IsElementNode() && ToElement(node)->SupportsFocus(); |
| } |
| @@ -1308,11 +1324,13 @@ bool AXNodeObject::CanSetValueAttribute() const { |
| } |
| bool AXNodeObject::CanSetSelectedAttribute() const { |
| - // ARIA list box options can be selected if they are children of an element |
| - // with an aria-activedescendant attribute. |
| - if (AriaRoleAttribute() == kListBoxOptionRole && |
| - AncestorExposesActiveDescendant()) |
| + const AccessibilityRole role = AriaRoleAttribute(); |
| + // These elements can be selected if not disabled (native or ARIA) |
| + if ((role == kListBoxOptionRole || role == kMenuListOptionRole || |
| + role == kTreeItemRole || role == kCellRole || role == kTabRole) && |
|
David Tseng
2017/06/06 21:28:47
The spec includes the roles:
gridcell
option
row
|
| + IsEnabled() && CanSetFocusAttribute()) { |
| return true; |
| + } |
| return AXObjectImpl::CanSetSelectedAttribute(); |
| } |
| @@ -2239,15 +2257,18 @@ bool AXNodeObject::CanHaveChildren() const { |
| switch (role) { |
| case kImageRole: |
| case kButtonRole: |
| - case kPopUpButtonRole: |
| case kCheckBoxRole: |
| case kRadioButtonRole: |
| case kSwitchRole: |
| case kTabRole: |
| case kToggleButtonRole: |
| case kListBoxOptionRole: |
| + case kMenuButtonRole: |
| + case kMenuListOptionRole: |
| case kScrollBarRole: |
| return false; |
| + case kPopUpButtonRole: |
| + return isHTMLSelectElement(GetNode()); |
| case kStaticTextRole: |
| if (!AxObjectCache().InlineTextBoxAccessibilityEnabled()) |
| return false; |