diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h index 6a606e39ac..e836c222c5 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h +++ b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h @@ -12,6 +12,8 @@ #include #include #include +#include +#include #include #include #include @@ -326,6 +328,7 @@ auto& vm = this->vm(); \ ADD_WINDOW_OBJECT_INTERFACE(AbortController) \ ADD_WINDOW_OBJECT_INTERFACE(AbortSignal) \ + ADD_WINDOW_OBJECT_INTERFACE(AbstractRange) \ ADD_WINDOW_OBJECT_INTERFACE(Crypto) \ ADD_WINDOW_OBJECT_INTERFACE(CSSRule) \ ADD_WINDOW_OBJECT_INTERFACE(CSSRuleList) \ diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index e1317f8f67..7edc464803 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -411,6 +411,7 @@ libweb_js_wrapper(CSS/MediaQueryListEvent) libweb_js_wrapper(CSS/Screen) libweb_js_wrapper(CSS/StyleSheet) libweb_js_wrapper(CSS/StyleSheetList) +libweb_js_wrapper(DOM/AbstractRange) libweb_js_wrapper(DOM/Attribute) libweb_js_wrapper(DOM/AbortController) libweb_js_wrapper(DOM/AbortSignal) diff --git a/Userland/Libraries/LibWeb/DOM/AbstractRange.h b/Userland/Libraries/LibWeb/DOM/AbstractRange.h new file mode 100644 index 0000000000..0547879aa8 --- /dev/null +++ b/Userland/Libraries/LibWeb/DOM/AbstractRange.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2022, Luke Wilde + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Web::DOM { + +class AbstractRange + : public RefCounted + , public Bindings::Wrappable { +public: + using WrapperType = Bindings::AbstractRangeWrapper; + + virtual ~AbstractRange() override = default; + + Node* start_container() { return m_start_container; } + const Node* start_container() const { return m_start_container; } + unsigned start_offset() const { return m_start_offset; } + + Node* end_container() { return m_end_container; } + const Node* end_container() const { return m_end_container; } + unsigned end_offset() const { return m_end_offset; } + + // https://dom.spec.whatwg.org/#range-collapsed + bool collapsed() const + { + // A range is collapsed if its start node is its end node and its start offset is its end offset. + return start_container() == end_container() && start_offset() == end_offset(); + } + +protected: + AbstractRange(Node& start_container, u32 start_offset, Node& end_container, u32 end_offset) + : m_start_container(start_container) + , m_start_offset(start_offset) + , m_end_container(end_container) + , m_end_offset(end_offset) + { + } + + NonnullRefPtr m_start_container; + u32 m_start_offset; + + NonnullRefPtr m_end_container; + u32 m_end_offset; +}; + +} diff --git a/Userland/Libraries/LibWeb/DOM/AbstractRange.idl b/Userland/Libraries/LibWeb/DOM/AbstractRange.idl new file mode 100644 index 0000000000..0b29d41450 --- /dev/null +++ b/Userland/Libraries/LibWeb/DOM/AbstractRange.idl @@ -0,0 +1,8 @@ +[Exposed=Window] +interface AbstractRange { + readonly attribute Node startContainer; + readonly attribute unsigned long startOffset; + readonly attribute Node endContainer; + readonly attribute unsigned long endOffset; + readonly attribute boolean collapsed; +}; diff --git a/Userland/Libraries/LibWeb/DOM/Range.cpp b/Userland/Libraries/LibWeb/DOM/Range.cpp index 015fa3adde..ebab3fa061 100644 --- a/Userland/Libraries/LibWeb/DOM/Range.cpp +++ b/Userland/Libraries/LibWeb/DOM/Range.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, the SerenityOS developers. + * Copyright (c) 2022, Luke Wilde * * SPDX-License-Identifier: BSD-2-Clause */ @@ -21,10 +22,11 @@ NonnullRefPtr Range::create(Document& document) return adopt_ref(*new Range(document)); } -NonnullRefPtr Range::create(Node& start_container, size_t start_offset, Node& end_container, size_t end_offset) +NonnullRefPtr Range::create(Node& start_container, u32 start_offset, Node& end_container, u32 end_offset) { return adopt_ref(*new Range(start_container, start_offset, end_container, end_offset)); } + NonnullRefPtr Range::create_with_global_object(Bindings::WindowObject& window) { return Range::create(window.impl()); @@ -35,11 +37,12 @@ Range::Range(Document& document) { } -Range::Range(Node& start_container, size_t start_offset, Node& end_container, size_t end_offset) - : m_start_container(start_container) - , m_start_offset(start_offset) - , m_end_container(end_container) - , m_end_offset(end_offset) +Range::Range(Node& start_container, u32 start_offset, Node& end_container, u32 end_offset) + : AbstractRange(start_container, start_offset, end_container, end_offset) +{ +} + +Range::~Range() { } diff --git a/Userland/Libraries/LibWeb/DOM/Range.h b/Userland/Libraries/LibWeb/DOM/Range.h index 4d5873ffc4..66c3c17091 100644 --- a/Userland/Libraries/LibWeb/DOM/Range.h +++ b/Userland/Libraries/LibWeb/DOM/Range.h @@ -1,44 +1,29 @@ /* * Copyright (c) 2020, the SerenityOS developers. + * Copyright (c) 2022, Luke Wilde * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once -#include -#include -#include -#include +#include namespace Web::DOM { -class Range final - : public RefCounted - , public Bindings::Wrappable { +class Range final : public AbstractRange { public: using WrapperType = Bindings::RangeWrapper; + virtual ~Range() override; + static NonnullRefPtr create(Document&); static NonnullRefPtr create(Window&); - static NonnullRefPtr create(Node& start_container, size_t start_offset, Node& end_container, size_t end_offset); + static NonnullRefPtr create(Node& start_container, u32 start_offset, Node& end_container, u32 end_offset); static NonnullRefPtr create_with_global_object(Bindings::WindowObject&); // FIXME: There are a ton of methods missing here. - Node* start_container() { return m_start_container; } - const Node* start_container() const { return m_start_container; } - unsigned start_offset() const { return m_start_offset; } - - Node* end_container() { return m_end_container; } - const Node* end_container() const { return m_end_container; } - unsigned end_offset() const { return m_end_offset; } - - bool collapsed() const - { - return start_container() == end_container() && start_offset() == end_offset(); - } - void set_start(Node& container, unsigned offset) { m_start_container = container; @@ -60,13 +45,7 @@ public: private: explicit Range(Document&); - Range(Node& start_container, size_t start_offset, Node& end_container, size_t end_offset); - - NonnullRefPtr m_start_container; - unsigned m_start_offset; - - NonnullRefPtr m_end_container; - unsigned m_end_offset; + Range(Node& start_container, u32 start_offset, Node& end_container, u32 end_offset); }; } diff --git a/Userland/Libraries/LibWeb/DOM/Range.idl b/Userland/Libraries/LibWeb/DOM/Range.idl index f84e225f8c..4597df43c3 100644 --- a/Userland/Libraries/LibWeb/DOM/Range.idl +++ b/Userland/Libraries/LibWeb/DOM/Range.idl @@ -1,18 +1,13 @@ #import +#import -interface Range { +[Exposed=Window] +interface Range : AbstractRange { constructor(); - readonly attribute boolean collapsed; - readonly attribute Node commonAncestorContainer; - readonly attribute Node startContainer; - readonly attribute unsigned long startOffset; - readonly attribute Node endContainer; - readonly attribute unsigned long endOffset; - undefined setStart(Node node, unsigned long offset); undefined setEnd(Node node, unsigned long offset); diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index e26f5f06da..8c1d0bfbd4 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -86,6 +86,7 @@ class UnsetStyleValue; } namespace Web::DOM { +class AbstractRange; class AbortController; class AbortSignal; class Attribute; @@ -347,6 +348,7 @@ class URLSearchParamsIterator; } namespace Web::Bindings { +class AbstractRangeWrapper; class AbortControllerWrapper; class AbortSignalWrapper; class AttributeWrapper;