From 6cda24097b5f3311ceb9f3ea224eb3cb643d8cc3 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 29 Sep 2021 23:43:18 +0200 Subject: [PATCH] LibWeb: Add the CSSStyleRule interface with some limited functionality --- .../LibWeb/WrapperGenerator.cpp | 4 +++ .../LibWeb/Bindings/CSSRuleWrapperFactory.cpp | 22 ++++++++++++++++ .../LibWeb/Bindings/CSSRuleWrapperFactory.h | 16 ++++++++++++ Userland/Libraries/LibWeb/CMakeLists.txt | 2 ++ .../Libraries/LibWeb/CSS/CSSStyleRule.cpp | 25 +++++++++++++++++++ Userland/Libraries/LibWeb/CSS/CSSStyleRule.h | 7 ++++++ .../Libraries/LibWeb/CSS/CSSStyleRule.idl | 6 +++++ Userland/Libraries/LibWeb/Forward.h | 3 ++- 8 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.cpp create mode 100644 Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.h create mode 100644 Userland/Libraries/LibWeb/CSS/CSSStyleRule.idl diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp index 1f3815ec3a6..21ddf8fd0e2 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator.cpp @@ -825,6 +825,8 @@ static bool should_emit_wrapper_factory(IDL::Interface const& interface) return false; if (interface.name.ends_with("Element")) return false; + if (interface.name.starts_with("CSS") && interface.name.ends_with("Rule")) + return false; return true; } @@ -1492,6 +1494,7 @@ void generate_implementation(IDL::Interface const& interface) #include #include #include +#include #include #include #include @@ -2688,6 +2691,7 @@ void generate_prototype_implementation(IDL::Interface const& interface) #include #include #include +#include #include #include #include diff --git a/Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.cpp b/Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.cpp new file mode 100644 index 00000000000..54cdc9643e1 --- /dev/null +++ b/Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.cpp @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include + +namespace Web::Bindings { + +CSSRuleWrapper* wrap(JS::GlobalObject& global_object, CSS::CSSRule& rule) +{ + if (is(rule)) + return static_cast(wrap_impl(global_object, verify_cast(rule))); + return static_cast(wrap_impl(global_object, rule)); +} + +} diff --git a/Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.h b/Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.h new file mode 100644 index 00000000000..de30b69dc29 --- /dev/null +++ b/Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2021, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Web::Bindings { + +CSSRuleWrapper* wrap(JS::GlobalObject&, CSS::CSSRule&); + +} diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index f02ee959b71..d530f170500 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -1,4 +1,5 @@ set(SOURCES + Bindings/CSSRuleWrapperFactory.cpp Bindings/CSSStyleDeclarationWrapperCustom.cpp Bindings/EventListenerWrapper.cpp Bindings/EventTargetWrapperFactory.cpp @@ -343,6 +344,7 @@ endfunction() libweb_js_wrapper(CSS/CSSRule) libweb_js_wrapper(CSS/CSSRuleList) libweb_js_wrapper(CSS/CSSStyleDeclaration) +libweb_js_wrapper(CSS/CSSStyleRule) libweb_js_wrapper(CSS/CSSStyleSheet) libweb_js_wrapper(CSS/MediaQueryList) libweb_js_wrapper(CSS/Screen) diff --git a/Userland/Libraries/LibWeb/CSS/CSSStyleRule.cpp b/Userland/Libraries/LibWeb/CSS/CSSStyleRule.cpp index 75a570344da..2d5bca15e52 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSStyleRule.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSStyleRule.cpp @@ -18,4 +18,29 @@ CSSStyleRule::~CSSStyleRule() { } +// https://drafts.csswg.org/cssom/#dom-cssstylerule-selectortext +String CSSStyleRule::selector_text() const +{ + TODO(); +} + +// https://drafts.csswg.org/cssom/#dom-cssstylerule-selectortext +void CSSStyleRule::set_selector_text(StringView selector_text) +{ + // FIXME: 1. Run the parse a group of selectors algorithm on the given value. + + // FIXME: 2. If the algorithm returns a non-null value replace the associated group of selectors with the returned value. + + // FIXME: 3. Otherwise, if the algorithm returns a null value, do nothing. + + (void)selector_text; + TODO(); +} + +// https://drafts.csswg.org/cssom/#dom-cssstylerule-style +CSSStyleDeclaration* CSSStyleRule::style() +{ + return m_declaration; +} + } diff --git a/Userland/Libraries/LibWeb/CSS/CSSStyleRule.h b/Userland/Libraries/LibWeb/CSS/CSSStyleRule.h index b0c636323f9..0a1b662a920 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSStyleRule.h +++ b/Userland/Libraries/LibWeb/CSS/CSSStyleRule.h @@ -20,6 +20,8 @@ class CSSStyleRule : public CSSRule { AK_MAKE_NONMOVABLE(CSSStyleRule); public: + using WrapperType = Bindings::CSSStyleRuleWrapper; + static NonnullRefPtr create(NonnullRefPtrVector&& selectors, NonnullRefPtr&& declaration) { return adopt_ref(*new CSSStyleRule(move(selectors), move(declaration))); @@ -33,6 +35,11 @@ public: virtual StringView class_name() const { return "CSSStyleRule"; }; virtual Type type() const { return Type::Style; }; + String selector_text() const; + void set_selector_text(StringView); + + CSSStyleDeclaration* style(); + private: CSSStyleRule(NonnullRefPtrVector&&, NonnullRefPtr&&); diff --git a/Userland/Libraries/LibWeb/CSS/CSSStyleRule.idl b/Userland/Libraries/LibWeb/CSS/CSSStyleRule.idl new file mode 100644 index 00000000000..89016783ad2 --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/CSSStyleRule.idl @@ -0,0 +1,6 @@ +interface CSSStyleRule { + + attribute CSSOMString selectorText; + [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style; + +}; diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 39db308396d..6ef1f9c6c71 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -262,9 +262,10 @@ class URLSearchParamsIterator; namespace Web::Bindings { class AbortControllerWrapper; class AbortSignalWrapper; -class CSSRuleWrapper; class CSSRuleListWrapper; +class CSSRuleWrapper; class CSSStyleDeclarationWrapper; +class CSSStyleRuleWrapper; class CSSStyleSheetWrapper; class CanvasRenderingContext2DWrapper; class CharacterDataWrapper;