Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : /*
7 : * internal abstract interface for containers (roughly origins within
8 : * the CSS cascade) that provide style rules matching an element or
9 : * pseudo-element
10 : */
11 :
12 : #ifndef nsIStyleRuleProcessor_h___
13 : #define nsIStyleRuleProcessor_h___
14 :
15 : #include "mozilla/MemoryReporting.h"
16 : #include "nsISupports.h"
17 : #include "nsChangeHint.h"
18 :
19 : struct RuleProcessorData;
20 : struct ElementRuleProcessorData;
21 : struct PseudoElementRuleProcessorData;
22 : struct AnonBoxRuleProcessorData;
23 : #ifdef MOZ_XUL
24 : struct XULTreeRuleProcessorData;
25 : #endif
26 : struct StateRuleProcessorData;
27 : struct PseudoElementStateRuleProcessorData;
28 : struct AttributeRuleProcessorData;
29 : class nsPresContext;
30 :
31 : // IID for the nsIStyleRuleProcessor interface
32 : // {c1d6001e-4fcb-4c40-bce1-5eba80bfd8f3}
33 : #define NS_ISTYLE_RULE_PROCESSOR_IID \
34 : { 0xc1d6001e, 0x4fcb, 0x4c40, \
35 : {0xbc, 0xe1, 0x5e, 0xba, 0x80, 0xbf, 0xd8, 0xf3} }
36 :
37 :
38 : /* The style rule processor interface is a mechanism to separate the matching
39 : * of style rules from style sheet instances.
40 : * Simple style sheets can and will act as their own processor.
41 : * Sheets where rule ordering interlaces between multiple sheets, will need to
42 : * share a single rule processor between them (CSS sheets do this for cascading order)
43 : *
44 : * @see nsIStyleRule (for significantly more detailed comments)
45 : */
46 170 : class nsIStyleRuleProcessor : public nsISupports {
47 : public:
48 : NS_DECLARE_STATIC_IID_ACCESSOR(NS_ISTYLE_RULE_PROCESSOR_IID)
49 :
50 : // Shorthand for:
51 : // nsCOMArray<nsIStyleRuleProcessor>::nsCOMArrayEnumFunc
52 : typedef bool (* EnumFunc)(nsIStyleRuleProcessor*, void*);
53 :
54 : /**
55 : * Find the |nsIStyleRule|s matching the given content node and
56 : * position the given |nsRuleWalker| at the |nsRuleNode| in the rule
57 : * tree representing that ordered list of rules (with higher
58 : * precedence being farther from the root of the lexicographic tree).
59 : */
60 : virtual void RulesMatching(ElementRuleProcessorData* aData) = 0;
61 :
62 : /**
63 : * Just like the previous |RulesMatching|, except for a given content
64 : * node <em>and pseudo-element</em>.
65 : */
66 : virtual void RulesMatching(PseudoElementRuleProcessorData* aData) = 0;
67 :
68 : /**
69 : * Just like the previous |RulesMatching|, except for a given anonymous box.
70 : */
71 : virtual void RulesMatching(AnonBoxRuleProcessorData* aData) = 0;
72 :
73 : #ifdef MOZ_XUL
74 : /**
75 : * Just like the previous |RulesMatching|, except for a given content
76 : * node <em>and tree pseudo</em>.
77 : */
78 : virtual void RulesMatching(XULTreeRuleProcessorData* aData) = 0;
79 : #endif
80 :
81 : /**
82 : * Return whether style can depend on a change of the given document state.
83 : *
84 : * Document states are defined in nsIDocument.h.
85 : */
86 : virtual bool
87 : HasDocumentStateDependentStyle(StateRuleProcessorData* aData) = 0;
88 :
89 : /**
90 : * Return how (as described by nsRestyleHint) style can depend on a
91 : * change of the given content state on the given content node. This
92 : * test is used for optimization only, and may err on the side of
93 : * reporting more dependencies than really exist.
94 : *
95 : * Event states are defined in mozilla/EventStates.h.
96 : */
97 : virtual nsRestyleHint
98 : HasStateDependentStyle(StateRuleProcessorData* aData) = 0;
99 : virtual nsRestyleHint
100 : HasStateDependentStyle(PseudoElementStateRuleProcessorData* aData) = 0;
101 :
102 : /**
103 : * This method will be called twice for every attribute change.
104 : * During the first call, aData->mAttrHasChanged will be false and
105 : * the attribute change will not have happened yet. During the
106 : * second call, aData->mAttrHasChanged will be true and the
107 : * change will have already happened. The bitwise OR of the two
108 : * return values must describe the style changes that are needed due
109 : * to the attribute change. It's up to the rule processor
110 : * implementation to decide how to split the bits up amongst the two
111 : * return values. For example, it could return the bits needed by
112 : * rules that might stop matching the node from the first call and
113 : * the bits needed by rules that might have started matching the
114 : * node from the second call. This test is used for optimization
115 : * only, and may err on the side of reporting more dependencies than
116 : * really exist.
117 : */
118 : virtual nsRestyleHint HasAttributeDependentStyle(
119 : AttributeRuleProcessorData* aData,
120 : mozilla::RestyleHintData& aRestyleHintDataResult) = 0;
121 :
122 : /**
123 : * Do any processing that needs to happen as a result of a change in
124 : * the characteristics of the medium, and return whether this rule
125 : * processor's rules have changed (e.g., because of media queries).
126 : */
127 : virtual bool MediumFeaturesChanged(nsPresContext* aPresContext) = 0;
128 :
129 : /**
130 : * Report the size of this style rule processor to about:memory. A
131 : * processor may return 0.
132 : */
133 : virtual size_t SizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const = 0;
134 : virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const = 0;
135 : };
136 :
137 : NS_DEFINE_STATIC_IID_ACCESSOR(nsIStyleRuleProcessor,
138 : NS_ISTYLE_RULE_PROCESSOR_IID)
139 :
140 : #endif /* nsIStyleRuleProcessor_h___ */
|