Serenity Operating System
1/*
2 * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org>
3 * Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
4 *
5 * SPDX-License-Identifier: BSD-2-Clause
6 */
7
8#include <LibJS/Runtime/Realm.h>
9#include <LibWeb/Bindings/CSSMediaRulePrototype.h>
10#include <LibWeb/Bindings/Intrinsics.h>
11#include <LibWeb/CSS/CSSMediaRule.h>
12
13namespace Web::CSS {
14
15WebIDL::ExceptionOr<JS::NonnullGCPtr<CSSMediaRule>> CSSMediaRule::create(JS::Realm& realm, MediaList& media_queries, CSSRuleList& rules)
16{
17 return MUST_OR_THROW_OOM(realm.heap().allocate<CSSMediaRule>(realm, realm, media_queries, rules));
18}
19
20CSSMediaRule::CSSMediaRule(JS::Realm& realm, MediaList& media, CSSRuleList& rules)
21 : CSSConditionRule(realm, rules)
22 , m_media(media)
23{
24}
25
26JS::ThrowCompletionOr<void> CSSMediaRule::initialize(JS::Realm& realm)
27{
28 MUST_OR_THROW_OOM(Base::initialize(realm));
29 set_prototype(&Bindings::ensure_web_prototype<Bindings::CSSMediaRulePrototype>(realm, "CSSMediaRule"));
30
31 return {};
32}
33
34void CSSMediaRule::visit_edges(Cell::Visitor& visitor)
35{
36 Base::visit_edges(visitor);
37 visitor.visit(&m_media);
38}
39
40DeprecatedString CSSMediaRule::condition_text() const
41{
42 return m_media.media_text();
43}
44
45void CSSMediaRule::set_condition_text(DeprecatedString text)
46{
47 m_media.set_media_text(text);
48}
49
50// https://www.w3.org/TR/cssom-1/#serialize-a-css-rule
51DeprecatedString CSSMediaRule::serialized() const
52{
53 // The result of concatenating the following:
54 StringBuilder builder;
55
56 // 1. The string "@media", followed by a single SPACE (U+0020).
57 builder.append("@media "sv);
58 // 2. The result of performing serialize a media query list on rule’s media query list.
59 builder.append(condition_text());
60 // 3. A single SPACE (U+0020), followed by the string "{", i.e., LEFT CURLY BRACKET (U+007B), followed by a newline.
61 builder.append(" {\n"sv);
62 // 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.
63 for (size_t i = 0; i < css_rules().length(); i++) {
64 auto rule = css_rules().item(i);
65 if (i != 0)
66 builder.append("\n"sv);
67 builder.append(" "sv);
68 builder.append(rule->css_text());
69 }
70 // 5. A newline, followed by the string "}", i.e., RIGHT CURLY BRACKET (U+007D)
71 builder.append("\n}"sv);
72
73 return builder.to_deprecated_string();
74}
75
76}