summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb/DOM/Node.cpp
diff options
context:
space:
mode:
authorJonah <jonahshafran@gmail.com>2022-12-11 10:56:37 -0600
committerSam Atkins <atkinssj@gmail.com>2023-01-07 10:51:53 +0000
commita469bbd1786db749e63f081fc7e0fe193f37090b (patch)
treea038d54b7d51997f554b1c0cd4fb0636e1957739 /Userland/Libraries/LibWeb/DOM/Node.cpp
parent3eef54823ab4f718009ecedf212431e59c0426ab (diff)
downloadserenity-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.cpp45
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([&current_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);
+ });
+ }
+ }
+}
+
}