From c5c2a674dc1d102b2c1c89ef95e9a95b7fc299c4 Mon Sep 17 00:00:00 2001 From: "ctguil@chromium.org" <ctguil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> Date: Fri, 1 Oct 2010 23:28:04 +0000 Subject: Make BrowserAccessibilityManager cross platform. Step 1. 1. Move windows browser accessibility source and headers into chrome\browser\accessibility 2. Rename BrowserAccessibilityManager to BrowserAccessibilityManagerWin and BrowserAccessibility to BrowserAccessibilityWin 3. Add base classes that will eventually contain common browser accessibility code. BUG=55264 TEST=interactive_ui_tests:AccessibilityWinBrowserTest.* TEST=unit_tests:BrowserAccessibilityTest.* Review URL: http://codereview.chromium.org/3591003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61253 0039d316-1c4b-4281-b951-d872f2087c98 --- .../browser_views_accessibility_browsertest.cc | 265 +++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 chrome/browser/accessibility/browser_views_accessibility_browsertest.cc (limited to 'chrome/browser/accessibility/browser_views_accessibility_browsertest.cc') diff --git a/chrome/browser/accessibility/browser_views_accessibility_browsertest.cc b/chrome/browser/accessibility/browser_views_accessibility_browsertest.cc new file mode 100644 index 0000000..af33e2c --- /dev/null +++ b/chrome/browser/accessibility/browser_views_accessibility_browsertest.cc @@ -0,0 +1,265 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <oleacc.h> + +#include "app/l10n_util.h" +#include "base/scoped_comptr_win.h" +#include "base/utf_string_conversions.h" +#include "chrome/browser/browser.h" +#include "chrome/browser/browser_window.h" +#include "chrome/browser/view_ids.h" +#include "chrome/browser/views/bookmark_bar_view.h" +#include "chrome/browser/views/frame/browser_view.h" +#include "chrome/browser/views/toolbar_view.h" +#include "chrome/common/url_constants.h" +#include "chrome/test/in_process_browser_test.h" +#include "chrome/test/ui_test_utils.h" +#include "grit/chromium_strings.h" +#include "grit/generated_resources.h" +#include "views/accessibility/view_accessibility_wrapper.h" +#include "views/widget/root_view.h" +#include "views/widget/widget_win.h" +#include "views/window/window.h" + +namespace { + +VARIANT id_self = {VT_I4, CHILDID_SELF}; + +// Dummy class to force creation of ATL module, needed by COM to instantiate +// ViewAccessibility. +class TestAtlModule : public CAtlDllModuleT< TestAtlModule > {}; +TestAtlModule test_atl_module_; + +class BrowserViewsAccessibilityTest : public InProcessBrowserTest { + public: + BrowserViewsAccessibilityTest() { + ::CoInitialize(NULL); + } + + ~BrowserViewsAccessibilityTest() { + ::CoUninitialize(); + } + + // Retrieves an instance of BrowserWindowTesting + BrowserWindowTesting* GetBrowserWindowTesting() { + BrowserWindow* browser_window = browser()->window(); + + if (!browser_window) + return NULL; + + return browser_window->GetBrowserWindowTesting(); + } + + // Retrieve an instance of BrowserView + BrowserView* GetBrowserView() { + return BrowserView::GetBrowserViewForNativeWindow( + browser()->window()->GetNativeHandle()); + } + + // Retrieves and initializes an instance of ToolbarView. + ToolbarView* GetToolbarView() { + BrowserWindowTesting* browser_window_testing = GetBrowserWindowTesting(); + + if (!browser_window_testing) + return NULL; + + return browser_window_testing->GetToolbarView(); + } + + // Retrieves and initializes an instance of BookmarkBarView. + BookmarkBarView* GetBookmarkBarView() { + BrowserWindowTesting* browser_window_testing = GetBrowserWindowTesting(); + + if (!browser_window_testing) + return NULL; + + return browser_window_testing->GetBookmarkBarView(); + } + + // Retrieves and verifies the accessibility object for the given View. + void TestViewAccessibilityObject(views::View* view, std::wstring name, + int32 role) { + ASSERT_TRUE(NULL != view); + + IAccessible* acc_obj = NULL; + HRESULT hr = view->GetViewAccessibilityWrapper()->GetInstance( + IID_IAccessible, reinterpret_cast<void**>(&acc_obj)); + ASSERT_EQ(S_OK, hr); + ASSERT_TRUE(NULL != acc_obj); + + TestAccessibilityInfo(acc_obj, name, role); + } + + + // Verifies MSAA Name and Role properties of the given IAccessible. + void TestAccessibilityInfo(IAccessible* acc_obj, std::wstring name, + int32 role) { + // Verify MSAA Name property. + BSTR acc_name; + + HRESULT hr = acc_obj->get_accName(id_self, &acc_name); + ASSERT_EQ(S_OK, hr); + EXPECT_STREQ(acc_name, name.c_str()); + + // Verify MSAA Role property. + VARIANT acc_role; + ::VariantInit(&acc_role); + + hr = acc_obj->get_accRole(id_self, &acc_role); + ASSERT_EQ(S_OK, hr); + EXPECT_EQ(VT_I4, acc_role.vt); + EXPECT_EQ(role, acc_role.lVal); + + ::VariantClear(&acc_role); + ::SysFreeString(acc_name); + } +}; + +// Retrieve accessibility object for main window and verify accessibility info. +IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, + TestChromeWindowAccObj) { + BrowserWindow* browser_window = browser()->window(); + ASSERT_TRUE(NULL != browser_window); + + HWND hwnd = browser_window->GetNativeHandle(); + ASSERT_TRUE(NULL != hwnd); + + // Get accessibility object. + ScopedComPtr<IAccessible> acc_obj; + HRESULT hr = ::AccessibleObjectFromWindow(hwnd, OBJID_WINDOW, IID_IAccessible, + reinterpret_cast<void**>(&acc_obj)); + ASSERT_EQ(S_OK, hr); + ASSERT_TRUE(NULL != acc_obj); + + ui_test_utils::NavigateToURL(browser(), GURL(chrome::kAboutBlankURL)); + std::wstring title = + l10n_util::GetStringF(IDS_BROWSER_WINDOW_TITLE_FORMAT, + ASCIIToWide(chrome::kAboutBlankURL)); + TestAccessibilityInfo(acc_obj, title, ROLE_SYSTEM_WINDOW); +} + +// Retrieve accessibility object for non client view and verify accessibility +// info. +IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestNonClientViewAccObj) { + views::View* non_client_view = + GetBrowserView()->GetWindow()->GetNonClientView(); + + TestViewAccessibilityObject(non_client_view, + l10n_util::GetString(IDS_PRODUCT_NAME), + ROLE_SYSTEM_WINDOW); +} + +// Retrieve accessibility object for browser root view and verify +// accessibility info. +IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, + TestBrowserRootViewAccObj) { + views::View* browser_root_view = + GetBrowserView()->frame()->GetFrameView()->GetRootView(); + + TestViewAccessibilityObject(browser_root_view, + l10n_util::GetString(IDS_PRODUCT_NAME), + ROLE_SYSTEM_APPLICATION); +} + +// Retrieve accessibility object for browser view and verify accessibility info. +IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestBrowserViewAccObj) { + // Verify root view MSAA name and role. + TestViewAccessibilityObject(GetBrowserView(), + l10n_util::GetString(IDS_PRODUCT_NAME), + ROLE_SYSTEM_CLIENT); +} + +// Retrieve accessibility object for toolbar view and verify accessibility info. +IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestToolbarViewAccObj) { + // Verify toolbar MSAA name and role. + TestViewAccessibilityObject(GetToolbarView(), + l10n_util::GetString(IDS_ACCNAME_TOOLBAR), + ROLE_SYSTEM_TOOLBAR); +} + +// Retrieve accessibility object for Back button and verify accessibility info. +IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestBackButtonAccObj) { + // Verify Back button MSAA name and role. + TestViewAccessibilityObject( + GetToolbarView()->GetViewByID(VIEW_ID_BACK_BUTTON), + l10n_util::GetString(IDS_ACCNAME_BACK), ROLE_SYSTEM_BUTTONDROPDOWN); +} + +// Retrieve accessibility object for Forward button and verify accessibility +// info. +IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestForwardButtonAccObj) { + // Verify Forward button MSAA name and role. + TestViewAccessibilityObject( + GetToolbarView()->GetViewByID(VIEW_ID_FORWARD_BUTTON), + l10n_util::GetString(IDS_ACCNAME_FORWARD), ROLE_SYSTEM_BUTTONDROPDOWN); +} + +// Retrieve accessibility object for Reload button and verify accessibility +// info. +IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestReloadButtonAccObj) { + // Verify Reload button MSAA name and role. + TestViewAccessibilityObject( + GetToolbarView()->GetViewByID(VIEW_ID_RELOAD_BUTTON), + l10n_util::GetString(IDS_ACCNAME_RELOAD), ROLE_SYSTEM_PUSHBUTTON); +} + +// Retrieve accessibility object for Home button and verify accessibility info. +IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestHomeButtonAccObj) { + // Verify Home button MSAA name and role. + TestViewAccessibilityObject( + GetToolbarView()->GetViewByID(VIEW_ID_HOME_BUTTON), + l10n_util::GetString(IDS_ACCNAME_HOME), ROLE_SYSTEM_PUSHBUTTON); +} + +// Retrieve accessibility object for Star button and verify accessibility info. +IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, + TestStarButtonAccObj) { + // Verify Star button MSAA name and role. + TestViewAccessibilityObject( + GetToolbarView()->GetViewByID(VIEW_ID_STAR_BUTTON), + l10n_util::GetString(IDS_ACCNAME_STAR), ROLE_SYSTEM_PUSHBUTTON); +} + +// Retrieve accessibility object for App menu button and verify accessibility +// info. +IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestAppMenuAccObj) { + // Verify App menu button MSAA name and role. + TestViewAccessibilityObject(GetToolbarView()->GetViewByID(VIEW_ID_APP_MENU), + l10n_util::GetString(IDS_ACCNAME_APP), + ROLE_SYSTEM_BUTTONMENU); +} + +IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, + TestBookmarkBarViewAccObj) { + TestViewAccessibilityObject(GetBookmarkBarView(), + l10n_util::GetString(IDS_ACCNAME_BOOKMARKS), + ROLE_SYSTEM_TOOLBAR); +} + +IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, + TestAboutChromeViewAccObj) { + // Firstly, test that the WindowDelegate got updated. + views::Window* aboutChromeWindow = GetBrowserView()->ShowAboutChromeDialog(); + EXPECT_STREQ(aboutChromeWindow->GetDelegate()->GetWindowTitle().c_str(), + l10n_util::GetString(IDS_ABOUT_CHROME_TITLE).c_str()); + EXPECT_EQ(aboutChromeWindow->GetDelegate()->accessible_role(), + AccessibilityTypes::ROLE_DIALOG); + + // Also test the accessibility object directly. + IAccessible* acc_obj = NULL; + HRESULT hr = + ::AccessibleObjectFromWindow(aboutChromeWindow->GetNativeWindow(), + OBJID_CLIENT, + IID_IAccessible, + reinterpret_cast<void**>(&acc_obj)); + ASSERT_EQ(S_OK, hr); + ASSERT_TRUE(NULL != acc_obj); + + TestAccessibilityInfo(acc_obj, l10n_util::GetString(IDS_ABOUT_CHROME_TITLE), + ROLE_SYSTEM_DIALOG); + + acc_obj->Release(); +} +} // Namespace. -- cgit v1.1