#include "ui/views/accessibility/view_accessibility.h"
#include <utility>
#include "base/auto_reset.h"
#include "base/functional/callback.h"
#include "base/memory/ptr_util.h"
#include "base/ranges/algorithm.h"
#include "base/strings/utf_string_conversions.h"
#include "build/chromeos_buildflags.h"
#include "ui/accessibility/accessibility_features.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/platform/ax_platform_node.h"
#include "ui/accessibility/platform/ax_platform_node_delegate.h"
#include "ui/base/buildflags.h"
#include "ui/display/display.h"
#include "ui/display/screen.h"
#include "ui/views/accessibility/atomic_view_ax_tree_manager.h"
#include "ui/views/accessibility/ax_event_manager.h"
#include "ui/views/accessibility/widget_ax_tree_id_map.h"
#include "ui/views/view.h"
#include "ui/views/view_utils.h"
#include "ui/views/widget/root_view.h"
#include "ui/views/widget/widget.h"
namespace views {
namespace {
bool IsValidRoleForViews(ax::mojom::Role role) { … }
}
#define RETURN_IF_UNAVAILABLE() …
#if !BUILDFLAG_INTERNAL_HAS_NATIVE_ACCESSIBILITY()
std::unique_ptr<ViewAccessibility> ViewAccessibility::Create(View* view) {
return base::WrapUnique(new ViewAccessibility(view));
}
#endif
ViewAccessibility::ViewAccessibility(View* view)
: … { … }
ViewAccessibility::~ViewAccessibility() = default;
void ViewAccessibility::AddVirtualChildView(
std::unique_ptr<AXVirtualView> virtual_view) { … }
void ViewAccessibility::AddVirtualChildViewAt(
std::unique_ptr<AXVirtualView> virtual_view,
size_t index) { … }
std::unique_ptr<AXVirtualView> ViewAccessibility::RemoveVirtualChildView(
AXVirtualView* virtual_view) { … }
void ViewAccessibility::RemoveAllVirtualChildViews() { … }
bool ViewAccessibility::Contains(const AXVirtualView* virtual_view) const { … }
std::optional<size_t> ViewAccessibility::GetIndexOf(
const AXVirtualView* virtual_view) const { … }
void ViewAccessibility::GetAccessibleNodeData(ui::AXNodeData* data) const { … }
void ViewAccessibility::NotifyEvent(ax::mojom::Event event_type,
bool send_native_event) { … }
void ViewAccessibility::OverrideFocus(AXVirtualView* virtual_view) { … }
bool ViewAccessibility::IsAccessibilityFocusable() const { … }
bool ViewAccessibility::IsFocusedForTesting() const { … }
void ViewAccessibility::SetPopupFocusOverride() { … }
void ViewAccessibility::EndPopupFocusOverride() { … }
void ViewAccessibility::FireFocusAfterMenuClose() { … }
void ViewAccessibility::SetProperties(
std::optional<ax::mojom::Role> role,
std::optional<std::u16string> name,
std::optional<std::u16string> description,
std::optional<std::u16string> role_description,
std::optional<ax::mojom::NameFrom> name_from,
std::optional<ax::mojom::DescriptionFrom> description_from) { … }
void ViewAccessibility::SetIsLeaf(bool value) { … }
bool ViewAccessibility::IsLeaf() const { … }
bool ViewAccessibility::IsChildOfLeaf() const { … }
void ViewAccessibility::SetReadOnly(bool read_only) { … }
bool ViewAccessibility::GetIsPruned() const { … }
void ViewAccessibility::SetCharacterOffsets(
const std::vector<int32_t>& offsets) { … }
const std::vector<int32_t>& ViewAccessibility::GetCharacterOffsets() const { … }
void ViewAccessibility::SetWordStarts(const std::vector<int32_t>& offsets) { … }
const std::vector<int32_t>& ViewAccessibility::GetWordStarts() const { … }
void ViewAccessibility::SetWordEnds(const std::vector<int32_t>& offsets) { … }
const std::vector<int32_t>& ViewAccessibility::GetWordEnds() const { … }
void ViewAccessibility::ClearTextOffsets() { … }
void ViewAccessibility::SetHasPopup(const ax::mojom::HasPopup has_popup) { … }
void ViewAccessibility::SetRole(const ax::mojom::Role role) { … }
void ViewAccessibility::SetRole(const ax::mojom::Role role,
const std::u16string& role_description) { … }
void ViewAccessibility::SetName(std::u16string name,
ax::mojom::NameFrom name_from) { … }
void ViewAccessibility::SetName(const std::string& name,
ax::mojom::NameFrom name_from) { … }
void ViewAccessibility::SetName(const std::string& name) { … }
void ViewAccessibility::SetName(const std::u16string& name) { … }
void ViewAccessibility::SetName(View& naming_view) { … }
void ViewAccessibility::RemoveName() { … }
std::u16string ViewAccessibility::GetCachedName() const { … }
ax::mojom::NameFrom ViewAccessibility::GetCachedNameFrom() const { … }
ax::mojom::Role ViewAccessibility::GetCachedRole() const { … }
void ViewAccessibility::SetRoleDescription(
const std::u16string& role_description) { … }
void ViewAccessibility::SetRoleDescription(
const std::string& role_description) { … }
void ViewAccessibility::RemoveRoleDescription() { … }
void ViewAccessibility::SetIsEditable(bool editable) { … }
void ViewAccessibility::SetBounds(const gfx::RectF& bounds) { … }
void ViewAccessibility::SetPosInSet(int pos_in_set) { … }
void ViewAccessibility::SetSetSize(int set_size) { … }
void ViewAccessibility::ClearPosInSet() { … }
void ViewAccessibility::ClearSetSize() { … }
void ViewAccessibility::SetScrollX(int scroll_x) { … }
void ViewAccessibility::SetScrollXMin(int scroll_x_min) { … }
void ViewAccessibility::SetScrollXMax(int scroll_x_max) { … }
void ViewAccessibility::SetScrollY(int scroll_y) { … }
void ViewAccessibility::SetScrollYMin(int scroll_y_min) { … }
void ViewAccessibility::SetScrollYMax(int scroll_y_max) { … }
void ViewAccessibility::SetIsScrollable(bool is_scrollable) { … }
void ViewAccessibility::SetActiveDescendant(views::View& view) { … }
void ViewAccessibility::SetActiveDescendant(ui::AXPlatformNodeId id) { … }
void ViewAccessibility::ClearActiveDescendant() { … }
void ViewAccessibility::SetIsInvisible(bool is_invisible) { … }
void ViewAccessibility::SetIsDefault(bool is_default) { … }
void ViewAccessibility::SetIsEnabled(bool is_enabled) { … }
bool ViewAccessibility::GetIsEnabled() const { … }
void ViewAccessibility::SetTableRowCount(int row_count) { … }
void ViewAccessibility::SetTableColumnCount(int column_count) { … }
void ViewAccessibility::ClearDescriptionAndDescriptionFrom() { … }
void ViewAccessibility::RemoveDescription() { … }
void ViewAccessibility::SetDescription(
const std::string& description,
const ax::mojom::DescriptionFrom description_from) { … }
void ViewAccessibility::SetDescription(
const std::u16string& description,
const ax::mojom::DescriptionFrom description_from) { … }
void ViewAccessibility::SetDescription(View& describing_view) { … }
std::u16string ViewAccessibility::GetCachedDescription() const { … }
void ViewAccessibility::SetPlaceholder(const std::string& placeholder) { … }
void ViewAccessibility::AddAction(ax::mojom::Action action) { … }
void ViewAccessibility::SetCheckedState(ax::mojom::CheckedState checked_state) { … }
void ViewAccessibility::RemoveCheckedState() { … }
void ViewAccessibility::SetKeyShortcuts(const std::string& key_shortcuts) { … }
void ViewAccessibility::RemoveKeyShortcuts() { … }
void ViewAccessibility::SetAccessKey(const std::string& access_key) { … }
void ViewAccessibility::RemoveAccessKey() { … }
void ViewAccessibility::SetChildTreeNodeAppId(const std::string& app_id) { … }
void ViewAccessibility::RemoveChildTreeNodeAppId() { … }
void ViewAccessibility::SetIsSelected(bool selected) { … }
void ViewAccessibility::SetIsMultiselectable(bool multiselectable) { … }
void ViewAccessibility::SetIsIgnored(bool is_ignored) { … }
bool ViewAccessibility::GetIsIgnored() const { … }
void ViewAccessibility::OverrideNativeWindowTitle(const std::string& title) { … }
void ViewAccessibility::OverrideNativeWindowTitle(const std::u16string& title) { … }
void ViewAccessibility::SetNextFocus(Widget* widget) { … }
void ViewAccessibility::SetPreviousFocus(Widget* widget) { … }
Widget* ViewAccessibility::GetNextWindowFocus() const { … }
Widget* ViewAccessibility::GetPreviousWindowFocus() const { … }
void ViewAccessibility::SetShowContextMenu(bool show_context_menu) { … }
void ViewAccessibility::SetContainerLiveStatus(const std::string& status) { … }
void ViewAccessibility::RemoveContainerLiveStatus() { … }
void ViewAccessibility::SetValue(const std::string& value) { … }
void ViewAccessibility::SetValue(const std::u16string& value) { … }
void ViewAccessibility::RemoveValue() { … }
std::u16string ViewAccessibility::GetValue() const { … }
void ViewAccessibility::SetDefaultActionVerb(
const ax::mojom::DefaultActionVerb default_action_verb) { … }
void ViewAccessibility::RemoveDefaultActionVerb() { … }
void ViewAccessibility::SetAutoComplete(const std::string autocomplete) { … }
void ViewAccessibility::UpdateFocusableState() { … }
void ViewAccessibility::UpdateFocusableStateRecursive() { … }
void ViewAccessibility::UpdateStatesForViewAndDescendants() { … }
void ViewAccessibility::SetRootViewIsReadyToNotifyEvents() { … }
void ViewAccessibility::UpdateInvisibleState() { … }
void ViewAccessibility::SetChildTreeID(ui::AXTreeID tree_id) { … }
ui::AXTreeID ViewAccessibility::GetChildTreeID() const { … }
void ViewAccessibility::SetChildTreeScaleFactor(float scale_factor) { … }
gfx::NativeViewAccessible ViewAccessibility::GetNativeObject() const { … }
void ViewAccessibility::AnnounceAlert(const std::u16string& text) { … }
void ViewAccessibility::AnnouncePolitely(const std::u16string& text) { … }
void ViewAccessibility::AnnounceText(const std::u16string& text) { … }
ui::AXPlatformNodeId ViewAccessibility::GetUniqueId() const { … }
AtomicViewAXTreeManager*
ViewAccessibility::GetAtomicViewAXTreeManagerForTesting() const { … }
gfx::NativeViewAccessible ViewAccessibility::GetFocusedDescendant() { … }
void ViewAccessibility::FireNativeEvent(ax::mojom::Event event_type) { … }
const ViewAccessibility::AccessibilityEventsCallback&
ViewAccessibility::accessibility_events_callback() const { … }
void ViewAccessibility::set_accessibility_events_callback(
ViewAccessibility::AccessibilityEventsCallback callback) { … }
void ViewAccessibility::CompleteCacheInitializationRecursive() { … }
void ViewAccessibility::InitializeRoleIfNeeded() { … }
void ViewAccessibility::OnWidgetClosing(Widget* widget) { … }
void ViewAccessibility::OnWidgetDestroyed(Widget* widget) { … }
void ViewAccessibility::OnWidgetUpdated(Widget* widget, Widget* old_widget) { … }
void ViewAccessibility::CompleteCacheInitialization() { … }
void ViewAccessibility::PruneSubtree() { … }
void ViewAccessibility::UnpruneSubtree() { … }
void ViewAccessibility::UpdateIgnoredState() { … }
void ViewAccessibility::UpdateReadyToNotifyEvents() { … }
void ViewAccessibility::SetReadyToNotifyEvents() { … }
void ViewAccessibility::SetWidgetClosedRecursive(Widget* widget, bool value) { … }
void ViewAccessibility::SetDataForClosedWidget(ui::AXNodeData* data) const { … }
void ViewAccessibility::SetHierarchicalLevel(int hierarchical_level) { … }
void ViewAccessibility::SetState(ax::mojom::State state, bool is_enabled) { … }
void ViewAccessibility::SetIsHovered(bool is_hovered) { … }
bool ViewAccessibility::GetIsHovered() const { … }
void ViewAccessibility::SetPopupForId(ui::AXPlatformNodeId popup_for_id) { … }
void ViewAccessibility::SetTextDirection(int text_direction) { … }
void ViewAccessibility::SetIsProtected(bool is_protected) { … }
void ViewAccessibility::SetIsExpanded() { … }
void ViewAccessibility::SetIsCollapsed() { … }
void ViewAccessibility::RemoveExpandCollapseState() { … }
void ViewAccessibility::SetIsVertical(bool vertical) { … }
void ViewAccessibility::SetTextSelStart(int32_t text_sel_start) { … }
void ViewAccessibility::SetTextSelEnd(int32_t text_sel_end) { … }
}