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

Side by Side Diff: content/browser/accessibility/cross_platform_accessibility_browsertest.cc

Issue 116293005: Refactor content/ to use ui::AXNodeData instead of blink. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Update content/DEPS instead of subdirs Created 6 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <string> 5 #include <string>
6 #include <vector> 6 #include <vector>
7 7
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "content/browser/renderer_host/render_view_host_impl.h" 9 #include "content/browser/renderer_host/render_view_host_impl.h"
10 #include "content/public/browser/notification_service.h" 10 #include "content/public/browser/notification_service.h"
11 #include "content/public/browser/notification_types.h" 11 #include "content/public/browser/notification_types.h"
12 #include "content/public/browser/render_widget_host_view.h" 12 #include "content/public/browser/render_widget_host_view.h"
13 #include "content/shell/browser/shell.h" 13 #include "content/shell/browser/shell.h"
14 #include "content/test/accessibility_browser_test_utils.h" 14 #include "content/test/accessibility_browser_test_utils.h"
15 #include "content/test/content_browser_test.h" 15 #include "content/test/content_browser_test.h"
16 #include "content/test/content_browser_test_utils.h" 16 #include "content/test/content_browser_test_utils.h"
17 #include "ui/accessibility/ax_node.h"
17 18
18 #if defined(OS_WIN) 19 #if defined(OS_WIN)
19 #include <atlbase.h> 20 #include <atlbase.h>
20 #include <atlcom.h> 21 #include <atlcom.h>
21 #include "base/win/scoped_com_initializer.h" 22 #include "base/win/scoped_com_initializer.h"
22 #include "ui/base/win/atl_module.h" 23 #include "ui/base/win/atl_module.h"
23 #endif 24 #endif
24 25
25 // TODO(dmazzoni): Disabled accessibility tests on Win64. crbug.com/179717 26 // TODO(dmazzoni): Disabled accessibility tests on Win64. crbug.com/179717
26 #if defined(OS_WIN) && defined(ARCH_CPU_X86_64) 27 #if defined(OS_WIN) && defined(ARCH_CPU_X86_64)
27 #define MAYBE_TableSpan DISABLED_TableSpan 28 #define MAYBE_TableSpan DISABLED_TableSpan
28 #else 29 #else
29 #define MAYBE_TableSpan TableSpan 30 #define MAYBE_TableSpan TableSpan
30 #endif 31 #endif
31 32
32 namespace content { 33 namespace content {
33 34
34 class CrossPlatformAccessibilityBrowserTest : public ContentBrowserTest { 35 class CrossPlatformAccessibilityBrowserTest : public ContentBrowserTest {
35 public: 36 public:
36 CrossPlatformAccessibilityBrowserTest() {} 37 CrossPlatformAccessibilityBrowserTest() {}
37 38
38 // Tell the renderer to send an accessibility tree, then wait for the 39 // Tell the renderer to send an accessibility tree, then wait for the
39 // notification that it's been received. 40 // notification that it's been received.
40 const AccessibilityNodeDataTreeNode& GetAccessibilityNodeDataTree( 41 const ui::AXTree& GetAXTree(
41 AccessibilityMode accessibility_mode = AccessibilityModeComplete) { 42 AccessibilityMode accessibility_mode = AccessibilityModeComplete) {
42 AccessibilityNotificationWaiter waiter( 43 AccessibilityNotificationWaiter waiter(
43 shell(), accessibility_mode, blink::WebAXEventLayoutComplete); 44 shell(), accessibility_mode, ui::AX_EVENT_LAYOUT_COMPLETE);
44 waiter.WaitForNotification(); 45 waiter.WaitForNotification();
45 return waiter.GetAccessibilityNodeDataTree(); 46 return waiter.GetAXTree();
46 } 47 }
47 48
48 // Make sure each node in the tree has an unique id. 49 // Make sure each node in the tree has an unique id.
49 void RecursiveAssertUniqueIds( 50 void RecursiveAssertUniqueIds(
50 const AccessibilityNodeDataTreeNode& node, base::hash_set<int>* ids) { 51 const ui::AXNode* node, base::hash_set<int>* ids) {
51 ASSERT_TRUE(ids->find(node.id) == ids->end()); 52 ASSERT_TRUE(ids->find(node->id()) == ids->end());
52 ids->insert(node.id); 53 ids->insert(node->id());
53 for (size_t i = 0; i < node.children.size(); i++) 54 for (int i = 0; i < node->child_count(); i++)
54 RecursiveAssertUniqueIds(node.children[i], ids); 55 RecursiveAssertUniqueIds(node->ChildAtIndex(i), ids);
55 } 56 }
56 57
57 // ContentBrowserTest 58 // ContentBrowserTest
58 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE; 59 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE;
59 virtual void TearDownInProcessBrowserTestFixture() OVERRIDE; 60 virtual void TearDownInProcessBrowserTestFixture() OVERRIDE;
60 61
61 protected: 62 protected:
62 std::string GetAttr(const AccessibilityNodeData& node, 63 std::string GetAttr(const ui::AXNode* node,
63 const AccessibilityNodeData::StringAttribute attr); 64 const ui::AXStringAttribute attr);
64 int GetIntAttr(const AccessibilityNodeData& node, 65 int GetIntAttr(const ui::AXNode* node,
65 const AccessibilityNodeData::IntAttribute attr); 66 const ui::AXIntAttribute attr);
66 bool GetBoolAttr(const AccessibilityNodeData& node, 67 bool GetBoolAttr(const ui::AXNode* node,
67 const AccessibilityNodeData::BoolAttribute attr); 68 const ui::AXBoolAttribute attr);
68 69
69 private: 70 private:
70 #if defined(OS_WIN) 71 #if defined(OS_WIN)
71 scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_; 72 scoped_ptr<base::win::ScopedCOMInitializer> com_initializer_;
72 #endif 73 #endif
73 74
74 DISALLOW_COPY_AND_ASSIGN(CrossPlatformAccessibilityBrowserTest); 75 DISALLOW_COPY_AND_ASSIGN(CrossPlatformAccessibilityBrowserTest);
75 }; 76 };
76 77
77 void CrossPlatformAccessibilityBrowserTest::SetUpInProcessBrowserTestFixture() { 78 void CrossPlatformAccessibilityBrowserTest::SetUpInProcessBrowserTestFixture() {
78 #if defined(OS_WIN) 79 #if defined(OS_WIN)
79 ui::win::CreateATLModuleIfNeeded(); 80 ui::win::CreateATLModuleIfNeeded();
80 com_initializer_.reset(new base::win::ScopedCOMInitializer()); 81 com_initializer_.reset(new base::win::ScopedCOMInitializer());
81 #endif 82 #endif
82 } 83 }
83 84
84 void 85 void
85 CrossPlatformAccessibilityBrowserTest::TearDownInProcessBrowserTestFixture() { 86 CrossPlatformAccessibilityBrowserTest::TearDownInProcessBrowserTestFixture() {
86 #if defined(OS_WIN) 87 #if defined(OS_WIN)
87 com_initializer_.reset(); 88 com_initializer_.reset();
88 #endif 89 #endif
89 } 90 }
90 91
91 // Convenience method to get the value of a particular AccessibilityNodeData 92 // Convenience method to get the value of a particular AXNode
92 // node attribute as a UTF-8 string. 93 // attribute as a UTF-8 string.
93 std::string CrossPlatformAccessibilityBrowserTest::GetAttr( 94 std::string CrossPlatformAccessibilityBrowserTest::GetAttr(
94 const AccessibilityNodeData& node, 95 const ui::AXNode* node,
95 const AccessibilityNodeData::StringAttribute attr) { 96 const ui::AXStringAttribute attr) {
96 for (size_t i = 0; i < node.string_attributes.size(); ++i) { 97 const ui::AXNodeData& data = node->data();
97 if (node.string_attributes[i].first == attr) 98 for (size_t i = 0; i < data.string_attributes.size(); ++i) {
98 return node.string_attributes[i].second; 99 if (data.string_attributes[i].first == attr)
100 return data.string_attributes[i].second;
99 } 101 }
100 return std::string(); 102 return std::string();
101 } 103 }
102 104
103 // Convenience method to get the value of a particular AccessibilityNodeData 105 // Convenience method to get the value of a particular AXNode
104 // node integer attribute. 106 // integer attribute.
105 int CrossPlatformAccessibilityBrowserTest::GetIntAttr( 107 int CrossPlatformAccessibilityBrowserTest::GetIntAttr(
106 const AccessibilityNodeData& node, 108 const ui::AXNode* node,
107 const AccessibilityNodeData::IntAttribute attr) { 109 const ui::AXIntAttribute attr) {
108 for (size_t i = 0; i < node.int_attributes.size(); ++i) { 110 const ui::AXNodeData& data = node->data();
109 if (node.int_attributes[i].first == attr) 111 for (size_t i = 0; i < data.int_attributes.size(); ++i) {
110 return node.int_attributes[i].second; 112 if (data.int_attributes[i].first == attr)
113 return data.int_attributes[i].second;
111 } 114 }
112 return -1; 115 return -1;
113 } 116 }
114 117
115 // Convenience method to get the value of a particular AccessibilityNodeData 118 // Convenience method to get the value of a particular AXNode
116 // node boolean attribute. 119 // boolean attribute.
117 bool CrossPlatformAccessibilityBrowserTest::GetBoolAttr( 120 bool CrossPlatformAccessibilityBrowserTest::GetBoolAttr(
118 const AccessibilityNodeData& node, 121 const ui::AXNode* node,
119 const AccessibilityNodeData::BoolAttribute attr) { 122 const ui::AXBoolAttribute attr) {
120 for (size_t i = 0; i < node.bool_attributes.size(); ++i) { 123 const ui::AXNodeData& data = node->data();
121 if (node.bool_attributes[i].first == attr) 124 for (size_t i = 0; i < data.bool_attributes.size(); ++i) {
122 return node.bool_attributes[i].second; 125 if (data.bool_attributes[i].first == attr)
126 return data.bool_attributes[i].second;
123 } 127 }
124 return false; 128 return false;
125 } 129 }
126 130
127 // Marked flaky per http://crbug.com/101984 131 // Marked flaky per http://crbug.com/101984
128 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest, 132 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
129 DISABLED_WebpageAccessibility) { 133 DISABLED_WebpageAccessibility) {
130 // Create a data url and load it. 134 // Create a data url and load it.
131 const char url_str[] = 135 const char url_str[] =
132 "data:text/html," 136 "data:text/html,"
133 "<!doctype html>" 137 "<!doctype html>"
134 "<html><head><title>Accessibility Test</title></head>" 138 "<html><head><title>Accessibility Test</title></head>"
135 "<body><input type='button' value='push' /><input type='checkbox' />" 139 "<body><input type='button' value='push' /><input type='checkbox' />"
136 "</body></html>"; 140 "</body></html>";
137 GURL url(url_str); 141 GURL url(url_str);
138 NavigateToURL(shell(), url); 142 NavigateToURL(shell(), url);
139 const AccessibilityNodeDataTreeNode& tree = GetAccessibilityNodeDataTree(); 143 const ui::AXTree& tree = GetAXTree();
144 const ui::AXNode* root = tree.GetRoot();
140 145
141 // Check properties of the root element of the tree. 146 // Check properties of the root element of the tree.
142 EXPECT_STREQ(url_str, 147 EXPECT_STREQ(url_str,
143 GetAttr(tree, AccessibilityNodeData::ATTR_DOC_URL).c_str()); 148 GetAttr(root, ui::AX_ATTR_DOC_URL).c_str());
144 EXPECT_STREQ( 149 EXPECT_STREQ(
145 "Accessibility Test", 150 "Accessibility Test",
146 GetAttr(tree, AccessibilityNodeData::ATTR_DOC_TITLE).c_str()); 151 GetAttr(root, ui::AX_ATTR_DOC_TITLE).c_str());
147 EXPECT_STREQ( 152 EXPECT_STREQ(
148 "html", GetAttr(tree, AccessibilityNodeData::ATTR_DOC_DOCTYPE).c_str()); 153 "html", GetAttr(root, ui::AX_ATTR_DOC_DOCTYPE).c_str());
149 EXPECT_STREQ( 154 EXPECT_STREQ(
150 "text/html", 155 "text/html",
151 GetAttr(tree, AccessibilityNodeData::ATTR_DOC_MIMETYPE).c_str()); 156 GetAttr(root, ui::AX_ATTR_DOC_MIMETYPE).c_str());
152 EXPECT_STREQ( 157 EXPECT_STREQ(
153 "Accessibility Test", 158 "Accessibility Test",
154 GetAttr(tree, AccessibilityNodeData::ATTR_NAME).c_str()); 159 GetAttr(root, ui::AX_ATTR_NAME).c_str());
155 EXPECT_EQ(blink::WebAXRoleRootWebArea, tree.role); 160 EXPECT_EQ(ui::AX_ROLE_ROOT_WEB_AREA, root->data().role);
156 161
157 // Check properites of the BODY element. 162 // Check properites of the BODY element.
158 ASSERT_EQ(1U, tree.children.size()); 163 ASSERT_EQ(1, root->child_count());
159 const AccessibilityNodeDataTreeNode& body = tree.children[0]; 164 const ui::AXNode* body = root->ChildAtIndex(0);
160 EXPECT_EQ(blink::WebAXRoleGroup, body.role); 165 EXPECT_EQ(ui::AX_ROLE_GROUP, body->data().role);
161 EXPECT_STREQ("body", 166 EXPECT_STREQ("body",
162 GetAttr(body, AccessibilityNodeData::ATTR_HTML_TAG).c_str()); 167 GetAttr(body, ui::AX_ATTR_HTML_TAG).c_str());
163 EXPECT_STREQ("block", 168 EXPECT_STREQ("block",
164 GetAttr(body, AccessibilityNodeData::ATTR_DISPLAY).c_str()); 169 GetAttr(body, ui::AX_ATTR_DISPLAY).c_str());
165 170
166 // Check properties of the two children of the BODY element. 171 // Check properties of the two children of the BODY element.
167 ASSERT_EQ(2U, body.children.size()); 172 ASSERT_EQ(2, body->child_count());
168 173
169 const AccessibilityNodeDataTreeNode& button = body.children[0]; 174 const ui::AXNode* button = body->ChildAtIndex(0);
170 EXPECT_EQ(blink::WebAXRoleButton, button.role); 175 EXPECT_EQ(ui::AX_ROLE_BUTTON, button->data().role);
171 EXPECT_STREQ( 176 EXPECT_STREQ(
172 "input", GetAttr(button, AccessibilityNodeData::ATTR_HTML_TAG).c_str()); 177 "input", GetAttr(button, ui::AX_ATTR_HTML_TAG).c_str());
173 EXPECT_STREQ( 178 EXPECT_STREQ(
174 "push", 179 "push",
175 GetAttr(button, AccessibilityNodeData::ATTR_NAME).c_str()); 180 GetAttr(button, ui::AX_ATTR_NAME).c_str());
176 EXPECT_STREQ( 181 EXPECT_STREQ(
177 "inline-block", 182 "inline-block",
178 GetAttr(button, AccessibilityNodeData::ATTR_DISPLAY).c_str()); 183 GetAttr(button, ui::AX_ATTR_DISPLAY).c_str());
179 ASSERT_EQ(2U, button.html_attributes.size()); 184 ASSERT_EQ(2U, button->data().html_attributes.size());
180 EXPECT_STREQ("type", button.html_attributes[0].first.c_str()); 185 EXPECT_STREQ("type", button->data().html_attributes[0].first.c_str());
181 EXPECT_STREQ("button", button.html_attributes[0].second.c_str()); 186 EXPECT_STREQ("button", button->data().html_attributes[0].second.c_str());
182 EXPECT_STREQ("value", button.html_attributes[1].first.c_str()); 187 EXPECT_STREQ("value", button->data().html_attributes[1].first.c_str());
183 EXPECT_STREQ("push", button.html_attributes[1].second.c_str()); 188 EXPECT_STREQ("push", button->data().html_attributes[1].second.c_str());
184 189
185 const AccessibilityNodeDataTreeNode& checkbox = body.children[1]; 190 const ui::AXNode* checkbox = body->ChildAtIndex(1);
186 EXPECT_EQ(blink::WebAXRoleCheckBox, checkbox.role); 191 EXPECT_EQ(ui::AX_ROLE_CHECK_BOX, checkbox->data().role);
187 EXPECT_STREQ( 192 EXPECT_STREQ(
188 "input", GetAttr(checkbox, AccessibilityNodeData::ATTR_HTML_TAG).c_str()); 193 "input", GetAttr(checkbox, ui::AX_ATTR_HTML_TAG).c_str());
189 EXPECT_STREQ( 194 EXPECT_STREQ(
190 "inline-block", 195 "inline-block",
191 GetAttr(checkbox, AccessibilityNodeData::ATTR_DISPLAY).c_str()); 196 GetAttr(checkbox, ui::AX_ATTR_DISPLAY).c_str());
192 ASSERT_EQ(1U, checkbox.html_attributes.size()); 197 ASSERT_EQ(1U, checkbox->data().html_attributes.size());
193 EXPECT_STREQ("type", checkbox.html_attributes[0].first.c_str()); 198 EXPECT_STREQ("type", checkbox->data().html_attributes[0].first.c_str());
194 EXPECT_STREQ("checkbox", checkbox.html_attributes[0].second.c_str()); 199 EXPECT_STREQ("checkbox", checkbox->data().html_attributes[0].second.c_str());
195 } 200 }
196 201
197 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest, 202 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
198 UnselectedEditableTextAccessibility) { 203 UnselectedEditableTextAccessibility) {
199 // Create a data url and load it. 204 // Create a data url and load it.
200 const char url_str[] = 205 const char url_str[] =
201 "data:text/html," 206 "data:text/html,"
202 "<!doctype html>" 207 "<!doctype html>"
203 "<body>" 208 "<body>"
204 "<input value=\"Hello, world.\"/>" 209 "<input value=\"Hello, world.\"/>"
205 "</body></html>"; 210 "</body></html>";
206 GURL url(url_str); 211 GURL url(url_str);
207 NavigateToURL(shell(), url); 212 NavigateToURL(shell(), url);
208 213
209 const AccessibilityNodeDataTreeNode& tree = GetAccessibilityNodeDataTree(); 214 const ui::AXTree& tree = GetAXTree();
210 ASSERT_EQ(1U, tree.children.size()); 215 const ui::AXNode* root = tree.GetRoot();
211 const AccessibilityNodeDataTreeNode& body = tree.children[0]; 216 ASSERT_EQ(1, root->child_count());
212 ASSERT_EQ(1U, body.children.size()); 217 const ui::AXNode* body = root->ChildAtIndex(0);
213 const AccessibilityNodeDataTreeNode& text = body.children[0]; 218 ASSERT_EQ(1, body->child_count());
214 EXPECT_EQ(blink::WebAXRoleTextField, text.role); 219 const ui::AXNode* text = body->ChildAtIndex(0);
220 EXPECT_EQ(ui::AX_ROLE_TEXT_FIELD, text->data().role);
215 EXPECT_STREQ( 221 EXPECT_STREQ(
216 "input", GetAttr(text, AccessibilityNodeData::ATTR_HTML_TAG).c_str()); 222 "input", GetAttr(text, ui::AX_ATTR_HTML_TAG).c_str());
217 EXPECT_EQ(0, GetIntAttr(text, AccessibilityNodeData::ATTR_TEXT_SEL_START)); 223 EXPECT_EQ(0, GetIntAttr(text, ui::AX_ATTR_TEXT_SEL_START));
218 EXPECT_EQ(0, GetIntAttr(text, AccessibilityNodeData::ATTR_TEXT_SEL_END)); 224 EXPECT_EQ(0, GetIntAttr(text, ui::AX_ATTR_TEXT_SEL_END));
219 EXPECT_STREQ( 225 EXPECT_STREQ(
220 "Hello, world.", 226 "Hello, world.",
221 GetAttr(text, AccessibilityNodeData::ATTR_VALUE).c_str()); 227 GetAttr(text, ui::AX_ATTR_VALUE).c_str());
222 228
223 // TODO(dmazzoni): as soon as more accessibility code is cross-platform, 229 // TODO(dmazzoni): as soon as more accessibility code is cross-platform,
224 // this code should test that the accessible info is dynamically updated 230 // this code should test that the accessible info is dynamically updated
225 // if the selection or value changes. 231 // if the selection or value changes.
226 } 232 }
227 233
228 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest, 234 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
229 SelectedEditableTextAccessibility) { 235 SelectedEditableTextAccessibility) {
230 // Create a data url and load it. 236 // Create a data url and load it.
231 const char url_str[] = 237 const char url_str[] =
232 "data:text/html," 238 "data:text/html,"
233 "<!doctype html>" 239 "<!doctype html>"
234 "<body onload=\"document.body.children[0].select();\">" 240 "<body onload=\"document.body.children[0].select();\">"
235 "<input value=\"Hello, world.\"/>" 241 "<input value=\"Hello, world.\"/>"
236 "</body></html>"; 242 "</body></html>";
237 GURL url(url_str); 243 GURL url(url_str);
238 NavigateToURL(shell(), url); 244 NavigateToURL(shell(), url);
239 245
240 const AccessibilityNodeDataTreeNode& tree = GetAccessibilityNodeDataTree(); 246 const ui::AXTree& tree = GetAXTree();
241 ASSERT_EQ(1U, tree.children.size()); 247 const ui::AXNode* root = tree.GetRoot();
242 const AccessibilityNodeDataTreeNode& body = tree.children[0]; 248 ASSERT_EQ(1, root->child_count());
243 ASSERT_EQ(1U, body.children.size()); 249 const ui::AXNode* body = root->ChildAtIndex(0);
244 const AccessibilityNodeDataTreeNode& text = body.children[0]; 250 ASSERT_EQ(1, body->child_count());
245 EXPECT_EQ(blink::WebAXRoleTextField, text.role); 251 const ui::AXNode* text = body->ChildAtIndex(0);
252 EXPECT_EQ(ui::AX_ROLE_TEXT_FIELD, text->data().role);
246 EXPECT_STREQ( 253 EXPECT_STREQ(
247 "input", GetAttr(text, AccessibilityNodeData::ATTR_HTML_TAG).c_str()); 254 "input", GetAttr(text, ui::AX_ATTR_HTML_TAG).c_str());
248 EXPECT_EQ(0, GetIntAttr(text, AccessibilityNodeData::ATTR_TEXT_SEL_START)); 255 EXPECT_EQ(0, GetIntAttr(text, ui::AX_ATTR_TEXT_SEL_START));
249 EXPECT_EQ(13, GetIntAttr(text, AccessibilityNodeData::ATTR_TEXT_SEL_END)); 256 EXPECT_EQ(13, GetIntAttr(text, ui::AX_ATTR_TEXT_SEL_END));
250 EXPECT_STREQ( 257 EXPECT_STREQ(
251 "Hello, world.", 258 "Hello, world.",
252 GetAttr(text, AccessibilityNodeData::ATTR_VALUE).c_str()); 259 GetAttr(text, ui::AX_ATTR_VALUE).c_str());
253 } 260 }
254 261
255 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest, 262 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
256 MultipleInheritanceAccessibility) { 263 MultipleInheritanceAccessibility) {
257 // In a WebKit accessibility render tree for a table, each cell is a 264 // In a WebKit accessibility render tree for a table, each cell is a
258 // child of both a row and a column, so it appears to use multiple 265 // child of both a row and a column, so it appears to use multiple
259 // inheritance. Make sure that the AccessibilityNodeDataObject tree only 266 // inheritance. Make sure that the ui::AXNodeDataObject tree only
260 // keeps one copy of each cell, and uses an indirect child id for the 267 // keeps one copy of each cell, and uses an indirect child id for the
261 // additional reference to it. 268 // additional reference to it.
262 const char url_str[] = 269 const char url_str[] =
263 "data:text/html," 270 "data:text/html,"
264 "<!doctype html>" 271 "<!doctype html>"
265 "<table border=1><tr><td>1</td><td>2</td></tr></table>"; 272 "<table border=1><tr><td>1</td><td>2</td></tr></table>";
266 GURL url(url_str); 273 GURL url(url_str);
267 NavigateToURL(shell(), url); 274 NavigateToURL(shell(), url);
268 275
269 const AccessibilityNodeDataTreeNode& tree = GetAccessibilityNodeDataTree(); 276 const ui::AXTree& tree = GetAXTree();
270 ASSERT_EQ(1U, tree.children.size()); 277 const ui::AXNode* root = tree.GetRoot();
271 const AccessibilityNodeDataTreeNode& table = tree.children[0]; 278 ASSERT_EQ(1, root->child_count());
272 EXPECT_EQ(blink::WebAXRoleTable, table.role); 279 const ui::AXNode* table = root->ChildAtIndex(0);
273 const AccessibilityNodeDataTreeNode& row = table.children[0]; 280 EXPECT_EQ(ui::AX_ROLE_TABLE, table->data().role);
274 EXPECT_EQ(blink::WebAXRoleRow, row.role); 281 const ui::AXNode* row = table->ChildAtIndex(0);
275 const AccessibilityNodeDataTreeNode& cell1 = row.children[0]; 282 EXPECT_EQ(ui::AX_ROLE_ROW, row->data().role);
276 EXPECT_EQ(blink::WebAXRoleCell, cell1.role); 283 const ui::AXNode* cell1 = row->ChildAtIndex(0);
277 const AccessibilityNodeDataTreeNode& cell2 = row.children[1]; 284 EXPECT_EQ(ui::AX_ROLE_CELL, cell1->data().role);
278 EXPECT_EQ(blink::WebAXRoleCell, cell2.role); 285 const ui::AXNode* cell2 = row->ChildAtIndex(1);
279 const AccessibilityNodeDataTreeNode& column1 = table.children[1]; 286 EXPECT_EQ(ui::AX_ROLE_CELL, cell2->data().role);
280 EXPECT_EQ(blink::WebAXRoleColumn, column1.role); 287 const ui::AXNode* column1 = table->ChildAtIndex(1);
281 EXPECT_EQ(0U, column1.children.size()); 288 EXPECT_EQ(ui::AX_ROLE_COLUMN, column1->data().role);
282 EXPECT_EQ(1U, column1.intlist_attributes.size()); 289 EXPECT_EQ(0, column1->child_count());
283 EXPECT_EQ(AccessibilityNodeData::ATTR_INDIRECT_CHILD_IDS, 290 EXPECT_EQ(1U, column1->data().intlist_attributes.size());
284 column1.intlist_attributes[0].first); 291 EXPECT_EQ(ui::AX_ATTR_INDIRECT_CHILD_IDS,
292 column1->data().intlist_attributes[0].first);
285 const std::vector<int32> column1_indirect_child_ids = 293 const std::vector<int32> column1_indirect_child_ids =
286 column1.intlist_attributes[0].second; 294 column1->data().intlist_attributes[0].second;
287 EXPECT_EQ(1U, column1_indirect_child_ids.size()); 295 EXPECT_EQ(1U, column1_indirect_child_ids.size());
288 EXPECT_EQ(cell1.id, column1_indirect_child_ids[0]); 296 EXPECT_EQ(cell1->id(), column1_indirect_child_ids[0]);
289 const AccessibilityNodeDataTreeNode& column2 = table.children[2]; 297 const ui::AXNode* column2 = table->ChildAtIndex(2);
290 EXPECT_EQ(blink::WebAXRoleColumn, column2.role); 298 EXPECT_EQ(ui::AX_ROLE_COLUMN, column2->data().role);
291 EXPECT_EQ(0U, column2.children.size()); 299 EXPECT_EQ(0, column2->child_count());
292 EXPECT_EQ(AccessibilityNodeData::ATTR_INDIRECT_CHILD_IDS, 300 EXPECT_EQ(ui::AX_ATTR_INDIRECT_CHILD_IDS,
293 column2.intlist_attributes[0].first); 301 column2->data().intlist_attributes[0].first);
294 const std::vector<int32> column2_indirect_child_ids = 302 const std::vector<int32> column2_indirect_child_ids =
295 column2.intlist_attributes[0].second; 303 column2->data().intlist_attributes[0].second;
296 EXPECT_EQ(1U, column2_indirect_child_ids.size()); 304 EXPECT_EQ(1U, column2_indirect_child_ids.size());
297 EXPECT_EQ(cell2.id, column2_indirect_child_ids[0]); 305 EXPECT_EQ(cell2->id(), column2_indirect_child_ids[0]);
298 } 306 }
299 307
300 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest, 308 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
301 MultipleInheritanceAccessibility2) { 309 MultipleInheritanceAccessibility2) {
302 // Here's another html snippet where WebKit puts the same node as a child 310 // Here's another html snippet where WebKit puts the same node as a child
303 // of two different parents. Instead of checking the exact output, just 311 // of two different parents. Instead of checking the exact output, just
304 // make sure that no id is reused in the resulting tree. 312 // make sure that no id is reused in the resulting tree.
305 const char url_str[] = 313 const char url_str[] =
306 "data:text/html," 314 "data:text/html,"
307 "<!doctype html>" 315 "<!doctype html>"
308 "<script>\n" 316 "<script>\n"
309 " document.writeln('<q><section></section></q><q><li>');\n" 317 " document.writeln('<q><section></section></q><q><li>');\n"
310 " setTimeout(function() {\n" 318 " setTimeout(function() {\n"
311 " document.close();\n" 319 " document.close();\n"
312 " }, 1);\n" 320 " }, 1);\n"
313 "</script>"; 321 "</script>";
314 GURL url(url_str); 322 GURL url(url_str);
315 NavigateToURL(shell(), url); 323 NavigateToURL(shell(), url);
316 324
317 const AccessibilityNodeDataTreeNode& tree = GetAccessibilityNodeDataTree(); 325 const ui::AXTree& tree = GetAXTree();
326 const ui::AXNode* root = tree.GetRoot();
318 base::hash_set<int> ids; 327 base::hash_set<int> ids;
319 RecursiveAssertUniqueIds(tree, &ids); 328 RecursiveAssertUniqueIds(root, &ids);
320 } 329 }
321 330
322 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest, 331 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
323 IframeAccessibility) { 332 IframeAccessibility) {
324 // Create a data url and load it. 333 // Create a data url and load it.
325 const char url_str[] = 334 const char url_str[] =
326 "data:text/html," 335 "data:text/html,"
327 "<!doctype html><html><body>" 336 "<!doctype html><html><body>"
328 "<button>Button 1</button>" 337 "<button>Button 1</button>"
329 "<iframe src='data:text/html," 338 "<iframe src='data:text/html,"
330 "<!doctype html><html><body><button>Button 2</button></body></html>" 339 "<!doctype html><html><body><button>Button 2</button></body></html>"
331 "'></iframe>" 340 "'></iframe>"
332 "<button>Button 3</button>" 341 "<button>Button 3</button>"
333 "</body></html>"; 342 "</body></html>";
334 GURL url(url_str); 343 GURL url(url_str);
335 NavigateToURL(shell(), url); 344 NavigateToURL(shell(), url);
336 345
337 const AccessibilityNodeDataTreeNode& tree = GetAccessibilityNodeDataTree(); 346 const ui::AXTree& tree = GetAXTree();
338 ASSERT_EQ(1U, tree.children.size()); 347 const ui::AXNode* root = tree.GetRoot();
339 const AccessibilityNodeDataTreeNode& body = tree.children[0]; 348 ASSERT_EQ(1, root->child_count());
340 ASSERT_EQ(3U, body.children.size()); 349 const ui::AXNode* body = root->ChildAtIndex(0);
350 ASSERT_EQ(3, body->child_count());
341 351
342 const AccessibilityNodeDataTreeNode& button1 = body.children[0]; 352 const ui::AXNode* button1 = body->ChildAtIndex(0);
343 EXPECT_EQ(blink::WebAXRoleButton, button1.role); 353 EXPECT_EQ(ui::AX_ROLE_BUTTON, button1->data().role);
344 EXPECT_STREQ( 354 EXPECT_STREQ(
345 "Button 1", 355 "Button 1",
346 GetAttr(button1, AccessibilityNodeData::ATTR_NAME).c_str()); 356 GetAttr(button1, ui::AX_ATTR_NAME).c_str());
347 357
348 const AccessibilityNodeDataTreeNode& iframe = body.children[1]; 358 const ui::AXNode* iframe = body->ChildAtIndex(1);
349 EXPECT_STREQ("iframe", 359 EXPECT_STREQ("iframe",
350 GetAttr(iframe, AccessibilityNodeData::ATTR_HTML_TAG).c_str()); 360 GetAttr(iframe, ui::AX_ATTR_HTML_TAG).c_str());
351 ASSERT_EQ(1U, iframe.children.size()); 361 ASSERT_EQ(1, iframe->child_count());
352 362
353 const AccessibilityNodeDataTreeNode& scroll_area = iframe.children[0]; 363 const ui::AXNode* scroll_area = iframe->ChildAtIndex(0);
354 EXPECT_EQ(blink::WebAXRoleScrollArea, scroll_area.role); 364 EXPECT_EQ(ui::AX_ROLE_SCROLL_AREA, scroll_area->data().role);
355 ASSERT_EQ(1U, scroll_area.children.size()); 365 ASSERT_EQ(1, scroll_area->child_count());
356 366
357 const AccessibilityNodeDataTreeNode& sub_document = scroll_area.children[0]; 367 const ui::AXNode* sub_document = scroll_area->ChildAtIndex(0);
358 EXPECT_EQ(blink::WebAXRoleWebArea, sub_document.role); 368 EXPECT_EQ(ui::AX_ROLE_WEB_AREA, sub_document->data().role);
359 ASSERT_EQ(1U, sub_document.children.size()); 369 ASSERT_EQ(1, sub_document->child_count());
360 370
361 const AccessibilityNodeDataTreeNode& sub_body = sub_document.children[0]; 371 const ui::AXNode* sub_body = sub_document->ChildAtIndex(0);
362 ASSERT_EQ(1U, sub_body.children.size()); 372 ASSERT_EQ(1, sub_body->child_count());
363 373
364 const AccessibilityNodeDataTreeNode& button2 = sub_body.children[0]; 374 const ui::AXNode* button2 = sub_body->ChildAtIndex(0);
365 EXPECT_EQ(blink::WebAXRoleButton, button2.role); 375 EXPECT_EQ(ui::AX_ROLE_BUTTON, button2->data().role);
366 EXPECT_STREQ("Button 2", 376 EXPECT_STREQ("Button 2",
367 GetAttr(button2, AccessibilityNodeData::ATTR_NAME).c_str()); 377 GetAttr(button2, ui::AX_ATTR_NAME).c_str());
368 378
369 const AccessibilityNodeDataTreeNode& button3 = body.children[2]; 379 const ui::AXNode* button3 = body->ChildAtIndex(2);
370 EXPECT_EQ(blink::WebAXRoleButton, button3.role); 380 EXPECT_EQ(ui::AX_ROLE_BUTTON, button3->data().role);
371 EXPECT_STREQ("Button 3", 381 EXPECT_STREQ("Button 3",
372 GetAttr(button3, AccessibilityNodeData::ATTR_NAME).c_str()); 382 GetAttr(button3, ui::AX_ATTR_NAME).c_str());
373 } 383 }
374 384
375 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest, 385 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
376 DuplicateChildrenAccessibility) { 386 DuplicateChildrenAccessibility) {
377 // Here's another html snippet where WebKit has a parent node containing 387 // Here's another html snippet where WebKit has a parent node containing
378 // two duplicate child nodes. Instead of checking the exact output, just 388 // two duplicate child nodes. Instead of checking the exact output, just
379 // make sure that no id is reused in the resulting tree. 389 // make sure that no id is reused in the resulting tree.
380 const char url_str[] = 390 const char url_str[] =
381 "data:text/html," 391 "data:text/html,"
382 "<!doctype html>" 392 "<!doctype html>"
383 "<em><code ><h4 ></em>"; 393 "<em><code ><h4 ></em>";
384 GURL url(url_str); 394 GURL url(url_str);
385 NavigateToURL(shell(), url); 395 NavigateToURL(shell(), url);
386 396
387 const AccessibilityNodeDataTreeNode& tree = GetAccessibilityNodeDataTree(); 397 const ui::AXTree& tree = GetAXTree();
398 const ui::AXNode* root = tree.GetRoot();
388 base::hash_set<int> ids; 399 base::hash_set<int> ids;
389 RecursiveAssertUniqueIds(tree, &ids); 400 RecursiveAssertUniqueIds(root, &ids);
390 } 401 }
391 402
392 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest, 403 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
393 MAYBE_TableSpan) { 404 MAYBE_TableSpan) {
394 // +---+---+---+ 405 // +---+---+---+
395 // | 1 | 2 | 406 // | 1 | 2 |
396 // +---+---+---+ 407 // +---+---+---+
397 // | 3 | 4 | 408 // | 3 | 4 |
398 // +---+---+---+ 409 // +---+---+---+
399 410
400 const char url_str[] = 411 const char url_str[] =
401 "data:text/html," 412 "data:text/html,"
402 "<!doctype html>" 413 "<!doctype html>"
403 "<table border=1>" 414 "<table border=1>"
404 " <tr>" 415 " <tr>"
405 " <td colspan=2>1</td><td>2</td>" 416 " <td colspan=2>1</td><td>2</td>"
406 " </tr>" 417 " </tr>"
407 " <tr>" 418 " <tr>"
408 " <td>3</td><td colspan=2>4</td>" 419 " <td>3</td><td colspan=2>4</td>"
409 " </tr>" 420 " </tr>"
410 "</table>"; 421 "</table>";
411 GURL url(url_str); 422 GURL url(url_str);
412 NavigateToURL(shell(), url); 423 NavigateToURL(shell(), url);
413 424
414 const AccessibilityNodeDataTreeNode& tree = GetAccessibilityNodeDataTree(); 425 const ui::AXTree& tree = GetAXTree();
415 const AccessibilityNodeDataTreeNode& table = tree.children[0]; 426 const ui::AXNode* root = tree.GetRoot();
416 EXPECT_EQ(blink::WebAXRoleTable, table.role); 427 const ui::AXNode* table = root->ChildAtIndex(0);
417 ASSERT_GE(table.children.size(), 5U); 428 EXPECT_EQ(ui::AX_ROLE_TABLE, table->data().role);
418 EXPECT_EQ(blink::WebAXRoleRow, table.children[0].role); 429 ASSERT_GE(table->child_count(), 5);
419 EXPECT_EQ(blink::WebAXRoleRow, table.children[1].role); 430 EXPECT_EQ(ui::AX_ROLE_ROW, table->ChildAtIndex(0)->data().role);
420 EXPECT_EQ(blink::WebAXRoleColumn, table.children[2].role); 431 EXPECT_EQ(ui::AX_ROLE_ROW, table->ChildAtIndex(1)->data().role);
421 EXPECT_EQ(blink::WebAXRoleColumn, table.children[3].role); 432 EXPECT_EQ(ui::AX_ROLE_COLUMN, table->ChildAtIndex(2)->data().role);
422 EXPECT_EQ(blink::WebAXRoleColumn, table.children[4].role); 433 EXPECT_EQ(ui::AX_ROLE_COLUMN, table->ChildAtIndex(3)->data().role);
434 EXPECT_EQ(ui::AX_ROLE_COLUMN, table->ChildAtIndex(4)->data().role);
423 EXPECT_EQ(3, 435 EXPECT_EQ(3,
424 GetIntAttr(table, AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT)); 436 GetIntAttr(table, ui::AX_ATTR_TABLE_COLUMN_COUNT));
425 EXPECT_EQ(2, GetIntAttr(table, AccessibilityNodeData::ATTR_TABLE_ROW_COUNT)); 437 EXPECT_EQ(2, GetIntAttr(table, ui::AX_ATTR_TABLE_ROW_COUNT));
426 438
427 const AccessibilityNodeDataTreeNode& cell1 = table.children[0].children[0]; 439 const ui::AXNode* cell1 = table->ChildAtIndex(0)->ChildAtIndex(0);
428 const AccessibilityNodeDataTreeNode& cell2 = table.children[0].children[1]; 440 const ui::AXNode* cell2 = table->ChildAtIndex(0)->ChildAtIndex(1);
429 const AccessibilityNodeDataTreeNode& cell3 = table.children[1].children[0]; 441 const ui::AXNode* cell3 = table->ChildAtIndex(1)->ChildAtIndex(0);
430 const AccessibilityNodeDataTreeNode& cell4 = table.children[1].children[1]; 442 const ui::AXNode* cell4 = table->ChildAtIndex(1)->ChildAtIndex(1);
431 443
432 ASSERT_EQ(AccessibilityNodeData::ATTR_CELL_IDS, 444 ASSERT_EQ(ui::AX_ATTR_CELL_IDS,
433 table.intlist_attributes[0].first); 445 table->data().intlist_attributes[0].first);
434 const std::vector<int32>& table_cell_ids = 446 const std::vector<int32>& table_cell_ids =
435 table.intlist_attributes[0].second; 447 table->data().intlist_attributes[0].second;
436 ASSERT_EQ(6U, table_cell_ids.size()); 448 ASSERT_EQ(6U, table_cell_ids.size());
437 EXPECT_EQ(cell1.id, table_cell_ids[0]); 449 EXPECT_EQ(cell1->id(), table_cell_ids[0]);
438 EXPECT_EQ(cell1.id, table_cell_ids[1]); 450 EXPECT_EQ(cell1->id(), table_cell_ids[1]);
439 EXPECT_EQ(cell2.id, table_cell_ids[2]); 451 EXPECT_EQ(cell2->id(), table_cell_ids[2]);
440 EXPECT_EQ(cell3.id, table_cell_ids[3]); 452 EXPECT_EQ(cell3->id(), table_cell_ids[3]);
441 EXPECT_EQ(cell4.id, table_cell_ids[4]); 453 EXPECT_EQ(cell4->id(), table_cell_ids[4]);
442 EXPECT_EQ(cell4.id, table_cell_ids[5]); 454 EXPECT_EQ(cell4->id(), table_cell_ids[5]);
443 455
444 EXPECT_EQ(0, GetIntAttr(cell1, 456 EXPECT_EQ(0, GetIntAttr(cell1,
445 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX)); 457 ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX));
446 EXPECT_EQ(0, GetIntAttr(cell1, 458 EXPECT_EQ(0, GetIntAttr(cell1,
447 AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX)); 459 ui::AX_ATTR_TABLE_CELL_ROW_INDEX));
448 EXPECT_EQ(2, GetIntAttr(cell1, 460 EXPECT_EQ(2, GetIntAttr(cell1,
449 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN)); 461 ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN));
450 EXPECT_EQ(1, GetIntAttr(cell1, 462 EXPECT_EQ(1, GetIntAttr(cell1,
451 AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN)); 463 ui::AX_ATTR_TABLE_CELL_ROW_SPAN));
452 EXPECT_EQ(2, GetIntAttr(cell2, 464 EXPECT_EQ(2, GetIntAttr(cell2,
453 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX)); 465 ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX));
454 EXPECT_EQ(1, GetIntAttr(cell2, 466 EXPECT_EQ(1, GetIntAttr(cell2,
455 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN)); 467 ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN));
456 EXPECT_EQ(0, GetIntAttr(cell3, 468 EXPECT_EQ(0, GetIntAttr(cell3,
457 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX)); 469 ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX));
458 EXPECT_EQ(1, GetIntAttr(cell3, 470 EXPECT_EQ(1, GetIntAttr(cell3,
459 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN)); 471 ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN));
460 EXPECT_EQ(1, GetIntAttr(cell4, 472 EXPECT_EQ(1, GetIntAttr(cell4,
461 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX)); 473 ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX));
462 EXPECT_EQ(2, GetIntAttr(cell4, 474 EXPECT_EQ(2, GetIntAttr(cell4,
463 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN)); 475 ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN));
464 } 476 }
465 477
466 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest, 478 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
467 WritableElement) { 479 WritableElement) {
468 const char url_str[] = 480 const char url_str[] =
469 "data:text/html," 481 "data:text/html,"
470 "<!doctype html>" 482 "<!doctype html>"
471 "<div role='textbox' tabindex=0>" 483 "<div role='textbox' tabindex=0>"
472 " Some text" 484 " Some text"
473 "</div>"; 485 "</div>";
474 GURL url(url_str); 486 GURL url(url_str);
475 NavigateToURL(shell(), url); 487 NavigateToURL(shell(), url);
476 const AccessibilityNodeDataTreeNode& tree = GetAccessibilityNodeDataTree(); 488 const ui::AXTree& tree = GetAXTree();
477 489 const ui::AXNode* root = tree.GetRoot();
478 ASSERT_EQ(1U, tree.children.size()); 490 ASSERT_EQ(1, root->child_count());
479 const AccessibilityNodeDataTreeNode& textbox = tree.children[0]; 491 const ui::AXNode* textbox = root->ChildAtIndex(0);
480 492 EXPECT_EQ(true, GetBoolAttr(textbox, ui::AX_ATTR_CAN_SET_VALUE));
481 EXPECT_EQ(
482 true, GetBoolAttr(textbox, AccessibilityNodeData::ATTR_CAN_SET_VALUE));
483 } 493 }
484 494
485 } // namespace content 495 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698