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

Side by Side Diff: chrome/browser/accessibility_win_browsertest.cc

Issue 3250014: Update browser accessibility tree on a renderer accessibility object state ch... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Fix lint errors Created 10 years, 3 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 <atlbase.h> 5 #include <atlbase.h>
6 #include <vector> 6 #include <vector>
7 7
8 #include "base/scoped_comptr_win.h" 8 #include "base/scoped_comptr_win.h"
9 #include "chrome/browser/browser.h" 9 #include "chrome/browser/browser.h"
10 #include "chrome/browser/browser_window.h" 10 #include "chrome/browser/browser_window.h"
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 void AppendExpectedChild(AccessibleChecker* expected_child); 75 void AppendExpectedChild(AccessibleChecker* expected_child);
76 76
77 // Check that the name and role of the given IAccessible instance and its 77 // Check that the name and role of the given IAccessible instance and its
78 // descendants match the expected names and roles that this object was 78 // descendants match the expected names and roles that this object was
79 // initialized with. 79 // initialized with.
80 void CheckAccessible(IAccessible* accessible); 80 void CheckAccessible(IAccessible* accessible);
81 81
82 // Set the expected value for this AccessibleChecker. 82 // Set the expected value for this AccessibleChecker.
83 void SetExpectedValue(wstring expected_value); 83 void SetExpectedValue(wstring expected_value);
84 84
85 // Set the expected state for this AccessibleChecker.
86 void SetExpectedState(LONG expected_state);
87
85 private: 88 private:
86 void CheckAccessibleName(IAccessible* accessible); 89 void CheckAccessibleName(IAccessible* accessible);
87 void CheckAccessibleRole(IAccessible* accessible); 90 void CheckAccessibleRole(IAccessible* accessible);
88 void CheckAccessibleValue(IAccessible* accessible); 91 void CheckAccessibleValue(IAccessible* accessible);
92 void CheckAccessibleState(IAccessible* accessible);
89 void CheckAccessibleChildren(IAccessible* accessible); 93 void CheckAccessibleChildren(IAccessible* accessible);
90 94
91 private: 95 private:
92 typedef vector<AccessibleChecker*> AccessibleCheckerVector; 96 typedef vector<AccessibleChecker*> AccessibleCheckerVector;
93 97
94 // Expected accessible name. Checked against IAccessible::get_accName. 98 // Expected accessible name. Checked against IAccessible::get_accName.
95 wstring name_; 99 wstring name_;
96 100
97 // Expected accessible role. Checked against IAccessible::get_accRole. 101 // Expected accessible role. Checked against IAccessible::get_accRole.
98 CComVariant role_; 102 CComVariant role_;
99 103
100 // Expected accessible value. Checked against IAccessible::get_accValue. 104 // Expected accessible value. Checked against IAccessible::get_accValue.
101 wstring value_; 105 wstring value_;
102 106
107 // Expected accessible state. Checked against IAccessible::get_accState.
108 LONG state_;
109
103 // Expected accessible children. Checked using IAccessible::get_accChildCount 110 // Expected accessible children. Checked using IAccessible::get_accChildCount
104 // and ::AccessibleChildren. 111 // and ::AccessibleChildren.
105 AccessibleCheckerVector children_; 112 AccessibleCheckerVector children_;
106 }; 113 };
107 114
108 VARIANT CreateI4Variant(LONG value) { 115 VARIANT CreateI4Variant(LONG value) {
109 VARIANT variant = {0}; 116 VARIANT variant = {0};
110 117
111 V_VT(&variant) = VT_I4; 118 V_VT(&variant) = VT_I4;
112 V_I4(&variant) = value; 119 V_I4(&variant) = value;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 EXPECT_EQ(S_OK, hr); 154 EXPECT_EQ(S_OK, hr);
148 EXPECT_NE(accessible, reinterpret_cast<IAccessible*>(NULL)); 155 EXPECT_NE(accessible, reinterpret_cast<IAccessible*>(NULL));
149 156
150 return accessible; 157 return accessible;
151 } 158 }
152 159
153 AccessibleChecker::AccessibleChecker( 160 AccessibleChecker::AccessibleChecker(
154 wstring expected_name, int32 expected_role, wstring expected_value) : 161 wstring expected_name, int32 expected_role, wstring expected_value) :
155 name_(expected_name), 162 name_(expected_name),
156 role_(expected_role), 163 role_(expected_role),
157 value_(expected_value) { 164 value_(expected_value),
165 state_(-1) {
158 } 166 }
159 167
160 AccessibleChecker::AccessibleChecker( 168 AccessibleChecker::AccessibleChecker(
161 wstring expected_name, wstring expected_role, wstring expected_value) : 169 wstring expected_name, wstring expected_role, wstring expected_value) :
162 name_(expected_name), 170 name_(expected_name),
163 role_(expected_role.c_str()), 171 role_(expected_role.c_str()),
164 value_(expected_value) { 172 value_(expected_value),
173 state_(-1) {
165 } 174 }
166 175
167 void AccessibleChecker::AppendExpectedChild( 176 void AccessibleChecker::AppendExpectedChild(
168 AccessibleChecker* expected_child) { 177 AccessibleChecker* expected_child) {
169 children_.push_back(expected_child); 178 children_.push_back(expected_child);
170 } 179 }
171 180
172 void AccessibleChecker::CheckAccessible(IAccessible* accessible) { 181 void AccessibleChecker::CheckAccessible(IAccessible* accessible) {
173 CheckAccessibleName(accessible); 182 CheckAccessibleName(accessible);
174 CheckAccessibleRole(accessible); 183 CheckAccessibleRole(accessible);
175 CheckAccessibleValue(accessible); 184 CheckAccessibleValue(accessible);
185 CheckAccessibleState(accessible);
176 CheckAccessibleChildren(accessible); 186 CheckAccessibleChildren(accessible);
177 } 187 }
178 188
179 void AccessibleChecker::SetExpectedValue(wstring expected_value) { 189 void AccessibleChecker::SetExpectedValue(wstring expected_value) {
180 value_ = expected_value; 190 value_ = expected_value;
181 } 191 }
182 192
193 void AccessibleChecker::SetExpectedState(LONG expected_state) {
194 state_ = expected_state;
195 }
196
183 void AccessibleChecker::CheckAccessibleName(IAccessible* accessible) { 197 void AccessibleChecker::CheckAccessibleName(IAccessible* accessible) {
184 CComBSTR name; 198 CComBSTR name;
185 HRESULT hr = 199 HRESULT hr =
186 accessible->get_accName(CreateI4Variant(CHILDID_SELF), &name); 200 accessible->get_accName(CreateI4Variant(CHILDID_SELF), &name);
187 201
188 if (name_.empty()) { 202 if (name_.empty()) {
189 // If the object doesn't have name S_FALSE should be returned. 203 // If the object doesn't have name S_FALSE should be returned.
190 EXPECT_EQ(hr, S_FALSE); 204 EXPECT_EQ(hr, S_FALSE);
191 } else { 205 } else {
192 // Test that the correct string was returned. 206 // Test that the correct string was returned.
(...skipping 15 matching lines...) Expand all
208 CComBSTR value; 222 CComBSTR value;
209 HRESULT hr = 223 HRESULT hr =
210 accessible->get_accValue(CreateI4Variant(CHILDID_SELF), &value); 224 accessible->get_accValue(CreateI4Variant(CHILDID_SELF), &value);
211 EXPECT_EQ(hr, S_OK); 225 EXPECT_EQ(hr, S_OK);
212 226
213 // Test that the correct string was returned. 227 // Test that the correct string was returned.
214 EXPECT_STREQ(value_.c_str(), 228 EXPECT_STREQ(value_.c_str(),
215 wstring(value.m_str, SysStringLen(value)).c_str()); 229 wstring(value.m_str, SysStringLen(value)).c_str());
216 } 230 }
217 231
232 void AccessibleChecker::CheckAccessibleState(IAccessible* accessible) {
233 if (state_ < 0)
234 return;
235
236 VARIANT var_state = {0};
237 HRESULT hr =
238 accessible->get_accState(CreateI4Variant(CHILDID_SELF), &var_state);
239 EXPECT_EQ(hr, S_OK);
240 EXPECT_EQ(VT_I4, V_VT(&var_state));
241 ASSERT_TRUE(state_ == V_I4(&var_state));
242 }
243
218 void AccessibleChecker::CheckAccessibleChildren(IAccessible* parent) { 244 void AccessibleChecker::CheckAccessibleChildren(IAccessible* parent) {
219 LONG child_count = 0; 245 LONG child_count = 0;
220 HRESULT hr = parent->get_accChildCount(&child_count); 246 HRESULT hr = parent->get_accChildCount(&child_count);
221 EXPECT_EQ(hr, S_OK); 247 EXPECT_EQ(hr, S_OK);
222 ASSERT_EQ(child_count, children_.size()); 248 ASSERT_EQ(child_count, children_.size());
223 249
224 auto_ptr<VARIANT> child_array(new VARIANT[child_count]); 250 auto_ptr<VARIANT> child_array(new VARIANT[child_count]);
225 LONG obtained_count = 0; 251 LONG obtained_count = 0;
226 hr = AccessibleChildren(parent, 0, child_count, 252 hr = AccessibleChildren(parent, 0, child_count,
227 child_array.get(), &obtained_count); 253 child_array.get(), &obtained_count);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 hr = document_accessible->get_accName(CreateI4Variant(CHILDID_SELF), &name); 325 hr = document_accessible->get_accName(CreateI4Variant(CHILDID_SELF), &name);
300 ASSERT_EQ(E_FAIL, hr); 326 ASSERT_EQ(E_FAIL, hr);
301 } 327 }
302 328
303 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, 329 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
304 TestDynamicAccessibilityTree) { 330 TestDynamicAccessibilityTree) {
305 // By requesting an accessible chrome will believe a screen reader has been 331 // By requesting an accessible chrome will believe a screen reader has been
306 // detected. Request and wait for the accessibility tree to be updated. 332 // detected. Request and wait for the accessibility tree to be updated.
307 GURL tree_url( 333 GURL tree_url(
308 "data:text/html,<html><body><div onclick=\"this.innerHTML='<b>new text" 334 "data:text/html,<html><body><div onclick=\"this.innerHTML='<b>new text"
309 "</b>';\"><b>old text</b></div></body></html>"); 335 "</b>';\"><b>old text</b></div><div><input type='checkbox' /></div>"
336 "</body></html>");
310 browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED); 337 browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED);
311 ScopedComPtr<IAccessible> document_accessible( 338 ScopedComPtr<IAccessible> document_accessible(
312 GetRenderWidgetHostViewClientAccessible()); 339 GetRenderWidgetHostViewClientAccessible());
313 ui_test_utils::WaitForNotification( 340 ui_test_utils::WaitForNotification(
314 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); 341 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
315 342
316 AccessibleChecker text_checker(L"", ROLE_SYSTEM_TEXT, L"old text"); 343 AccessibleChecker text_checker(L"", ROLE_SYSTEM_TEXT, L"old text");
344
345 AccessibleChecker div_checker1(L"", L"div", L"");
dmazzoni 2010/09/01 15:10:52 How about div1_checker through div3_checker?
Chris Guillory 2010/09/01 15:35:27 Done. I like that better.
346 div_checker1.AppendExpectedChild(&text_checker);
347
317 AccessibleChecker checkbox_checker(L"", ROLE_SYSTEM_CHECKBUTTON, L""); 348 AccessibleChecker checkbox_checker(L"", ROLE_SYSTEM_CHECKBUTTON, L"");
349 checkbox_checker.SetExpectedState(
350 STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_READONLY);
318 351
319 AccessibleChecker div_checker(L"", L"div", L""); 352 AccessibleChecker div_checker2(L"", L"div", L"");
320 div_checker.AppendExpectedChild(&text_checker); 353 div_checker2.AppendExpectedChild(&checkbox_checker);
321 354
322 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); 355 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L"");
323 document_checker.AppendExpectedChild(&div_checker); 356 document_checker.AppendExpectedChild(&div_checker1);
357 document_checker.AppendExpectedChild(&div_checker2);
358
359 // TODO(ctguil): Fix: We should not be expecting busy state here.
360 document_checker.SetExpectedState(STATE_SYSTEM_BUSY);
324 361
325 // Check the accessible tree of the browser. 362 // Check the accessible tree of the browser.
326 document_accessible = GetRenderWidgetHostViewClientAccessible(); 363 document_accessible = GetRenderWidgetHostViewClientAccessible();
327 ASSERT_NE(document_accessible.get(), reinterpret_cast<IAccessible*>(NULL)); 364 ASSERT_NE(document_accessible.get(), reinterpret_cast<IAccessible*>(NULL));
328 document_checker.CheckAccessible(document_accessible); 365 document_checker.CheckAccessible(document_accessible);
329 366
330 // Perform the default action on the div which executes the script that 367 // Perform the default action on the div which executes the script that
331 // updates text node within the div. 368 // updates text node within the div.
332 CComPtr<IDispatch> div_dispatch; 369 CComPtr<IDispatch> div_dispatch;
333 HRESULT hr = document_accessible->get_accChild(CreateI4Variant(1), 370 HRESULT hr = document_accessible->get_accChild(CreateI4Variant(1),
334 &div_dispatch); 371 &div_dispatch);
335 EXPECT_EQ(hr, S_OK); 372 EXPECT_EQ(hr, S_OK);
336 CComQIPtr<IAccessible> div_accessible(div_dispatch); 373 CComQIPtr<IAccessible> div_accessible(div_dispatch);
337 hr = div_accessible->accDoDefaultAction(CreateI4Variant(CHILDID_SELF)); 374 hr = div_accessible->accDoDefaultAction(CreateI4Variant(CHILDID_SELF));
338 EXPECT_EQ(hr, S_OK); 375 EXPECT_EQ(hr, S_OK);
339 ui_test_utils::WaitForNotification( 376 ui_test_utils::WaitForNotification(
340 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); 377 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
341 378
379 div_dispatch.Release();
380 div_accessible.Release();
381
382 // Check that the accessibility tree of the browser has been updated.
383 text_checker.SetExpectedValue(L"new text");
384 document_checker.CheckAccessible(document_accessible);
385
386 // Perform the default action on the checkbox which marks it as checked.
387 hr = document_accessible->get_accChild(CreateI4Variant(2), &div_dispatch);
388 EXPECT_EQ(hr, S_OK);
389 div_accessible = div_dispatch;
390 CComPtr<IDispatch> checkbox_dispatch;
391 hr = div_accessible->get_accChild(CreateI4Variant(1), &checkbox_dispatch);
392 EXPECT_EQ(hr, S_OK);
393 CComQIPtr<IAccessible> checkbox_accessible(checkbox_dispatch);
394 hr = checkbox_accessible->accDoDefaultAction(CreateI4Variant(CHILDID_SELF));
395 EXPECT_EQ(hr, S_OK);
396 ui_test_utils::WaitForNotification(
397 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
398
342 // Check that the accessibility tree of the browser has been updated. 399 // Check that the accessibility tree of the browser has been updated.
343 text_checker.SetExpectedValue(L"new text"); 400 checkbox_checker.SetExpectedState(
401 STATE_SYSTEM_CHECKED | STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED |
402 STATE_SYSTEM_READONLY);
344 document_checker.CheckAccessible(document_accessible); 403 document_checker.CheckAccessible(document_accessible);
345 } 404 }
346 } // namespace. 405 } // namespace.
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/browser_accessibility_manager_win.h » ('j') | chrome/browser/browser_accessibility_manager_win.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698