Index: ui/accessibility/platform/ax_platform_node_base.cc |
diff --git a/ui/accessibility/platform/ax_platform_node_base.cc b/ui/accessibility/platform/ax_platform_node_base.cc |
index 3479af14ab5d1daa5204100454b551f02c3e67d9..62cfe5aec10ec627902eb34742e80828aed7a64d 100644 |
--- a/ui/accessibility/platform/ax_platform_node_base.cc |
+++ b/ui/accessibility/platform/ax_platform_node_base.cc |
@@ -4,55 +4,276 @@ |
#include "ui/accessibility/platform/ax_platform_node_base.h" |
+#include "base/strings/utf_string_conversions.h" |
#include "ui/accessibility/ax_node_data.h" |
#include "ui/accessibility/platform/ax_platform_node_delegate.h" |
namespace ui { |
-AXPlatformNodeBase::AXPlatformNodeBase() { |
-} |
+namespace { |
-AXPlatformNodeBase::~AXPlatformNodeBase() { |
+// Predicate that returns true if the first value of a pair is |first|. |
+template<typename FirstType, typename SecondType> |
+struct FirstIs { |
+ FirstIs(FirstType first) |
+ : first_(first) {} |
+ bool operator()(std::pair<FirstType, SecondType> const& p) { |
+ return p.first == first_; |
+ } |
+ FirstType first_; |
+}; |
+ |
+// Helper function that finds in a vector of pairs by matching on the |
+// first value, and returns an iterator. |
+template<typename FirstType, typename SecondType> |
+typename std::vector<std::pair<FirstType, SecondType>>::const_iterator |
+ FindInVectorOfPairs( |
+ FirstType first, |
+ const std::vector<std::pair<FirstType, SecondType>>& vector) { |
+ return std::find_if(vector.begin(), |
+ vector.end(), |
+ FirstIs<FirstType, SecondType>(first)); |
} |
+} // namespace |
+ |
void AXPlatformNodeBase::Init(AXPlatformNodeDelegate* delegate) { |
delegate_ = delegate; |
} |
-AXRole AXPlatformNodeBase::GetRole() const { |
- return delegate_ ? delegate_->GetData()->role : AX_ROLE_UNKNOWN; |
+const AXNodeData& AXPlatformNodeBase::GetData() const { |
+ CHECK(delegate_); |
+ return delegate_->GetData(); |
} |
gfx::Rect AXPlatformNodeBase::GetBoundsInScreen() const { |
- if (!delegate_) |
- return gfx::Rect(); |
- gfx::Rect bounds = delegate_->GetData()->location; |
+ CHECK(delegate_); |
+ gfx::Rect bounds = GetData().location; |
bounds.Offset(delegate_->GetGlobalCoordinateOffset()); |
return bounds; |
} |
gfx::NativeViewAccessible AXPlatformNodeBase::GetParent() { |
- return delegate_ ? delegate_->GetParent() : NULL; |
+ CHECK(delegate_); |
+ return delegate_->GetParent(); |
} |
int AXPlatformNodeBase::GetChildCount() { |
- return delegate_ ? delegate_->GetChildCount() : 0; |
+ CHECK(delegate_); |
+ return delegate_->GetChildCount(); |
} |
gfx::NativeViewAccessible AXPlatformNodeBase::ChildAtIndex(int index) { |
- return delegate_ ? delegate_->ChildAtIndex(index) : NULL; |
+ CHECK(delegate_); |
+ return delegate_->ChildAtIndex(index); |
} |
-// AXPlatformNode |
+// AXPlatformNode overrides. |
void AXPlatformNodeBase::Destroy() { |
- delegate_ = NULL; |
+ delegate_ = nullptr; |
delete this; |
} |
gfx::NativeViewAccessible AXPlatformNodeBase::GetNativeViewAccessible() { |
- return NULL; |
+ return nullptr; |
+} |
+ |
+AXPlatformNodeDelegate* AXPlatformNodeBase::GetDelegate() const { |
+ return delegate_; |
+} |
+ |
+// Helpers. |
+ |
+AXPlatformNodeBase* AXPlatformNodeBase::GetPreviousSibling() { |
+ CHECK(delegate_); |
+ gfx::NativeViewAccessible parent_accessible = GetParent(); |
+ AXPlatformNodeBase* parent = FromNativeViewAccessible(parent_accessible); |
+ if (!parent) |
+ return nullptr; |
+ |
+ int previous_index = GetIndexInParent() - 1; |
+ if (previous_index >= 0 && |
+ previous_index < parent->GetChildCount()) { |
+ return FromNativeViewAccessible(parent->ChildAtIndex(previous_index)); |
+ } |
+ return nullptr; |
+} |
+ |
+AXPlatformNodeBase* AXPlatformNodeBase::GetNextSibling() { |
+ CHECK(delegate_); |
+ gfx::NativeViewAccessible parent_accessible = GetParent(); |
+ AXPlatformNodeBase* parent = FromNativeViewAccessible(parent_accessible); |
+ if (!parent) |
+ return nullptr; |
+ |
+ int next_index = GetIndexInParent() + 1; |
+ if (next_index >= 0 && next_index < parent->GetChildCount()) |
+ return FromNativeViewAccessible(parent->ChildAtIndex(next_index)); |
+ return nullptr; |
} |
+bool AXPlatformNodeBase::IsDescendant(AXPlatformNodeBase* node) { |
+ CHECK(delegate_); |
+ if (!node) |
+ return false; |
+ if (node == this) |
+ return true; |
+ AXPlatformNodeBase* parent = FromNativeViewAccessible(node->GetParent()); |
+ return IsDescendant(parent); |
+} |
+ |
+bool AXPlatformNodeBase::HasBoolAttribute( |
+ ui::AXBoolAttribute attribute) const { |
+ CHECK(delegate_); |
+ const ui::AXNodeData& data = GetData(); |
+ auto iter = FindInVectorOfPairs(attribute, data.bool_attributes); |
+ return iter != data.bool_attributes.end(); |
+} |
+ |
+bool AXPlatformNodeBase::GetBoolAttribute( |
+ ui::AXBoolAttribute attribute) const { |
+ CHECK(delegate_); |
+ bool result; |
+ if (GetBoolAttribute(attribute, &result)) |
+ return result; |
+ return false; |
+} |
+ |
+bool AXPlatformNodeBase::GetBoolAttribute( |
+ ui::AXBoolAttribute attribute, bool* value) const { |
+ CHECK(delegate_); |
+ const ui::AXNodeData& data = GetData(); |
+ auto iter = FindInVectorOfPairs(attribute, data.bool_attributes); |
+ if (iter != data.bool_attributes.end()) { |
+ *value = iter->second; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+bool AXPlatformNodeBase::HasFloatAttribute( |
+ ui::AXFloatAttribute attribute) const { |
+ CHECK(delegate_); |
+ const ui::AXNodeData& data = GetData(); |
+ auto iter = FindInVectorOfPairs(attribute, data.float_attributes); |
+ return iter != data.float_attributes.end(); |
+} |
+ |
+float AXPlatformNodeBase::GetFloatAttribute( |
+ ui::AXFloatAttribute attribute) const { |
+ CHECK(delegate_); |
+ float result; |
+ if (GetFloatAttribute(attribute, &result)) |
+ return result; |
+ return 0.0; |
+} |
+ |
+bool AXPlatformNodeBase::GetFloatAttribute( |
+ ui::AXFloatAttribute attribute, float* value) const { |
+ CHECK(delegate_); |
+ const ui::AXNodeData& data = GetData(); |
+ auto iter = FindInVectorOfPairs(attribute, data.float_attributes); |
+ if (iter != data.float_attributes.end()) { |
+ *value = iter->second; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+bool AXPlatformNodeBase::HasIntAttribute( |
+ ui::AXIntAttribute attribute) const { |
+ CHECK(delegate_); |
+ const ui::AXNodeData& data = GetData(); |
+ auto iter = FindInVectorOfPairs(attribute, data.int_attributes); |
+ return iter != data.int_attributes.end(); |
+} |
+ |
+int AXPlatformNodeBase::GetIntAttribute( |
+ ui::AXIntAttribute attribute) const { |
+ CHECK(delegate_); |
+ int result; |
+ if (GetIntAttribute(attribute, &result)) |
+ return result; |
+ return 0; |
+} |
+ |
+bool AXPlatformNodeBase::GetIntAttribute( |
+ ui::AXIntAttribute attribute, int* value) const { |
+ CHECK(delegate_); |
+ const ui::AXNodeData& data = GetData(); |
+ auto iter = FindInVectorOfPairs(attribute, data.int_attributes); |
+ if (iter != data.int_attributes.end()) { |
+ *value = iter->second; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+bool AXPlatformNodeBase::HasStringAttribute( |
+ ui::AXStringAttribute attribute) const { |
+ CHECK(delegate_); |
+ const ui::AXNodeData& data = GetData(); |
+ auto iter = FindInVectorOfPairs(attribute, data.string_attributes); |
+ return iter != data.string_attributes.end(); |
+} |
+ |
+const std::string& AXPlatformNodeBase::GetStringAttribute( |
+ ui::AXStringAttribute attribute) const { |
+ CHECK(delegate_); |
+ const ui::AXNodeData& data = GetData(); |
+ CR_DEFINE_STATIC_LOCAL(std::string, empty_string, ()); |
+ auto iter = FindInVectorOfPairs(attribute, data.string_attributes); |
+ return iter != data.string_attributes.end() ? iter->second : empty_string; |
+} |
+ |
+bool AXPlatformNodeBase::GetStringAttribute( |
+ ui::AXStringAttribute attribute, std::string* value) const { |
+ CHECK(delegate_); |
+ const ui::AXNodeData& data = GetData(); |
+ auto iter = FindInVectorOfPairs(attribute, data.string_attributes); |
+ if (iter != data.string_attributes.end()) { |
+ *value = iter->second; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+base::string16 AXPlatformNodeBase::GetString16Attribute( |
+ ui::AXStringAttribute attribute) const { |
+ CHECK(delegate_); |
+ std::string value_utf8; |
+ if (!GetStringAttribute(attribute, &value_utf8)) |
+ return base::string16(); |
+ return base::UTF8ToUTF16(value_utf8); |
+} |
+ |
+bool AXPlatformNodeBase::GetString16Attribute( |
+ ui::AXStringAttribute attribute, |
+ base::string16* value) const { |
+ CHECK(delegate_); |
+ std::string value_utf8; |
+ if (!GetStringAttribute(attribute, &value_utf8)) |
+ return false; |
+ *value = base::UTF8ToUTF16(value_utf8); |
+ return true; |
+} |
+ |
+AXPlatformNodeBase::AXPlatformNodeBase() { |
+} |
+ |
+AXPlatformNodeBase::~AXPlatformNodeBase() { |
+} |
+ |
+// static |
+AXPlatformNodeBase* AXPlatformNodeBase::FromNativeViewAccessible( |
+ gfx::NativeViewAccessible accessible) { |
+ return static_cast<AXPlatformNodeBase*>( |
+ AXPlatformNode::FromNativeViewAccessible(accessible)); |
+} |
} // namespace ui |