#ifndef UI_VIEWS_ACCESSIBILITY_AX_VIRTUAL_VIEW_H_
#define UI_VIEWS_ACCESSIBILITY_AX_VIRTUAL_VIEW_H_
#include <stdint.h>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "ui/accessibility/ax_enums.mojom-forward.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/accessibility/platform/ax_platform_node_delegate.h"
#include "ui/accessibility/platform/ax_unique_id.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/native_ui_types.h"
#include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/views_export.h"
#if defined(USE_AURA)
#include "ui/views/accessibility/ax_virtual_view_wrapper.h"
#endif
namespace ui {
struct AXActionData;
}
namespace views {
class AXAuraObjCache;
class AXVirtualViewWrapper;
class View;
class ViewAXPlatformNodeDelegate;
namespace test {
class AXVirtualViewTest;
}
class VIEWS_EXPORT AXVirtualView : public ViewAccessibility,
public ui::AXPlatformNodeDelegate {
public:
using AXVirtualViews = std::vector<std::unique_ptr<AXVirtualView>>;
static AXVirtualView* GetFromId(int32_t id);
AXVirtualView();
AXVirtualView(const AXVirtualView&) = delete;
AXVirtualView& operator=(const AXVirtualView&) = delete;
~AXVirtualView() override;
void AddChildView(std::unique_ptr<AXVirtualView> view);
void AddChildViewAt(std::unique_ptr<AXVirtualView> view, size_t index);
void ReorderChildView(AXVirtualView* view, size_t index);
std::unique_ptr<AXVirtualView> RemoveFromParentView();
std::unique_ptr<AXVirtualView> RemoveChildView(AXVirtualView* view);
void RemoveAllChildViews();
const AXVirtualViews& children() const { return children_; }
const ViewAccessibility* parent_view() const { return parent_view_; }
ViewAccessibility* parent_view() { return parent_view_; }
const AXVirtualView* virtual_parent_view() const {
return virtual_parent_view_;
}
AXVirtualView* virtual_parent_view() { return virtual_parent_view_; }
ui::AXPlatformNode* ax_platform_node() { return ax_platform_node_.get(); }
bool Contains(const AXVirtualView* view) const;
std::optional<size_t> GetIndexOf(const AXVirtualView* view) const;
const char* GetViewClassName() const;
gfx::NativeViewAccessible GetNativeObject() const override;
Widget* GetWidget() const override;
ViewAccessibility* GetViewAccessibilityParent() const override;
std::string GetDebugString() const override;
const ui::AXNodeData& GetData() const override;
size_t GetChildCount() const override;
gfx::NativeViewAccessible ChildAtIndex(size_t index) const override;
gfx::NativeViewAccessible GetNSWindow() override;
gfx::NativeViewAccessible GetNativeViewAccessible() override;
gfx::NativeViewAccessible GetParent() const override;
using AXPlatformNodeDelegate::GetBoundsRect;
gfx::Rect GetBoundsRect(
const ui::AXCoordinateSystem coordinate_system,
const ui::AXClippingBehavior clipping_behavior,
ui::AXOffscreenResult* offscreen_result) const override;
gfx::NativeViewAccessible HitTestSync(
int screen_physical_pixel_x,
int screen_physical_pixel_y) const override;
gfx::NativeViewAccessible GetFocus() const override;
ui::AXPlatformNode* GetFromNodeID(int32_t id) override;
bool AccessibilityPerformAction(const ui::AXActionData& data) override;
bool ShouldIgnoreHoveredStateForTesting() override;
bool IsOffscreen() const override;
ui::AXPlatformNodeId GetUniqueId() const override;
gfx::AcceleratedWidget GetTargetForNativeAccessibilityEvent() override;
std::vector<int32_t> GetColHeaderNodeIds() const override;
std::vector<int32_t> GetColHeaderNodeIds(int col_index) const override;
std::optional<int32_t> GetCellId(int row_index, int col_index) const override;
View* GetOwnerView() const;
ViewAXPlatformNodeDelegate* GetDelegate() const;
AXVirtualViewWrapper* GetOrCreateWrapper(views::AXAuraObjCache* cache);
virtual bool HandleAccessibleAction(const ui::AXActionData& action_data);
void PruneVirtualSubtree();
void UnpruneVirtualSubtree();
void ForceSetIsFocusable(bool focusable);
void ResetIsFocusable();
void OnViewHasNewAncestor(bool ancestor_focusable);
void OnViewHasNewAncestor(const AXVirtualView* new_ancestor);
void NotifyEvent(ax::mojom::Event event_type,
bool send_native_event) override;
void NotifyDataChanged() override;
void UpdateFocusableState() override;
void UpdateInvisibleState() override;
void OnWidgetClosing(Widget* widget) override;
void OnWidgetDestroyed(Widget* widget) override;
void OnWidgetUpdated(Widget* widget, Widget* old_widget) override;
void UpdateReadyToNotifyEvents() override;
void UpdateIgnoredState() override;
void SetIsEnabled(bool enabled) override;
void SetShowContextMenu(bool show_context_menu) override;
bool parent_view_is_drawn() const { return parent_view_is_drawn_; }
protected:
bool HandleAccessibleActionInOwnerView(const ui::AXActionData& action_data);
private:
friend class AXAuraObjCache;
friend class AXVirtualViewWrapper;
friend class views::test::AXVirtualViewTest;
static const char kViewClassName[];
void set_cache(AXAuraObjCache* cache);
void set_parent_view(ViewAccessibility* view_accessibility) {
DCHECK(!virtual_parent_view_);
parent_view_ = view_accessibility;
}
void SetIsEnabledRecursive(bool enabled);
void SetShowContextMenuRecursive(bool show_context_menu);
void UpdateParentViewIsDrawnRecursive(const views::View* initial_view,
bool parent_view_is_drawn);
ui::AXPlatformNode::Pointer ax_platform_node_;
raw_ptr<ViewAccessibility> parent_view_ = nullptr;
raw_ptr<AXVirtualView> virtual_parent_view_ = nullptr;
AXVirtualViews children_;
raw_ptr<AXAuraObjCache> ax_aura_obj_cache_ = nullptr;
std::optional<bool> should_be_focusable_ = std::nullopt;
bool parent_view_is_drawn_ = true;
friend class ViewAccessibility;
};
}
#endif