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