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/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 
     29 class BrowserViewsAccessibilityTest : public InProcessBrowserTest {
     30  public:
     31   BrowserViewsAccessibilityTest();
     32   virtual ~BrowserViewsAccessibilityTest();
     33 
     34   // Retrieves an instance of BrowserWindowTesting.
     35   BrowserWindowTesting* GetBrowserWindowTesting();
     36 
     37   // Retrieve an instance of BrowserView.
     38   BrowserView* GetBrowserView();
     39 
     40   // Retrieves and initializes an instance of ToolbarView.
     41   ToolbarView* GetToolbarView();
     42 
     43   // Retrieves and initializes an instance of BookmarkBarView.
     44   BookmarkBarView* GetBookmarkBarView();
     45 
     46   // Retrieves and verifies the accessibility object for the given View.
     47   void TestViewAccessibilityObject(views::View* view,
     48                                    std::wstring name,
     49                                    int32 role);
     50 
     51   // Verifies MSAA Name and Role properties of the given IAccessible.
     52   void TestAccessibilityInfo(IAccessible* acc_obj,
     53                              std::wstring name,
     54                              int32 role);
     55 
     56  private:
     57   base::win::ScopedCOMInitializer com_initializer_;
     58 
     59   DISALLOW_COPY_AND_ASSIGN(BrowserViewsAccessibilityTest);
     60 };
     61 
     62 BrowserViewsAccessibilityTest::BrowserViewsAccessibilityTest() {
     63   ui::win::CreateATLModuleIfNeeded();
     64 }
     65 
     66 BrowserViewsAccessibilityTest::~BrowserViewsAccessibilityTest() {
     67 }
     68 
     69 BrowserWindowTesting* BrowserViewsAccessibilityTest::GetBrowserWindowTesting() {
     70   BrowserWindow* browser_window = browser()->window();
     71   return browser_window ? browser_window->GetBrowserWindowTesting() : NULL;
     72 }
     73 
     74 BrowserView* BrowserViewsAccessibilityTest::GetBrowserView() {
     75   return BrowserView::GetBrowserViewForBrowser(browser());
     76 }
     77 
     78 ToolbarView* BrowserViewsAccessibilityTest::GetToolbarView() {
     79   BrowserWindowTesting* browser_window_testing = GetBrowserWindowTesting();
     80   return browser_window_testing ?
     81       browser_window_testing->GetToolbarView() : NULL;
     82 }
     83 
     84 BookmarkBarView* BrowserViewsAccessibilityTest::GetBookmarkBarView() {
     85   BrowserWindowTesting* browser_window_testing = GetBrowserWindowTesting();
     86   return browser_window_testing ?
     87       browser_window_testing->GetBookmarkBarView() : NULL;
     88 }
     89 
     90 void BrowserViewsAccessibilityTest::TestViewAccessibilityObject(
     91     views::View* view,
     92     std::wstring name,
     93     int32 role) {
     94   ASSERT_TRUE(view != NULL);
     95   TestAccessibilityInfo(view->GetNativeViewAccessible(), name, role);
     96 }
     97 
     98 void BrowserViewsAccessibilityTest::TestAccessibilityInfo(IAccessible* acc_obj,
     99                                                           std::wstring name,
    100                                                           int32 role) {
    101   // Verify MSAA Name property.
    102   base::win::ScopedVariant childid_self(CHILDID_SELF);
    103   base::win::ScopedBstr acc_name;
    104   ASSERT_EQ(S_OK, acc_obj->get_accName(childid_self, acc_name.Receive()));
    105   EXPECT_EQ(name, string16(acc_name));
    106 
    107   // Verify MSAA Role property.
    108   base::win::ScopedVariant acc_role;
    109   ASSERT_EQ(S_OK, acc_obj->get_accRole(childid_self, acc_role.Receive()));
    110   EXPECT_EQ(VT_I4, acc_role.type());
    111   EXPECT_EQ(role, V_I4(&acc_role));
    112 }
    113 
    114 // Retrieve accessibility object for main window and verify accessibility info.
    115 IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
    116                        TestChromeWindowAccObj) {
    117   BrowserWindow* browser_window = browser()->window();
    118   ASSERT_TRUE(NULL != browser_window);
    119 
    120   HWND hwnd = browser_window->GetNativeWindow();
    121   ASSERT_TRUE(NULL != hwnd);
    122 
    123   // Get accessibility object.
    124   base::win::ScopedComPtr<IAccessible> acc_obj;
    125   HRESULT hr = ::AccessibleObjectFromWindow(hwnd, OBJID_WINDOW, IID_IAccessible,
    126                                             reinterpret_cast<void**>(&acc_obj));
    127   ASSERT_EQ(S_OK, hr);
    128   ASSERT_TRUE(NULL != acc_obj);
    129 
    130   ui_test_utils::NavigateToURL(browser(), GURL(content::kAboutBlankURL));
    131   std::wstring title = UTF16ToWide(l10n_util::GetStringFUTF16(
    132       IDS_BROWSER_WINDOW_TITLE_FORMAT,
    133       ASCIIToUTF16(content::kAboutBlankURL)));
    134   TestAccessibilityInfo(acc_obj, title, ROLE_SYSTEM_WINDOW);
    135 }
    136 
    137 // Retrieve accessibility object for non client view and verify accessibility
    138 // info.
    139 // TODO(pkasting): Disabled pending resolution of whether this should be
    140 // ROLE_SYSTEM_CLIENT or ROLE_SYSTEM_WINDOW.
    141 IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
    142                        DISABLED_TestNonClientViewAccObj) {
    143   TestViewAccessibilityObject(
    144       GetBrowserView()->GetWidget()->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 accessibility
    150 // info.
    151 // TODO(pkasting): Disabled pending resolution of whether this should be
    152 // ROLE_SYSTEM_WINDOW or ROLE_SYSTEM_APPLICATION, as well as what the name
    153 // should be.
    154 IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
    155                        DISABLED_TestBrowserRootViewAccObj) {
    156   TestViewAccessibilityObject(
    157       GetBrowserView()->frame()->GetRootView(),
    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.
    163 // TODO(pkasting): Disabled pending resolution of whether this object should
    164 // have an accessible name.
    165 IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
    166                        DISABLED_TestBrowserViewAccObj) {
    167   TestViewAccessibilityObject(
    168       GetBrowserView(),
    169       UTF16ToWide(l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)),
    170       ROLE_SYSTEM_CLIENT);
    171 }
    172 
    173 // Retrieve accessibility object for toolbar view and verify accessibility info.
    174 IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestToolbarViewAccObj) {
    175   TestViewAccessibilityObject(
    176       GetToolbarView(),
    177       UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_TOOLBAR)),
    178       ROLE_SYSTEM_TOOLBAR);
    179 }
    180 
    181 // Retrieve accessibility object for Back button and verify accessibility info.
    182 IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestBackButtonAccObj) {
    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.
    191 IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestForwardButtonAccObj) {
    192   TestViewAccessibilityObject(
    193       GetToolbarView()->GetViewByID(VIEW_ID_FORWARD_BUTTON),
    194       UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_FORWARD)),
    195       ROLE_SYSTEM_BUTTONDROPDOWN);
    196 }
    197 
    198 // Retrieve accessibility object for Reload button and verify accessibility
    199 // info.
    200 IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestReloadButtonAccObj) {
    201   TestViewAccessibilityObject(
    202       GetToolbarView()->GetViewByID(VIEW_ID_RELOAD_BUTTON),
    203       UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_RELOAD)),
    204       ROLE_SYSTEM_PUSHBUTTON);
    205 }
    206 
    207 // Retrieve accessibility object for Home button and verify accessibility info.
    208 IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestHomeButtonAccObj) {
    209   TestViewAccessibilityObject(
    210       GetToolbarView()->GetViewByID(VIEW_ID_HOME_BUTTON),
    211       UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_HOME)),
    212       ROLE_SYSTEM_PUSHBUTTON);
    213 }
    214 
    215 // Retrieve accessibility object for Star button and verify accessibility info.
    216 IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestStarButtonAccObj) {
    217   TestViewAccessibilityObject(
    218       GetToolbarView()->GetViewByID(VIEW_ID_STAR_BUTTON),
    219       UTF16ToWide(l10n_util::GetStringUTF16(IDS_TOOLTIP_STAR)),
    220       ROLE_SYSTEM_PUSHBUTTON);
    221 }
    222 
    223 // Retrieve accessibility object for Mic search button and verify accessibility
    224 // info.
    225 IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
    226                        TestMicSearchButtonViewAccObj) {
    227   TestViewAccessibilityObject(
    228       GetToolbarView()->GetViewByID(VIEW_ID_MIC_SEARCH_BUTTON),
    229       UTF16ToWide(l10n_util::GetStringUTF16(IDS_TOOLTIP_MIC_SEARCH)),
    230       ROLE_SYSTEM_PUSHBUTTON);
    231 }
    232 
    233 // Retrieve accessibility object for App menu button and verify accessibility
    234 // info.
    235 IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestAppMenuAccObj) {
    236   TestViewAccessibilityObject(
    237       GetToolbarView()->GetViewByID(VIEW_ID_APP_MENU),
    238       UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_APP)),
    239       ROLE_SYSTEM_BUTTONMENU);
    240 }
    241 
    242 // Retrieve accessibility object for bookmark bar and verify accessibility info.
    243 IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
    244                        TestBookmarkBarViewAccObj) {
    245   TestViewAccessibilityObject(
    246       GetBookmarkBarView(),
    247       UTF16ToWide(l10n_util::GetStringUTF16(IDS_ACCNAME_BOOKMARKS)),
    248       ROLE_SYSTEM_TOOLBAR);
    249 }
    250