Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(692)

Side by Side Diff: content/renderer/accessibility/blink_ax_tree_source.cc

Issue 2589273002: Add sparse accessibility attribute interface to Blink (Closed)
Patch Set: Address feedback Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/accessibility/blink_ax_tree_source.h" 5 #include "content/renderer/accessibility/blink_ax_tree_source.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <set> 9 #include <set>
10 10
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 using blink::WebNode; 48 using blink::WebNode;
49 using blink::WebPlugin; 49 using blink::WebPlugin;
50 using blink::WebPluginContainer; 50 using blink::WebPluginContainer;
51 using blink::WebVector; 51 using blink::WebVector;
52 using blink::WebView; 52 using blink::WebView;
53 53
54 namespace content { 54 namespace content {
55 55
56 namespace { 56 namespace {
57 57
58 void AddIntListAttributeFromWebObjects(ui::AXIntListAttribute attr,
59 const WebVector<WebAXObject>& objects,
60 AXContentNodeData* dst) {
61 std::vector<int32_t> ids;
62 for (size_t i = 0; i < objects.size(); i++)
63 ids.push_back(objects[i].axID());
64 if (!ids.empty())
65 dst->AddIntListAttribute(attr, ids);
66 }
67
68 class AXContentNodeDataSparseAttributeAdapter
69 : public blink::WebAXSparseAttributeClient {
70 public:
71 AXContentNodeDataSparseAttributeAdapter(AXContentNodeData* dst) : dst_(dst) {
72 DCHECK(dst_);
73 }
74 ~AXContentNodeDataSparseAttributeAdapter() override {}
75
76 private:
77 AXContentNodeData* dst_;
78
79 void addBoolAttribute(blink::WebAXBoolAttribute attribute,
80 bool value) override {
81 NOTREACHED();
82 }
83
84 void addStringAttribute(blink::WebAXStringAttribute attribute,
85 const blink::WebString& value) override {
86 NOTREACHED();
87 }
88
89 void addObjectAttribute(blink::WebAXObjectAttribute attribute,
90 const blink::WebAXObject& value) override {
91 switch (attribute) {
92 case blink::WebAXObjectAttribute::AriaActiveDescendant:
93 dst_->AddIntAttribute(ui::AX_ATTR_ACTIVEDESCENDANT_ID, value.axID());
94 break;
95 default:
96 NOTREACHED();
97 }
98 }
99
100 void addObjectVectorAttribute(
101 blink::WebAXObjectVectorAttribute attribute,
102 const blink::WebVector<WebAXObject>& value) override {
103 switch (attribute) {
104 case blink::WebAXObjectVectorAttribute::AriaControls:
105 AddIntListAttributeFromWebObjects(ui::AX_ATTR_CONTROLS_IDS, value,
106 dst_);
107 break;
108 case blink::WebAXObjectVectorAttribute::AriaFlowTo:
109 AddIntListAttributeFromWebObjects(ui::AX_ATTR_FLOWTO_IDS, value, dst_);
110 break;
111 default:
112 NOTREACHED();
113 }
114 }
115 };
116
58 WebAXObject ParentObjectUnignored(WebAXObject child) { 117 WebAXObject ParentObjectUnignored(WebAXObject child) {
59 WebAXObject parent = child.parentObject(); 118 WebAXObject parent = child.parentObject();
60 while (!parent.isDetached() && parent.accessibilityIsIgnored()) 119 while (!parent.isDetached() && parent.accessibilityIsIgnored())
61 parent = parent.parentObject(); 120 parent = parent.parentObject();
62 return parent; 121 return parent;
63 } 122 }
64 123
65 // Returns true if |ancestor| is the first unignored parent of |child|, 124 // Returns true if |ancestor| is the first unignored parent of |child|,
66 // which means that when walking up the parent chain from |child|, 125 // which means that when walking up the parent chain from |child|,
67 // |ancestor| is the *first* ancestor that isn't marked as 126 // |ancestor| is the *first* ancestor that isn't marked as
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 return "slider"; 161 return "slider";
103 case ui::AX_ROLE_TIME: 162 case ui::AX_ROLE_TIME:
104 return "time"; 163 return "time";
105 default: 164 default:
106 break; 165 break;
107 } 166 }
108 167
109 return std::string(); 168 return std::string();
110 } 169 }
111 170
112 void AddIntListAttributeFromWebObjects(ui::AXIntListAttribute attr,
113 WebVector<WebAXObject> objects,
114 AXContentNodeData* dst) {
115 std::vector<int32_t> ids;
116 for(size_t i = 0; i < objects.size(); i++)
117 ids.push_back(objects[i].axID());
118 if (ids.size() > 0)
119 dst->AddIntListAttribute(attr, ids);
120 }
121
122 } // namespace 171 } // namespace
123 172
124 ScopedFreezeBlinkAXTreeSource::ScopedFreezeBlinkAXTreeSource( 173 ScopedFreezeBlinkAXTreeSource::ScopedFreezeBlinkAXTreeSource(
125 BlinkAXTreeSource* tree_source) 174 BlinkAXTreeSource* tree_source)
126 : tree_source_(tree_source) { 175 : tree_source_(tree_source) {
127 tree_source_->Freeze(); 176 tree_source_->Freeze();
128 } 177 }
129 178
130 ScopedFreezeBlinkAXTreeSource::~ScopedFreezeBlinkAXTreeSource() { 179 ScopedFreezeBlinkAXTreeSource::~ScopedFreezeBlinkAXTreeSource() {
131 tree_source_->Thaw(); 180 tree_source_->Thaw();
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 WebFloatRect bounds_in_container; 366 WebFloatRect bounds_in_container;
318 SkMatrix44 container_transform; 367 SkMatrix44 container_transform;
319 src.getRelativeBounds( 368 src.getRelativeBounds(
320 offset_container, bounds_in_container, container_transform); 369 offset_container, bounds_in_container, container_transform);
321 dst->location = bounds_in_container; 370 dst->location = bounds_in_container;
322 if (!container_transform.isIdentity()) 371 if (!container_transform.isIdentity())
323 dst->transform = base::WrapUnique(new gfx::Transform(container_transform)); 372 dst->transform = base::WrapUnique(new gfx::Transform(container_transform));
324 if (!offset_container.isDetached()) 373 if (!offset_container.isDetached())
325 dst->offset_container_id = offset_container.axID(); 374 dst->offset_container_id = offset_container.axID();
326 375
376 AXContentNodeDataSparseAttributeAdapter sparse_attribute_adapter(dst);
377 src.getSparseAXAttributes(sparse_attribute_adapter);
378
327 blink::WebAXNameFrom nameFrom; 379 blink::WebAXNameFrom nameFrom;
328 blink::WebVector<blink::WebAXObject> nameObjects; 380 blink::WebVector<blink::WebAXObject> nameObjects;
329 blink::WebString web_name = src.name(nameFrom, nameObjects); 381 blink::WebString web_name = src.name(nameFrom, nameObjects);
330 if (!web_name.isEmpty()) { 382 if (!web_name.isEmpty()) {
331 dst->AddStringAttribute(ui::AX_ATTR_NAME, web_name.utf8()); 383 dst->AddStringAttribute(ui::AX_ATTR_NAME, web_name.utf8());
332 dst->AddIntAttribute(ui::AX_ATTR_NAME_FROM, AXNameFromFromBlink(nameFrom)); 384 dst->AddIntAttribute(ui::AX_ATTR_NAME_FROM, AXNameFromFromBlink(nameFrom));
333 AddIntListAttributeFromWebObjects( 385 AddIntListAttributeFromWebObjects(
334 ui::AX_ATTR_LABELLEDBY_IDS, nameObjects, dst); 386 ui::AX_ATTR_LABELLEDBY_IDS, nameObjects, dst);
335 } 387 }
336 388
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 WebAXObject child = src.childAt(i); 800 WebAXObject child = src.childAt(i);
749 std::vector<int32_t> indirect_child_ids; 801 std::vector<int32_t> indirect_child_ids;
750 if (!is_iframe && !child.isDetached() && !IsParentUnignoredOf(src, child)) 802 if (!is_iframe && !child.isDetached() && !IsParentUnignoredOf(src, child))
751 indirect_child_ids.push_back(child.axID()); 803 indirect_child_ids.push_back(child.axID());
752 if (indirect_child_ids.size() > 0) { 804 if (indirect_child_ids.size() > 0) {
753 dst->AddIntListAttribute( 805 dst->AddIntListAttribute(
754 ui::AX_ATTR_INDIRECT_CHILD_IDS, indirect_child_ids); 806 ui::AX_ATTR_INDIRECT_CHILD_IDS, indirect_child_ids);
755 } 807 }
756 } 808 }
757 809
758 WebVector<WebAXObject> controls;
759 if (src.ariaControls(controls))
760 AddIntListAttributeFromWebObjects(ui::AX_ATTR_CONTROLS_IDS, controls, dst);
761
762 WebVector<WebAXObject> flowTo;
763 if (src.ariaFlowTo(flowTo))
764 AddIntListAttributeFromWebObjects(ui::AX_ATTR_FLOWTO_IDS, flowTo, dst);
765
766 if (src.isScrollableContainer()) { 810 if (src.isScrollableContainer()) {
767 const gfx::Point& scrollOffset = src.getScrollOffset(); 811 const gfx::Point& scrollOffset = src.getScrollOffset();
768 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X, scrollOffset.x()); 812 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X, scrollOffset.x());
769 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y, scrollOffset.y()); 813 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y, scrollOffset.y());
770 814
771 const gfx::Point& minScrollOffset = src.minimumScrollOffset(); 815 const gfx::Point& minScrollOffset = src.minimumScrollOffset();
772 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X_MIN, minScrollOffset.x()); 816 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X_MIN, minScrollOffset.x());
773 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y_MIN, minScrollOffset.y()); 817 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y_MIN, minScrollOffset.y());
774 818
775 const gfx::Point& maxScrollOffset = src.maximumScrollOffset(); 819 const gfx::Point& maxScrollOffset = src.maximumScrollOffset();
(...skipping 20 matching lines...) Expand all
796 return WebAXObject(); 840 return WebAXObject();
797 841
798 WebDocument document = render_frame_->GetWebFrame()->document(); 842 WebDocument document = render_frame_->GetWebFrame()->document();
799 if (!document.isNull()) 843 if (!document.isNull())
800 return document.accessibilityObject(); 844 return document.accessibilityObject();
801 845
802 return WebAXObject(); 846 return WebAXObject();
803 } 847 }
804 848
805 } // namespace content 849 } // namespace content
OLDNEW
« no previous file with comments | « components/test_runner/web_ax_object_proxy.cc ('k') | third_party/WebKit/Source/core/dom/QualifiedName.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698