ladybird/Libraries/LibDevTools/Actors/AccessibilityWalkerActor.h
Sam Atkins 41b4292447 LibDevTools+LibWebView: Implement initial accessibility tree view
This is enough for Firefox to display the Accessibility tab, containing
our accessibility tree which can be inspected. Most information is
blank for now.

There's quite a bit of duplication between AccessibilityWalkerActor and
WalkerActor - it might be worth trying to make a base class once the
details are figured out. Frustratingly, the two don't work quite the
same: for a lot of messages that would be sent to WalkerActor, the
accessibility equivalent is sent to the AccessibilityNodeActor instead.

Co-authored-by: Tim Flynn <trflynn89@pm.me>
2025-10-20 10:51:19 +01:00

56 lines
1.9 KiB
C++

/*
* Copyright (c) 2025, Sam Atkins <sam@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibDevTools/Actor.h>
#include <LibDevTools/Actors/AccessibilityNodeActor.h>
#include <LibDevTools/Forward.h>
namespace DevTools {
class DEVTOOLS_API AccessibilityWalkerActor final : public Actor {
public:
static constexpr auto base_name = "accessibility-walker"sv;
static NonnullRefPtr<AccessibilityWalkerActor> create(DevToolsServer&, String name, WeakPtr<TabActor>, JsonObject accessibility_tree);
virtual ~AccessibilityWalkerActor() override;
static bool is_suitable_for_accessibility_inspection(JsonValue const&);
JsonValue serialize_root() const;
JsonValue serialize_node(JsonObject const&) const;
static Optional<Node> accessibility_node_for(WeakPtr<AccessibilityWalkerActor> const&, StringView actor);
Optional<Node> accessibility_node(StringView actor);
static Optional<Node> parent_of_accessibility_node_for(WeakPtr<AccessibilityWalkerActor> const&, Node const&);
Optional<Node> parent_of_accessibility_node(Node const&);
static Optional<Node> root_accessibility_node_for(WeakPtr<AccessibilityWalkerActor> const&);
Optional<Node> root_accessibility_node();
private:
AccessibilityWalkerActor(DevToolsServer&, String name, WeakPtr<TabActor>, JsonObject accessibility_tree);
virtual void handle_message(Message const&) override;
void populate_accessibility_tree_cache();
void populate_accessibility_tree_cache(JsonObject& node, JsonObject const* parent);
AccessibilityNodeActor const& actor_for_node(JsonObject const& node);
WeakPtr<TabActor> m_tab;
JsonObject m_accessibility_tree;
HashMap<JsonObject const*, JsonObject const*> m_node_to_parent_map;
HashMap<String, JsonObject const*> m_actor_to_node_map;
HashMap<Web::UniqueNodeID, String> m_node_id_to_actor_map;
HashMap<NodeIdentifier, WeakPtr<AccessibilityNodeActor>> m_node_actors;
};
}