Home | History | Annotate | Download | only in accessibility
      1 // Copyright (c) 2011 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 #import <Cocoa/Cocoa.h>
      6 
      7 #include "base/memory/scoped_ptr.h"
      8 #include "base/string_util.h"
      9 #include "base/utf_string_conversions.h"
     10 #include "chrome/browser/accessibility/browser_accessibility_cocoa.h"
     11 #include "chrome/browser/accessibility/browser_accessibility_manager.h"
     12 #include "chrome/browser/ui/cocoa/cocoa_test_helper.h"
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 #import "testing/gtest_mac.h"
     15 
     16 @interface MockAccessibilityDelegate :
     17     NSView<BrowserAccessibilityDelegateCocoa>
     18 
     19 - (NSPoint)accessibilityPointInScreen:(BrowserAccessibilityCocoa*)accessibility;
     20 - (void)doDefaultAction:(int32)accessibilityObjectId;
     21 - (void)setAccessibilityFocus:(BOOL)focus
     22               accessibilityId:(int32)accessibilityObjectId;
     23 - (NSWindow*)window;
     24 
     25 @end
     26 
     27 @implementation MockAccessibilityDelegate
     28 
     29 - (NSPoint)accessibilityPointInScreen:
     30     (BrowserAccessibilityCocoa*)accessibility {
     31   return NSZeroPoint;
     32 }
     33 - (void)doDefaultAction:(int32)accessibilityObjectId {
     34 }
     35 - (void)setAccessibilityFocus:(BOOL)focus
     36               accessibilityId:(int32)accessibilityObjectId {
     37 }
     38 - (NSWindow*)window {
     39   return nil;
     40 }
     41 
     42 @end
     43 
     44 
     45 class BrowserAccessibilityTest : public CocoaTest {
     46  public:
     47   virtual void SetUp() {
     48     CocoaTest::SetUp();
     49     WebAccessibility root;
     50     root.location.set_width(500);
     51     root.location.set_height(100);
     52     root.role = WebAccessibility::ROLE_WEB_AREA;
     53     root.attributes[WebAccessibility::ATTR_HELP] = ASCIIToUTF16("HelpText");
     54 
     55     WebAccessibility child1;
     56     child1.name = ASCIIToUTF16("Child1");
     57     child1.location.set_width(250);
     58     child1.location.set_height(100);
     59     child1.role = WebAccessibility::ROLE_BUTTON;
     60 
     61     WebAccessibility child2;
     62     child2.location.set_x(250);
     63     child2.location.set_width(250);
     64     child2.location.set_height(100);
     65     child2.role = WebAccessibility::ROLE_HEADING;
     66 
     67     root.children.push_back(child1);
     68     root.children.push_back(child2);
     69 
     70     delegate_.reset([[MockAccessibilityDelegate alloc] init]);
     71     manager_.reset(
     72         BrowserAccessibilityManager::Create(delegate_, root, NULL));
     73     accessibility_.reset([manager_->GetRoot()->toBrowserAccessibilityCocoa()
     74         retain]);
     75   }
     76 
     77  protected:
     78   scoped_nsobject<MockAccessibilityDelegate> delegate_;
     79   scoped_nsobject<BrowserAccessibilityCocoa> accessibility_;
     80   scoped_ptr<BrowserAccessibilityManager> manager_;
     81 };
     82 
     83 // Standard hit test.
     84 TEST_F(BrowserAccessibilityTest, HitTestTest) {
     85   BrowserAccessibilityCocoa* firstChild =
     86       [accessibility_ accessibilityHitTest:NSMakePoint(50, 50)];
     87   EXPECT_NSEQ(@"Child1",
     88       [firstChild accessibilityAttributeValue:NSAccessibilityTitleAttribute]);
     89 }
     90 
     91 // Test doing a hit test on the edge of a child.
     92 TEST_F(BrowserAccessibilityTest, EdgeHitTest) {
     93   BrowserAccessibilityCocoa* firstChild =
     94       [accessibility_ accessibilityHitTest:NSMakePoint(0, 0)];
     95   EXPECT_NSEQ(@"Child1",
     96       [firstChild accessibilityAttributeValue:NSAccessibilityTitleAttribute]);
     97 }
     98 
     99 // This will test a hit test with invalid coordinates.  It is assumed that
    100 // the hit test has been narrowed down to this object or one of its children
    101 // so it should return itself since it has no better hit result.
    102 TEST_F(BrowserAccessibilityTest, InvalidHitTestCoordsTest) {
    103   BrowserAccessibilityCocoa* hitTestResult =
    104       [accessibility_ accessibilityHitTest:NSMakePoint(-50, 50)];
    105   EXPECT_NSEQ(accessibility_, hitTestResult);
    106 }
    107 
    108 // Test to ensure querying standard attributes works.
    109 TEST_F(BrowserAccessibilityTest, BasicAttributeTest) {
    110   NSString* helpText = [accessibility_
    111       accessibilityAttributeValue:NSAccessibilityHelpAttribute];
    112   EXPECT_NSEQ(@"HelpText", helpText);
    113 }
    114 
    115 // Test querying for an invalid attribute to ensure it doesn't crash.
    116 TEST_F(BrowserAccessibilityTest, InvalidAttributeTest) {
    117   NSString* shouldBeNil = [accessibility_
    118       accessibilityAttributeValue:@"NSAnInvalidAttribute"];
    119   EXPECT_TRUE(shouldBeNil == nil);
    120 }
    121