Serenity Operating System
1/*
2 * Copyright (c) 2022, Luke Wilde <lukew@serenityos.org>
3 * Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
4 *
5 * SPDX-License-Identifier: BSD-2-Clause
6 */
7
8#pragma once
9
10#include <LibWeb/Bindings/PlatformObject.h>
11#include <LibWeb/Forward.h>
12
13namespace Web::DOM {
14
15class AbstractRange : public Bindings::PlatformObject {
16 WEB_PLATFORM_OBJECT(AbstractRange, Bindings::PlatformObject);
17
18public:
19 virtual ~AbstractRange() override;
20
21 Node* start_container() { return m_start_container.ptr(); }
22 Node const* start_container() const { return m_start_container.ptr(); }
23 unsigned start_offset() const { return m_start_offset; }
24
25 Node* end_container() { return m_end_container.ptr(); }
26 Node const* end_container() const { return m_end_container.ptr(); }
27 unsigned end_offset() const { return m_end_offset; }
28
29 // https://dom.spec.whatwg.org/#range-collapsed
30 bool collapsed() const
31 {
32 // A range is collapsed if its start node is its end node and its start offset is its end offset.
33 return start_container() == end_container() && start_offset() == end_offset();
34 }
35
36protected:
37 AbstractRange(Node& start_container, u32 start_offset, Node& end_container, u32 end_offset);
38
39 virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
40 virtual void visit_edges(Cell::Visitor&) override;
41
42 JS::NonnullGCPtr<Node> m_start_container;
43 u32 m_start_offset;
44
45 JS::NonnullGCPtr<Node> m_end_container;
46 u32 m_end_offset;
47};
48
49}