CSSRule.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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, Type type)
  14. : PlatformObject(realm)
  15. , m_type(type)
  16. {
  17. }
  18. void CSSRule::visit_edges(Cell::Visitor& visitor)
  19. {
  20. Base::visit_edges(visitor);
  21. visitor.visit(m_parent_style_sheet);
  22. visitor.visit(m_parent_rule);
  23. }
  24. // https://www.w3.org/TR/cssom/#dom-cssrule-csstext
  25. String CSSRule::css_text() const
  26. {
  27. // The cssText attribute must return a serialization of the CSS rule.
  28. return serialized();
  29. }
  30. // https://www.w3.org/TR/cssom/#dom-cssrule-csstext
  31. void CSSRule::set_css_text(StringView)
  32. {
  33. // On setting the cssText attribute must do nothing.
  34. }
  35. void CSSRule::set_parent_rule(CSSRule* parent_rule)
  36. {
  37. m_parent_rule = parent_rule;
  38. clear_caches();
  39. }
  40. void CSSRule::set_parent_style_sheet(CSSStyleSheet* parent_style_sheet)
  41. {
  42. m_parent_style_sheet = parent_style_sheet;
  43. clear_caches();
  44. }
  45. void CSSRule::clear_caches()
  46. {
  47. m_cached_layer_name.clear();
  48. }
  49. FlyString const& CSSRule::parent_layer_internal_qualified_name_slow_case() const
  50. {
  51. Vector<FlyString> layer_names;
  52. for (auto* rule = parent_rule(); rule; rule = rule->parent_rule()) {
  53. switch (rule->type()) {
  54. case Type::Import:
  55. // TODO: Handle `layer(foo)` in import rules once we implement that.
  56. break;
  57. case Type::LayerBlock: {
  58. auto& layer_block = static_cast<CSSLayerBlockRule const&>(*rule);
  59. layer_names.append(layer_block.internal_name());
  60. break;
  61. }
  62. // Ignore everything else
  63. // Note that LayerStatement cannot have child rules so we still ignore it here.
  64. case Type::LayerStatement:
  65. case Type::Style:
  66. case Type::Media:
  67. case Type::FontFace:
  68. case Type::Keyframes:
  69. case Type::Keyframe:
  70. case Type::Namespace:
  71. case Type::Supports:
  72. case Type::NestedDeclarations:
  73. case Type::Property:
  74. break;
  75. }
  76. }
  77. m_cached_layer_name = MUST(String::join("."sv, layer_names.in_reverse()));
  78. return m_cached_layer_name.value();
  79. }
  80. }