CSSRule.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * Copyright (c) 2021, the SerenityOS developers.
  3. * Copyright (c) 2022-2024, Sam Atkins <sam@ladybird.org>
  4. * Copyright (c) 2022, Andreas Kling <andreas@ladybird.org>
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #include <LibWeb/Bindings/CSSRulePrototype.h>
  9. #include <LibWeb/CSS/CSSLayerBlockRule.h>
  10. #include <LibWeb/CSS/CSSRule.h>
  11. #include <LibWeb/CSS/CSSStyleSheet.h>
  12. namespace Web::CSS {
  13. CSSRule::CSSRule(JS::Realm& realm)
  14. : PlatformObject(realm)
  15. {
  16. }
  17. void CSSRule::visit_edges(Cell::Visitor& visitor)
  18. {
  19. Base::visit_edges(visitor);
  20. visitor.visit(m_parent_style_sheet);
  21. visitor.visit(m_parent_rule);
  22. }
  23. // https://www.w3.org/TR/cssom/#dom-cssrule-csstext
  24. String CSSRule::css_text() const
  25. {
  26. // The cssText attribute must return a serialization of the CSS rule.
  27. return serialized();
  28. }
  29. // https://www.w3.org/TR/cssom/#dom-cssrule-csstext
  30. void CSSRule::set_css_text(StringView)
  31. {
  32. // On setting the cssText attribute must do nothing.
  33. }
  34. void CSSRule::set_parent_rule(CSSRule* parent_rule)
  35. {
  36. m_parent_rule = parent_rule;
  37. clear_caches();
  38. }
  39. void CSSRule::set_parent_style_sheet(CSSStyleSheet* parent_style_sheet)
  40. {
  41. m_parent_style_sheet = parent_style_sheet;
  42. clear_caches();
  43. }
  44. void CSSRule::clear_caches()
  45. {
  46. m_cached_layer_name.clear();
  47. }
  48. FlyString const& CSSRule::parent_layer_internal_qualified_name_slow_case() const
  49. {
  50. Vector<FlyString> layer_names;
  51. for (auto* rule = parent_rule(); rule; rule = rule->parent_rule()) {
  52. switch (rule->type()) {
  53. case Type::Import:
  54. // TODO: Handle `layer(foo)` in import rules once we implement that.
  55. break;
  56. case Type::LayerBlock: {
  57. auto& layer_block = static_cast<CSSLayerBlockRule const&>(*rule);
  58. layer_names.append(layer_block.internal_name());
  59. break;
  60. }
  61. // Ignore everything else
  62. // Note that LayerStatement cannot have child rules so we still ignore it here.
  63. case Type::LayerStatement:
  64. case Type::Style:
  65. case Type::Media:
  66. case Type::FontFace:
  67. case Type::Keyframes:
  68. case Type::Keyframe:
  69. case Type::Namespace:
  70. case Type::Supports:
  71. case Type::NestedDeclarations:
  72. case Type::Property:
  73. break;
  74. }
  75. }
  76. m_cached_layer_name = MUST(String::join("."sv, layer_names.in_reverse()));
  77. return m_cached_layer_name.value();
  78. }
  79. }