browser_views_accessibility_browsertest.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
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 <oleacc.h>
6
7#include "base/scoped_comptr_win.h"
8#include "base/utf_string_conversions.h"
9#include "chrome/browser/browser_window.h"
10#include "chrome/browser/ui/browser.h"
11#include "chrome/browser/ui/view_ids.h"
12#include "chrome/browser/ui/views/bookmark_bar_view.h"
13#include "chrome/browser/ui/views/frame/browser_view.h"
14#include "chrome/browser/ui/views/toolbar_view.h"
15#include "chrome/common/url_constants.h"
16#include "chrome/test/in_process_browser_test.h"
17#include "chrome/test/ui_test_utils.h"
18#include "grit/chromium_strings.h"
19#include "grit/generated_resources.h"
20#include "ui/base/l10n/l10n_util.h"
21#include "views/accessibility/view_accessibility.h"
22#include "views/widget/root_view.h"
23#include "views/widget/widget_win.h"
24#include "views/window/window.h"
25
26namespace {
27
28VARIANT id_self = {VT_I4, CHILDID_SELF};
29
30// Dummy class to force creation of ATL module, needed by COM to instantiate
31// ViewAccessibility.
32class TestAtlModule : public CAtlDllModuleT< TestAtlModule > {};
33TestAtlModule test_atl_module_;
34
35class BrowserViewsAccessibilityTest : public InProcessBrowserTest {
36 public:
37  BrowserViewsAccessibilityTest() {
38    ::CoInitialize(NULL);
39  }
40
41  ~BrowserViewsAccessibilityTest() {
42    ::CoUninitialize();
43  }
44
45  // Retrieves an instance of BrowserWindowTesting
46  BrowserWindowTesting* GetBrowserWindowTesting() {
47    BrowserWindow* browser_window = browser()->window();
48
49    if (!browser_window)
50      return NULL;
51
52    return browser_window->GetBrowserWindowTesting();
53  }
54
55  // Retrieve an instance of BrowserView
56  BrowserView* GetBrowserView() {
57    return BrowserView::GetBrowserViewForNativeWindow(
58               browser()->window()->GetNativeHandle());
59  }
60
61  // Retrieves and initializes an instance of ToolbarView.
62  ToolbarView* GetToolbarView() {
63    BrowserWindowTesting* browser_window_testing = GetBrowserWindowTesting();
64
65    if (!browser_window_testing)
66      return NULL;
67
68    return browser_window_testing->GetToolbarView();
69  }
70
71  // Retrieves and initializes an instance of BookmarkBarView.
72  BookmarkBarView* GetBookmarkBarView() {
73    BrowserWindowTesting* browser_window_testing = GetBrowserWindowTesting();
74
75    if (!browser_window_testing)
76      return NULL;
77
78    return browser_window_testing->GetBookmarkBarView();
79  }
80
81  // Retrieves and verifies the accessibility object for the given View.
82  void TestViewAccessibilityObject(views::View* view, std::wstring name,
83                                   int32 role) {
84    ASSERT_TRUE(NULL != view);
85
86    TestAccessibilityInfo(
87        ViewAccessibility::GetAccessibleForView(view), name, role);
88  }
89
90
91  // Verifies MSAA Name and Role properties of the given IAccessible.
92  void TestAccessibilityInfo(IAccessible* acc_obj, std::wstring name,
93                             int32 role) {
94    // Verify MSAA Name property.
95    BSTR acc_name;
96
97    HRESULT hr = acc_obj->get_accName(id_self, &acc_name);
98    ASSERT_EQ(S_OK, hr);
99    EXPECT_STREQ(acc_name, name.c_str());
100
101    // Verify MSAA Role property.
102    VARIANT acc_role;
103    ::VariantInit(&acc_role);
104
105    hr = acc_obj->get_accRole(id_self, &acc_role);
106    ASSERT_EQ(S_OK, hr);
107    EXPECT_EQ(VT_I4, acc_role.vt);
108    EXPECT_EQ(role, acc_role.lVal);
109
110    ::VariantClear(&acc_role);
111    ::SysFreeString(acc_name);
112  }
113};
114
115// Retrieve accessibility object for main window and verify accessibility info.
116IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
117                       TestChromeWindowAccObj) {
118  BrowserWindow* browser_window = browser()->window();
119  ASSERT_TRUE(NULL != browser_window);
120
121  HWND hwnd = browser_window->GetNativeHandle();
122  ASSERT_TRUE(NULL != hwnd);
123
124  // Get accessibility object.
125  ScopedComPtr<IAccessible> acc_obj;
126  HRESULT hr = ::AccessibleObjectFromWindow(hwnd, OBJID_WINDOW, IID_IAccessible,
127                                            reinterpret_cast<void**>(&acc_obj));
128  ASSERT_EQ(S_OK, hr);
129  ASSERT_TRUE(NULL != acc_obj);
130
131  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kAboutBlankURL));
132  std::wstring title = UTF16ToWide(l10n_util::GetStringFUTF16(
133      IDS_BROWSER_WINDOW_TITLE_FORMAT,
134      ASCIIToUTF16(chrome::kAboutBlankURL)));
135  TestAccessibilityInfo(acc_obj, title, ROLE_SYSTEM_WINDOW);
136}
137
138// Retrieve accessibility object for non client view and verify accessibility
139// info.
140IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestNonClientViewAccObj) {
141  views::View* non_client_view =
142  GetBrowserView()->GetWindow()->GetNonClientView();
143
144  TestViewAccessibilityObject(non_client_view,
145      UTF16ToWide(l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)),
146      ROLE_SYSTEM_WINDOW);
147}
148
149// Retrieve accessibility object for browser root view and verify
150// accessibility info.
151IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
152                       TestBrowserRootViewAccObj) {
153  views::View* browser_root_view =
154      GetBrowserView()->frame()->GetFrameView()->GetRootView();
155
156  TestViewAccessibilityObject(
157      browser_root_view,
158      UTF16ToWide(l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)),
159      ROLE_SYSTEM_APPLICATION);
160}
161
162// Retrieve accessibility object for browser view and verify accessibility info.
163IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestBrowserViewAccObj) {
164  // Verify root view MSAA name and role.
165  TestViewAccessibilityObject(
166      GetBrowserView(),
167      UTF16ToWide(l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)),
168      ROLE_SYSTEM_CLIENT);
169}
170
171// Retrieve accessibility object for toolbar view and verify accessibility info.
172IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestToolbarViewAccObj) {
173  // Verify toolbar MSAA name and role.
174  TestViewAccessibilityObject(
175      GetToolbarView(),
176      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_TOOLBAR)),
177      ROLE_SYSTEM_TOOLBAR);
178}
179
180// Retrieve accessibility object for Back button and verify accessibility info.
181IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestBackButtonAccObj) {
182  // Verify Back button MSAA name and role.
183  TestViewAccessibilityObject(
184      GetToolbarView()->GetViewByID(VIEW_ID_BACK_BUTTON),
185      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_BACK)),
186      ROLE_SYSTEM_BUTTONDROPDOWN);
187}
188
189// Retrieve accessibility object for Forward button and verify accessibility
190// info.
191IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestForwardButtonAccObj) {
192  // Verify Forward button MSAA name and role.
193  TestViewAccessibilityObject(
194      GetToolbarView()->GetViewByID(VIEW_ID_FORWARD_BUTTON),
195      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_FORWARD)),
196      ROLE_SYSTEM_BUTTONDROPDOWN);
197}
198
199// Retrieve accessibility object for Reload button and verify accessibility
200// info.
201IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestReloadButtonAccObj) {
202  // Verify Reload button MSAA name and role.
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  // Verify Home button MSAA name and role.
212  TestViewAccessibilityObject(
213      GetToolbarView()->GetViewByID(VIEW_ID_HOME_BUTTON),
214      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_HOME)),
215      ROLE_SYSTEM_PUSHBUTTON);
216}
217
218// Retrieve accessibility object for Star button and verify accessibility info.
219IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
220                       TestStarButtonAccObj) {
221  // Verify Star button MSAA name and role.
222  TestViewAccessibilityObject(
223      GetToolbarView()->GetViewByID(VIEW_ID_STAR_BUTTON),
224      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_STAR)),
225      ROLE_SYSTEM_PUSHBUTTON);
226}
227
228// Retrieve accessibility object for App menu button and verify accessibility
229// info.
230IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestAppMenuAccObj) {
231  // Verify App menu button MSAA name and role.
232  TestViewAccessibilityObject(
233      GetToolbarView()->GetViewByID(VIEW_ID_APP_MENU),
234      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_APP)),
235      ROLE_SYSTEM_BUTTONMENU);
236}
237
238IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
239                       TestBookmarkBarViewAccObj) {
240  TestViewAccessibilityObject(
241      GetBookmarkBarView(),
242      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_BOOKMARKS)),
243      ROLE_SYSTEM_TOOLBAR);
244}
245
246IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
247                       TestAboutChromeViewAccObj) {
248  //  Firstly, test that the WindowDelegate got updated.
249  views::Window* aboutChromeWindow = GetBrowserView()->ShowAboutChromeDialog();
250  EXPECT_STREQ(
251      aboutChromeWindow->GetDelegate()->GetWindowTitle().c_str(),
252      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ABOUT_CHROME_TITLE)).c_str());
253  EXPECT_EQ(aboutChromeWindow->GetDelegate()->accessible_role(),
254            AccessibilityTypes::ROLE_DIALOG);
255
256  // Also test the accessibility object directly.
257  IAccessible* acc_obj = NULL;
258  HRESULT hr =
259    ::AccessibleObjectFromWindow(aboutChromeWindow->GetNativeWindow(),
260                                 OBJID_CLIENT,
261                                 IID_IAccessible,
262                                 reinterpret_cast<void**>(&acc_obj));
263  ASSERT_EQ(S_OK, hr);
264  ASSERT_TRUE(NULL != acc_obj);
265
266  TestAccessibilityInfo(
267      acc_obj,
268      UTF16ToWide(l10n_util::GetStringUTF16(IDS_ABOUT_CHROME_TITLE)),
269      ROLE_SYSTEM_DIALOG);
270
271  acc_obj->Release();
272}
273}  // Namespace.
274