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