1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef mozilla_CSSStyleRule_h
8 #define mozilla_CSSStyleRule_h
10 #include "mozilla/css/GroupRule.h"
11 #include "mozilla/ServoBindingTypes.h"
12 #include "mozilla/NotNull.h"
13 #include "mozilla/WeakPtr.h"
15 #include "nsDOMCSSDeclaration.h"
19 class DeclarationBlock
;
25 class CSSStyleRuleDeclaration final
: public nsDOMCSSDeclaration
{
27 NS_DECL_ISUPPORTS_INHERITED
29 css::Rule
* GetParentRule() final
;
30 nsINode
* GetAssociatedNode() const final
;
31 nsISupports
* GetParentObject() const final
;
34 mozilla::DeclarationBlock
* GetOrCreateCSSDeclaration(
35 Operation aOperation
, mozilla::DeclarationBlock
** aCreated
) final
;
36 nsresult
SetCSSDeclaration(DeclarationBlock
* aDecl
,
37 MutationClosureData
* aClosureData
) final
;
38 Document
* DocToUpdate() final
;
39 ParsingEnvironment
GetParsingEnvironment(
40 nsIPrincipal
* aSubjectPrincipal
) const final
;
43 // For accessing the constructor.
44 friend class CSSStyleRule
;
46 explicit CSSStyleRuleDeclaration(
47 already_AddRefed
<StyleLockedDeclarationBlock
> aDecls
);
48 ~CSSStyleRuleDeclaration();
50 inline CSSStyleRule
* Rule();
51 inline const CSSStyleRule
* Rule() const;
53 void SetRawAfterClone(RefPtr
<StyleLockedDeclarationBlock
>);
55 RefPtr
<DeclarationBlock
> mDecls
;
58 class CSSStyleRule final
: public css::GroupRule
, public SupportsWeakPtr
{
60 CSSStyleRule(already_AddRefed
<StyleLockedStyleRule
> aRawRule
,
61 StyleSheet
* aSheet
, css::Rule
* aParentRule
, uint32_t aLine
,
64 NS_DECL_ISUPPORTS_INHERITED
65 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(CSSStyleRule
,
67 bool IsCCLeaf() const final MOZ_MUST_OVERRIDE
;
69 uint32_t SelectorCount() const;
70 void SelectorTextAt(uint32_t aSelectorIndex
, bool aDesugared
,
72 uint64_t SelectorSpecificityAt(uint32_t aSelectorIndex
, bool aDesugared
);
73 bool SelectorMatchesElement(uint32_t aSelectorIndex
, dom::Element
&,
74 const nsAString
& aPseudo
,
75 bool aRelevantLinkVisited
);
76 NotNull
<DeclarationBlock
*> GetDeclarationBlock() const;
79 StyleCssRuleType
Type() const final
;
80 void GetCssText(nsACString
& aCssText
) const final
;
81 void GetSelectorText(nsACString
& aSelectorText
);
82 void SetSelectorText(const nsACString
& aSelectorText
);
83 nsICSSDeclaration
* Style();
85 StyleLockedStyleRule
* Raw() const { return mRawRule
; }
86 void SetRawAfterClone(RefPtr
<StyleLockedStyleRule
>);
87 already_AddRefed
<StyleLockedCssRules
> GetOrCreateRawRules() final
;
89 // Methods of mozilla::css::Rule
90 size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf
) const final
;
92 void List(FILE* out
= stdout
, int32_t aIndent
= 0) const final
;
95 JSObject
* WrapObject(JSContext
*, JS::Handle
<JSObject
*> aGivenProto
) override
;
98 ~CSSStyleRule() = default;
100 void GetSelectorDataAtIndex(uint32_t aSelectorIndex
, bool aDesugared
,
101 nsACString
* aText
, uint64_t* aSpecificity
);
103 // For computing the offset of mDecls.
104 friend class CSSStyleRuleDeclaration
;
106 RefPtr
<StyleLockedStyleRule
> mRawRule
;
107 CSSStyleRuleDeclaration mDecls
;
110 CSSStyleRule
* CSSStyleRuleDeclaration::Rule() {
111 return reinterpret_cast<CSSStyleRule
*>(reinterpret_cast<uint8_t*>(this) -
112 offsetof(CSSStyleRule
, mDecls
));
115 const CSSStyleRule
* CSSStyleRuleDeclaration::Rule() const {
116 return reinterpret_cast<const CSSStyleRule
*>(
117 reinterpret_cast<const uint8_t*>(this) - offsetof(CSSStyleRule
, mDecls
));
121 } // namespace mozilla
123 #endif // mozilla_CSSStyleRule_h