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