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

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

Issue 1806001: Add browser test to verify that MSAA clients can correctly retrieve accessibi... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 7 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 | chrome/chrome_tests.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include <atlbase.h>
6 #include <vector>
7
8 #include "base/file_path.h"
9 #include "base/scoped_comptr_win.h"
10 #include "chrome/browser/browser.h"
11 #include "chrome/browser/browser_window.h"
12 #include "chrome/browser/renderer_host/render_widget_host_view_win.h"
13 #include "chrome/browser/tab_contents/tab_contents.h"
14 #include "chrome/common/chrome_switches.h"
15 #include "chrome/test/in_process_browser_test.h"
16 #include "chrome/test/ui_test_utils.h"
17
18 namespace {
19
20 class AccessibilityWinBrowserTest : public InProcessBrowserTest {
21 public:
22 void SetUpCommandLine(CommandLine* command_line) {
23 // Turns on the accessibility in the renderer. Off by default until
24 // http://b/issue?id=1432077 is fixed.
25 command_line->AppendSwitch(switches::kEnableRendererAccessibility);
26 }
27
28 protected:
29 IAccessible* GetRenderWidgetHostViewClientAccessible();
30 };
31
32 class AccessibleChecker {
33 public:
34 AccessibleChecker(std::wstring expected_name, int32 expected_role);
35
36 // Append an AccessibleChecker that verifies accessibility information for
37 // a child IAccessible. Order is important.
38 void AppendExpectedChild(AccessibleChecker* expected_child);
39
40 // Check that the name and role of the given IAccessible instance and its
41 // descendants match the expected names and roles that this object was
42 // initialized with.
43 void CheckAccessible(IAccessible* accessible);
44
45 typedef std::vector<AccessibleChecker*> AccessibleCheckerVector;
46
47 private:
48 void CheckAccessibleName(IAccessible* accessible);
49 void CheckAccessibleRole(IAccessible* accessible);
50 void CheckAccessibleChildren(IAccessible* accessible);
51
52 private:
53 // Expected accessible name. Checked against IAccessible::get_accName.
54 std::wstring name_;
55
56 // Expected accessible role. Checked against IAccessible::get_accRole.
57 int32 role_;
58
59 // Expected accessible children. Checked using IAccessible::get_accChildCount
60 // and ::AccessibleChildren.
61 AccessibleCheckerVector children_;
62 };
63
64 VARIANT CreateI4Variant(LONG value) {
65 VARIANT variant = {0};
66
67 V_VT(&variant) = VT_I4;
68 V_I4(&variant) = value;
69
70 return variant;
71 }
72
73 IAccessible* GetAccessibleFromResultVariant(IAccessible* parent, VARIANT *var) {
74 switch (V_VT(var)) {
75 case VT_DISPATCH:
76 return CComQIPtr<IAccessible>(V_DISPATCH(var)).Detach();
77 break;
78
79 case VT_I4: {
80 CComPtr<IDispatch> dispatch;
81 HRESULT hr = parent->get_accChild(CreateI4Variant(V_I4(var)), &dispatch);
82 EXPECT_EQ(hr, S_OK);
83 return CComQIPtr<IAccessible>(dispatch).Detach();
84 break;
85 }
86 }
87
88 return NULL;
89 }
90
91 // Retrieve the MSAA client accessibility object for the Render Widget Host View
92 // of the selected tab.
93 IAccessible*
94 AccessibilityWinBrowserTest::GetRenderWidgetHostViewClientAccessible() {
95 HWND hwnd_render_widget_host_view =
96 browser()->GetSelectedTabContents()->GetRenderWidgetHostView()->
97 GetNativeView();
98
99 IAccessible* accessible;
100 HRESULT hr = AccessibleObjectFromWindow(
101 hwnd_render_widget_host_view, OBJID_CLIENT,
102 IID_IAccessible, reinterpret_cast<void**>(&accessible));
103 EXPECT_EQ(S_OK, hr);
104 EXPECT_NE(accessible, reinterpret_cast<IAccessible*>(NULL));
105
106 return accessible;
107 }
108
109 AccessibleChecker::AccessibleChecker(
110 std::wstring expected_name, int32 expected_role) :
111 name_(expected_name),
112 role_(expected_role) {
113 }
114
115 void AccessibleChecker::AppendExpectedChild(
116 AccessibleChecker* expected_child) {
117 children_.push_back(expected_child);
118 }
119
120 void AccessibleChecker::CheckAccessible(IAccessible* accessible) {
121 CheckAccessibleName(accessible);
122 CheckAccessibleRole(accessible);
123 CheckAccessibleChildren(accessible);
124 }
125
126 void AccessibleChecker::CheckAccessibleName(IAccessible* accessible) {
127 CComBSTR name;
128 HRESULT hr =
129 accessible->get_accName(CreateI4Variant(CHILDID_SELF), &name);
130
131 if (name_.empty()) {
132 // If the object doesn't have name S_FALSE should be returned.
133 EXPECT_EQ(hr, S_FALSE);
134 } else {
135 // Test that the correct string was returned.
136 EXPECT_EQ(hr, S_OK);
137 EXPECT_EQ(CompareString(LOCALE_NEUTRAL, 0, name, SysStringLen(name),
138 name_.c_str(), name_.length()),
139 CSTR_EQUAL);
140 }
141 }
142
143 void AccessibleChecker::CheckAccessibleRole(IAccessible* accessible) {
144 VARIANT var_role = {0};
145 HRESULT hr =
146 accessible->get_accRole(CreateI4Variant(CHILDID_SELF), &var_role);
147 EXPECT_EQ(hr, S_OK);
148 EXPECT_EQ(V_VT(&var_role), VT_I4);
149 EXPECT_EQ(V_I4(&var_role), role_);
150 }
151
152 void AccessibleChecker::CheckAccessibleChildren(IAccessible* parent) {
153 LONG child_count = 0;
154 HRESULT hr = parent->get_accChildCount(&child_count);
155 EXPECT_EQ(hr, S_OK);
156 ASSERT_EQ(child_count, children_.size());
157
158 std::auto_ptr<VARIANT> child_array(new VARIANT[child_count]);
159 LONG obtained_count = 0;
160 hr = AccessibleChildren(parent, 0, child_count,
161 child_array.get(), &obtained_count);
162 ASSERT_EQ(hr, S_OK);
163 ASSERT_EQ(child_count, obtained_count);
164
165 VARIANT* child = child_array.get();
166 for (AccessibleCheckerVector::iterator child_checker = children_.begin();
167 child_checker != children_.end();
168 ++child_checker, ++child) {
169 ScopedComPtr<IAccessible> child_accessible;
170 child_accessible.Attach(GetAccessibleFromResultVariant(parent, child));
171 (*child_checker)->CheckAccessible(child_accessible);
172 }
173 }
174
175 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
176 TestRendererAccessibilityTree) {
177 GURL tree_url(
178 "data:text/html,<html><head><title>Accessibility Win Test</title></head>"
179 "<body><input type='button' value='push' /><input type='checkbox' />"
180 "</body></html>");
181 ui_test_utils::NavigateToURL(browser(), tree_url);
182
183 ScopedComPtr<IAccessible> document_accessible(
184 GetRenderWidgetHostViewClientAccessible());
185
186 AccessibleChecker button_checker(L"push", ROLE_SYSTEM_PUSHBUTTON);
187 AccessibleChecker checkbox_checker(L"", ROLE_SYSTEM_CHECKBUTTON);
188
189 AccessibleChecker grouping_checker(L"", ROLE_SYSTEM_GROUPING);
190 grouping_checker.AppendExpectedChild(&button_checker);
191 grouping_checker.AppendExpectedChild(&checkbox_checker);
192
193 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT);
194 document_checker.AppendExpectedChild(&grouping_checker);
195
196 // Check the accessible tree of the renderer.
197 document_checker.CheckAccessible(document_accessible);
198
199 // Check that document accessible has a parent accessible.
200 ScopedComPtr<IDispatch> parent_dispatch;
201 HRESULT hr = document_accessible->get_accParent(parent_dispatch.Receive());
202 EXPECT_EQ(hr, S_OK);
203 EXPECT_NE(parent_dispatch, reinterpret_cast<IDispatch*>(NULL));
204
205 // Navigate to another page.
206 GURL about_url("about:");
207 ui_test_utils::NavigateToURL(browser(), about_url);
208
209 // Verify that the IAccessible reference still points to a valid object and
210 // that it calls to its methods fail since the tree is no longer valid after
211 // the page navagation.
212 // Todo(ctguil): Currently this is giving a false positive because E_FAIL is
213 // returned when BrowserAccessibilityManager::RequestAccessibilityInfo fails
214 // since the previous render view host connection is lost. Verify that
215 // instances are actually marked as invalid once the browse side cache is
216 // checked in.
217 CComBSTR name;
218 hr = document_accessible->get_accName(CreateI4Variant(CHILDID_SELF), &name);
219 ASSERT_EQ(E_FAIL, hr);
220 }
221 } // namespace.
222
OLDNEW
« no previous file with comments | « no previous file | chrome/chrome_tests.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698