From fdc1c150642011e3fec0e0dacd3f0b26ae77cf57 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 11 Oct 2021 00:18:07 +0200 Subject: [PATCH] LibWeb: Stub out a basic ResizeObserver interface This patch establishes scaffolding for the ResizeObserver API. --- .../LibWeb/WrapperGenerator.cpp | 20 ++++++++- .../LibWeb/Bindings/WindowObjectHelper.h | 3 ++ Userland/Libraries/LibWeb/CMakeLists.txt | 2 + Userland/Libraries/LibWeb/Forward.h | 5 +++ .../LibWeb/ResizeObserver/ResizeObserver.cpp | 42 +++++++++++++++++++ .../LibWeb/ResizeObserver/ResizeObserver.h | 33 +++++++++++++++ .../LibWeb/ResizeObserver/ResizeObserver.idl | 17 ++++++++ 7 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 Userland/Libraries/LibWeb/ResizeObserver/ResizeObserver.cpp create mode 100644 Userland/Libraries/LibWeb/ResizeObserver/ResizeObserver.h create mode 100644 Userland/Libraries/LibWeb/ResizeObserver/ResizeObserver.idl diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp index 3d850c7260..9f4b87c120 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp @@ -740,7 +740,7 @@ int main(int argc, char** argv) auto interface = IDL::parse_interface(path, data, import_base_path); - if (namespace_.is_one_of("Crypto", "CSS", "DOM", "HTML", "UIEvents", "Geometry", "HighResolutionTime", "NavigationTiming", "RequestIdleCallback", "SVG", "Selection", "XHR", "URL")) { + if (namespace_.is_one_of("Crypto", "CSS", "DOM", "HTML", "UIEvents", "Geometry", "HighResolutionTime", "NavigationTiming", "RequestIdleCallback", "ResizeObserver", "SVG", "Selection", "XHR", "URL")) { StringBuilder builder; builder.append(namespace_); builder.append("::"); @@ -1389,6 +1389,8 @@ static void generate_header(IDL::Interface const& interface) # include #elif __has_include() # include +#elif __has_include() +# include #elif __has_include() # include #elif __has_include() @@ -1552,6 +1554,7 @@ void generate_implementation(IDL::Interface const& interface) #include #include #include +#include // FIXME: This is a total hack until we can figure out the namespace for a given type somehow. using namespace Web::CSS; @@ -1559,6 +1562,7 @@ using namespace Web::DOM; using namespace Web::Geometry; using namespace Web::HTML; using namespace Web::RequestIdleCallback; +using namespace Web::ResizeObserver; using namespace Web::Selection; namespace Web::Bindings { @@ -2473,6 +2477,8 @@ void generate_constructor_implementation(IDL::Interface const& interface) # include #elif __has_include() # include +#elif __has_include() +# include #elif __has_include() # include #elif __has_include() @@ -2489,6 +2495,7 @@ using namespace Web::DOM; using namespace Web::Geometry; using namespace Web::HTML; using namespace Web::RequestIdleCallback; +using namespace Web::ResizeObserver; using namespace Web::Selection; using namespace Web::UIEvents; using namespace Web::XHR; @@ -2783,6 +2790,8 @@ void generate_prototype_implementation(IDL::Interface const& interface) # include #elif __has_include() # include +#elif __has_include() +# include #elif __has_include() # include #elif __has_include() @@ -2813,6 +2822,8 @@ void generate_prototype_implementation(IDL::Interface const& interface) # include #elif __has_include() # include +#elif __has_include() +# include #elif __has_include() # include #elif __has_include() @@ -2834,6 +2845,7 @@ using namespace Web::Geometry; using namespace Web::HTML; using namespace Web::NavigationTiming; using namespace Web::RequestIdleCallback; +using namespace Web::ResizeObserver; using namespace Web::Selection; using namespace Web::XHR; using namespace Web::URL; @@ -3256,6 +3268,8 @@ static void generate_iterator_header(IDL::Interface const& interface) # include #elif __has_include() # include +#elif __has_include() +# include #elif __has_include() # include #elif __has_include() @@ -3324,6 +3338,7 @@ using namespace Web::DOM; using namespace Web::Geometry; using namespace Web::HTML; using namespace Web::RequestIdleCallback; +using namespace Web::ResizeObserver; using namespace Web::Selection; namespace Web::Bindings { @@ -3438,6 +3453,8 @@ void generate_iterator_prototype_implementation(IDL::Interface const& interface) # include #elif __has_include() # include +#elif __has_include() +# include #elif __has_include() # include #elif __has_include() @@ -3455,6 +3472,7 @@ using namespace Web::Geometry; using namespace Web::HTML; using namespace Web::NavigationTiming; using namespace Web::RequestIdleCallback; +using namespace Web::ResizeObserver; using namespace Web::Selection; using namespace Web::XHR; using namespace Web::URL; diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h index 32f7e38578..0bc087e1a2 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h +++ b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h @@ -233,6 +233,8 @@ #include #include #include +#include +#include #include #include #include @@ -395,6 +397,7 @@ ADD_WINDOW_OBJECT_INTERFACE(ProcessingInstruction) \ ADD_WINDOW_OBJECT_INTERFACE(ProgressEvent) \ ADD_WINDOW_OBJECT_INTERFACE(Range) \ + ADD_WINDOW_OBJECT_INTERFACE(ResizeObserver) \ ADD_WINDOW_OBJECT_INTERFACE(Screen) \ ADD_WINDOW_OBJECT_INTERFACE(Selection) \ ADD_WINDOW_OBJECT_INTERFACE(ShadowRoot) \ diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 8a7b3d96e6..214ed38de6 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -244,6 +244,7 @@ set(SOURCES Painting/ShadowPainting.cpp Painting/StackingContext.cpp RequestIdleCallback/IdleDeadline.cpp + ResizeObserver/ResizeObserver.cpp SVG/AttributeNames.cpp SVG/SVGElement.cpp SVG/SVGGElement.cpp @@ -472,6 +473,7 @@ libweb_js_wrapper(HTML/WebSocket) libweb_js_wrapper(HighResolutionTime/Performance) libweb_js_wrapper(NavigationTiming/PerformanceTiming) libweb_js_wrapper(RequestIdleCallback/IdleDeadline) +libweb_js_wrapper(ResizeObserver/ResizeObserver) libweb_js_wrapper(SVG/SVGElement) libweb_js_wrapper(SVG/SVGGeometryElement) libweb_js_wrapper(SVG/SVGGraphicsElement) diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 9decf36e3c..7aa1e1ba59 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -211,6 +211,10 @@ namespace Web::RequestIdleCallback { class IdleDeadline; } +namespace Web::ResizeObserver { +class ResizeObserver; +} + namespace Web::SVG { class SVGElement; class SVGGeometryElement; @@ -396,6 +400,7 @@ class PerformanceTimingWrapper; class PerformanceWrapper; class ProcessingInstructionWrapper; class ProgressEventWrapper; +class ResizeObserverWrapper; class ScreenWrapper; class ScriptExecutionContext; class SubmitEventWrapper; diff --git a/Userland/Libraries/LibWeb/ResizeObserver/ResizeObserver.cpp b/Userland/Libraries/LibWeb/ResizeObserver/ResizeObserver.cpp new file mode 100644 index 0000000000..65ecd8f1e4 --- /dev/null +++ b/Userland/Libraries/LibWeb/ResizeObserver/ResizeObserver.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2021, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Web::ResizeObserver { + +// https://drafts.csswg.org/resize-observer/#dom-resizeobserver-resizeobserver +NonnullRefPtr ResizeObserver::create_with_global_object(JS::GlobalObject& global_object, JS::Value callback) +{ + // FIXME: Implement + (void)global_object; + (void)callback; + return adopt_ref(*new ResizeObserver); +} + +// https://drafts.csswg.org/resize-observer/#dom-resizeobserver-observe +void ResizeObserver::observe(DOM::Element& target, ResizeObserverOptions options) +{ + // FIXME: Implement + (void)target; + (void)options; +} + +// https://drafts.csswg.org/resize-observer/#dom-resizeobserver-unobserve +void ResizeObserver::unobserve(DOM::Element& target) +{ + // FIXME: Implement + (void)target; +} + +// https://drafts.csswg.org/resize-observer/#dom-resizeobserver-disconnect +void ResizeObserver::disconnect() +{ + // FIXME: Implement +} + +} diff --git a/Userland/Libraries/LibWeb/ResizeObserver/ResizeObserver.h b/Userland/Libraries/LibWeb/ResizeObserver/ResizeObserver.h new file mode 100644 index 0000000000..a18fd8d189 --- /dev/null +++ b/Userland/Libraries/LibWeb/ResizeObserver/ResizeObserver.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::ResizeObserver { + +struct ResizeObserverOptions { + String box; +}; + +// https://drafts.csswg.org/resize-observer/#resize-observer-interface +class ResizeObserver + : public RefCounted + , public Bindings::Wrappable { +public: + using WrapperType = Bindings::ResizeObserverWrapper; + + static NonnullRefPtr create_with_global_object(JS::GlobalObject&, JS::Value callback); + + void observe(DOM::Element& target, ResizeObserverOptions); + void unobserve(DOM::Element& target); + void disconnect(); +}; + +} diff --git a/Userland/Libraries/LibWeb/ResizeObserver/ResizeObserver.idl b/Userland/Libraries/LibWeb/ResizeObserver/ResizeObserver.idl new file mode 100644 index 0000000000..868ad4612d --- /dev/null +++ b/Userland/Libraries/LibWeb/ResizeObserver/ResizeObserver.idl @@ -0,0 +1,17 @@ +[Exposed=(Window)] +interface ResizeObserver { + + // FIXME: This should be a ResizeObserverCallback. + constructor(any callback); + undefined observe(Element target, optional ResizeObserverOptions options = {}); + undefined unobserve(Element target); + undefined disconnect(); + +}; + +dictionary ResizeObserverOptions { + + // FIXME: This should be an enum. + DOMString box = "content-box"; + +};