blob: ea0fd5cff04097a3f8e589e8c7a612a61a87111e [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// 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_DELEGATE_BASE_H_
#define UI_ACCESSIBILITY_PLATFORM_AX_PLATFORM_NODE_DELEGATE_BASE_H_
#include <stdint.h>
#include <memory>
#include <set>
#include <string>
#include <vector>
#include "ax_platform_node_delegate.h"
namespace ui {
// Base implementation of AXPlatformNodeDelegate where all functions
// return a default value. Useful for classes that want to implement
// AXPlatformNodeDelegate but don't need to override much of its
// behavior.
class AX_EXPORT AXPlatformNodeDelegateBase : public AXPlatformNodeDelegate {
public:
AXPlatformNodeDelegateBase();
~AXPlatformNodeDelegateBase() override;
// Get the accessibility data that should be exposed for this node.
// Virtually all of the information is obtained from this structure
// (role, state, name, cursor position, etc.) - the rest of this interface
// is mostly to implement support for walking the accessibility tree.
const AXNodeData& GetData() const override;
// Get the accessibility tree data for this node.
const AXTreeData& GetTreeData() const override;
std::u16string GetInnerText() const override;
const AXTree::Selection GetUnignoredSelection() const override;
// Creates a text position rooted at this object.
AXNodePosition::AXPositionInstance CreateTextPositionAt(
int offset) const override;
// See comments in AXPlatformNodeDelegate.
gfx::NativeViewAccessible GetNSWindow() override;
// Get the node for this delegate, which may be an AXPlatformNode or it may
// be a native accessible object implemented by another class.
gfx::NativeViewAccessible GetNativeViewAccessible() override;
// Get the parent of the node, which may be an AXPlatformNode or it may
// be a native accessible object implemented by another class.
gfx::NativeViewAccessible GetParent() override;
// Get the index in parent. Typically this is the AXNode's index_in_parent_.
int GetIndexInParent() override;
// Get the number of children of this node.
int GetChildCount() const override;
// Get the child of a node given a 0-based index.
gfx::NativeViewAccessible ChildAtIndex(int index) override;
// Returns true if it has a modal dialog.
bool HasModalDialog() const override;
gfx::NativeViewAccessible GetFirstChild() override;
gfx::NativeViewAccessible GetLastChild() override;
gfx::NativeViewAccessible GetNextSibling() override;
gfx::NativeViewAccessible GetPreviousSibling() override;
bool IsChildOfLeaf() const override;
bool IsChildOfPlainTextField() const override;
bool IsLeaf() const override;
bool IsToplevelBrowserWindow() override;
gfx::NativeViewAccessible GetClosestPlatformObject() const override;
class ChildIteratorBase : public ChildIterator {
public:
ChildIteratorBase(AXPlatformNodeDelegateBase* parent, int index);
ChildIteratorBase(const ChildIteratorBase& it);
~ChildIteratorBase() override = default;
bool operator==(const ChildIterator& rhs) const override;
bool operator!=(const ChildIterator& rhs) const override;
void operator++() override;
void operator++(int) override;
void operator--() override;
void operator--(int) override;
gfx::NativeViewAccessible GetNativeViewAccessible() const override;
int GetIndexInParent() const override;
AXPlatformNodeDelegate& operator*() const override;
AXPlatformNodeDelegate* operator->() const override;
private:
int index_;
AXPlatformNodeDelegateBase* parent_;
};
std::unique_ptr<AXPlatformNodeDelegate::ChildIterator> ChildrenBegin()
override;
std::unique_ptr<AXPlatformNodeDelegate::ChildIterator> ChildrenEnd() override;
std::string GetName() const override;
std::u16string GetHypertext() const override;
bool SetHypertextSelection(int start_offset, int end_offset) override;
TextAttributeMap ComputeTextAttributeMap(
const TextAttributeList& default_attributes) const override;
std::string GetInheritedFontFamilyName() const override;
gfx::Rect GetBoundsRect(const AXCoordinateSystem coordinate_system,
const AXClippingBehavior clipping_behavior,
AXOffscreenResult* offscreen_result) const override;
gfx::Rect GetHypertextRangeBoundsRect(
const int start_offset,
const int end_offset,
const AXCoordinateSystem coordinate_system,
const AXClippingBehavior clipping_behavior,
AXOffscreenResult* offscreen_result) const override;
gfx::Rect GetInnerTextRangeBoundsRect(
const int start_offset,
const int end_offset,
const AXCoordinateSystem coordinate_system,
const AXClippingBehavior clipping_behavior,
AXOffscreenResult* offscreen_result) const override;
// Derivative utils for AXPlatformNodeDelegate::GetBoundsRect
gfx::Rect GetClippedScreenBoundsRect(
AXOffscreenResult* offscreen_result = nullptr) const override;
gfx::Rect GetUnclippedScreenBoundsRect(
AXOffscreenResult* offscreen_result = nullptr) const;
// Do a *synchronous* hit test of the given location in global screen physical
// pixel coordinates, and the node within this node's subtree (inclusive)
// that's hit, if any.
//
// If the result is anything other than this object or NULL, it will be
// hit tested again recursively - that allows hit testing to work across
// implementation classes. It's okay to take advantage of this and return
// only an immediate child and not the deepest descendant.
//
// This function is mainly used by accessibility debugging software.
// Platforms with touch accessibility use a different asynchronous interface.
gfx::NativeViewAccessible HitTestSync(
int screen_physical_pixel_x,
int screen_physical_pixel_y) const override;
// Return the node within this node's subtree (inclusive) that currently
// has focus.
gfx::NativeViewAccessible GetFocus() override;
// Get whether this node is offscreen.
bool IsOffscreen() const override;
// Get whether this node is a minimized window.
bool IsMinimized() const override;
bool IsText() const override;
// Get whether this node is in web content.
bool IsWebContent() const override;
// Returns true if the caret or selection is visible on this object.
bool HasVisibleCaretOrSelection() const override;
// Get another node from this same tree.
AXPlatformNode* GetFromNodeID(int32_t id) override;
// Get a node from a different tree using a tree ID and node ID.
// Note that this is only guaranteed to work if the other tree is of the
// same type, i.e. it won't work between web and views or vice-versa.
AXPlatformNode* GetFromTreeIDAndNodeID(const ui::AXTreeID& ax_tree_id,
int32_t id) override;
// Given a node ID attribute (one where IsNodeIdIntAttribute is true), return
// a target nodes for which this delegate's node has that relationship
// attribute or NULL if there is no such relationship.
AXPlatformNode* GetTargetNodeForRelation(
ax::mojom::IntAttribute attr) override;
// Given a node ID attribute (one where IsNodeIdIntListAttribute is true),
// return a vector of all target nodes for which this delegate's node has that
// relationship attribute.
std::vector<AXPlatformNode*> GetTargetNodesForRelation(
ax::mojom::IntListAttribute attr) override;
// Given a node ID attribute (one where IsNodeIdIntAttribute is true), return
// a set of all source nodes that have that relationship attribute between
// them and this delegate's node.
std::set<AXPlatformNode*> GetReverseRelations(
ax::mojom::IntAttribute attr) override;
// Given a node ID list attribute (one where IsNodeIdIntListAttribute is
// true) return a set of all source nodes that have that relationship
// attribute between them and this delegate's node.
std::set<AXPlatformNode*> GetReverseRelations(
ax::mojom::IntListAttribute attr) override;
std::u16string GetAuthorUniqueId() const override;
const AXUniqueId& GetUniqueId() const override;
std::optional<int> FindTextBoundary(
ax::mojom::TextBoundary boundary,
int offset,
ax::mojom::MoveDirection direction,
ax::mojom::TextAffinity affinity) const override;
const std::vector<gfx::NativeViewAccessible> GetUIADescendants()
const override;
std::string GetLanguage() const override;
//
// Tables. All of these should be called on a node that's a table-like
// role, otherwise they return nullopt.
//
bool IsTable() const override;
std::optional<int> GetTableColCount() const override;
std::optional<int> GetTableRowCount() const override;
std::optional<int> GetTableAriaColCount() const override;
std::optional<int> GetTableAriaRowCount() const override;
std::optional<int> GetTableCellCount() const override;
std::optional<bool> GetTableHasColumnOrRowHeaderNode() const override;
std::vector<int32_t> GetColHeaderNodeIds() const override;
std::vector<int32_t> GetColHeaderNodeIds(int col_index) const override;
std::vector<int32_t> GetRowHeaderNodeIds() const override;
std::vector<int32_t> GetRowHeaderNodeIds(int row_index) const override;
AXPlatformNode* GetTableCaption() const override;
// Table row-like nodes.
bool IsTableRow() const override;
std::optional<int> GetTableRowRowIndex() const override;
// Table cell-like nodes.
bool IsTableCellOrHeader() const override;
std::optional<int> GetTableCellIndex() const override;
std::optional<int> GetTableCellColIndex() const override;
std::optional<int> GetTableCellRowIndex() const override;
std::optional<int> GetTableCellColSpan() const override;
std::optional<int> GetTableCellRowSpan() const override;
std::optional<int> GetTableCellAriaColIndex() const override;
std::optional<int> GetTableCellAriaRowIndex() const override;
std::optional<int32_t> GetCellId(int row_index, int col_index) const override;
std::optional<int32_t> CellIndexToId(int cell_index) const override;
// Helper methods to check if a cell is an ARIA-1.1+ 'cell' or 'gridcell'
bool IsCellOrHeaderOfARIATable() const override;
bool IsCellOrHeaderOfARIAGrid() const override;
// Ordered-set-like and item-like nodes.
bool IsOrderedSetItem() const override;
bool IsOrderedSet() const override;
std::optional<int> GetPosInSet() const override;
std::optional<int> GetSetSize() const override;
//
// Events.
//
// Return the platform-native GUI object that should be used as a target
// for accessibility events.
gfx::AcceleratedWidget GetTargetForNativeAccessibilityEvent() override;
//
// Actions.
//
// Perform an accessibility action, switching on the ax::mojom::Action
// provided in |data|.
bool AccessibilityPerformAction(const AXActionData& data) override;
//
// Localized strings.
//
std::u16string GetLocalizedStringForImageAnnotationStatus(
ax::mojom::ImageAnnotationStatus status) const override;
std::u16string GetLocalizedRoleDescriptionForUnlabeledImage() const override;
std::u16string GetLocalizedStringForLandmarkType() const override;
std::u16string GetLocalizedStringForRoleDescription() const override;
std::u16string GetStyleNameAttributeAsLocalizedString() const override;
//
// Testing.
//
// Accessibility objects can have the "hot tracked" state set when
// the mouse is hovering over them, but this makes tests flaky because
// the test behaves differently when the mouse happens to be over an
// element. The default value should be falses if not in testing mode.
bool ShouldIgnoreHoveredStateForTesting() override;
protected:
std::string SubtreeToStringHelper(size_t level) override;
// Given a list of node ids, return the nodes in this delegate's tree to
// which they correspond.
std::set<ui::AXPlatformNode*> GetNodesForNodeIds(
const std::set<int32_t>& ids);
AXPlatformNodeDelegate* GetParentDelegate();
private:
BASE_DISALLOW_COPY_AND_ASSIGN(AXPlatformNodeDelegateBase);
};
} // namespace ui
#endif // UI_ACCESSIBILITY_PLATFORM_AX_PLATFORM_NODE_DELEGATE_BASE_H_