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

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

Issue 14264015: Misc. cleanup: (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 8 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
« no previous file with comments | « no previous file | content/browser/accessibility/browser_accessibility_win_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <vector> 5 #include <vector>
6 6
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "base/stringprintf.h"
9 #include "base/utf_string_conversions.h" 8 #include "base/utf_string_conversions.h"
10 #include "base/win/scoped_bstr.h" 9 #include "base/win/scoped_bstr.h"
11 #include "base/win/scoped_comptr.h" 10 #include "base/win/scoped_comptr.h"
12 #include "base/win/scoped_variant.h" 11 #include "base/win/scoped_variant.h"
13 #include "content/browser/accessibility/accessibility_tree_formatter_utils_win.h " 12 #include "content/browser/accessibility/accessibility_tree_formatter_utils_win.h "
14 #include "content/browser/renderer_host/render_view_host_impl.h" 13 #include "content/browser/renderer_host/render_view_host_impl.h"
15 #include "content/public/browser/notification_service.h" 14 #include "content/public/browser/notification_service.h"
16 #include "content/public/browser/notification_types.h" 15 #include "content/public/browser/notification_types.h"
17 #include "content/public/browser/render_view_host.h" 16 #include "content/public/browser/render_view_host.h"
18 #include "content/public/browser/render_widget_host_view.h" 17 #include "content/public/browser/render_widget_host_view.h"
19 #include "content/public/browser/web_contents.h" 18 #include "content/public/browser/web_contents.h"
20 #include "content/public/common/url_constants.h" 19 #include "content/public/common/url_constants.h"
21 #include "content/public/test/test_utils.h" 20 #include "content/public/test/test_utils.h"
22 #include "content/shell/shell.h" 21 #include "content/shell/shell.h"
23 #include "content/test/content_browser_test.h" 22 #include "content/test/content_browser_test.h"
24 #include "content/test/content_browser_test_utils.h" 23 #include "content/test/content_browser_test_utils.h"
25 #include "third_party/iaccessible2/ia2_api_all.h" 24 #include "third_party/iaccessible2/ia2_api_all.h"
26 #include "third_party/isimpledom/ISimpleDOMNode.h" 25 #include "third_party/isimpledom/ISimpleDOMNode.h"
27 26
28 using std::auto_ptr;
29 using std::string;
30 using std::vector;
31 using std::wstring;
32
33 // TODO(dmazzoni): Disabled accessibility tests on Win64. crbug.com/179717 27 // TODO(dmazzoni): Disabled accessibility tests on Win64. crbug.com/179717
34 #if defined(ARCH_CPU_X86_64) 28 #if defined(ARCH_CPU_X86_64)
35 #define MAYBE(x) DISABLED_##x 29 #define MAYBE(x) DISABLED_##x
36 #else 30 #else
37 #define MAYBE(x) x 31 #define MAYBE(x) x
38 #endif 32 #endif
39 33
40 namespace content { 34 namespace content {
41 35
42 namespace { 36 namespace {
43 37
44 class AccessibilityWinBrowserTest : public ContentBrowserTest {
45 public:
46 AccessibilityWinBrowserTest() {}
47 38
48 protected: 39 // Helpers --------------------------------------------------------------------
49 void LoadInitialAccessibilityTreeFromHtml(string html);
50 IAccessible* GetRendererAccessible();
51 void ExecuteScript(wstring script);
52 };
53
54 class AccessibleChecker {
55 public:
56 AccessibleChecker(
57 wstring expected_name,
58 int32 expected_role,
59 wstring expected_value);
60 AccessibleChecker(
61 wstring expected_name,
62 wstring expected_role,
63 int32 expected_ia2_role,
64 wstring expected_value);
65 AccessibleChecker(
66 wstring expected_name,
67 int32 expected_role,
68 int32 expected_ia2_role,
69 wstring expected_value);
70
71 // Append an AccessibleChecker that verifies accessibility information for
72 // a child IAccessible. Order is important.
73 void AppendExpectedChild(AccessibleChecker* expected_child);
74
75 // Check that the name and role of the given IAccessible instance and its
76 // descendants match the expected names and roles that this object was
77 // initialized with.
78 void CheckAccessible(IAccessible* accessible);
79
80 // Set the expected value for this AccessibleChecker.
81 void SetExpectedValue(wstring expected_value);
82
83 // Set the expected state for this AccessibleChecker.
84 void SetExpectedState(LONG expected_state);
85
86 private:
87 void CheckAccessibleName(IAccessible* accessible);
88 void CheckAccessibleRole(IAccessible* accessible);
89 void CheckIA2Role(IAccessible* accessible);
90 void CheckAccessibleValue(IAccessible* accessible);
91 void CheckAccessibleState(IAccessible* accessible);
92 void CheckAccessibleChildren(IAccessible* accessible);
93 string16 RoleVariantToString(const base::win::ScopedVariant& role_variant);
94
95 private:
96 typedef vector<AccessibleChecker*> AccessibleCheckerVector;
97
98 // Expected accessible name. Checked against IAccessible::get_accName.
99 wstring name_;
100
101 // Expected accessible role. Checked against IAccessible::get_accRole.
102 base::win::ScopedVariant role_;
103
104 // Expected IAccessible2 role. Checked against IAccessible2::role.
105 int32 ia2_role_;
106
107 // Expected accessible value. Checked against IAccessible::get_accValue.
108 wstring value_;
109
110 // Expected accessible state. Checked against IAccessible::get_accState.
111 LONG state_;
112
113 // Expected accessible children. Checked using IAccessible::get_accChildCount
114 // and ::AccessibleChildren.
115 AccessibleCheckerVector children_;
116 };
117 40
118 base::win::ScopedComPtr<IAccessible> GetAccessibleFromResultVariant( 41 base::win::ScopedComPtr<IAccessible> GetAccessibleFromResultVariant(
119 IAccessible* parent, 42 IAccessible* parent,
120 VARIANT *var) { 43 VARIANT* var) {
121 base::win::ScopedComPtr<IAccessible> ptr; 44 base::win::ScopedComPtr<IAccessible> ptr;
122 switch (V_VT(var)) { 45 switch (V_VT(var)) {
123 case VT_DISPATCH: { 46 case VT_DISPATCH: {
124 IDispatch* dispatch = V_DISPATCH(var); 47 IDispatch* dispatch = V_DISPATCH(var);
125 if (dispatch) 48 if (dispatch)
126 ptr.QueryFrom(dispatch); 49 ptr.QueryFrom(dispatch);
127 break; 50 break;
128 } 51 }
129 52
130 case VT_I4: { 53 case VT_I4: {
131 base::win::ScopedComPtr<IDispatch> dispatch; 54 base::win::ScopedComPtr<IDispatch> dispatch;
132 HRESULT hr = parent->get_accChild(*var, dispatch.Receive()); 55 HRESULT hr = parent->get_accChild(*var, dispatch.Receive());
133 EXPECT_TRUE(SUCCEEDED(hr)); 56 EXPECT_TRUE(SUCCEEDED(hr));
134 if (dispatch.get()) 57 if (dispatch.get())
135 dispatch.QueryInterface(ptr.Receive()); 58 dispatch.QueryInterface(ptr.Receive());
136 break; 59 break;
137 } 60 }
138 } 61 }
139 return ptr; 62 return ptr;
140 } 63 }
141 64
142 HRESULT QueryIAccessible2(IAccessible* accessible, IAccessible2** accessible2) { 65 HRESULT QueryIAccessible2(IAccessible* accessible, IAccessible2** accessible2) {
143 // TODO(ctguil): For some reason querying the IAccessible2 interface from 66 // TODO(ctguil): For some reason querying the IAccessible2 interface from
144 // IAccessible fails. 67 // IAccessible fails.
145 base::win::ScopedComPtr<IServiceProvider> service_provider; 68 base::win::ScopedComPtr<IServiceProvider> service_provider;
146 HRESULT hr = accessible->QueryInterface(service_provider.Receive()); 69 HRESULT hr = accessible->QueryInterface(service_provider.Receive());
147 if (FAILED(hr)) 70 return SUCCEEDED(hr) ?
148 return hr; 71 service_provider->QueryService(IID_IAccessible2, accessible2) : hr;
149
150 hr = service_provider->QueryService(IID_IAccessible2, accessible2);
151 return hr;
152 } 72 }
153 73
154 // Recursively search through all of the descendants reachable from an 74 // Recursively search through all of the descendants reachable from an
155 // IAccessible node and return true if we find one with the given role 75 // IAccessible node and return true if we find one with the given role
156 // and name. 76 // and name.
157 void RecursiveFindNodeInAccessibilityTree( 77 void RecursiveFindNodeInAccessibilityTree(IAccessible* node,
158 IAccessible* node, 78 int32 expected_role,
159 int32 expected_role, 79 const std::wstring& expected_name,
160 const wstring& expected_name, 80 int32 depth,
161 int32 depth, 81 bool* found) {
162 bool* found) {
163 base::win::ScopedBstr name_bstr; 82 base::win::ScopedBstr name_bstr;
164 base::win::ScopedVariant childid_self(CHILDID_SELF); 83 base::win::ScopedVariant childid_self(CHILDID_SELF);
165 node->get_accName(childid_self, name_bstr.Receive()); 84 node->get_accName(childid_self, name_bstr.Receive());
166 wstring name(name_bstr, name_bstr.Length()); 85 std::wstring name(name_bstr, name_bstr.Length());
167 base::win::ScopedVariant role; 86 base::win::ScopedVariant role;
168 node->get_accRole(childid_self, role.Receive()); 87 node->get_accRole(childid_self, role.Receive());
169 ASSERT_EQ(VT_I4, role.type()); 88 ASSERT_EQ(VT_I4, role.type());
170 89
171 // Print the accessibility tree as we go, because if this test fails 90 // Print the accessibility tree as we go, because if this test fails
172 // on the bots, this is really helpful in figuring out why. 91 // on the bots, this is really helpful in figuring out why.
173 for (int i = 0; i < depth; i++) { 92 for (int i = 0; i < depth; i++)
174 printf(" "); 93 printf(" ");
175 }
176 printf("role=%d name=%s\n", V_I4(&role), WideToUTF8(name).c_str()); 94 printf("role=%d name=%s\n", V_I4(&role), WideToUTF8(name).c_str());
177 95
178 if (expected_role == V_I4(&role) && expected_name == name) { 96 if (expected_role == V_I4(&role) && expected_name == name) {
179 *found = true; 97 *found = true;
180 return; 98 return;
181 } 99 }
182 100
183 LONG child_count = 0; 101 LONG child_count = 0;
184 HRESULT hr = node->get_accChildCount(&child_count); 102 HRESULT hr = node->get_accChildCount(&child_count);
185 ASSERT_EQ(S_OK, hr); 103 ASSERT_EQ(S_OK, hr);
(...skipping 11 matching lines...) Expand all
197 if (child_accessible.get()) { 115 if (child_accessible.get()) {
198 RecursiveFindNodeInAccessibilityTree( 116 RecursiveFindNodeInAccessibilityTree(
199 child_accessible.get(), expected_role, expected_name, depth + 1, 117 child_accessible.get(), expected_role, expected_name, depth + 1,
200 found); 118 found);
201 if (*found) 119 if (*found)
202 return; 120 return;
203 } 121 }
204 } 122 }
205 } 123 }
206 124
125
126 // AccessibilityWinBrowserTest ------------------------------------------------
127
128 class AccessibilityWinBrowserTest : public ContentBrowserTest {
129 public:
130 AccessibilityWinBrowserTest();
131 virtual ~AccessibilityWinBrowserTest();
132
133 protected:
134 void LoadInitialAccessibilityTreeFromHtml(const std::string& html);
135 IAccessible* GetRendererAccessible();
136 void ExecuteScript(const std::wstring& script);
137
138 private:
139 DISALLOW_COPY_AND_ASSIGN(AccessibilityWinBrowserTest);
140 };
141
142 AccessibilityWinBrowserTest::AccessibilityWinBrowserTest() {
143 }
144
145 AccessibilityWinBrowserTest::~AccessibilityWinBrowserTest() {
146 }
147
207 void AccessibilityWinBrowserTest::LoadInitialAccessibilityTreeFromHtml( 148 void AccessibilityWinBrowserTest::LoadInitialAccessibilityTreeFromHtml(
208 string html) { 149 const std::string& html) {
209 // Load the html using a data url and wait for the navigation to finish. 150 // Load the html using a data url and wait for the navigation to finish.
210 GURL html_data_url(string("data:text/html,") + html); 151 GURL html_data_url("data:text/html," + html);
211 NavigateToURL(shell(), html_data_url); 152 NavigateToURL(shell(), html_data_url);
212 153
213 // At this point, renderer accessibility is off and the page has completed 154 // At this point, renderer accessibility is off and the page has completed
214 // loading. (Both of these must be strictly true or there will be test 155 // loading. (Both of these must be strictly true or there will be test
215 // flakiness.) Now call GetRendererAccessible, which will trigger 156 // flakiness.) Now call GetRendererAccessible, which will trigger
216 // changing the accessibility mode to AccessibilityModeComplete. When 157 // changing the accessibility mode to AccessibilityModeComplete. When
217 // the renderer switches accessibility on, it will send a Layout Complete 158 // the renderer switches accessibility on, it will send a Layout Complete
218 // accessibility notification containing the full accessibility tree, which 159 // accessibility notification containing the full accessibility tree, which
219 // we can wait for. 160 // we can wait for.
220 scoped_refptr<MessageLoopRunner> loop_runner(new MessageLoopRunner); 161 scoped_refptr<MessageLoopRunner> loop_runner(new MessageLoopRunner);
221 WebContents* web_contents = shell()->web_contents(); 162 WebContents* web_contents = shell()->web_contents();
222 RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>( 163 RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>(
223 web_contents->GetRenderViewHost()); 164 web_contents->GetRenderViewHost());
224 view_host->SetAccessibilityLayoutCompleteCallbackForTesting( 165 view_host->SetAccessibilityLayoutCompleteCallbackForTesting(
225 loop_runner->QuitClosure()); 166 loop_runner->QuitClosure());
226 GetRendererAccessible(); 167 GetRendererAccessible();
227 loop_runner->Run(); 168 loop_runner->Run();
228 } 169 }
229 170
230 // Retrieve the MSAA client accessibility object for the Render Widget Host View 171 // Retrieve the MSAA client accessibility object for the Render Widget Host View
231 // of the selected tab. 172 // of the selected tab.
232 IAccessible* 173 IAccessible* AccessibilityWinBrowserTest::GetRendererAccessible() {
233 AccessibilityWinBrowserTest::GetRendererAccessible() {
234 HWND hwnd_render_widget_host_view = 174 HWND hwnd_render_widget_host_view =
235 shell()->web_contents()->GetRenderWidgetHostView()->GetNativeView(); 175 shell()->web_contents()->GetRenderWidgetHostView()->GetNativeView();
236 176
237 // Invoke windows screen reader detection by sending the WM_GETOBJECT message 177 // Invoke windows screen reader detection by sending the WM_GETOBJECT message
238 // with kIdCustom as the LPARAM. 178 // with kIdCustom as the LPARAM.
239 const int32 kIdCustom = 1; 179 const int32 kIdCustom = 1;
240 SendMessage( 180 SendMessage(
241 hwnd_render_widget_host_view, WM_GETOBJECT, OBJID_CLIENT, kIdCustom); 181 hwnd_render_widget_host_view, WM_GETOBJECT, OBJID_CLIENT, kIdCustom);
242 182
243 IAccessible* accessible; 183 IAccessible* accessible;
244 HRESULT hr = AccessibleObjectFromWindow( 184 HRESULT hr = AccessibleObjectFromWindow(
245 hwnd_render_widget_host_view, OBJID_CLIENT, 185 hwnd_render_widget_host_view, OBJID_CLIENT,
246 IID_IAccessible, reinterpret_cast<void**>(&accessible)); 186 IID_IAccessible, reinterpret_cast<void**>(&accessible));
247 187
248 EXPECT_EQ(S_OK, hr); 188 EXPECT_EQ(S_OK, hr);
249 EXPECT_NE(accessible, reinterpret_cast<IAccessible*>(NULL)); 189 EXPECT_NE(accessible, reinterpret_cast<IAccessible*>(NULL));
250 190
251 return accessible; 191 return accessible;
252 } 192 }
253 193
254 void AccessibilityWinBrowserTest::ExecuteScript(wstring script) { 194 void AccessibilityWinBrowserTest::ExecuteScript(const std::wstring& script) {
255 shell()->web_contents()->GetRenderViewHost()-> 195 shell()->web_contents()->GetRenderViewHost()->ExecuteJavascriptInWebFrame(
256 ExecuteJavascriptInWebFrame(L"", script); 196 std::wstring(), script);
257 } 197 }
258 198
259 // This constructor can be used if IA2 role will be the same as MSAA role 199
260 AccessibleChecker::AccessibleChecker( 200 // AccessibleChecker ----------------------------------------------------------
261 wstring expected_name, int32 expected_role, wstring expected_value) : 201
262 name_(expected_name), 202 class AccessibleChecker {
263 role_(expected_role), 203 public:
264 ia2_role_(expected_role), 204 // This constructor can be used if the IA2 role will be the same as the MSAA
265 value_(expected_value), 205 // role.
266 state_(-1) { 206 AccessibleChecker(const std::wstring& expected_name,
207 int32 expected_role,
208 const std::wstring& expected_value);
209 AccessibleChecker(const std::wstring& expected_name,
210 int32 expected_role,
211 int32 expected_ia2_role,
212 const std::wstring& expected_value);
213 AccessibleChecker(const std::wstring& expected_name,
214 const std::wstring& expected_role,
215 int32 expected_ia2_role,
216 const std::wstring& expected_value);
217
218 // Append an AccessibleChecker that verifies accessibility information for
219 // a child IAccessible. Order is important.
220 void AppendExpectedChild(AccessibleChecker* expected_child);
221
222 // Check that the name and role of the given IAccessible instance and its
223 // descendants match the expected names and roles that this object was
224 // initialized with.
225 void CheckAccessible(IAccessible* accessible);
226
227 // Set the expected value for this AccessibleChecker.
228 void SetExpectedValue(const std::wstring& expected_value);
229
230 // Set the expected state for this AccessibleChecker.
231 void SetExpectedState(LONG expected_state);
232
233 private:
234 typedef std::vector<AccessibleChecker*> AccessibleCheckerVector;
235
236 void CheckAccessibleName(IAccessible* accessible);
237 void CheckAccessibleRole(IAccessible* accessible);
238 void CheckIA2Role(IAccessible* accessible);
239 void CheckAccessibleValue(IAccessible* accessible);
240 void CheckAccessibleState(IAccessible* accessible);
241 void CheckAccessibleChildren(IAccessible* accessible);
242 string16 RoleVariantToString(const base::win::ScopedVariant& role);
243
244 // Expected accessible name. Checked against IAccessible::get_accName.
245 std::wstring name_;
246
247 // Expected accessible role. Checked against IAccessible::get_accRole.
248 base::win::ScopedVariant role_;
249
250 // Expected IAccessible2 role. Checked against IAccessible2::role.
251 int32 ia2_role_;
252
253 // Expected accessible value. Checked against IAccessible::get_accValue.
254 std::wstring value_;
255
256 // Expected accessible state. Checked against IAccessible::get_accState.
257 LONG state_;
258
259 // Expected accessible children. Checked using IAccessible::get_accChildCount
260 // and ::AccessibleChildren.
261 AccessibleCheckerVector children_;
262 };
263
264 AccessibleChecker::AccessibleChecker(const std::wstring& expected_name,
265 int32 expected_role,
266 const std::wstring& expected_value)
267 : name_(expected_name),
268 role_(expected_role),
269 ia2_role_(expected_role),
270 value_(expected_value),
271 state_(-1) {
267 } 272 }
268 273
269 AccessibleChecker::AccessibleChecker(wstring expected_name, 274 AccessibleChecker::AccessibleChecker(const std::wstring& expected_name,
270 int32 expected_role, 275 int32 expected_role,
271 int32 expected_ia2_role, 276 int32 expected_ia2_role,
272 wstring expected_value) : 277 const std::wstring& expected_value)
273 name_(expected_name), 278 : name_(expected_name),
274 role_(expected_role), 279 role_(expected_role),
275 ia2_role_(expected_ia2_role), 280 ia2_role_(expected_ia2_role),
276 value_(expected_value), 281 value_(expected_value),
277 state_(-1) { 282 state_(-1) {
278 } 283 }
279 284
280 AccessibleChecker::AccessibleChecker(wstring expected_name, 285 AccessibleChecker::AccessibleChecker(const std::wstring& expected_name,
281 wstring expected_role, 286 const std::wstring& expected_role,
282 int32 expected_ia2_role, 287 int32 expected_ia2_role,
283 wstring expected_value) : 288 const std::wstring& expected_value)
284 name_(expected_name), 289 : name_(expected_name),
285 role_(expected_role.c_str()), 290 role_(expected_role.c_str()),
286 ia2_role_(expected_ia2_role), 291 ia2_role_(expected_ia2_role),
287 value_(expected_value), 292 value_(expected_value),
288 state_(-1) { 293 state_(-1) {
289 } 294 }
290 295
291 void AccessibleChecker::AppendExpectedChild( 296 void AccessibleChecker::AppendExpectedChild(
292 AccessibleChecker* expected_child) { 297 AccessibleChecker* expected_child) {
293 children_.push_back(expected_child); 298 children_.push_back(expected_child);
294 } 299 }
295 300
296 void AccessibleChecker::CheckAccessible(IAccessible* accessible) { 301 void AccessibleChecker::CheckAccessible(IAccessible* accessible) {
297 SCOPED_TRACE(base::StringPrintf( 302 SCOPED_TRACE("while checking " + UTF16ToUTF8(RoleVariantToString(role_)));
298 "while checking %s",
299 UTF16ToUTF8(RoleVariantToString(role_)).c_str()));
300 CheckAccessibleName(accessible); 303 CheckAccessibleName(accessible);
301 CheckAccessibleRole(accessible); 304 CheckAccessibleRole(accessible);
302 CheckIA2Role(accessible); 305 CheckIA2Role(accessible);
303 CheckAccessibleValue(accessible); 306 CheckAccessibleValue(accessible);
304 CheckAccessibleState(accessible); 307 CheckAccessibleState(accessible);
305 CheckAccessibleChildren(accessible); 308 CheckAccessibleChildren(accessible);
306 } 309 }
307 310
308 void AccessibleChecker::SetExpectedValue(wstring expected_value) { 311 void AccessibleChecker::SetExpectedValue(const std::wstring& expected_value) {
309 value_ = expected_value; 312 value_ = expected_value;
310 } 313 }
311 314
312 void AccessibleChecker::SetExpectedState(LONG expected_state) { 315 void AccessibleChecker::SetExpectedState(LONG expected_state) {
313 state_ = expected_state; 316 state_ = expected_state;
314 } 317 }
315 318
316 void AccessibleChecker::CheckAccessibleName(IAccessible* accessible) { 319 void AccessibleChecker::CheckAccessibleName(IAccessible* accessible) {
317 base::win::ScopedBstr name; 320 base::win::ScopedBstr name;
318 base::win::ScopedVariant childid_self(CHILDID_SELF); 321 base::win::ScopedVariant childid_self(CHILDID_SELF);
319 HRESULT hr = accessible->get_accName(childid_self, name.Receive()); 322 HRESULT hr = accessible->get_accName(childid_self, name.Receive());
320 323
321 if (name_.empty()) { 324 if (name_.empty()) {
322 // If the object doesn't have name S_FALSE should be returned. 325 // If the object doesn't have name S_FALSE should be returned.
323 EXPECT_EQ(hr, S_FALSE); 326 EXPECT_EQ(S_FALSE, hr);
324 } else { 327 } else {
325 // Test that the correct string was returned. 328 // Test that the correct string was returned.
326 EXPECT_EQ(S_OK, hr); 329 EXPECT_EQ(S_OK, hr);
327 EXPECT_STREQ(name_.c_str(), 330 EXPECT_EQ(name_, std::wstring(name, name.Length()));
328 wstring(name, name.Length()).c_str());
329 } 331 }
330 } 332 }
331 333
332 void AccessibleChecker::CheckAccessibleRole(IAccessible* accessible) { 334 void AccessibleChecker::CheckAccessibleRole(IAccessible* accessible) {
333 base::win::ScopedVariant var_role; 335 base::win::ScopedVariant role;
334 base::win::ScopedVariant childid_self(CHILDID_SELF); 336 base::win::ScopedVariant childid_self(CHILDID_SELF);
335 HRESULT hr = accessible->get_accRole(childid_self, var_role.Receive()); 337 HRESULT hr = accessible->get_accRole(childid_self, role.Receive());
336 ASSERT_EQ(S_OK, hr); 338 ASSERT_EQ(S_OK, hr);
337 EXPECT_EQ(0, role_.Compare(var_role)) 339 EXPECT_EQ(0, role_.Compare(role))
338 << "Expected role: " << RoleVariantToString(role_) 340 << "Expected role: " << RoleVariantToString(role_)
339 << "\nGot role: " << RoleVariantToString(var_role); 341 << "\nGot role: " << RoleVariantToString(role);
340 } 342 }
341 343
342 void AccessibleChecker::CheckIA2Role(IAccessible* accessible) { 344 void AccessibleChecker::CheckIA2Role(IAccessible* accessible) {
343 base::win::ScopedComPtr<IAccessible2> accessible2; 345 base::win::ScopedComPtr<IAccessible2> accessible2;
344 HRESULT hr = QueryIAccessible2(accessible, accessible2.Receive()); 346 HRESULT hr = QueryIAccessible2(accessible, accessible2.Receive());
345 ASSERT_EQ(S_OK, hr); 347 ASSERT_EQ(S_OK, hr);
346 long ia2_role = 0; 348 long ia2_role = 0;
347 hr = accessible2->role(&ia2_role); 349 hr = accessible2->role(&ia2_role);
348 ASSERT_EQ(S_OK, hr); 350 ASSERT_EQ(S_OK, hr);
349 EXPECT_EQ(ia2_role_, ia2_role); 351 EXPECT_EQ(ia2_role_, ia2_role)
350 if (ia2_role_ != ia2_role) { 352 << "Expected ia2 role: " << IAccessible2RoleToString(ia2_role_)
351 LOG(ERROR) << "Expected ia2 role: " << 353 << "\nGot ia2 role: " << IAccessible2RoleToString(ia2_role);
352 IAccessible2RoleToString(ia2_role_);
353 LOG(ERROR) << "Got ia2 role: " <<
354 IAccessible2RoleToString(ia2_role);
355 }
356 } 354 }
357 355
358 void AccessibleChecker::CheckAccessibleValue(IAccessible* accessible) { 356 void AccessibleChecker::CheckAccessibleValue(IAccessible* accessible) {
359 // Don't check the value if if's a DOCUMENT role, because the value 357 // Don't check the value if if's a DOCUMENT role, because the value
360 // is supposed to be the url (and we don't keep track of that in the 358 // is supposed to be the url (and we don't keep track of that in the
361 // test expectations). 359 // test expectations).
362 base::win::ScopedVariant var_role; 360 base::win::ScopedVariant role;
363 base::win::ScopedVariant childid_self(CHILDID_SELF); 361 base::win::ScopedVariant childid_self(CHILDID_SELF);
364 HRESULT hr = accessible->get_accRole(childid_self, var_role.Receive()); 362 HRESULT hr = accessible->get_accRole(childid_self, role.Receive());
365 ASSERT_EQ(S_OK, hr); 363 ASSERT_EQ(S_OK, hr);
366 if (var_role.type() == VT_I4 && 364 if (role.type() == VT_I4 && V_I4(&role) == ROLE_SYSTEM_DOCUMENT)
367 V_I4(&var_role) == ROLE_SYSTEM_DOCUMENT) {
368 return; 365 return;
369 }
370 366
371 // Get the value. 367 // Get the value.
372 base::win::ScopedBstr value; 368 base::win::ScopedBstr value;
373 hr = accessible->get_accValue(childid_self, value.Receive()); 369 hr = accessible->get_accValue(childid_self, value.Receive());
374 EXPECT_EQ(S_OK, hr); 370 EXPECT_EQ(S_OK, hr);
375 371
376 // Test that the correct string was returned. 372 // Test that the correct string was returned.
377 EXPECT_STREQ(value_.c_str(), 373 EXPECT_EQ(value_, std::wstring(value, value.Length()));
378 wstring(value, value.Length()).c_str());
379 } 374 }
380 375
381 void AccessibleChecker::CheckAccessibleState(IAccessible* accessible) { 376 void AccessibleChecker::CheckAccessibleState(IAccessible* accessible) {
382 if (state_ < 0) 377 if (state_ < 0)
383 return; 378 return;
384 379
385 base::win::ScopedVariant var_state; 380 base::win::ScopedVariant state;
386 base::win::ScopedVariant childid_self(CHILDID_SELF); 381 base::win::ScopedVariant childid_self(CHILDID_SELF);
387 HRESULT hr = accessible->get_accState(childid_self, var_state.Receive()); 382 HRESULT hr = accessible->get_accState(childid_self, state.Receive());
388 EXPECT_EQ(S_OK, hr); 383 EXPECT_EQ(S_OK, hr);
389 ASSERT_EQ(VT_I4, var_state.type()); 384 ASSERT_EQ(VT_I4, state.type());
390 LONG obj_state = V_I4(&var_state); 385 LONG obj_state = V_I4(&state);
391 // Avoid flakiness. The "offscreen" state depends on whether the browser 386 // Avoid flakiness. The "offscreen" state depends on whether the browser
392 // window is frontmost or not, and "hottracked" depends on whether the 387 // window is frontmost or not, and "hottracked" depends on whether the
393 // mouse cursor happens to be over the element. 388 // mouse cursor happens to be over the element.
394 obj_state &= ~STATE_SYSTEM_OFFSCREEN; 389 obj_state &= ~(STATE_SYSTEM_OFFSCREEN | STATE_SYSTEM_HOTTRACKED);
395 obj_state &= ~STATE_SYSTEM_HOTTRACKED; 390 EXPECT_EQ(state_, obj_state)
396 EXPECT_EQ(state_, obj_state); 391 << "Expected state: " << IAccessibleStateToString(state_)
397 if (state_ != obj_state) { 392 << "\nGot state: " << IAccessibleStateToString(obj_state);
398 LOG(ERROR) << "Expected state: " << IAccessibleStateToString(state_);
399 LOG(ERROR) << "Got state: " << IAccessibleStateToString(V_I4(&var_state));
400 }
401 } 393 }
402 394
403 void AccessibleChecker::CheckAccessibleChildren(IAccessible* parent) { 395 void AccessibleChecker::CheckAccessibleChildren(IAccessible* parent) {
404 LONG child_count = 0; 396 LONG child_count = 0;
405 HRESULT hr = parent->get_accChildCount(&child_count); 397 HRESULT hr = parent->get_accChildCount(&child_count);
406 EXPECT_EQ(S_OK, hr); 398 EXPECT_EQ(S_OK, hr);
407 ASSERT_EQ(child_count, children_.size()); 399 ASSERT_EQ(child_count, children_.size());
408 400
409 auto_ptr<VARIANT> child_array(new VARIANT[child_count]); 401 scoped_ptr<VARIANT[]> child_array(new VARIANT[child_count]);
410 LONG obtained_count = 0; 402 LONG obtained_count = 0;
411 hr = AccessibleChildren(parent, 0, child_count, 403 hr = AccessibleChildren(parent, 0, child_count,
412 child_array.get(), &obtained_count); 404 child_array.get(), &obtained_count);
413 ASSERT_EQ(S_OK, hr); 405 ASSERT_EQ(S_OK, hr);
414 ASSERT_EQ(child_count, obtained_count); 406 ASSERT_EQ(child_count, obtained_count);
415 407
416 VARIANT* child = child_array.get(); 408 VARIANT* child = child_array.get();
417 for (AccessibleCheckerVector::iterator child_checker = children_.begin(); 409 for (AccessibleCheckerVector::iterator child_checker = children_.begin();
418 child_checker != children_.end(); 410 child_checker != children_.end();
419 ++child_checker, ++child) { 411 ++child_checker, ++child) {
420 base::win::ScopedComPtr<IAccessible> child_accessible( 412 base::win::ScopedComPtr<IAccessible> child_accessible(
421 GetAccessibleFromResultVariant(parent, child)); 413 GetAccessibleFromResultVariant(parent, child));
422 ASSERT_TRUE(child_accessible.get()); 414 ASSERT_TRUE(child_accessible.get());
423 (*child_checker)->CheckAccessible(child_accessible); 415 (*child_checker)->CheckAccessible(child_accessible);
424 } 416 }
425 } 417 }
426 418
427 string16 AccessibleChecker::RoleVariantToString( 419 string16 AccessibleChecker::RoleVariantToString(
428 const base::win::ScopedVariant& role_variant) { 420 const base::win::ScopedVariant& role) {
429 if (role_variant.type() == VT_I4) 421 if (role.type() == VT_I4)
430 return IAccessibleRoleToString(V_I4(&role_variant)); 422 return IAccessibleRoleToString(V_I4(&role));
431 else if (role_variant.type() == VT_BSTR) 423 if (role.type() == VT_BSTR)
432 return string16(V_BSTR(&role_variant), SysStringLen(V_BSTR(&role_variant))); 424 return string16(V_BSTR(&role), SysStringLen(V_BSTR(&role)));
433 return string16(); 425 return string16();
434 } 426 }
435 427
428 } // namespace
429
430
431 // Tests ----------------------------------------------------------------------
432
436 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, 433 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
437 MAYBE(TestBusyAccessibilityTree)) { 434 MAYBE(TestBusyAccessibilityTree)) {
438 NavigateToURL(shell(), GURL(chrome::kAboutBlankURL)); 435 NavigateToURL(shell(), GURL(chrome::kAboutBlankURL));
439 436
440 // The initial accessible returned should have state STATE_SYSTEM_BUSY while 437 // The initial accessible returned should have state STATE_SYSTEM_BUSY while
441 // the accessibility tree is being requested from the renderer. 438 // the accessibility tree is being requested from the renderer.
442 AccessibleChecker document1_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); 439 AccessibleChecker document1_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT,
440 std::wstring());
443 document1_checker.SetExpectedState( 441 document1_checker.SetExpectedState(
444 STATE_SYSTEM_READONLY | STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED | 442 STATE_SYSTEM_READONLY | STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED |
445 STATE_SYSTEM_BUSY); 443 STATE_SYSTEM_BUSY);
446 document1_checker.CheckAccessible(GetRendererAccessible()); 444 document1_checker.CheckAccessible(GetRendererAccessible());
447 } 445 }
448 446
449 // Flaky, http://crbug.com/167320 . 447 // Flaky, http://crbug.com/167320 .
450 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, 448 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
451 DISABLED_TestRendererAccessibilityTree) { 449 DISABLED_TestRendererAccessibilityTree) {
452 LoadInitialAccessibilityTreeFromHtml( 450 LoadInitialAccessibilityTreeFromHtml(
453 "<html><head><title>Accessibility Win Test</title></head>" 451 "<html><head><title>Accessibility Win Test</title></head>"
454 "<body><input type='button' value='push' /><input type='checkbox' />" 452 "<body><input type='button' value='push' /><input type='checkbox' />"
455 "</body></html>"); 453 "</body></html>");
456 454
457 // Check the browser's copy of the renderer accessibility tree. 455 // Check the browser's copy of the renderer accessibility tree.
458 AccessibleChecker button_checker(L"push", ROLE_SYSTEM_PUSHBUTTON, L""); 456 AccessibleChecker button_checker(L"push", ROLE_SYSTEM_PUSHBUTTON,
459 AccessibleChecker checkbox_checker(L"", ROLE_SYSTEM_CHECKBUTTON, L""); 457 std::wstring());
460 AccessibleChecker body_checker(L"", L"body", IA2_ROLE_SECTION, L""); 458 AccessibleChecker checkbox_checker(std::wstring(), ROLE_SYSTEM_CHECKBUTTON,
461 AccessibleChecker document2_checker( 459 std::wstring());
462 L"Accessibility Win Test", ROLE_SYSTEM_DOCUMENT, L""); 460 AccessibleChecker body_checker(std::wstring(), L"body", IA2_ROLE_SECTION,
461 std::wstring());
462 AccessibleChecker document2_checker(L"Accessibility Win Test",
463 ROLE_SYSTEM_DOCUMENT, std::wstring());
463 body_checker.AppendExpectedChild(&button_checker); 464 body_checker.AppendExpectedChild(&button_checker);
464 body_checker.AppendExpectedChild(&checkbox_checker); 465 body_checker.AppendExpectedChild(&checkbox_checker);
465 document2_checker.AppendExpectedChild(&body_checker); 466 document2_checker.AppendExpectedChild(&body_checker);
466 document2_checker.CheckAccessible(GetRendererAccessible()); 467 document2_checker.CheckAccessible(GetRendererAccessible());
467 468
468 // Check that document accessible has a parent accessible. 469 // Check that document accessible has a parent accessible.
469 base::win::ScopedComPtr<IAccessible> document_accessible( 470 base::win::ScopedComPtr<IAccessible> document_accessible(
470 GetRendererAccessible()); 471 GetRendererAccessible());
471 ASSERT_NE(document_accessible.get(), reinterpret_cast<IAccessible*>(NULL)); 472 ASSERT_NE(document_accessible.get(), reinterpret_cast<IAccessible*>(NULL));
472 base::win::ScopedComPtr<IDispatch> parent_dispatch; 473 base::win::ScopedComPtr<IDispatch> parent_dispatch;
(...skipping 14 matching lines...) Expand all
487 } 488 }
488 489
489 // Periodically failing. See crbug.com/145537 490 // Periodically failing. See crbug.com/145537
490 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, 491 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
491 DISABLED_TestNotificationActiveDescendantChanged) { 492 DISABLED_TestNotificationActiveDescendantChanged) {
492 LoadInitialAccessibilityTreeFromHtml( 493 LoadInitialAccessibilityTreeFromHtml(
493 "<ul tabindex='-1' role='radiogroup' aria-label='ul'>" 494 "<ul tabindex='-1' role='radiogroup' aria-label='ul'>"
494 "<li id='li'>li</li></ul>"); 495 "<li id='li'>li</li></ul>");
495 496
496 // Check the browser's copy of the renderer accessibility tree. 497 // Check the browser's copy of the renderer accessibility tree.
497 AccessibleChecker list_marker_checker(L"\x2022", ROLE_SYSTEM_TEXT, L""); 498 AccessibleChecker list_marker_checker(L"\x2022", ROLE_SYSTEM_TEXT,
498 AccessibleChecker static_text_checker(L"li", ROLE_SYSTEM_TEXT, L""); 499 std::wstring());
499 AccessibleChecker list_item_checker(L"", ROLE_SYSTEM_LISTITEM, L""); 500 AccessibleChecker static_text_checker(L"li", ROLE_SYSTEM_TEXT,
500 list_item_checker.SetExpectedState( 501 std::wstring());
501 STATE_SYSTEM_READONLY); 502 AccessibleChecker list_item_checker(std::wstring(), ROLE_SYSTEM_LISTITEM,
503 std::wstring());
504 list_item_checker.SetExpectedState(STATE_SYSTEM_READONLY);
502 AccessibleChecker radio_group_checker(L"ul", ROLE_SYSTEM_GROUPING, 505 AccessibleChecker radio_group_checker(L"ul", ROLE_SYSTEM_GROUPING,
503 IA2_ROLE_SECTION, L""); 506 IA2_ROLE_SECTION, std::wstring());
504 radio_group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); 507 radio_group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE);
505 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); 508 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT,
509 std::wstring());
506 list_item_checker.AppendExpectedChild(&list_marker_checker); 510 list_item_checker.AppendExpectedChild(&list_marker_checker);
507 list_item_checker.AppendExpectedChild(&static_text_checker); 511 list_item_checker.AppendExpectedChild(&static_text_checker);
508 radio_group_checker.AppendExpectedChild(&list_item_checker); 512 radio_group_checker.AppendExpectedChild(&list_item_checker);
509 document_checker.AppendExpectedChild(&radio_group_checker); 513 document_checker.AppendExpectedChild(&radio_group_checker);
510 document_checker.CheckAccessible(GetRendererAccessible()); 514 document_checker.CheckAccessible(GetRendererAccessible());
511 515
512 // Set focus to the radio group. 516 // Set focus to the radio group.
513 scoped_refptr<MessageLoopRunner> loop_runner(new MessageLoopRunner); 517 scoped_refptr<MessageLoopRunner> loop_runner(new MessageLoopRunner);
514 WebContents* web_contents = shell()->web_contents(); 518 WebContents* web_contents = shell()->web_contents();
515 RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>( 519 RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>(
(...skipping 22 matching lines...) Expand all
538 radio_group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); 542 radio_group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE);
539 document_checker.CheckAccessible(GetRendererAccessible()); 543 document_checker.CheckAccessible(GetRendererAccessible());
540 } 544 }
541 545
542 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, 546 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
543 MAYBE(TestNotificationCheckedStateChanged)) { 547 MAYBE(TestNotificationCheckedStateChanged)) {
544 LoadInitialAccessibilityTreeFromHtml( 548 LoadInitialAccessibilityTreeFromHtml(
545 "<body><input type='checkbox' /></body>"); 549 "<body><input type='checkbox' /></body>");
546 550
547 // Check the browser's copy of the renderer accessibility tree. 551 // Check the browser's copy of the renderer accessibility tree.
548 AccessibleChecker checkbox_checker(L"", ROLE_SYSTEM_CHECKBUTTON, L""); 552 AccessibleChecker checkbox_checker(std::wstring(), ROLE_SYSTEM_CHECKBUTTON,
553 std::wstring());
549 checkbox_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); 554 checkbox_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE);
550 AccessibleChecker body_checker(L"", L"body", IA2_ROLE_SECTION, L""); 555 AccessibleChecker body_checker(std::wstring(), L"body", IA2_ROLE_SECTION,
551 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); 556 std::wstring());
557 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT,
558 std::wstring());
552 body_checker.AppendExpectedChild(&checkbox_checker); 559 body_checker.AppendExpectedChild(&checkbox_checker);
553 document_checker.AppendExpectedChild(&body_checker); 560 document_checker.AppendExpectedChild(&body_checker);
554 document_checker.CheckAccessible(GetRendererAccessible()); 561 document_checker.CheckAccessible(GetRendererAccessible());
555 562
556 // Check the checkbox. 563 // Check the checkbox.
557 scoped_refptr<MessageLoopRunner> loop_runner(new MessageLoopRunner); 564 scoped_refptr<MessageLoopRunner> loop_runner(new MessageLoopRunner);
558 WebContents* web_contents = shell()->web_contents(); 565 WebContents* web_contents = shell()->web_contents();
559 RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>( 566 RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>(
560 web_contents->GetRenderViewHost()); 567 web_contents->GetRenderViewHost());
561 view_host->SetAccessibilityOtherCallbackForTesting( 568 view_host->SetAccessibilityOtherCallbackForTesting(
562 loop_runner->QuitClosure()); 569 loop_runner->QuitClosure());
563 ExecuteScript(L"document.body.children[0].checked=true"); 570 ExecuteScript(L"document.body.children[0].checked=true");
564 loop_runner->Run(); 571 loop_runner->Run();
565 572
566 // Check that the accessibility tree of the browser has been updated. 573 // Check that the accessibility tree of the browser has been updated.
567 checkbox_checker.SetExpectedState( 574 checkbox_checker.SetExpectedState(
568 STATE_SYSTEM_CHECKED | STATE_SYSTEM_FOCUSABLE); 575 STATE_SYSTEM_CHECKED | STATE_SYSTEM_FOCUSABLE);
569 document_checker.CheckAccessible(GetRendererAccessible()); 576 document_checker.CheckAccessible(GetRendererAccessible());
570 } 577 }
571 578
572 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, 579 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
573 MAYBE(TestNotificationChildrenChanged)) { 580 MAYBE(TestNotificationChildrenChanged)) {
574 // The role attribute causes the node to be in the accessibility tree. 581 // The role attribute causes the node to be in the accessibility tree.
575 LoadInitialAccessibilityTreeFromHtml("<body role=group></body>"); 582 LoadInitialAccessibilityTreeFromHtml("<body role=group></body>");
576 583
577 // Check the browser's copy of the renderer accessibility tree. 584 // Check the browser's copy of the renderer accessibility tree.
578 AccessibleChecker group_checker(L"", ROLE_SYSTEM_GROUPING, L""); 585 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING,
579 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); 586 std::wstring());
587 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT,
588 std::wstring());
580 document_checker.AppendExpectedChild(&group_checker); 589 document_checker.AppendExpectedChild(&group_checker);
581 document_checker.CheckAccessible(GetRendererAccessible()); 590 document_checker.CheckAccessible(GetRendererAccessible());
582 591
583 // Change the children of the document body. 592 // Change the children of the document body.
584 scoped_refptr<MessageLoopRunner> loop_runner(new MessageLoopRunner); 593 scoped_refptr<MessageLoopRunner> loop_runner(new MessageLoopRunner);
585 WebContents* web_contents = shell()->web_contents(); 594 WebContents* web_contents = shell()->web_contents();
586 RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>( 595 RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>(
587 web_contents->GetRenderViewHost()); 596 web_contents->GetRenderViewHost());
588 view_host->SetAccessibilityOtherCallbackForTesting( 597 view_host->SetAccessibilityOtherCallbackForTesting(
589 loop_runner->QuitClosure()); 598 loop_runner->QuitClosure());
590 ExecuteScript(L"document.body.innerHTML='<b>new text</b>'"); 599 ExecuteScript(L"document.body.innerHTML='<b>new text</b>'");
591 loop_runner->Run(); 600 loop_runner->Run();
592 601
593 // Check that the accessibility tree of the browser has been updated. 602 // Check that the accessibility tree of the browser has been updated.
594 AccessibleChecker text_checker(L"new text", ROLE_SYSTEM_TEXT, L""); 603 AccessibleChecker text_checker(L"new text", ROLE_SYSTEM_TEXT, std::wstring());
595 group_checker.AppendExpectedChild(&text_checker); 604 group_checker.AppendExpectedChild(&text_checker);
596 document_checker.CheckAccessible(GetRendererAccessible()); 605 document_checker.CheckAccessible(GetRendererAccessible());
597 } 606 }
598 607
599 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, 608 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
600 MAYBE(TestNotificationChildrenChanged2)) { 609 MAYBE(TestNotificationChildrenChanged2)) {
601 // The role attribute causes the node to be in the accessibility tree. 610 // The role attribute causes the node to be in the accessibility tree.
602 LoadInitialAccessibilityTreeFromHtml( 611 LoadInitialAccessibilityTreeFromHtml(
603 "<div role=group style='visibility: hidden'>text</div>"); 612 "<div role=group style='visibility: hidden'>text</div>");
604 613
605 // Check the accessible tree of the browser. 614 // Check the accessible tree of the browser.
606 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); 615 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT,
616 std::wstring());
607 document_checker.CheckAccessible(GetRendererAccessible()); 617 document_checker.CheckAccessible(GetRendererAccessible());
608 618
609 // Change the children of the document body. 619 // Change the children of the document body.
610 scoped_refptr<MessageLoopRunner> loop_runner(new MessageLoopRunner); 620 scoped_refptr<MessageLoopRunner> loop_runner(new MessageLoopRunner);
611 WebContents* web_contents = shell()->web_contents(); 621 WebContents* web_contents = shell()->web_contents();
612 RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>( 622 RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>(
613 web_contents->GetRenderViewHost()); 623 web_contents->GetRenderViewHost());
614 view_host->SetAccessibilityOtherCallbackForTesting( 624 view_host->SetAccessibilityOtherCallbackForTesting(
615 loop_runner->QuitClosure()); 625 loop_runner->QuitClosure());
616 ExecuteScript(L"document.body.children[0].style.visibility='visible'"); 626 ExecuteScript(L"document.body.children[0].style.visibility='visible'");
617 loop_runner->Run(); 627 loop_runner->Run();
618 628
619 // Check that the accessibility tree of the browser has been updated. 629 // Check that the accessibility tree of the browser has been updated.
620 AccessibleChecker static_text_checker(L"text", ROLE_SYSTEM_TEXT, L""); 630 AccessibleChecker static_text_checker(L"text", ROLE_SYSTEM_TEXT,
621 AccessibleChecker group_checker(L"", ROLE_SYSTEM_GROUPING, L""); 631 std::wstring());
632 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING,
633 std::wstring());
622 document_checker.AppendExpectedChild(&group_checker); 634 document_checker.AppendExpectedChild(&group_checker);
623 group_checker.AppendExpectedChild(&static_text_checker); 635 group_checker.AppendExpectedChild(&static_text_checker);
624 document_checker.CheckAccessible(GetRendererAccessible()); 636 document_checker.CheckAccessible(GetRendererAccessible());
625 } 637 }
626 638
627 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, 639 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
628 MAYBE(TestNotificationFocusChanged)) { 640 MAYBE(TestNotificationFocusChanged)) {
629 // The role attribute causes the node to be in the accessibility tree. 641 // The role attribute causes the node to be in the accessibility tree.
630 LoadInitialAccessibilityTreeFromHtml("<div role=group tabindex='-1'></div>"); 642 LoadInitialAccessibilityTreeFromHtml("<div role=group tabindex='-1'></div>");
631 643
632 // Check the browser's copy of the renderer accessibility tree. 644 // Check the browser's copy of the renderer accessibility tree.
633 SCOPED_TRACE("Check initial tree"); 645 SCOPED_TRACE("Check initial tree");
634 AccessibleChecker group_checker(L"", ROLE_SYSTEM_GROUPING, L""); 646 AccessibleChecker group_checker(std::wstring(), ROLE_SYSTEM_GROUPING,
647 std::wstring());
635 group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); 648 group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE);
636 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); 649 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT,
650 std::wstring());
637 document_checker.AppendExpectedChild(&group_checker); 651 document_checker.AppendExpectedChild(&group_checker);
638 document_checker.CheckAccessible(GetRendererAccessible()); 652 document_checker.CheckAccessible(GetRendererAccessible());
639 653
640 // Focus the div in the document 654 // Focus the div in the document
641 scoped_refptr<MessageLoopRunner> loop_runner(new MessageLoopRunner); 655 scoped_refptr<MessageLoopRunner> loop_runner(new MessageLoopRunner);
642 WebContents* web_contents = shell()->web_contents(); 656 WebContents* web_contents = shell()->web_contents();
643 RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>( 657 RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>(
644 web_contents->GetRenderViewHost()); 658 web_contents->GetRenderViewHost());
645 view_host->SetAccessibilityOtherCallbackForTesting( 659 view_host->SetAccessibilityOtherCallbackForTesting(
646 loop_runner->QuitClosure()); 660 loop_runner->QuitClosure());
(...skipping 23 matching lines...) Expand all
670 group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); 684 group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE);
671 document_checker.CheckAccessible(GetRendererAccessible()); 685 document_checker.CheckAccessible(GetRendererAccessible());
672 } 686 }
673 687
674 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, 688 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
675 MAYBE(TestNotificationValueChanged)) { 689 MAYBE(TestNotificationValueChanged)) {
676 LoadInitialAccessibilityTreeFromHtml( 690 LoadInitialAccessibilityTreeFromHtml(
677 "<body><input type='text' value='old value'/></body>"); 691 "<body><input type='text' value='old value'/></body>");
678 692
679 // Check the browser's copy of the renderer accessibility tree. 693 // Check the browser's copy of the renderer accessibility tree.
680 AccessibleChecker text_field_checker(L"", ROLE_SYSTEM_TEXT, L"old value"); 694 AccessibleChecker text_field_checker(std::wstring(), ROLE_SYSTEM_TEXT,
695 L"old value");
681 text_field_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE); 696 text_field_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE);
682 AccessibleChecker body_checker(L"", L"body", IA2_ROLE_SECTION, L""); 697 AccessibleChecker body_checker(std::wstring(), L"body", IA2_ROLE_SECTION,
683 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); 698 std::wstring());
699 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT,
700 std::wstring());
684 body_checker.AppendExpectedChild(&text_field_checker); 701 body_checker.AppendExpectedChild(&text_field_checker);
685 document_checker.AppendExpectedChild(&body_checker); 702 document_checker.AppendExpectedChild(&body_checker);
686 document_checker.CheckAccessible(GetRendererAccessible()); 703 document_checker.CheckAccessible(GetRendererAccessible());
687 704
688 // Set the value of the text control 705 // Set the value of the text control
689 scoped_refptr<MessageLoopRunner> loop_runner(new MessageLoopRunner); 706 scoped_refptr<MessageLoopRunner> loop_runner(new MessageLoopRunner);
690 WebContents* web_contents = shell()->web_contents(); 707 WebContents* web_contents = shell()->web_contents();
691 RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>( 708 RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>(
692 web_contents->GetRenderViewHost()); 709 web_contents->GetRenderViewHost());
693 view_host->SetAccessibilityOtherCallbackForTesting( 710 view_host->SetAccessibilityOtherCallbackForTesting(
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 RecursiveFindNodeInAccessibilityTree( 745 RecursiveFindNodeInAccessibilityTree(
729 browser_accessible.get(), ROLE_SYSTEM_DOCUMENT, L"MyDocument", 0, &found); 746 browser_accessible.get(), ROLE_SYSTEM_DOCUMENT, L"MyDocument", 0, &found);
730 ASSERT_EQ(found, true); 747 ASSERT_EQ(found, true);
731 } 748 }
732 749
733 // Disabled because of http://crbug.com/144390. 750 // Disabled because of http://crbug.com/144390.
734 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, 751 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
735 DISABLED_TestToggleButtonRoleAndStates) { 752 DISABLED_TestToggleButtonRoleAndStates) {
736 AccessibleChecker* button_checker; 753 AccessibleChecker* button_checker;
737 std::string button_html("data:text/html,"); 754 std::string button_html("data:text/html,");
738 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); 755 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT,
739 AccessibleChecker body_checker(L"", L"body", IA2_ROLE_SECTION, L""); 756 std::wstring());
757 AccessibleChecker body_checker(std::wstring(), L"body", IA2_ROLE_SECTION,
758 std::wstring());
740 document_checker.AppendExpectedChild(&body_checker); 759 document_checker.AppendExpectedChild(&body_checker);
741 760
742 // Temporary macro 761 // Temporary macro
743 #define ADD_BUTTON(html, ia2_role, state) \ 762 #define ADD_BUTTON(html, ia2_role, state) \
744 button_html += html; \ 763 button_html += html; \
745 button_checker = new AccessibleChecker(L"x", ROLE_SYSTEM_PUSHBUTTON, \ 764 button_checker = new AccessibleChecker(L"x", ROLE_SYSTEM_PUSHBUTTON, \
746 ia2_role, L""); \ 765 ia2_role, std::wstring()); \
747 button_checker->SetExpectedState(state); \ 766 button_checker->SetExpectedState(state); \
748 body_checker.AppendExpectedChild(button_checker) 767 body_checker.AppendExpectedChild(button_checker)
749 768
750 // If aria-pressed is 'undefined', empty or not present, use PUSHBUTTON 769 // If aria-pressed is 'undefined', empty or not present, use PUSHBUTTON
751 // Otherwise use TOGGLE_BUTTON, even if the value is invalid. 770 // Otherwise use TOGGLE_BUTTON, even if the value is invalid.
752 // The spec does this in an attempt future-proof in case new values are added. 771 // The spec does this in an attempt future-proof in case new values are added.
753 ADD_BUTTON("<span role='button' aria-pressed='false'>x</span>", 772 ADD_BUTTON("<span role='button' aria-pressed='false'>x</span>",
754 IA2_ROLE_TOGGLE_BUTTON, 0); 773 IA2_ROLE_TOGGLE_BUTTON, 0);
755 ADD_BUTTON("<span role='button' aria-pressed='true'>x</span>", 774 ADD_BUTTON("<span role='button' aria-pressed='true'>x</span>",
756 IA2_ROLE_TOGGLE_BUTTON, STATE_SYSTEM_PRESSED); 775 IA2_ROLE_TOGGLE_BUTTON, STATE_SYSTEM_PRESSED);
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
842 node_value.Reset(); 861 node_value.Reset();
843 862
844 base::win::ScopedComPtr<ISimpleDOMNode> body_isimpledomnode; 863 base::win::ScopedComPtr<ISimpleDOMNode> body_isimpledomnode;
845 hr = document_isimpledomnode->get_firstChild( 864 hr = document_isimpledomnode->get_firstChild(
846 body_isimpledomnode.Receive()); 865 body_isimpledomnode.Receive());
847 ASSERT_EQ(S_OK, hr); 866 ASSERT_EQ(S_OK, hr);
848 hr = body_isimpledomnode->get_nodeInfo( 867 hr = body_isimpledomnode->get_nodeInfo(
849 node_name.Receive(), &name_space_id, node_value.Receive(), &num_children, 868 node_name.Receive(), &name_space_id, node_value.Receive(), &num_children,
850 &unique_id, &node_type); 869 &unique_id, &node_type);
851 ASSERT_EQ(S_OK, hr); 870 ASSERT_EQ(S_OK, hr);
852 EXPECT_STREQ(L"body", wstring(node_name, node_name.Length()).c_str()); 871 EXPECT_EQ(L"body", std::wstring(node_name, node_name.Length()));
853 EXPECT_EQ(NODETYPE_ELEMENT, node_type); 872 EXPECT_EQ(NODETYPE_ELEMENT, node_type);
854 EXPECT_EQ(1, num_children); 873 EXPECT_EQ(1, num_children);
855 node_name.Reset(); 874 node_name.Reset();
856 node_value.Reset(); 875 node_value.Reset();
857 876
858 base::win::ScopedComPtr<ISimpleDOMNode> checkbox_isimpledomnode; 877 base::win::ScopedComPtr<ISimpleDOMNode> checkbox_isimpledomnode;
859 hr = body_isimpledomnode->get_firstChild( 878 hr = body_isimpledomnode->get_firstChild(
860 checkbox_isimpledomnode.Receive()); 879 checkbox_isimpledomnode.Receive());
861 ASSERT_EQ(S_OK, hr); 880 ASSERT_EQ(S_OK, hr);
862 hr = checkbox_isimpledomnode->get_nodeInfo( 881 hr = checkbox_isimpledomnode->get_nodeInfo(
863 node_name.Receive(), &name_space_id, node_value.Receive(), &num_children, 882 node_name.Receive(), &name_space_id, node_value.Receive(), &num_children,
864 &unique_id, &node_type); 883 &unique_id, &node_type);
865 ASSERT_EQ(S_OK, hr); 884 ASSERT_EQ(S_OK, hr);
866 EXPECT_STREQ(L"input", wstring(node_name, node_name.Length()).c_str()); 885 EXPECT_EQ(L"input", std::wstring(node_name, node_name.Length()));
867 EXPECT_EQ(NODETYPE_ELEMENT, node_type); 886 EXPECT_EQ(NODETYPE_ELEMENT, node_type);
868 EXPECT_EQ(0, num_children); 887 EXPECT_EQ(0, num_children);
869 } 888 }
870 889
871 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, MAYBE(TestRoleGroup)) { 890 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, MAYBE(TestRoleGroup)) {
872 LoadInitialAccessibilityTreeFromHtml( 891 LoadInitialAccessibilityTreeFromHtml(
873 "<fieldset></fieldset><div role=group></div>"); 892 "<fieldset></fieldset><div role=group></div>");
874 893
875 // Check the browser's copy of the renderer accessibility tree. 894 // Check the browser's copy of the renderer accessibility tree.
876 AccessibleChecker grouping1_checker(L"", ROLE_SYSTEM_GROUPING, L""); 895 AccessibleChecker grouping1_checker(std::wstring(), ROLE_SYSTEM_GROUPING,
877 AccessibleChecker grouping2_checker(L"", ROLE_SYSTEM_GROUPING, L""); 896 std::wstring());
878 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); 897 AccessibleChecker grouping2_checker(std::wstring(), ROLE_SYSTEM_GROUPING,
898 std::wstring());
899 AccessibleChecker document_checker(std::wstring(), ROLE_SYSTEM_DOCUMENT,
900 std::wstring());
879 document_checker.AppendExpectedChild(&grouping1_checker); 901 document_checker.AppendExpectedChild(&grouping1_checker);
880 document_checker.AppendExpectedChild(&grouping2_checker); 902 document_checker.AppendExpectedChild(&grouping2_checker);
881 document_checker.CheckAccessible(GetRendererAccessible()); 903 document_checker.CheckAccessible(GetRendererAccessible());
882 } 904 }
883 } // namespace.
884 905
885 } // namespace content 906 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/browser/accessibility/browser_accessibility_win_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698