Jelajahi Sumber

LibWeb: Add the CSSStyleRule interface with some limited functionality

Andreas Kling 3 tahun lalu
induk
melakukan
6cda24097b

+ 4 - 0
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 <LibWeb/Bindings/@wrapper_class@.h>
 #include <LibWeb/Bindings/CSSRuleListWrapper.h>
 #include <LibWeb/Bindings/CSSRuleWrapper.h>
+#include <LibWeb/Bindings/CSSRuleWrapperFactory.h>
 #include <LibWeb/Bindings/CSSStyleSheetWrapper.h>
 #include <LibWeb/Bindings/CanvasRenderingContext2DWrapper.h>
 #include <LibWeb/Bindings/CommentWrapper.h>
@@ -2688,6 +2691,7 @@ void generate_prototype_implementation(IDL::Interface const& interface)
 #include <LibWeb/Bindings/AbortSignalWrapper.h>
 #include <LibWeb/Bindings/CSSRuleListWrapper.h>
 #include <LibWeb/Bindings/CSSRuleWrapper.h>
+#include <LibWeb/Bindings/CSSRuleWrapperFactory.h>
 #include <LibWeb/Bindings/CSSStyleDeclarationWrapper.h>
 #include <LibWeb/Bindings/CSSStyleSheetWrapper.h>
 #include <LibWeb/Bindings/CanvasRenderingContext2DWrapper.h>

+ 22 - 0
Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.cpp

@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <AK/TypeCasts.h>
+#include <LibWeb/Bindings/CSSRuleWrapper.h>
+#include <LibWeb/Bindings/CSSRuleWrapperFactory.h>
+#include <LibWeb/Bindings/CSSStyleRuleWrapper.h>
+#include <LibWeb/CSS/CSSStyleRule.h>
+
+namespace Web::Bindings {
+
+CSSRuleWrapper* wrap(JS::GlobalObject& global_object, CSS::CSSRule& rule)
+{
+    if (is<CSS::CSSStyleRule>(rule))
+        return static_cast<CSSRuleWrapper*>(wrap_impl(global_object, verify_cast<CSS::CSSStyleRule>(rule)));
+    return static_cast<CSSRuleWrapper*>(wrap_impl(global_object, rule));
+}
+
+}

+ 16 - 0
Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.h

@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibJS/Forward.h>
+#include <LibWeb/Forward.h>
+
+namespace Web::Bindings {
+
+CSSRuleWrapper* wrap(JS::GlobalObject&, CSS::CSSRule&);
+
+}

+ 2 - 0
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)

+ 25 - 0
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;
+}
+
 }

+ 7 - 0
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<CSSStyleRule> create(NonnullRefPtrVector<Selector>&& selectors, NonnullRefPtr<CSSStyleDeclaration>&& 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<Selector>&&, NonnullRefPtr<CSSStyleDeclaration>&&);
 

+ 6 - 0
Userland/Libraries/LibWeb/CSS/CSSStyleRule.idl

@@ -0,0 +1,6 @@
+interface CSSStyleRule {
+
+    attribute CSSOMString selectorText;
+    [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
+
+};

+ 2 - 1
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;