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