Index: third_party/WebKit/Source/core/dom/AccessibleNode.cpp |
diff --git a/third_party/WebKit/Source/core/dom/AccessibleNode.cpp b/third_party/WebKit/Source/core/dom/AccessibleNode.cpp |
index a8dd6c111a06a752f8f053130bee947a37b7df45..4f6eaa48eb7cf63d3f84da146e5e4d88c65080e5 100644 |
--- a/third_party/WebKit/Source/core/dom/AccessibleNode.cpp |
+++ b/third_party/WebKit/Source/core/dom/AccessibleNode.cpp |
@@ -27,7 +27,7 @@ const AtomicString& AccessibleNode::GetProperty(Element* element, |
if (AccessibleNode* accessible_node = element->ExistingAccessibleNode()) { |
for (const auto& item : accessible_node->string_properties_) { |
- if (item.first == property) |
+ if (item.first == property && !item.second.IsNull()) |
return item.second; |
} |
} |
@@ -36,6 +36,26 @@ const AtomicString& AccessibleNode::GetProperty(Element* element, |
} |
// static |
+bool AccessibleNode::GetProperty(Element* element, |
+ AOMBooleanProperty property, |
+ bool& is_null) { |
+ is_null = true; |
+ if (!element) |
+ return false; |
+ |
+ if (AccessibleNode* accessible_node = element->ExistingAccessibleNode()) { |
+ for (const auto& item : accessible_node->boolean_properties_) { |
+ if (item.first == property) { |
+ is_null = false; |
+ return item.second; |
+ } |
+ } |
+ } |
+ |
+ return false; |
+} |
+ |
+// static |
const AtomicString& AccessibleNode::GetPropertyOrARIAAttribute( |
Element* element, |
AOMStringProperty property) { |
@@ -49,39 +69,102 @@ const AtomicString& AccessibleNode::GetPropertyOrARIAAttribute( |
// Fall back on the equivalent ARIA attribute. |
switch (property) { |
case AOMStringProperty::kAutocomplete: |
- return element->getAttribute(aria_autocompleteAttr); |
+ return element->FastGetAttribute(aria_autocompleteAttr); |
case AOMStringProperty::kChecked: |
- return element->getAttribute(aria_checkedAttr); |
+ return element->FastGetAttribute(aria_checkedAttr); |
case AOMStringProperty::kCurrent: |
- return element->getAttribute(aria_currentAttr); |
+ return element->FastGetAttribute(aria_currentAttr); |
case AOMStringProperty::kInvalid: |
- return element->getAttribute(aria_invalidAttr); |
+ return element->FastGetAttribute(aria_invalidAttr); |
case AOMStringProperty::kKeyShortcuts: |
- return element->getAttribute(aria_keyshortcutsAttr); |
+ return element->FastGetAttribute(aria_keyshortcutsAttr); |
case AOMStringProperty::kLabel: |
- return element->getAttribute(aria_labelAttr); |
+ return element->FastGetAttribute(aria_labelAttr); |
case AOMStringProperty::kLive: |
- return element->getAttribute(aria_liveAttr); |
+ return element->FastGetAttribute(aria_liveAttr); |
case AOMStringProperty::kOrientation: |
- return element->getAttribute(aria_orientationAttr); |
+ return element->FastGetAttribute(aria_orientationAttr); |
case AOMStringProperty::kPlaceholder: |
- return element->getAttribute(aria_placeholderAttr); |
+ return element->FastGetAttribute(aria_placeholderAttr); |
case AOMStringProperty::kRelevant: |
- return element->getAttribute(aria_relevantAttr); |
+ return element->FastGetAttribute(aria_relevantAttr); |
case AOMStringProperty::kRole: |
- return element->getAttribute(roleAttr); |
+ return element->FastGetAttribute(roleAttr); |
case AOMStringProperty::kRoleDescription: |
- return element->getAttribute(aria_roledescriptionAttr); |
+ return element->FastGetAttribute(aria_roledescriptionAttr); |
case AOMStringProperty::kSort: |
- return element->getAttribute(aria_sortAttr); |
+ return element->FastGetAttribute(aria_sortAttr); |
case AOMStringProperty::kValueText: |
- return element->getAttribute(aria_valuetextAttr); |
+ return element->FastGetAttribute(aria_valuetextAttr); |
} |
NOTREACHED(); |
return g_null_atom; |
} |
+// static |
+bool AccessibleNode::GetPropertyOrARIAAttribute(Element* element, |
+ AOMBooleanProperty property, |
+ bool& is_null) { |
+ is_null = true; |
+ if (!element) |
+ return false; |
+ |
+ bool result = GetProperty(element, property, is_null); |
+ if (!is_null) |
+ return result; |
+ |
+ // Fall back on the equivalent ARIA attribute. |
+ AtomicString attr_value; |
+ switch (property) { |
+ case AOMBooleanProperty::kAtomic: |
+ attr_value = element->FastGetAttribute(aria_atomicAttr); |
+ break; |
+ case AOMBooleanProperty::kBusy: |
+ attr_value = element->FastGetAttribute(aria_busyAttr); |
+ break; |
+ case AOMBooleanProperty::kDisabled: |
+ attr_value = element->FastGetAttribute(aria_disabledAttr); |
+ break; |
+ case AOMBooleanProperty::kExpanded: |
+ attr_value = element->FastGetAttribute(aria_expandedAttr); |
+ break; |
+ case AOMBooleanProperty::kHidden: |
+ attr_value = element->FastGetAttribute(aria_hiddenAttr); |
+ break; |
+ case AOMBooleanProperty::kModal: |
+ attr_value = element->FastGetAttribute(aria_modalAttr); |
+ break; |
+ case AOMBooleanProperty::kMultiline: |
+ attr_value = element->FastGetAttribute(aria_multilineAttr); |
+ break; |
+ case AOMBooleanProperty::kMultiselectable: |
+ attr_value = element->FastGetAttribute(aria_multiselectableAttr); |
+ break; |
+ case AOMBooleanProperty::kReadOnly: |
+ attr_value = element->FastGetAttribute(aria_readonlyAttr); |
+ break; |
+ case AOMBooleanProperty::kRequired: |
+ attr_value = element->FastGetAttribute(aria_requiredAttr); |
+ break; |
+ case AOMBooleanProperty::kSelected: |
+ attr_value = element->FastGetAttribute(aria_selectedAttr); |
+ break; |
+ } |
+ |
+ is_null = attr_value.IsNull(); |
+ return EqualIgnoringASCIICase(attr_value, "true"); |
+} |
+ |
+bool AccessibleNode::atomic(bool& is_null) const { |
+ return GetProperty(element_, AOMBooleanProperty::kAtomic, is_null); |
+} |
+ |
+void AccessibleNode::setAtomic(bool atomic, bool is_null) { |
+ SetBooleanProperty(AOMBooleanProperty::kAtomic, atomic, is_null); |
+ NotifyAttributeChanged(aria_atomicAttr); |
+} |
+ |
AtomicString AccessibleNode::autocomplete() const { |
return GetProperty(element_, AOMStringProperty::kAutocomplete); |
} |
@@ -91,6 +174,15 @@ void AccessibleNode::setAutocomplete(const AtomicString& autocomplete) { |
NotifyAttributeChanged(aria_autocompleteAttr); |
} |
+bool AccessibleNode::busy(bool& is_null) const { |
+ return GetProperty(element_, AOMBooleanProperty::kBusy, is_null); |
+} |
+ |
+void AccessibleNode::setBusy(bool busy, bool is_null) { |
+ SetBooleanProperty(AOMBooleanProperty::kBusy, busy, is_null); |
+ NotifyAttributeChanged(aria_busyAttr); |
+} |
+ |
AtomicString AccessibleNode::checked() const { |
return GetProperty(element_, AOMStringProperty::kChecked); |
} |
@@ -111,6 +203,33 @@ void AccessibleNode::setCurrent(const AtomicString& current) { |
cache->HandleAttributeChanged(aria_currentAttr, element_); |
} |
+bool AccessibleNode::disabled(bool& is_null) const { |
+ return GetProperty(element_, AOMBooleanProperty::kDisabled, is_null); |
+} |
+ |
+void AccessibleNode::setDisabled(bool disabled, bool is_null) { |
+ SetBooleanProperty(AOMBooleanProperty::kDisabled, disabled, is_null); |
+ NotifyAttributeChanged(aria_disabledAttr); |
+} |
+ |
+bool AccessibleNode::expanded(bool& is_null) const { |
+ return GetProperty(element_, AOMBooleanProperty::kExpanded, is_null); |
+} |
+ |
+void AccessibleNode::setExpanded(bool expanded, bool is_null) { |
+ SetBooleanProperty(AOMBooleanProperty::kExpanded, expanded, is_null); |
+ NotifyAttributeChanged(aria_expandedAttr); |
+} |
+ |
+bool AccessibleNode::hidden(bool& is_null) const { |
+ return GetProperty(element_, AOMBooleanProperty::kHidden, is_null); |
+} |
+ |
+void AccessibleNode::setHidden(bool hidden, bool is_null) { |
+ SetBooleanProperty(AOMBooleanProperty::kHidden, hidden, is_null); |
+ NotifyAttributeChanged(aria_hiddenAttr); |
+} |
+ |
AtomicString AccessibleNode::invalid() const { |
return GetProperty(element_, AOMStringProperty::kInvalid); |
} |
@@ -147,6 +266,34 @@ void AccessibleNode::setLive(const AtomicString& live) { |
NotifyAttributeChanged(aria_liveAttr); |
} |
+bool AccessibleNode::modal(bool& is_null) const { |
+ return GetProperty(element_, AOMBooleanProperty::kModal, is_null); |
+} |
+ |
+void AccessibleNode::setModal(bool modal, bool is_null) { |
+ SetBooleanProperty(AOMBooleanProperty::kModal, modal, is_null); |
+ NotifyAttributeChanged(aria_modalAttr); |
+} |
+ |
+bool AccessibleNode::multiline(bool& is_null) const { |
+ return GetProperty(element_, AOMBooleanProperty::kMultiline, is_null); |
+} |
+ |
+void AccessibleNode::setMultiline(bool multiline, bool is_null) { |
+ SetBooleanProperty(AOMBooleanProperty::kMultiline, multiline, is_null); |
+ NotifyAttributeChanged(aria_multilineAttr); |
+} |
+ |
+bool AccessibleNode::multiselectable(bool& is_null) const { |
+ return GetProperty(element_, AOMBooleanProperty::kMultiselectable, is_null); |
+} |
+ |
+void AccessibleNode::setMultiselectable(bool multiselectable, bool is_null) { |
+ SetBooleanProperty(AOMBooleanProperty::kMultiselectable, multiselectable, |
+ is_null); |
+ NotifyAttributeChanged(aria_multiselectableAttr); |
+} |
+ |
AtomicString AccessibleNode::orientation() const { |
return GetProperty(element_, AOMStringProperty::kOrientation); |
} |
@@ -165,6 +312,15 @@ void AccessibleNode::setPlaceholder(const AtomicString& placeholder) { |
NotifyAttributeChanged(aria_placeholderAttr); |
} |
+bool AccessibleNode::readOnly(bool& is_null) const { |
+ return GetProperty(element_, AOMBooleanProperty::kReadOnly, is_null); |
+} |
+ |
+void AccessibleNode::setReadOnly(bool read_only, bool is_null) { |
+ SetBooleanProperty(AOMBooleanProperty::kReadOnly, read_only, is_null); |
+ NotifyAttributeChanged(aria_readonlyAttr); |
+} |
+ |
AtomicString AccessibleNode::relevant() const { |
return GetProperty(element_, AOMStringProperty::kRelevant); |
} |
@@ -174,6 +330,15 @@ void AccessibleNode::setRelevant(const AtomicString& relevant) { |
NotifyAttributeChanged(aria_relevantAttr); |
} |
+bool AccessibleNode::required(bool& is_null) const { |
+ return GetProperty(element_, AOMBooleanProperty::kRequired, is_null); |
+} |
+ |
+void AccessibleNode::setRequired(bool required, bool is_null) { |
+ SetBooleanProperty(AOMBooleanProperty::kRequired, required, is_null); |
+ NotifyAttributeChanged(aria_requiredAttr); |
+} |
+ |
AtomicString AccessibleNode::role() const { |
return GetProperty(element_, AOMStringProperty::kRole); |
} |
@@ -192,6 +357,15 @@ void AccessibleNode::setRoleDescription(const AtomicString& role_description) { |
NotifyAttributeChanged(aria_roledescriptionAttr); |
} |
+bool AccessibleNode::selected(bool& is_null) const { |
+ return GetProperty(element_, AOMBooleanProperty::kSelected, is_null); |
+} |
+ |
+void AccessibleNode::setSelected(bool selected, bool is_null) { |
+ SetBooleanProperty(AOMBooleanProperty::kSelected, selected, is_null); |
+ NotifyAttributeChanged(aria_selectedAttr); |
+} |
+ |
AtomicString AccessibleNode::sort() const { |
return GetProperty(element_, AOMStringProperty::kSort); |
} |
@@ -222,6 +396,23 @@ void AccessibleNode::SetStringProperty(AOMStringProperty property, |
string_properties_.push_back(std::make_pair(property, value)); |
} |
+void AccessibleNode::SetBooleanProperty(AOMBooleanProperty property, |
+ bool value, |
+ bool is_null) { |
+ for (size_t i = 0; i < boolean_properties_.size(); i++) { |
+ auto& item = boolean_properties_[i]; |
+ if (item.first == property) { |
+ if (is_null) |
+ boolean_properties_.erase(i); |
+ else |
+ item.second = value; |
+ return; |
+ } |
+ } |
+ |
+ boolean_properties_.push_back(std::make_pair(property, value)); |
+} |
+ |
void AccessibleNode::NotifyAttributeChanged( |
const blink::QualifiedName& attribute) { |
// TODO(dmazzoni): Make a cleaner API for this rather than pretending |