1/*
2 * (C) 1999-2003 Lars Knoll (knoll@kde.org)
3 * (C) 2002-2003 Dirk Mueller (mueller@kde.org)
4 * Copyright (C) 2002, 2006, 2007, 2012 Apple Inc. All rights reserved.
5 * Copyright (C) 2011 Andreas Kling (kling@webkit.org)
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * Library General Public License for more details.
16 *
17 * You should have received a copy of the GNU Library General Public License
18 * along with this library; see the file COPYING.LIB.  If not, write to
19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 * Boston, MA 02110-1301, USA.
21 */
22
23#ifndef CSSRule_h
24#define CSSRule_h
25
26#include <wtf/RefCounted.h>
27#include <wtf/text/WTFString.h>
28
29namespace WebCore {
30
31class CSSStyleSheet;
32class StyleRuleBase;
33struct CSSParserContext;
34typedef int ExceptionCode;
35
36class CSSRule : public RefCounted<CSSRule> {
37public:
38    virtual ~CSSRule() { }
39
40    enum Type {
41        UNKNOWN_RULE,
42        STYLE_RULE,
43        CHARSET_RULE,
44        IMPORT_RULE,
45        MEDIA_RULE,
46        FONT_FACE_RULE,
47        PAGE_RULE,
48        // 7 was VARIABLES_RULE; we now match other browsers with 7 as
49        // KEYFRAMES_RULE:
50        // <https://bugs.webkit.org/show_bug.cgi?id=71293>.
51        WEBKIT_KEYFRAMES_RULE,
52        WEBKIT_KEYFRAME_RULE,
53#if ENABLE(CSS3_CONDITIONAL_RULES)
54        SUPPORTS_RULE = 12,
55#endif
56#if ENABLE(CSS_DEVICE_ADAPTATION)
57        WEBKIT_VIEWPORT_RULE = 15,
58#endif
59#if ENABLE(CSS_REGIONS)
60        WEBKIT_REGION_RULE = 16,
61#endif
62#if ENABLE(CSS_SHADERS)
63        WEBKIT_FILTER_RULE = 17,
64#endif
65#if ENABLE(SHADOW_DOM)
66        HOST_RULE = 1001,
67#endif
68    };
69
70    virtual Type type() const = 0;
71    virtual String cssText() const = 0;
72    virtual void reattach(StyleRuleBase*) = 0;
73
74    void setParentStyleSheet(CSSStyleSheet* styleSheet)
75    {
76        m_parentIsRule = false;
77        m_parentStyleSheet = styleSheet;
78    }
79
80    void setParentRule(CSSRule* rule)
81    {
82        m_parentIsRule = true;
83        m_parentRule = rule;
84    }
85
86    CSSStyleSheet* parentStyleSheet() const
87    {
88        if (m_parentIsRule)
89            return m_parentRule ? m_parentRule->parentStyleSheet() : 0;
90        return m_parentStyleSheet;
91    }
92
93    CSSRule* parentRule() const { return m_parentIsRule ? m_parentRule : 0; }
94
95    // NOTE: Just calls notImplemented().
96    void setCssText(const String&, ExceptionCode&);
97
98protected:
99    CSSRule(CSSStyleSheet* parent)
100        : m_hasCachedSelectorText(false)
101        , m_parentIsRule(false)
102        , m_parentStyleSheet(parent)
103    {
104    }
105
106    bool hasCachedSelectorText() const { return m_hasCachedSelectorText; }
107    void setHasCachedSelectorText(bool hasCachedSelectorText) const { m_hasCachedSelectorText = hasCachedSelectorText; }
108
109    const CSSParserContext& parserContext() const;
110
111private:
112    mutable unsigned char m_hasCachedSelectorText : 1;
113    unsigned char m_parentIsRule : 1;
114
115    union {
116        CSSRule* m_parentRule;
117        CSSStyleSheet* m_parentStyleSheet;
118    };
119};
120
121} // namespace WebCore
122
123#endif // CSSRule_h
124