Serenity Operating System
at master 76 lines 2.4 kB view raw
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}