Serenity Operating System
1/*
2 * Copyright (c) 2019-2021, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/Function.h>
10#include <LibWeb/CSS/CSSRule.h>
11#include <LibWeb/CSS/CSSRuleList.h>
12#include <LibWeb/CSS/CSSStyleRule.h>
13#include <LibWeb/CSS/StyleSheet.h>
14#include <LibWeb/Loader/Resource.h>
15
16namespace Web::CSS {
17
18class CSSImportRule;
19
20class CSSStyleSheet final
21 : public StyleSheet
22 , public Weakable<CSSStyleSheet> {
23 WEB_PLATFORM_OBJECT(CSSStyleSheet, StyleSheet);
24
25public:
26 static WebIDL::ExceptionOr<JS::NonnullGCPtr<CSSStyleSheet>> create(JS::Realm&, CSSRuleList& rules, MediaList& media, Optional<AK::URL> location);
27
28 virtual ~CSSStyleSheet() override = default;
29
30 void set_owner_css_rule(CSSRule* rule) { m_owner_css_rule = rule; }
31
32 virtual DeprecatedString type() const override { return "text/css"; }
33
34 CSSRuleList const& rules() const { return *m_rules; }
35 CSSRuleList& rules() { return *m_rules; }
36 void set_rules(CSSRuleList& rules) { m_rules = &rules; }
37
38 CSSRuleList* css_rules() { return m_rules; }
39 CSSRuleList const* css_rules() const { return m_rules; }
40
41 WebIDL::ExceptionOr<unsigned> insert_rule(StringView rule, unsigned index);
42 WebIDL::ExceptionOr<void> remove_rule(unsigned index);
43 WebIDL::ExceptionOr<void> delete_rule(unsigned index);
44
45 void for_each_effective_style_rule(Function<void(CSSStyleRule const&)> const& callback) const;
46 // Returns whether the match state of any media queries changed after evaluation.
47 bool evaluate_media_queries(HTML::Window const&);
48
49 void set_style_sheet_list(Badge<StyleSheetList>, StyleSheetList*);
50
51private:
52 CSSStyleSheet(JS::Realm&, CSSRuleList&, MediaList&, Optional<AK::URL> location);
53
54 virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
55 virtual void visit_edges(Cell::Visitor&) override;
56
57 CSSRuleList* m_rules { nullptr };
58
59 JS::GCPtr<StyleSheetList> m_style_sheet_list;
60 CSSRule* m_owner_css_rule { nullptr };
61};
62
63}