browser_views_accessibility_browsertest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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
3// found in the LICENSE file.
4
5#include <oleacc.h>
6
7#include "base/strings/utf_string_conversions.h"
8#include "base/win/scoped_bstr.h"
9#include "base/win/scoped_com_initializer.h"
10#include "base/win/scoped_comptr.h"
11#include "base/win/scoped_variant.h"
12#include "chrome/browser/ui/browser.h"
13#include "chrome/browser/ui/browser_window.h"
14#include "chrome/browser/ui/view_ids.h"
15#include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h"
16#include "chrome/browser/ui/views/frame/browser_view.h"
17#include "chrome/browser/ui/views/toolbar_view.h"
18#include "chrome/common/url_constants.h"
19#include "chrome/test/base/in_process_browser_test.h"
20#include "chrome/test/base/ui_test_utils.h"
21#include "grit/chromium_strings.h"
22#include "grit/generated_resources.h"
23#include "ui/base/accessibility/accessibility_types.h"
24#include "ui/base/l10n/l10n_util.h"
25#include "ui/base/win/atl_module.h"
26#include "ui/views/accessibility/native_view_accessibility_win.h"
27#include "ui/views/widget/widget.h"
28
29using base::UTF16ToWide;
30
31class BrowserViewsAccessibilityTest : public InProcessBrowserTest {
32 public:
33  BrowserViewsAccessibilityTest();
34  virtual ~BrowserViewsAccessibilityTest();
35
36  // Retrieves an instance of BrowserWindowTesting.
37  BrowserWindowTesting* GetBrowserWindowTesting();
38
39  // Retrieve an instance of BrowserView.
40  BrowserView* GetBrowserView();
41
42  // Retrieves and initializes an instance of ToolbarView.
43  ToolbarView* GetToolbarView();
44
45  // Retrieves and initializes an instance of BookmarkBarView.
46  BookmarkBarView* GetBookmarkBarView();
47
48  // Retrieves and verifies the accessibility object for the given View.
49  void TestViewAccessibilityObject(views::View* view,
50                                   std::wstring name,
51                                   int32 role);
52
53  // Verifies MSAA Name and Role properties of the given IAccessible.
54  void TestAccessibilityInfo(IAccessible* acc_obj,
55                             std::wstring name,
56                             int32 role);
57
58 private:
59  base::win::ScopedCOMInitializer com_initializer_;
60
61  DISALLOW_COPY_AND_ASSIGN(BrowserViewsAccessibilityTest);
62};
63
64BrowserViewsAccessibilityTest::BrowserViewsAccessibilityTest() {
65  ui::win::CreateATLModuleIfNeeded();
66}
67
68BrowserViewsAccessibilityTest::~BrowserViewsAccessibilityTest() {
69}
70
71BrowserWindowTesting* BrowserViewsAccessibilityTest::GetBrowserWindowTesting() {
72  BrowserWindow* browser_window = browser()->window();
73  return browser_window ? browser_window->GetBrowserWindowTesting() : NULL;
74}
75
76BrowserView* BrowserViewsAccessibilityTest::GetBrowserView() {
77  return BrowserView::GetBrowserViewForBrowser(browser());
78}
79
80ToolbarView* BrowserViewsAccessibilityTest::GetToolbarView() {
81  BrowserWindowTesting* browser_window_testing = GetBrowserWindowTesting();
82  return browser_window_testing ?
83      browser_window_testing->GetToolbarView() : NULL;
84}
85
86BookmarkBarView* BrowserViewsAccessibilityTest::GetBookmarkBarView() {
87  BrowserWindowTesting* browser_window_testing = GetBrowserWindowTesting();
88  return browser_window_testing ?
89      browser_window_testing->GetBookmarkBarView() : NULL;
90}
91
92void BrowserViewsAccessibilityTest::TestViewAccessibilityObject(
93    views::View* view,
94    std::wstring name,
95    int32 role) {
96  ASSERT_TRUE(view != NULL);
97  TestAccessibilityInfo(view->GetNativeViewAccessible(), name, role);
98}
99
100void BrowserViewsAccessibilityTest::TestAccessibilityInfo(IAccessible* acc_obj,
101                                                          std::wstring name,
102                                                          int32 role) {
103  // Verify MSAA Name property.
104  base::win::ScopedVariant childid_self(CHILDID_SELF);
105  base::win::ScopedBstr acc_name;
106  ASSERT_EQ(S_OK, acc_obj->get_accName(childid_self, acc_name.Receive()));
107  EXPECT_EQ(name, base::string16(acc_name));
108
109  // Verify MSAA Role property.
110  base::win::ScopedVariant acc_role;
111  ASSERT_EQ(S_OK, acc_obj->get_accRole(childid_self, acc_role.Receive()));
112  EXPECT_EQ(VT_I4, acc_role.type());
113  EXPECT_EQ(role, V_I4(&acc_role));
114}
115
116// Retrieve accessibility object for main window and verify accessibility info.
117IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
118                       TestChromeWindowAccObj) {
119  BrowserWindow* browser_window = browser()->window();
120  ASSERT_TRUE(NULL != browser_window);
121
122  HWND hwnd = browser_window->GetNativeWindow();
123  ASSERT_TRUE(NULL != hwnd);
124
125  // Get accessibility object.
126  base::win::ScopedComPtr<IAccessible> acc_obj;
127  HRESULT hr = ::AccessibleObjectFromWindow(hwnd, OBJID_WINDOW, IID_IAccessible,
128                                            reinterpret_cast<void**>(&acc_obj));
129  ASSERT_EQ(S_OK, hr);
130  ASSERT_TRUE(NULL != acc_obj);
131
132  ui_test_utils::NavigateToURL(browser(), GURL(content::kAboutBlankURL));
133  std::wstring title = UTF16ToWide(l10n_util::GetStringFUTF16(
134      IDS_BROWSER_WINDOW_TITLE_FORMAT,
135      base::ASCIIToUTF16(content::kAboutBlankURL)));
136  TestAccessibilityInfo(acc_obj, title, ROLE_SYSTEM_WINDOW);
137}
138
139// Retrieve accessibility object for non client view and verify accessibility
140// info.
141// TODO(pkasting): Disabled pending resolution of whether this should be
142// ROLE_SYSTEM_CLIENT or ROLE_SYSTEM_WINDOW.
143IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
144                       DISABLED_TestNonClientViewAccObj) {
145  TestViewAccessibilityObject(
146      GetBrowserView()->GetWidget()->non_client_view(),
147      UTF16ToWide(l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)),
148      ROLE_SYSTEM_WINDOW);
149}
150
151// Retrieve accessibility object for browser root view and verify accessibility
152// info.
153// TODO(pkasting): Disabled pending resolution of whether this should be
154// ROLE_SYSTEM_WINDOW or ROLE_SYSTEM_APPLICATION, as well as what the name
155// should be.
156IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
157                       DISABLED_TestBrowserRootViewAccObj) {
158  TestViewAccessibilityObject(
159      GetBrowserView()->frame()->GetRootView(),
160      UTF16ToWide(l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)),
161      ROLE_SYSTEM_APPLICATION);
162}
163
164// Retrieve accessibility object for browser view and verify accessibility info.
165// TODO(pkasting): Disabled pending resolution of whether this object should
166// have an accessible name.
167IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
168                       DISABLED_TestBrowserViewAccObj) {
169  TestViewAccessibilityObject(
170      GetBrowserView(),
171      UTF16ToWide(l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)),
172      ROLE_SYSTEM_CLIENT);
173}
174
175// Retrieve accessibility object for toolbar view and verify accessibility info.
176IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestToolbarViewAccObj) {
177  TestViewAccessibilityObject(
178      GetToolbarView(),
179      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_TOOLBAR)),
180      ROLE_SYSTEM_TOOLBAR);
181}
182
183// Retrieve accessibility object for Back button and verify accessibility info.
184IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestBackButtonAccObj) {
185  TestViewAccessibilityObject(
186      GetToolbarView()->GetViewByID(VIEW_ID_BACK_BUTTON),
187      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_BACK)),
188      ROLE_SYSTEM_BUTTONDROPDOWN);
189}
190
191// Retrieve accessibility object for Forward button and verify accessibility
192// info.
193IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestForwardButtonAccObj) {
194  TestViewAccessibilityObject(
195      GetToolbarView()->GetViewByID(VIEW_ID_FORWARD_BUTTON),
196      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_FORWARD)),
197      ROLE_SYSTEM_BUTTONDROPDOWN);
198}
199
200// Retrieve accessibility object for Reload button and verify accessibility
201// info.
202IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestReloadButtonAccObj) {
203  TestViewAccessibilityObject(
204      GetToolbarView()->GetViewByID(VIEW_ID_RELOAD_BUTTON),
205      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_RELOAD)),
206      ROLE_SYSTEM_PUSHBUTTON);
207}
208
209// Retrieve accessibility object for Home button and verify accessibility info.
210IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestHomeButtonAccObj) {
211  TestViewAccessibilityObject(
212      GetToolbarView()->GetViewByID(VIEW_ID_HOME_BUTTON),
213      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_HOME)),
214      ROLE_SYSTEM_PUSHBUTTON);
215}
216
217// Retrieve accessibility object for Star button and verify accessibility info.
218IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestStarButtonAccObj) {
219  TestViewAccessibilityObject(
220      GetToolbarView()->GetViewByID(VIEW_ID_STAR_BUTTON),
221      UTF16ToWide(l10n_util::GetStringUTF16(IDS_TOOLTIP_STAR)),
222      ROLE_SYSTEM_PUSHBUTTON);
223}
224
225// Retrieve accessibility object for Mic search button and verify accessibility
226// info.
227IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
228                       TestMicSearchButtonViewAccObj) {
229  TestViewAccessibilityObject(
230      GetToolbarView()->GetViewByID(VIEW_ID_MIC_SEARCH_BUTTON),
231      UTF16ToWide(l10n_util::GetStringUTF16(IDS_TOOLTIP_MIC_SEARCH)),
232      ROLE_SYSTEM_PUSHBUTTON);
233}
234
235// Retrieve accessibility object for App menu button and verify accessibility
236// info.
237IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestAppMenuAccObj) {
238  TestViewAccessibilityObject(
239      GetToolbarView()->GetViewByID(VIEW_ID_APP_MENU),
240      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_APP)),
241      ROLE_SYSTEM_BUTTONMENU);
242}
243
244// Retrieve accessibility object for bookmark bar and verify accessibility info.
245IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
246                       TestBookmarkBarViewAccObj) {
247  TestViewAccessibilityObject(
248      GetBookmarkBarView(),
249      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_BOOKMARKS)),
250      ROLE_SYSTEM_TOOLBAR);
251}
252