blob: 1a953530d2f08e191edfe60a743fdf9f345a49ed [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_ACCESSIBILITY_PLATFORM_AX_PLATFORM_NODE_COCOA_H_
#define UI_ACCESSIBILITY_PLATFORM_AX_PLATFORM_NODE_COCOA_H_
#import <Accessibility/Accessibility.h>
#import <Cocoa/Cocoa.h>
#include <utility>
#include <vector>
#include "base/component_export.h"
#include "ui/accessibility/ax_enums.mojom-forward.h"
namespace ui {
class AXPlatformNodeBase;
class AXPlatformNodeDelegate;
using CocoaActionList = std::vector<std::pair<ax::mojom::Action, NSString*>>;
// Returns the pairings of accessibility actions to their Cocoa equivalents
// for testing.
COMPONENT_EXPORT(AX_PLATFORM)
const CocoaActionList& GetCocoaActionListForTesting();
} // namespace ui
COMPONENT_EXPORT(AX_PLATFORM)
@interface AXAnnouncementSpec : NSObject
@property(nonatomic, readonly) NSString* announcement;
@property(nonatomic, readonly) NSWindow* window;
@property(nonatomic, readonly) BOOL polite;
@end
COMPONENT_EXPORT(AX_PLATFORM)
@interface AXPlatformNodeCocoa
: NSAccessibilityElement <NSAccessibility, AXCustomContentProvider>
- (NSArray*)accessibilityCustomContent;
// Determines if this object is alive, i.e. it hasn't been detached.
- (BOOL)instanceActive;
// Returns true if this object should expose its accessible name using
// accessibilityLabel (legacy AXDescription attribute).
- (BOOL)isNameFromLabel;
// Returns an accessible element serving as a title UI element, an element
// representing the accessible name of the object and which is exposed via
// accessibilityTitleUIElement (or AXTitleUIElement legacy attribute) not via
// accessibilityTitle (or legacy AXTitle attribute) or accessibilityLabel
// (legacy AXDescription attribute).
- (id)titleUIElement;
// Adds UI elements to the array from the given attribute.
- (NSArray*)uiElementsForAttribute:(ax::mojom::IntListAttribute)attribute;
// Collects all nested accessible tree item ids in treeItemIds.
- (void)getTreeItemDescendantNodeIds:(std::vector<int32_t>*)treeItemIds;
// Maps AX roles to native roles. Returns NSAccessibilityUnknownRole if not
// found.
+ (NSString*)nativeRoleFromAXRole:(ax::mojom::Role)role;
// Maps AX roles to native subroles. Returns nil if not found.
+ (NSString*)nativeSubroleFromAXRole:(ax::mojom::Role)role;
// Maps AX events to native notifications. Returns nil if not found.
+ (NSString*)nativeNotificationFromAXEvent:(ax::mojom::Event)event;
- (instancetype)initWithNode:(ui::AXPlatformNodeBase*)node;
- (void)detachAndNotifyDestroyed:(BOOL)shouldNotify;
// Returns this node's internal role, i.e. the one that is stored in
// the internal accessibility tree as opposed to the platform tree.
- (ax::mojom::Role)internalRole;
// Returns true if the given action is supported on the node.
- (BOOL)hasAction:(ax::mojom::Action)action;
// Performs the given action if supported.
- (BOOL)performAction:(ax::mojom::Action)action;
// Returns all accessibility attribute names. This is analogous to the
// deprecated NSAccessibility accessibilityAttributeNames method, which
// functions identically when the migration flag is off (see
// kMacAccessibilityAPIMigration). This is used for ax dump testing that
// essentially tests the deprecated API.
- (NSMutableArray*)internalAccessibilityAttributeNames;
// Returns all accessibility parameterized attribute names, similar to
// internalAccessibilityAttributeNames.
- (NSMutableArray*)internalAccessibilityParameterizedAttributeNames;
- (NSMutableArray*)internalAccessibilityActionNames;
// Returns YES if `method` has been implemented in the transition to the new
// accessibility API, and is supported by this node (based on its role).
- (BOOL)supportsNewAccessibilityAPIMethod:(NSString*)method;
// Returns YES if the node responds to the method identified by the given
// given selector. This is not the same as implementing the method; rather, it
// checks whether the given method is supported by the specific AX element.
// If the method is not supported, it returns NO.
// For example, a node that is not an AXTitleUIElement will not respond to
// the accessibilityTitleUIElement method.
- (BOOL)conditionallyRespondsToSelector:(SEL)selector;
// The new NSAccessibility API is method-based, but the old NSAccessibility
// is attribute-based. For every method, there is a corresponding attribute.
// This function returns the map between the methods and the attributes
// for purposes of migrating to the new API.
+ (NSDictionary*)newAccessibilityAPIMethodToAttributeMap;
// Returns YES if `attribute`'s value is available through the new Cocoa
// accessibility API.
+ (BOOL)isAttributeAvailableThroughNewAccessibilityAPI:(NSString*)attribute;
@property(nonatomic, readonly) NSRect boundsInScreen;
@property(nonatomic, readonly) ui::AXPlatformNodeBase* node;
@property(nonatomic, readonly) ui::AXPlatformNodeDelegate* nodeDelegate;
// Returns the data necessary to queue an NSAccessibility announcement if
// |eventType| should be announced, or nil otherwise.
- (AXAnnouncementSpec*)announcementForEvent:(ax::mojom::Event)eventType;
// Ask the system to announce |announcementText|. This is debounced to happen
// at most every |kLiveRegionDebounceMillis| per node, with only the most
// recent announcement text read, to account for situations with multiple
// notifications happening one after another (for example, results for
// find-in-page updating rapidly as they come in from subframes).
- (void)scheduleLiveRegionAnnouncement:(AXAnnouncementSpec*)announcement;
- (id)AXWindow;
@end
#endif // UI_ACCESSIBILITY_PLATFORM_AX_PLATFORM_NODE_COCOA_H_