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/BindingStyleRule.h"
11 #include "mozilla/ServoBindingTypes.h"
12 #include "mozilla/WeakPtr.h"
14 #include "nsDOMCSSDeclaration.h"
18 class DeclarationBlock
;
24 class CSSStyleRuleDeclaration final
: public nsDOMCSSDeclaration
{
26 NS_DECL_ISUPPORTS_INHERITED
28 css::Rule
* GetParentRule() final
;
29 nsINode
* GetParentObject() final
;
32 mozilla::DeclarationBlock
* GetOrCreateCSSDeclaration(
33 Operation aOperation
, mozilla::DeclarationBlock
** aCreated
) final
;
34 nsresult
SetCSSDeclaration(DeclarationBlock
* aDecl
,
35 MutationClosureData
* aClosureData
) final
;
36 Document
* DocToUpdate() final
;
37 ParsingEnvironment
GetParsingEnvironment(
38 nsIPrincipal
* aSubjectPrincipal
) const final
;
41 // For accessing the constructor.
42 friend class CSSStyleRule
;
44 explicit CSSStyleRuleDeclaration(
45 already_AddRefed
<RawServoDeclarationBlock
> aDecls
);
46 ~CSSStyleRuleDeclaration();
48 inline CSSStyleRule
* Rule();
49 inline const CSSStyleRule
* Rule() const;
51 RefPtr
<DeclarationBlock
> mDecls
;
54 class CSSStyleRule final
: public BindingStyleRule
, public SupportsWeakPtr
{
56 CSSStyleRule(already_AddRefed
<RawServoStyleRule
> aRawRule
, StyleSheet
* aSheet
,
57 css::Rule
* aParentRule
, uint32_t aLine
, uint32_t aColumn
);
59 NS_DECL_ISUPPORTS_INHERITED
60 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(CSSStyleRule
,
62 bool IsCCLeaf() const final MOZ_MUST_OVERRIDE
;
64 uint32_t GetSelectorCount() override
;
65 nsresult
GetSelectorText(uint32_t aSelectorIndex
, nsACString
& aText
) override
;
66 nsresult
GetSpecificity(uint32_t aSelectorIndex
,
67 uint64_t* aSpecificity
) override
;
68 nsresult
SelectorMatchesElement(dom::Element
* aElement
,
69 uint32_t aSelectorIndex
,
70 const nsAString
& aPseudo
,
71 bool aRelevantLinkVisited
,
72 bool* aMatches
) override
;
73 NotNull
<DeclarationBlock
*> GetDeclarationBlock() const override
;
76 uint16_t Type() const final
{ return dom::CSSRule_Binding::STYLE_RULE
; }
77 void GetCssText(nsACString
& aCssText
) const final
;
78 void GetSelectorText(nsACString
& aSelectorText
) final
;
79 void SetSelectorText(const nsACString
& aSelectorText
) final
;
80 nsICSSDeclaration
* Style() final
;
82 RawServoStyleRule
* Raw() const { return mRawRule
; }
84 // Methods of mozilla::css::Rule
85 size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf
) const final
;
87 void List(FILE* out
= stdout
, int32_t aIndent
= 0) const final
;
91 ~CSSStyleRule() = default;
93 // For computing the offset of mDecls.
94 friend class CSSStyleRuleDeclaration
;
96 RefPtr
<RawServoStyleRule
> mRawRule
;
97 CSSStyleRuleDeclaration mDecls
;
100 CSSStyleRule
* CSSStyleRuleDeclaration::Rule() {
101 return reinterpret_cast<CSSStyleRule
*>(reinterpret_cast<uint8_t*>(this) -
102 offsetof(CSSStyleRule
, mDecls
));
105 const CSSStyleRule
* CSSStyleRuleDeclaration::Rule() const {
106 return reinterpret_cast<const CSSStyleRule
*>(
107 reinterpret_cast<const uint8_t*>(this) - offsetof(CSSStyleRule
, mDecls
));
111 } // namespace mozilla
113 #endif // mozilla_CSSStyleRule_h