Home | History | Annotate | Download | only in accessibility
      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