Serenity Operating System
at master 75 lines 2.2 kB view raw
1/* 2 * Copyright (c) 2022, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include <LibWeb/DOM/NodeFilter.h> 10 11namespace Web::DOM { 12 13// https://dom.spec.whatwg.org/#treewalker 14class TreeWalker final : public Bindings::PlatformObject { 15 WEB_PLATFORM_OBJECT(TreeWalker, Bindings::PlatformObject); 16 17public: 18 static WebIDL::ExceptionOr<JS::NonnullGCPtr<TreeWalker>> create(Node& root, unsigned what_to_show, JS::GCPtr<NodeFilter>); 19 20 virtual ~TreeWalker() override; 21 22 JS::NonnullGCPtr<Node> current_node() const; 23 void set_current_node(Node&); 24 25 JS::ThrowCompletionOr<JS::GCPtr<Node>> parent_node(); 26 JS::ThrowCompletionOr<JS::GCPtr<Node>> first_child(); 27 JS::ThrowCompletionOr<JS::GCPtr<Node>> last_child(); 28 JS::ThrowCompletionOr<JS::GCPtr<Node>> previous_sibling(); 29 JS::ThrowCompletionOr<JS::GCPtr<Node>> next_sibling(); 30 JS::ThrowCompletionOr<JS::GCPtr<Node>> previous_node(); 31 JS::ThrowCompletionOr<JS::GCPtr<Node>> next_node(); 32 33 JS::NonnullGCPtr<Node> root() { return m_root; } 34 35 NodeFilter* filter() { return m_filter.ptr(); } 36 37 unsigned what_to_show() const { return m_what_to_show; } 38 39private: 40 explicit TreeWalker(Node& root); 41 42 virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override; 43 virtual void visit_edges(Cell::Visitor&) override; 44 45 enum class ChildTraversalType { 46 First, 47 Last, 48 }; 49 JS::ThrowCompletionOr<JS::GCPtr<Node>> traverse_children(ChildTraversalType); 50 51 enum class SiblingTraversalType { 52 Next, 53 Previous, 54 }; 55 JS::ThrowCompletionOr<JS::GCPtr<Node>> traverse_siblings(SiblingTraversalType); 56 57 JS::ThrowCompletionOr<NodeFilter::Result> filter(Node&); 58 59 // https://dom.spec.whatwg.org/#concept-traversal-root 60 JS::NonnullGCPtr<Node> m_root; 61 62 // https://dom.spec.whatwg.org/#treewalker-current 63 JS::NonnullGCPtr<Node> m_current; 64 65 // https://dom.spec.whatwg.org/#concept-traversal-whattoshow 66 unsigned m_what_to_show { 0 }; 67 68 // https://dom.spec.whatwg.org/#concept-traversal-filter 69 JS::GCPtr<NodeFilter> m_filter; 70 71 // https://dom.spec.whatwg.org/#concept-traversal-active 72 bool m_active { false }; 73}; 74 75}