CSSLayerBlockRule.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * Copyright (c) 2024, Sam Atkins <sam@ladybird.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "CSSLayerBlockRule.h"
  7. #include <LibWeb/Bindings/CSSLayerBlockRulePrototype.h>
  8. #include <LibWeb/Bindings/Intrinsics.h>
  9. #include <LibWeb/CSS/Serialize.h>
  10. namespace Web::CSS {
  11. JS_DEFINE_ALLOCATOR(CSSLayerBlockRule);
  12. JS::NonnullGCPtr<CSSLayerBlockRule> CSSLayerBlockRule::create(JS::Realm& realm, FlyString name, CSSRuleList& rules)
  13. {
  14. return realm.heap().allocate<CSSLayerBlockRule>(realm, realm, move(name), rules);
  15. }
  16. FlyString CSSLayerBlockRule::next_unique_anonymous_layer_name()
  17. {
  18. static u64 s_anonymous_layer_id = 0;
  19. return MUST(String::formatted("#{}", ++s_anonymous_layer_id));
  20. }
  21. CSSLayerBlockRule::CSSLayerBlockRule(JS::Realm& realm, FlyString name, CSSRuleList& rules)
  22. : CSSGroupingRule(realm, rules)
  23. , m_name(move(name))
  24. {
  25. if (m_name.is_empty()) {
  26. m_name_internal = next_unique_anonymous_layer_name();
  27. } else {
  28. m_name_internal = m_name;
  29. }
  30. }
  31. void CSSLayerBlockRule::initialize(JS::Realm& realm)
  32. {
  33. Base::initialize(realm);
  34. WEB_SET_PROTOTYPE_FOR_INTERFACE(CSSLayerBlockRule);
  35. }
  36. String CSSLayerBlockRule::serialized() const
  37. {
  38. // AD-HOC: No spec yet, so this is based on the @media serialization algorithm.
  39. StringBuilder builder;
  40. builder.append("@layer"sv);
  41. if (!m_name.is_empty())
  42. builder.appendff(" {}", m_name);
  43. builder.append(" {\n"sv);
  44. // AD-HOC: All modern browsers omit the ending newline if there are no CSS rules, so let's do the same.
  45. if (css_rules().length() == 0) {
  46. builder.append('}');
  47. return builder.to_string_without_validation();
  48. }
  49. for (size_t i = 0; i < css_rules().length(); i++) {
  50. auto rule = css_rules().item(i);
  51. if (i != 0)
  52. builder.append("\n"sv);
  53. builder.append(" "sv);
  54. builder.append(rule->css_text());
  55. }
  56. builder.append("\n}"sv);
  57. return builder.to_string_without_validation();
  58. }
  59. FlyString CSSLayerBlockRule::internal_qualified_name(Badge<StyleComputer>) const
  60. {
  61. auto const& parent_name = parent_layer_internal_qualified_name();
  62. if (parent_name.is_empty())
  63. return m_name_internal;
  64. return MUST(String::formatted("{}.{}", parent_name, m_name_internal));
  65. }
  66. }