browser_views_accessibility_browsertest.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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(url::kAboutBlankURL)); 133 std::wstring title = UTF16ToWide( 134 l10n_util::GetStringFUTF16(IDS_BROWSER_WINDOW_TITLE_FORMAT, 135 base::ASCIIToUTF16(url::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