blob: 34874e3e49a07b95eb36a891450704ce80dbb58b [file] [log] [blame]
[email protected]208fadbf2012-02-21 08:37:121// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]020a50c2010-07-07 21:59:062// 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
[email protected]3b63f8f42011-03-28 01:54:157#include "base/memory/scoped_ptr.h"
[email protected]10994d132013-06-11 07:16:188#include "base/strings/string_util.h"
[email protected]74ebfb12013-06-07 20:48:009#include "base/strings/utf_string_conversions.h"
[email protected]ba1fa652011-06-25 05:16:2210#include "content/browser/accessibility/browser_accessibility_cocoa.h"
11#include "content/browser/accessibility/browser_accessibility_manager.h"
[email protected]a6120e32013-03-15 11:07:3512#include "content/browser/accessibility/browser_accessibility_manager_mac.h"
[email protected]020a50c2010-07-07 21:59:0613#include "testing/gtest/include/gtest/gtest.h"
[email protected]70d5c182010-08-06 20:43:0714#import "testing/gtest_mac.h"
[email protected]5651c582014-02-09 02:55:4315#import "ui/gfx/test/ui_cocoa_test_helper.h"
[email protected]020a50c2010-07-07 21:59:0616
[email protected]e6b34872012-10-24 20:51:3217namespace content {
[email protected]020a50c2010-07-07 21:59:0618
[email protected]208fadbf2012-02-21 08:37:1219class BrowserAccessibilityTest : public ui::CocoaTest {
[email protected]020a50c2010-07-07 21:59:0620 public:
dcheng60135332015-01-09 02:05:3421 void SetUp() override {
[email protected]020a50c2010-07-07 21:59:0622 CocoaTest::SetUp();
[email protected]3911ab82013-06-21 05:15:2623 RebuildAccessibilityTree();
24 }
25
26 protected:
27 void RebuildAccessibilityTree() {
[email protected]5eec2f52014-01-06 22:30:5428 ui::AXNodeData root;
[email protected]d3540c22011-08-17 23:12:0729 root.id = 1000;
[email protected]0aed2f52011-03-23 18:06:3630 root.location.set_width(500);
31 root.location.set_height(100);
[email protected]5eec2f52014-01-06 22:30:5432 root.role = ui::AX_ROLE_ROOT_WEB_AREA;
33 root.AddStringAttribute(ui::AX_ATTR_HELP, "HelpText");
[email protected]c477540962013-03-07 00:43:1034 root.child_ids.push_back(1001);
35 root.child_ids.push_back(1002);
[email protected]020a50c2010-07-07 21:59:0636
[email protected]5eec2f52014-01-06 22:30:5437 ui::AXNodeData child1;
[email protected]d3540c22011-08-17 23:12:0738 child1.id = 1001;
[email protected]eecf89f02013-08-20 23:41:5139 child1.SetName("Child1");
[email protected]0aed2f52011-03-23 18:06:3640 child1.location.set_width(250);
41 child1.location.set_height(100);
[email protected]5eec2f52014-01-06 22:30:5442 child1.role = ui::AX_ROLE_BUTTON;
[email protected]198d45d2010-07-27 00:20:5643
[email protected]5eec2f52014-01-06 22:30:5444 ui::AXNodeData child2;
[email protected]d3540c22011-08-17 23:12:0745 child2.id = 1002;
[email protected]0aed2f52011-03-23 18:06:3646 child2.location.set_x(250);
47 child2.location.set_width(250);
48 child2.location.set_height(100);
[email protected]5eec2f52014-01-06 22:30:5449 child2.role = ui::AX_ROLE_HEADING;
[email protected]198d45d2010-07-27 00:20:5650
[email protected]0d7dad62010-10-19 21:18:5051 manager_.reset(
[email protected]d96f3842014-04-21 18:07:2952 new BrowserAccessibilityManagerMac(
[email protected]678e1362014-04-30 05:47:3453 nil,
[email protected]d96f3842014-04-21 18:07:2954 MakeAXTreeUpdate(root, child1, child2),
55 NULL));
[email protected]cd3e2d902012-05-09 07:05:2056 accessibility_.reset([manager_->GetRoot()->ToBrowserAccessibilityCocoa()
[email protected]95b3f5442012-05-06 17:10:0757 retain]);
[email protected]020a50c2010-07-07 21:59:0658 }
[email protected]198d45d2010-07-27 00:20:5659
[email protected]a8522032013-06-24 22:51:4660 base::scoped_nsobject<BrowserAccessibilityCocoa> accessibility_;
[email protected]0d7dad62010-10-19 21:18:5061 scoped_ptr<BrowserAccessibilityManager> manager_;
[email protected]020a50c2010-07-07 21:59:0662};
63
[email protected]198d45d2010-07-27 00:20:5664// Standard hit test.
[email protected]020a50c2010-07-07 21:59:0665TEST_F(BrowserAccessibilityTest, HitTestTest) {
[email protected]1dbadbd2010-10-13 18:50:1066 BrowserAccessibilityCocoa* firstChild =
[email protected]020a50c2010-07-07 21:59:0667 [accessibility_ accessibilityHitTest:NSMakePoint(50, 50)];
[email protected]70d5c182010-08-06 20:43:0768 EXPECT_NSEQ(@"Child1",
69 [firstChild accessibilityAttributeValue:NSAccessibilityTitleAttribute]);
[email protected]020a50c2010-07-07 21:59:0670}
71
[email protected]198d45d2010-07-27 00:20:5672// Test doing a hit test on the edge of a child.
73TEST_F(BrowserAccessibilityTest, EdgeHitTest) {
[email protected]1dbadbd2010-10-13 18:50:1074 BrowserAccessibilityCocoa* firstChild =
[email protected]58d0043f2013-07-13 04:30:4675 [accessibility_ accessibilityHitTest:NSZeroPoint];
[email protected]70d5c182010-08-06 20:43:0776 EXPECT_NSEQ(@"Child1",
77 [firstChild accessibilityAttributeValue:NSAccessibilityTitleAttribute]);
[email protected]198d45d2010-07-27 00:20:5678}
79
80// This will test a hit test with invalid coordinates. It is assumed that
81// the hit test has been narrowed down to this object or one of its children
82// so it should return itself since it has no better hit result.
83TEST_F(BrowserAccessibilityTest, InvalidHitTestCoordsTest) {
[email protected]1dbadbd2010-10-13 18:50:1084 BrowserAccessibilityCocoa* hitTestResult =
[email protected]198d45d2010-07-27 00:20:5685 [accessibility_ accessibilityHitTest:NSMakePoint(-50, 50)];
[email protected]70d5c182010-08-06 20:43:0786 EXPECT_NSEQ(accessibility_, hitTestResult);
[email protected]198d45d2010-07-27 00:20:5687}
88
89// Test to ensure querying standard attributes works.
[email protected]16a3356e2013-10-18 13:56:5790TEST_F(BrowserAccessibilityTest, BasicAttributeTest) {
[email protected]020a50c2010-07-07 21:59:0691 NSString* helpText = [accessibility_
92 accessibilityAttributeValue:NSAccessibilityHelpAttribute];
[email protected]70d5c182010-08-06 20:43:0793 EXPECT_NSEQ(@"HelpText", helpText);
[email protected]020a50c2010-07-07 21:59:0694}
[email protected]198d45d2010-07-27 00:20:5695
96// Test querying for an invalid attribute to ensure it doesn't crash.
97TEST_F(BrowserAccessibilityTest, InvalidAttributeTest) {
98 NSString* shouldBeNil = [accessibility_
99 accessibilityAttributeValue:@"NSAnInvalidAttribute"];
100 EXPECT_TRUE(shouldBeNil == nil);
101}
[email protected]e6b34872012-10-24 20:51:32102
[email protected]3911ab82013-06-21 05:15:26103TEST_F(BrowserAccessibilityTest, RetainedDetachedObjectsReturnNil) {
104 // Get the first child.
105 BrowserAccessibilityCocoa* retainedFirstChild =
106 [accessibility_ accessibilityHitTest:NSMakePoint(50, 50)];
107 EXPECT_NSEQ(@"Child1", [retainedFirstChild
108 accessibilityAttributeValue:NSAccessibilityTitleAttribute]);
109
110 // Retain it. This simulates what the system might do with an
111 // accessibility object.
112 [retainedFirstChild retain];
113
114 // Rebuild the accessibility tree, which should detach |retainedFirstChild|.
115 RebuildAccessibilityTree();
116
117 // Now any attributes we query should return nil.
118 EXPECT_EQ(nil, [retainedFirstChild
119 accessibilityAttributeValue:NSAccessibilityTitleAttribute]);
120
121 // Don't leak memory in the test.
122 [retainedFirstChild release];
123}
124
[email protected]e6b34872012-10-24 20:51:32125} // namespace content