CSSStyleSheet.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * Copyright (c) 2019-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/NonnullRefPtrVector.h>
  8. #include <AK/TypeCasts.h>
  9. #include <LibWeb/CSS/CSSImportRule.h>
  10. #include <LibWeb/CSS/CSSRule.h>
  11. #include <LibWeb/CSS/CSSRuleList.h>
  12. #include <LibWeb/CSS/StyleSheet.h>
  13. #include <LibWeb/Loader/Resource.h>
  14. namespace Web::CSS {
  15. class CSSStyleSheet final : public StyleSheet {
  16. public:
  17. using WrapperType = Bindings::CSSStyleSheetWrapper;
  18. static NonnullRefPtr<CSSStyleSheet> create(NonnullRefPtrVector<CSSRule> rules)
  19. {
  20. return adopt_ref(*new CSSStyleSheet(move(rules)));
  21. }
  22. virtual ~CSSStyleSheet() override;
  23. virtual String type() const override { return "text/css"; }
  24. CSSRuleList const& rules() const { return m_rules; }
  25. CSSRuleList& rules() { return m_rules; }
  26. void set_rules(NonnullRefPtr<CSSRuleList> rules) { m_rules = move(rules); }
  27. CSSRuleList* css_rules() { return m_rules; }
  28. CSSRuleList const* css_rules() const { return m_rules; }
  29. DOM::ExceptionOr<unsigned> insert_rule(StringView rule, unsigned index);
  30. DOM::ExceptionOr<void> remove_rule(unsigned index);
  31. DOM::ExceptionOr<void> delete_rule(unsigned index);
  32. template<typename Callback>
  33. void for_each_effective_style_rule(Callback callback) const
  34. {
  35. for (auto& rule : *m_rules)
  36. if (rule.type() == CSSRule::Type::Style) {
  37. callback(verify_cast<CSSStyleRule>(rule));
  38. } else if (rule.type() == CSSRule::Type::Import) {
  39. const auto& import_rule = verify_cast<CSSImportRule>(rule);
  40. if (import_rule.has_import_result())
  41. import_rule.loaded_style_sheet()->for_each_effective_style_rule(callback);
  42. }
  43. }
  44. template<typename Callback>
  45. bool for_first_not_loaded_import_rule(Callback callback)
  46. {
  47. for (auto& rule : *m_rules)
  48. if (rule.type() == CSSRule::Type::Import) {
  49. auto& import_rule = verify_cast<CSSImportRule>(rule);
  50. if (!import_rule.has_import_result()) {
  51. callback(import_rule);
  52. return true;
  53. }
  54. if (import_rule.loaded_style_sheet()->for_first_not_loaded_import_rule(callback)) {
  55. return true;
  56. }
  57. }
  58. return false;
  59. }
  60. private:
  61. explicit CSSStyleSheet(NonnullRefPtrVector<CSSRule>);
  62. NonnullRefPtr<CSSRuleList> m_rules;
  63. };
  64. }
  65. namespace Web::Bindings {
  66. CSSStyleSheetWrapper* wrap(JS::GlobalObject&, CSS::CSSStyleSheet&);
  67. }