diff options
author | Jonah <jonahshafran@gmail.com> | 2022-12-11 10:56:37 -0600 |
---|---|---|
committer | Sam Atkins <atkinssj@gmail.com> | 2023-01-07 10:51:53 +0000 |
commit | a469bbd1786db749e63f081fc7e0fe193f37090b (patch) | |
tree | a038d54b7d51997f554b1c0cd4fb0636e1957739 /Userland/Libraries/LibWeb/DOM/Node.cpp | |
parent | 3eef54823ab4f718009ecedf212431e59c0426ab (diff) | |
download | serenity-a469bbd1786db749e63f081fc7e0fe193f37090b.zip |
LibWeb: Add Functionality to Dump to Accessibility Tree
This will be used to display the accessibility tree in the inspector.
Diffstat (limited to 'Userland/Libraries/LibWeb/DOM/Node.cpp')
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Node.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/DOM/Node.cpp b/Userland/Libraries/LibWeb/DOM/Node.cpp index 735ab0e1f2..2929682465 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.cpp +++ b/Userland/Libraries/LibWeb/DOM/Node.cpp @@ -29,6 +29,7 @@ #include <LibWeb/DOM/StaticNodeList.h> #include <LibWeb/HTML/BrowsingContextContainer.h> #include <LibWeb/HTML/HTMLAnchorElement.h> +#include <LibWeb/HTML/HTMLStyleElement.h> #include <LibWeb/HTML/Origin.h> #include <LibWeb/HTML/Parser/HTMLParser.h> #include <LibWeb/Layout/InitialContainingBlock.h> @@ -1542,4 +1543,48 @@ bool Node::is_following(Node const& other) const return false; } +void Node::build_accessibility_tree(AccessibilityTreeNode& parent) const +{ + if (is_uninteresting_whitespace_node()) + return; + + if (is_document()) { + auto const* document = static_cast<DOM::Document const*>(this); + auto const* document_element = document->document_element(); + if (document_element) { + parent.set_value(document_element); + if (document_element->has_child_nodes()) + document_element->for_each_child([&parent](DOM::Node const& child) { + child.build_accessibility_tree(parent); + }); + } + } else if (is_element()) { + auto const* element = static_cast<DOM::Element const*>(this); + + if (is<HTML::HTMLScriptElement>(element) || is<HTML::HTMLStyleElement>(element)) + return; + + if (element->include_in_accessibility_tree()) { + auto current_node = AccessibilityTreeNode::create(const_cast<Document*>(&this->document()), this); + parent.append_child(current_node); + if (has_child_nodes()) { + for_each_child([¤t_node](DOM::Node& child) { + child.build_accessibility_tree(*current_node); + }); + } + } else if (has_child_nodes()) { + for_each_child([&parent](DOM::Node& child) { + child.build_accessibility_tree(parent); + }); + } + } else if (is_text()) { + parent.append_child(AccessibilityTreeNode::create(const_cast<Document*>(&this->document()), this)); + if (has_child_nodes()) { + for_each_child([&parent](DOM::Node& child) { + child.build_accessibility_tree(parent); + }); + } + } +} + } |