Index: third_party/WebKit/Source/modules/accessibility/AXObjectImpl.cpp |
diff --git a/third_party/WebKit/Source/modules/accessibility/AXObjectImpl.cpp b/third_party/WebKit/Source/modules/accessibility/AXObjectImpl.cpp |
index 37699ded8eb6daca5aa78529441b7caa1843913c..e30e4a4005faf14054d76d89cb18fce95c517156 100644 |
--- a/third_party/WebKit/Source/modules/accessibility/AXObjectImpl.cpp |
+++ b/third_party/WebKit/Source/modules/accessibility/AXObjectImpl.cpp |
@@ -774,7 +774,7 @@ bool AXObjectImpl::ComputeAncestorExposesActiveDescendant() const { |
return false; |
if (parent->SupportsActiveDescendant() && |
- !parent->GetAttribute(aria_activedescendantAttr).IsEmpty()) { |
+ parent->HasAttribute(aria_activedescendantAttr)) { |
return true; |
} |
@@ -1255,6 +1255,35 @@ AXObjectImpl* AXObjectImpl::ParentObjectUnignored() const { |
return parent; |
} |
+// Container widgets are those that a user tabs into and arrows around |
+// sub-widgets |
+bool AXObjectImpl::IsContainerWidget() const { |
+ switch (RoleValue()) { |
+ case kComboBoxRole: |
+ case kGridRole: |
+ case kListBoxRole: |
+ case kMenuBarRole: |
+ case kMenuRole: |
+ case kRadioGroupRole: |
+ case kSpinButtonRole: |
+ case kTabListRole: |
+ case kToolbarRole: |
+ case kTreeGridRole: |
+ case kTreeRole: |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+AXObjectImpl* AXObjectImpl::ContainerWidget() const { |
+ AXObjectImpl* ancestor = ParentObjectUnignored(); |
+ while (ancestor && !ancestor->IsContainerWidget()) |
+ ancestor = ancestor->ParentObjectUnignored(); |
+ |
+ return ancestor; |
+} |
+ |
void AXObjectImpl::UpdateChildrenIfNecessary() { |
if (!HasChildren()) |
AddChildren(); |