CSSRule.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. }
  38. void CSSRule::set_parent_style_sheet(CSSStyleSheet* parent_style_sheet)
  39. {
  40. m_parent_style_sheet = parent_style_sheet;
  41. }
  42. FlyString const& CSSRule::parent_layer_internal_qualified_name_slow_case() const
  43. {
  44. Vector<FlyString> layer_names;
  45. for (auto* rule = parent_rule(); rule; rule = rule->parent_rule()) {
  46. switch (rule->type()) {
  47. case CSSRule::Type::Import:
  48. // TODO: Handle `layer(foo)` in import rules once we implement that.
  49. break;
  50. case CSSRule::Type::LayerBlock: {
  51. auto& layer_block = static_cast<CSSLayerBlockRule const&>(*rule);
  52. layer_names.append(layer_block.internal_name());
  53. break;
  54. }
  55. // Ignore everything else
  56. // Note that LayerStatement cannot have child rules so we still ignore it here.
  57. case CSSRule::Type::LayerStatement:
  58. case CSSRule::Type::Style:
  59. case CSSRule::Type::Media:
  60. case CSSRule::Type::FontFace:
  61. case CSSRule::Type::Keyframes:
  62. case CSSRule::Type::Keyframe:
  63. case CSSRule::Type::Namespace:
  64. case CSSRule::Type::Supports:
  65. break;
  66. }
  67. }
  68. m_cached_layer_name = MUST(String::join("."sv, layer_names.in_reverse()));
  69. return m_cached_layer_name.value();
  70. }
  71. }