Index: content/renderer/accessibility/blink_ax_tree_source.cc |
diff --git a/content/renderer/accessibility/blink_ax_tree_source.cc b/content/renderer/accessibility/blink_ax_tree_source.cc |
index 0b86f3b64e71d1cc3c63870143f2595d1b05fe17..e6c45067b5254fef2441ef94681aa4fa88e99227 100644 |
--- a/content/renderer/accessibility/blink_ax_tree_source.cc |
+++ b/content/renderer/accessibility/blink_ax_tree_source.cc |
@@ -55,6 +55,65 @@ namespace content { |
namespace { |
+void AddIntListAttributeFromWebObjects(ui::AXIntListAttribute attr, |
+ const WebVector<WebAXObject>& objects, |
+ AXContentNodeData* dst) { |
+ std::vector<int32_t> ids; |
+ for (size_t i = 0; i < objects.size(); i++) |
+ ids.push_back(objects[i].axID()); |
+ if (!ids.empty()) |
+ dst->AddIntListAttribute(attr, ids); |
+} |
+ |
+class AXContentNodeDataSparseAttributeAdapter |
+ : public blink::WebAXSparseAttributeClient { |
+ public: |
+ AXContentNodeDataSparseAttributeAdapter(AXContentNodeData* dst) : dst_(dst) { |
+ DCHECK(dst_); |
+ } |
+ ~AXContentNodeDataSparseAttributeAdapter() override {} |
+ |
+ private: |
+ AXContentNodeData* dst_; |
+ |
+ void addBoolAttribute(blink::WebAXBoolAttribute attribute, |
+ bool value) override { |
+ NOTREACHED(); |
+ } |
+ |
+ void addStringAttribute(blink::WebAXStringAttribute attribute, |
+ const blink::WebString& value) override { |
+ NOTREACHED(); |
+ } |
+ |
+ void addObjectAttribute(blink::WebAXObjectAttribute attribute, |
+ const blink::WebAXObject& value) override { |
+ switch (attribute) { |
+ case blink::WebAXObjectAttribute::AriaActiveDescendant: |
+ dst_->AddIntAttribute(ui::AX_ATTR_ACTIVEDESCENDANT_ID, value.axID()); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ } |
+ } |
+ |
+ void addObjectVectorAttribute( |
+ blink::WebAXObjectVectorAttribute attribute, |
+ const blink::WebVector<WebAXObject>& value) override { |
+ switch (attribute) { |
+ case blink::WebAXObjectVectorAttribute::AriaControls: |
+ AddIntListAttributeFromWebObjects(ui::AX_ATTR_CONTROLS_IDS, value, |
+ dst_); |
+ break; |
+ case blink::WebAXObjectVectorAttribute::AriaFlowTo: |
+ AddIntListAttributeFromWebObjects(ui::AX_ATTR_FLOWTO_IDS, value, dst_); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ } |
+ } |
+}; |
+ |
WebAXObject ParentObjectUnignored(WebAXObject child) { |
WebAXObject parent = child.parentObject(); |
while (!parent.isDetached() && parent.accessibilityIsIgnored()) |
@@ -109,16 +168,6 @@ std::string GetEquivalentAriaRoleString(const ui::AXRole role) { |
return std::string(); |
} |
-void AddIntListAttributeFromWebObjects(ui::AXIntListAttribute attr, |
- WebVector<WebAXObject> objects, |
- AXContentNodeData* dst) { |
- std::vector<int32_t> ids; |
- for(size_t i = 0; i < objects.size(); i++) |
- ids.push_back(objects[i].axID()); |
- if (ids.size() > 0) |
- dst->AddIntListAttribute(attr, ids); |
-} |
- |
} // namespace |
ScopedFreezeBlinkAXTreeSource::ScopedFreezeBlinkAXTreeSource( |
@@ -324,6 +373,9 @@ void BlinkAXTreeSource::SerializeNode(blink::WebAXObject src, |
if (!offset_container.isDetached()) |
dst->offset_container_id = offset_container.axID(); |
+ AXContentNodeDataSparseAttributeAdapter sparse_attribute_adapter(dst); |
+ src.getSparseAXAttributes(sparse_attribute_adapter); |
+ |
blink::WebAXNameFrom nameFrom; |
blink::WebVector<blink::WebAXObject> nameObjects; |
blink::WebString web_name = src.name(nameFrom, nameObjects); |
@@ -755,14 +807,6 @@ void BlinkAXTreeSource::SerializeNode(blink::WebAXObject src, |
} |
} |
- WebVector<WebAXObject> controls; |
- if (src.ariaControls(controls)) |
- AddIntListAttributeFromWebObjects(ui::AX_ATTR_CONTROLS_IDS, controls, dst); |
- |
- WebVector<WebAXObject> flowTo; |
- if (src.ariaFlowTo(flowTo)) |
- AddIntListAttributeFromWebObjects(ui::AX_ATTR_FLOWTO_IDS, flowTo, dst); |
- |
if (src.isScrollableContainer()) { |
const gfx::Point& scrollOffset = src.getScrollOffset(); |
dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X, scrollOffset.x()); |