summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Atkins <atkinssj@serenityos.org>2021-10-15 16:42:26 +0100
committerLinus Groh <mail@linusgroh.de>2021-10-15 18:12:20 +0100
commit0f88a47e5876c3a17ee281b3a93f65498e4ae3a5 (patch)
tree034b06351b8a5d406e2dda18248fdf6ee70e27cf
parent46bba44f8bb184ae87ffd00ab4347bbe8ed6b2a7 (diff)
downloadserenity-0f88a47e5876c3a17ee281b3a93f65498e4ae3a5.zip
LibWeb: Add serialization code for CSS{Media,Supports}Rule
The `CSSMediaRule::serialized()` code is to spec. The `CSSSupportsRule::serialized()` code has no spec right now, but I'm fairly confident it will be almost identical to media's, so I copied that for now.
-rw-r--r--Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp6
-rw-r--r--Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h2
-rw-r--r--Userland/Libraries/LibWeb/CSS/CSSMediaRule.cpp26
-rw-r--r--Userland/Libraries/LibWeb/CSS/CSSMediaRule.h2
-rw-r--r--Userland/Libraries/LibWeb/CSS/CSSSupportsRule.cpp23
-rw-r--r--Userland/Libraries/LibWeb/CSS/CSSSupportsRule.h2
6 files changed, 53 insertions, 8 deletions
diff --git a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp
index fb771b6c35..694f321066 100644
--- a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp
+++ b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp
@@ -30,12 +30,6 @@ void CSSGroupingRule::delete_rule(size_t)
TODO();
}
-// https://drafts.csswg.org/cssom/#serialize-a-css-rule
-String CSSGroupingRule::serialized() const
-{
- TODO();
-}
-
void CSSGroupingRule::for_each_effective_style_rule(Function<void(CSSStyleRule const&)> const& callback) const
{
m_rules->for_each_effective_style_rule(callback);
diff --git a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h
index 127fbbf7a6..108de57469 100644
--- a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h
+++ b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h
@@ -29,8 +29,6 @@ public:
virtual void for_each_effective_style_rule(Function<void(CSSStyleRule const&)> const& callback) const;
virtual bool for_first_not_loaded_import_rule(Function<void(CSSImportRule&)> const& callback);
- virtual String serialized() const;
-
protected:
explicit CSSGroupingRule(NonnullRefPtrVector<CSSRule>&&);
diff --git a/Userland/Libraries/LibWeb/CSS/CSSMediaRule.cpp b/Userland/Libraries/LibWeb/CSS/CSSMediaRule.cpp
index 0666e08054..484f79b4ca 100644
--- a/Userland/Libraries/LibWeb/CSS/CSSMediaRule.cpp
+++ b/Userland/Libraries/LibWeb/CSS/CSSMediaRule.cpp
@@ -28,4 +28,30 @@ void CSSMediaRule::set_condition_text(String text)
m_media->set_media_text(text);
}
+// https://www.w3.org/TR/cssom-1/#serialize-a-css-rule
+String CSSMediaRule::serialized() const
+{
+ // The result of concatenating the following:
+ StringBuilder builder;
+
+ // 1. The string "@media", followed by a single SPACE (U+0020).
+ builder.append("@media ");
+ // 2. The result of performing serialize a media query list on rule’s media query list.
+ builder.append(condition_text());
+ // 3. A single SPACE (U+0020), followed by the string "{", i.e., LEFT CURLY BRACKET (U+007B), followed by a newline.
+ builder.append(" {\n");
+ // 4. The result of performing serialize a CSS rule on each rule in the rule’s cssRules list, separated by a newline and indented by two spaces.
+ for (size_t i = 0; i < css_rules().length(); i++) {
+ auto rule = css_rules().item(i);
+ if (i != 0)
+ builder.append("\n");
+ builder.append(" ");
+ builder.append(rule->css_text());
+ }
+ // 5. A newline, followed by the string "}", i.e., RIGHT CURLY BRACKET (U+007D)
+ builder.append("\n}");
+
+ return builder.to_string();
+}
+
}
diff --git a/Userland/Libraries/LibWeb/CSS/CSSMediaRule.h b/Userland/Libraries/LibWeb/CSS/CSSMediaRule.h
index be3ce292e3..b4833b31a6 100644
--- a/Userland/Libraries/LibWeb/CSS/CSSMediaRule.h
+++ b/Userland/Libraries/LibWeb/CSS/CSSMediaRule.h
@@ -39,6 +39,8 @@ public:
private:
explicit CSSMediaRule(NonnullRefPtr<MediaList>&&, NonnullRefPtrVector<CSSRule>&&);
+ virtual String serialized() const override;
+
NonnullRefPtr<MediaList> m_media;
};
diff --git a/Userland/Libraries/LibWeb/CSS/CSSSupportsRule.cpp b/Userland/Libraries/LibWeb/CSS/CSSSupportsRule.cpp
index b949d41697..347852ff25 100644
--- a/Userland/Libraries/LibWeb/CSS/CSSSupportsRule.cpp
+++ b/Userland/Libraries/LibWeb/CSS/CSSSupportsRule.cpp
@@ -31,4 +31,27 @@ void CSSSupportsRule::set_condition_text(String text)
m_supports = new_supports.release_nonnull();
}
+// https://www.w3.org/TR/cssom-1/#serialize-a-css-rule
+String CSSSupportsRule::serialized() const
+{
+ // Note: The spec doesn't cover this yet, so I'm roughly following the spec for the @media rule.
+ // It should be pretty close!
+
+ StringBuilder builder;
+
+ builder.append("@supports ");
+ builder.append(condition_text());
+ builder.append(" {\n");
+ for (size_t i = 0; i < css_rules().length(); i++) {
+ auto rule = css_rules().item(i);
+ if (i != 0)
+ builder.append("\n");
+ builder.append(" ");
+ builder.append(rule->css_text());
+ }
+ builder.append("\n}");
+
+ return builder.to_string();
+}
+
}
diff --git a/Userland/Libraries/LibWeb/CSS/CSSSupportsRule.h b/Userland/Libraries/LibWeb/CSS/CSSSupportsRule.h
index 890fb563cf..a4a4e2a7b9 100644
--- a/Userland/Libraries/LibWeb/CSS/CSSSupportsRule.h
+++ b/Userland/Libraries/LibWeb/CSS/CSSSupportsRule.h
@@ -38,6 +38,8 @@ public:
private:
explicit CSSSupportsRule(NonnullRefPtr<Supports>&&, NonnullRefPtrVector<CSSRule>&&);
+ virtual String serialized() const override;
+
NonnullRefPtr<Supports> m_supports;
};