diff options
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h | 3 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/StaticRange.cpp | 38 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/StaticRange.h | 34 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/StaticRange.idl | 14 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/Forward.h | 2 |
6 files changed, 93 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h index e836c222c5..f30f345391 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h +++ b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h @@ -280,6 +280,8 @@ #include <LibWeb/Bindings/SelectionPrototype.h> #include <LibWeb/Bindings/ShadowRootConstructor.h> #include <LibWeb/Bindings/ShadowRootPrototype.h> +#include <LibWeb/Bindings/StaticRangeConstructor.h> +#include <LibWeb/Bindings/StaticRangePrototype.h> #include <LibWeb/Bindings/StorageConstructor.h> #include <LibWeb/Bindings/StoragePrototype.h> #include <LibWeb/Bindings/StyleSheetConstructor.h> @@ -449,6 +451,7 @@ ADD_WINDOW_OBJECT_INTERFACE(Screen) \ ADD_WINDOW_OBJECT_INTERFACE(Selection) \ ADD_WINDOW_OBJECT_INTERFACE(ShadowRoot) \ + ADD_WINDOW_OBJECT_INTERFACE(StaticRange) \ ADD_WINDOW_OBJECT_INTERFACE(Storage) \ ADD_WINDOW_OBJECT_INTERFACE(StyleSheet) \ ADD_WINDOW_OBJECT_INTERFACE(StyleSheetList) \ diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 7edc464803..0121a08294 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -93,6 +93,7 @@ set(SOURCES DOM/Range.cpp DOM/ShadowRoot.cpp DOM/StaticNodeList.cpp + DOM/StaticRange.cpp DOM/Text.cpp DOM/Text.idl DOM/Timer.cpp @@ -434,6 +435,7 @@ libweb_js_wrapper(DOM/NodeList) libweb_js_wrapper(DOM/ProcessingInstruction) libweb_js_wrapper(DOM/Range) libweb_js_wrapper(DOM/ShadowRoot) +libweb_js_wrapper(DOM/StaticRange) libweb_js_wrapper(DOM/Text) libweb_js_wrapper(Encoding/TextDecoder) libweb_js_wrapper(Encoding/TextEncoder) diff --git a/Userland/Libraries/LibWeb/DOM/StaticRange.cpp b/Userland/Libraries/LibWeb/DOM/StaticRange.cpp new file mode 100644 index 0000000000..ec5ba26200 --- /dev/null +++ b/Userland/Libraries/LibWeb/DOM/StaticRange.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2022, Luke Wilde <lukew@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <AK/TypeCasts.h> +#include <LibWeb/DOM/Attribute.h> +#include <LibWeb/DOM/DocumentType.h> +#include <LibWeb/DOM/ExceptionOr.h> +#include <LibWeb/DOM/StaticRange.h> + +namespace Web::DOM { + +StaticRange::StaticRange(Node& start_container, u32 start_offset, Node& end_container, u32 end_offset) + : AbstractRange(start_container, start_offset, end_container, end_offset) +{ +} + +StaticRange::~StaticRange() +{ +} + +// https://dom.spec.whatwg.org/#dom-staticrange-staticrange +ExceptionOr<NonnullRefPtr<StaticRange>> StaticRange::create_with_global_object(JS::GlobalObject&, StaticRangeInit& init) +{ + // 1. If init["startContainer"] or init["endContainer"] is a DocumentType or Attr node, then throw an "InvalidNodeTypeError" DOMException. + if (is<DocumentType>(*init.start_container) || is<Attribute>(*init.start_container)) + return DOM::InvalidNodeTypeError::create("startContainer cannot be a DocumentType or Attribute node."); + + if (is<DocumentType>(*init.end_container) || is<Attribute>(*init.end_container)) + return DOM::InvalidNodeTypeError::create("endContainer cannot be a DocumentType or Attribute node."); + + // 2. Set thisโs start to (init["startContainer"], init["startOffset"]) and end to (init["endContainer"], init["endOffset"]). + return adopt_ref(*new StaticRange(*init.start_container, init.start_offset, *init.end_container, init.end_offset)); +} + +} diff --git a/Userland/Libraries/LibWeb/DOM/StaticRange.h b/Userland/Libraries/LibWeb/DOM/StaticRange.h new file mode 100644 index 0000000000..9e99d0c0d1 --- /dev/null +++ b/Userland/Libraries/LibWeb/DOM/StaticRange.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022, Luke Wilde <lukew@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <LibWeb/DOM/AbstractRange.h> + +namespace Web::DOM { + +// NOTE: We must use RP instead of NNRP here, otherwise the generated code cannot default initialize this struct. +// They will never be null, as they are marked as required and non-null in the dictionary. +struct StaticRangeInit { + RefPtr<Node> start_container; + u32 start_offset { 0 }; + RefPtr<Node> end_container; + u32 end_offset { 0 }; +}; + +class StaticRange final : public AbstractRange { +public: + using WrapperType = Bindings::StaticRangeWrapper; + + virtual ~StaticRange() override; + + static ExceptionOr<NonnullRefPtr<StaticRange>> create_with_global_object(JS::GlobalObject&, StaticRangeInit& init); + +private: + StaticRange(Node& start_container, u32 start_offset, Node& end_container, u32 end_offset); +}; + +} diff --git a/Userland/Libraries/LibWeb/DOM/StaticRange.idl b/Userland/Libraries/LibWeb/DOM/StaticRange.idl new file mode 100644 index 0000000000..cc3b747f29 --- /dev/null +++ b/Userland/Libraries/LibWeb/DOM/StaticRange.idl @@ -0,0 +1,14 @@ +#import <DOM/Node.idl> +#import <DOM/AbstractRange.idl> + +[Exposed=Window] +interface StaticRange : AbstractRange { + constructor(StaticRangeInit init); +}; + +dictionary StaticRangeInit { + required Node startContainer; + required unsigned long startOffset; + required Node endContainer; + required unsigned long endOffset; +}; diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 8c1d0bfbd4..49aa38a112 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -117,6 +117,7 @@ class ProcessingInstruction; class Range; class ShadowRoot; class StaticNodeList; +class StaticRange; class Text; class Timer; class Window; @@ -481,6 +482,7 @@ class RangeWrapper; class ResizeObserverWrapper; class ScreenWrapper; class SelectionWrapper; +class StaticRangeWrapper; class StorageWrapper; class StyleSheetListWrapper; class StyleSheetWrapper; |