From 3d4411859503425af970c36152c254aafaa1619a Mon Sep 17 00:00:00 2001 From: Luke Wilde Date: Sun, 30 Jan 2022 23:37:42 +0000 Subject: LibWeb: Implement StaticRange --- .../Libraries/LibWeb/Bindings/WindowObjectHelper.h | 3 ++ Userland/Libraries/LibWeb/CMakeLists.txt | 2 ++ Userland/Libraries/LibWeb/DOM/StaticRange.cpp | 38 ++++++++++++++++++++++ Userland/Libraries/LibWeb/DOM/StaticRange.h | 34 +++++++++++++++++++ Userland/Libraries/LibWeb/DOM/StaticRange.idl | 14 ++++++++ Userland/Libraries/LibWeb/Forward.h | 2 ++ 6 files changed, 93 insertions(+) create mode 100644 Userland/Libraries/LibWeb/DOM/StaticRange.cpp create mode 100644 Userland/Libraries/LibWeb/DOM/StaticRange.h create mode 100644 Userland/Libraries/LibWeb/DOM/StaticRange.idl (limited to 'Userland') 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 #include #include +#include +#include #include #include #include @@ -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 + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include + +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> 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(*init.start_container) || is(*init.start_container)) + return DOM::InvalidNodeTypeError::create("startContainer cannot be a DocumentType or Attribute node."); + + if (is(*init.end_container) || is(*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 + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +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 start_container; + u32 start_offset { 0 }; + RefPtr end_container; + u32 end_offset { 0 }; +}; + +class StaticRange final : public AbstractRange { +public: + using WrapperType = Bindings::StaticRangeWrapper; + + virtual ~StaticRange() override; + + static ExceptionOr> 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 +#import + +[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; -- cgit v1.2.3