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 30 using base::UTF16ToWide; 31 32 class 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 65 BrowserViewsAccessibilityTest::BrowserViewsAccessibilityTest() { 66 ui::win::CreateATLModuleIfNeeded(); 67 } 68 69 BrowserViewsAccessibilityTest::~BrowserViewsAccessibilityTest() { 70 } 71 72 BrowserWindowTesting* BrowserViewsAccessibilityTest::GetBrowserWindowTesting() { 73 BrowserWindow* browser_window = browser()->window(); 74 return browser_window ? browser_window->GetBrowserWindowTesting() : NULL; 75 } 76 77 BrowserView* BrowserViewsAccessibilityTest::GetBrowserView() { 78 return BrowserView::GetBrowserViewForBrowser(browser()); 79 } 80 81 ToolbarView* BrowserViewsAccessibilityTest::GetToolbarView() { 82 BrowserWindowTesting* browser_window_testing = GetBrowserWindowTesting(); 83 return browser_window_testing ? 84 browser_window_testing->GetToolbarView() : NULL; 85 } 86 87 BookmarkBarView* BrowserViewsAccessibilityTest::GetBookmarkBarView() { 88 BrowserWindowTesting* browser_window_testing = GetBrowserWindowTesting(); 89 return browser_window_testing ? 90 browser_window_testing->GetBookmarkBarView() : NULL; 91 } 92 93 void 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 101 void 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. 118 IN_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. 144 IN_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. 157 IN_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. 168 IN_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. 177 IN_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. 185 IN_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. 194 IN_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. 203 IN_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. 211 IN_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. 219 IN_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. 228 IN_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. 238 IN_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. 246 IN_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