Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : // vim:cindent:ts=2:et:sw=2:
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/. */
6 :
7 : /* rules in a CSS stylesheet other than style rules (e.g., @import rules) */
8 :
9 : #ifndef nsCSSRules_h_
10 : #define nsCSSRules_h_
11 :
12 : #include "Declaration.h"
13 : #include "StyleRule.h"
14 : #include "gfxFontFeatures.h"
15 : #include "mozilla/Attributes.h"
16 : #include "mozilla/MemoryReporting.h"
17 : #include "mozilla/Move.h"
18 : #include "mozilla/SheetType.h"
19 : #include "mozilla/css/GroupRule.h"
20 : #include "mozilla/css/URLMatchingFunction.h"
21 : #include "mozilla/dom/CSSKeyframeRule.h"
22 : #include "mozilla/dom/CSSKeyframesRule.h"
23 : #include "mozilla/dom/CSSMediaRule.h"
24 : #include "mozilla/dom/CSSPageRule.h"
25 : #include "mozilla/dom/CSSSupportsRule.h"
26 : #include "mozilla/dom/CSSMozDocumentRule.h"
27 : #include "nsAutoPtr.h"
28 : #include "nsCSSPropertyID.h"
29 : #include "nsCSSValue.h"
30 : #include "nsDOMCSSDeclaration.h"
31 : #include "nsIDOMCSSConditionRule.h"
32 : #include "nsIDOMCSSFontFeatureValuesRule.h"
33 : #include "nsIDOMCSSGroupingRule.h"
34 : #include "nsIDOMCSSMozDocumentRule.h"
35 : #include "nsIDOMCSSSupportsRule.h"
36 : #include "nsTArray.h"
37 :
38 : class nsMediaList;
39 :
40 : namespace mozilla {
41 :
42 : class ErrorResult;
43 :
44 : namespace dom {
45 : class MediaList;
46 : }
47 :
48 : namespace css {
49 :
50 : class MediaRule final : public dom::CSSMediaRule
51 : {
52 : public:
53 : MediaRule(uint32_t aLineNumber, uint32_t aColumnNumber);
54 : private:
55 : MediaRule(const MediaRule& aCopy);
56 : ~MediaRule();
57 : public:
58 : NS_DECL_ISUPPORTS_INHERITED
59 48 : NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaRule, dom::CSSMediaRule)
60 :
61 : // Rule methods
62 : #ifdef DEBUG
63 : virtual void List(FILE* out = stdout, int32_t aIndent = 0) const override;
64 : #endif
65 : virtual void SetStyleSheet(mozilla::StyleSheet* aSheet) override; //override GroupRule
66 48 : mozilla::CSSStyleSheet* GetStyleSheet() const
67 : {
68 48 : mozilla::StyleSheet* sheet = GroupRule::GetStyleSheet();
69 48 : return sheet ? sheet->AsGecko() : nullptr;
70 : }
71 : virtual already_AddRefed<Rule> Clone() const override;
72 :
73 : // nsIDOMCSSConditionRule interface
74 : NS_DECL_NSIDOMCSSCONDITIONRULE
75 :
76 : // rest of GroupRule
77 : virtual bool UseForPresentation(nsPresContext* aPresContext,
78 : nsMediaQueryResultCacheKey& aKey) override;
79 :
80 : // @media rule methods
81 : nsresult SetMedia(nsMediaList* aMedia);
82 :
83 : // WebIDL interface
84 : void GetCssTextImpl(nsAString& aCssText) const override;
85 : using CSSMediaRule::SetConditionText;
86 : dom::MediaList* Media() override;
87 :
88 : virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf)
89 : const override MOZ_MUST_OVERRIDE;
90 :
91 : protected:
92 : void AppendConditionText(nsAString& aOutput) const;
93 :
94 : RefPtr<nsMediaList> mMedia;
95 : };
96 :
97 : class DocumentRule final : public dom::CSSMozDocumentRule
98 : {
99 : public:
100 : DocumentRule(uint32_t aLineNumber, uint32_t aColumnNumber);
101 : private:
102 : DocumentRule(const DocumentRule& aCopy);
103 : ~DocumentRule();
104 : public:
105 :
106 : NS_DECL_ISUPPORTS_INHERITED
107 :
108 : // Rule methods
109 : #ifdef DEBUG
110 : virtual void List(FILE* out = stdout, int32_t aIndent = 0) const override;
111 : #endif
112 : virtual already_AddRefed<Rule> Clone() const override;
113 :
114 : // nsIDOMCSSConditionRule interface
115 : NS_DECL_NSIDOMCSSCONDITIONRULE
116 :
117 : // rest of GroupRule
118 : virtual bool UseForPresentation(nsPresContext* aPresContext,
119 : nsMediaQueryResultCacheKey& aKey) override;
120 :
121 : bool UseForPresentation(nsPresContext* aPresContext);
122 :
123 : static bool UseForPresentation(nsIDocument* aDoc,
124 : nsIURI* aDocURI,
125 : const nsACString& aDocURISpec,
126 : const nsACString& aPattern,
127 : URLMatchingFunction aUrlMatchingFunction);
128 :
129 : struct URL {
130 : URLMatchingFunction func;
131 : nsCString url;
132 : URL *next;
133 :
134 2 : URL() : next(nullptr) {}
135 0 : URL(const URL& aOther)
136 0 : : func(aOther.func)
137 : , url(aOther.url)
138 0 : , next(aOther.next ? new URL(*aOther.next) : nullptr)
139 : {
140 0 : }
141 : ~URL();
142 : };
143 :
144 2 : void SetURLs(URL *aURLs) { mURLs = aURLs; }
145 :
146 : // WebIDL interface
147 : void GetCssTextImpl(nsAString& aCssText) const override;
148 : using dom::CSSMozDocumentRule::SetConditionText;
149 :
150 : virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf)
151 : const override MOZ_MUST_OVERRIDE;
152 :
153 : protected:
154 : void AppendConditionText(nsAString& aOutput) const;
155 :
156 : nsAutoPtr<URL> mURLs; // linked list of |struct URL| above.
157 : };
158 :
159 : } // namespace css
160 :
161 : } // namespace mozilla
162 :
163 : class nsCSSFontFeatureValuesRule final : public mozilla::css::Rule,
164 : public nsIDOMCSSFontFeatureValuesRule
165 : {
166 : public:
167 0 : nsCSSFontFeatureValuesRule(uint32_t aLineNumber, uint32_t aColumnNumber)
168 0 : : mozilla::css::Rule(aLineNumber, aColumnNumber)
169 : {
170 0 : }
171 :
172 0 : nsCSSFontFeatureValuesRule(const nsCSSFontFeatureValuesRule& aCopy)
173 : // copy everything except our reference count
174 0 : : mozilla::css::Rule(aCopy),
175 : mFamilyList(aCopy.mFamilyList),
176 0 : mFeatureValues(aCopy.mFeatureValues)
177 : {
178 0 : }
179 :
180 : NS_DECL_ISUPPORTS_INHERITED
181 : virtual bool IsCCLeaf() const override;
182 :
183 : #ifdef DEBUG
184 : virtual void List(FILE* out = stdout, int32_t aIndent = 0) const override;
185 : #endif
186 : virtual int32_t GetType() const override;
187 : using Rule::GetType;
188 : virtual already_AddRefed<mozilla::css::Rule> Clone() const override;
189 :
190 : // nsIDOMCSSFontFaceRule interface
191 : NS_DECL_NSIDOMCSSFONTFEATUREVALUESRULE
192 :
193 : // WebIDL interface
194 : uint16_t Type() const override;
195 : void GetCssTextImpl(nsAString& aCssText) const override;
196 : // The XPCOM GetFontFamily is fine
197 : void SetFontFamily(const nsAString& aFamily, mozilla::ErrorResult& aRv);
198 : // The XPCOM GetValueText is fine
199 : void SetValueText(const nsAString& aFamily, mozilla::ErrorResult& aRv);
200 :
201 0 : const mozilla::FontFamilyList& GetFamilyList() { return mFamilyList; }
202 : void SetFamilyList(const mozilla::FontFamilyList& aFamilyList);
203 :
204 : void AddValueList(int32_t aVariantAlternate,
205 : nsTArray<gfxFontFeatureValueSet::ValueList>& aValueList);
206 :
207 0 : const nsTArray<gfxFontFeatureValueSet::FeatureValues>& GetFeatureValues()
208 : {
209 0 : return mFeatureValues;
210 : }
211 :
212 : virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const override;
213 :
214 : virtual JSObject* WrapObject(JSContext* aCx,
215 : JS::Handle<JSObject*> aGivenProto) override;
216 :
217 : protected:
218 0 : ~nsCSSFontFeatureValuesRule() {}
219 :
220 : mozilla::FontFamilyList mFamilyList;
221 : nsTArray<gfxFontFeatureValueSet::FeatureValues> mFeatureValues;
222 : };
223 :
224 : class nsCSSKeyframeRule;
225 :
226 : class nsCSSKeyframeStyleDeclaration final : public nsDOMCSSDeclaration
227 : {
228 : public:
229 : explicit nsCSSKeyframeStyleDeclaration(nsCSSKeyframeRule *aRule);
230 :
231 : NS_IMETHOD GetParentRule(nsIDOMCSSRule **aParent) override;
232 0 : void DropReference() { mRule = nullptr; }
233 : virtual mozilla::DeclarationBlock* GetCSSDeclaration(Operation aOperation) override;
234 : virtual nsresult SetCSSDeclaration(mozilla::DeclarationBlock* aDecl) override;
235 : virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) override;
236 : nsDOMCSSDeclaration::ServoCSSParsingEnvironment GetServoCSSParsingEnvironment() const final;
237 : virtual nsIDocument* DocToUpdate() override;
238 :
239 : NS_DECL_CYCLE_COLLECTING_ISUPPORTS
240 0 : NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsCSSKeyframeStyleDeclaration,
241 : nsICSSDeclaration)
242 :
243 : virtual nsINode* GetParentObject() override;
244 :
245 : protected:
246 : virtual ~nsCSSKeyframeStyleDeclaration();
247 :
248 : // This reference is not reference-counted. The rule object tells us
249 : // when it's about to go away.
250 : nsCSSKeyframeRule* MOZ_NON_OWNING_REF mRule;
251 : };
252 :
253 : class nsCSSKeyframeRule final : public mozilla::dom::CSSKeyframeRule
254 : {
255 : public:
256 : // Steals the contents of aKeys, and takes the reference in Declaration
257 78 : nsCSSKeyframeRule(InfallibleTArray<float>&& aKeys,
258 : already_AddRefed<mozilla::css::Declaration>&& aDeclaration,
259 : uint32_t aLineNumber, uint32_t aColumnNumber)
260 78 : : mozilla::dom::CSSKeyframeRule(aLineNumber, aColumnNumber)
261 78 : , mKeys(mozilla::Move(aKeys))
262 156 : , mDeclaration(mozilla::Move(aDeclaration))
263 : {
264 78 : mDeclaration->SetOwningRule(this);
265 78 : }
266 : private:
267 : nsCSSKeyframeRule(const nsCSSKeyframeRule& aCopy);
268 : ~nsCSSKeyframeRule();
269 : public:
270 : NS_DECL_ISUPPORTS_INHERITED
271 78 : NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsCSSKeyframeRule,
272 : mozilla::dom::CSSKeyframeRule)
273 : virtual bool IsCCLeaf() const override;
274 :
275 : #ifdef DEBUG
276 : virtual void List(FILE* out = stdout, int32_t aIndent = 0) const override;
277 : #endif
278 : virtual already_AddRefed<mozilla::css::Rule> Clone() const override;
279 :
280 : // nsIDOMCSSKeyframeRule interface
281 : NS_IMETHOD GetKeyText(nsAString& aKeyText) final;
282 : NS_IMETHOD SetKeyText(const nsAString& aKeyText) final;
283 :
284 : // WebIDL interface
285 : void GetCssTextImpl(nsAString& aCssText) const final;
286 : nsICSSDeclaration* Style() final;
287 :
288 0 : const nsTArray<float>& GetKeys() const { return mKeys; }
289 0 : mozilla::css::Declaration* Declaration() { return mDeclaration; }
290 :
291 : void ChangeDeclaration(mozilla::css::Declaration* aDeclaration);
292 :
293 : virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const override;
294 :
295 : void DoGetKeyText(nsAString &aKeyText) const;
296 :
297 : private:
298 : nsTArray<float> mKeys;
299 : RefPtr<mozilla::css::Declaration> mDeclaration;
300 : // lazily created when needed:
301 : RefPtr<nsCSSKeyframeStyleDeclaration> mDOMDeclaration;
302 : };
303 :
304 : class nsCSSKeyframesRule final : public mozilla::dom::CSSKeyframesRule
305 : {
306 : public:
307 31 : nsCSSKeyframesRule(const nsAString& aName,
308 : uint32_t aLineNumber, uint32_t aColumnNumber)
309 31 : : mozilla::dom::CSSKeyframesRule(aLineNumber, aColumnNumber)
310 31 : , mName(aName)
311 : {
312 31 : }
313 : private:
314 : nsCSSKeyframesRule(const nsCSSKeyframesRule& aCopy);
315 : ~nsCSSKeyframesRule();
316 : public:
317 : NS_DECL_ISUPPORTS_INHERITED
318 :
319 : // Rule methods
320 : #ifdef DEBUG
321 : virtual void List(FILE* out = stdout, int32_t aIndent = 0) const override;
322 : #endif
323 : virtual already_AddRefed<mozilla::css::Rule> Clone() const override;
324 :
325 : // nsIDOMCSSKeyframesRule interface
326 : NS_IMETHOD GetName(nsAString& aName) final;
327 : NS_IMETHOD SetName(const nsAString& aName) final;
328 : NS_IMETHOD AppendRule(const nsAString& aRule) final;
329 : NS_IMETHOD DeleteRule(const nsAString& aKey) final;
330 : using nsIDOMCSSKeyframesRule::FindRule;
331 :
332 : // WebIDL interface
333 : void GetCssTextImpl(nsAString& aCssText) const final;
334 0 : mozilla::dom::CSSRuleList* CssRules() final { return GroupRule::CssRules(); }
335 : nsCSSKeyframeRule* FindRule(const nsAString& aKey) final;
336 :
337 93 : const nsString& GetName() { return mName; }
338 :
339 : virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const override;
340 :
341 : private:
342 : uint32_t FindRuleIndexForKey(const nsAString& aKey);
343 :
344 : nsString mName;
345 : };
346 :
347 : class nsCSSPageRule;
348 :
349 : class nsCSSPageStyleDeclaration final : public nsDOMCSSDeclaration
350 : {
351 : public:
352 : explicit nsCSSPageStyleDeclaration(nsCSSPageRule *aRule);
353 :
354 : NS_IMETHOD GetParentRule(nsIDOMCSSRule **aParent) override;
355 0 : void DropReference() { mRule = nullptr; }
356 : virtual mozilla::DeclarationBlock* GetCSSDeclaration(Operation aOperation) override;
357 : virtual nsresult SetCSSDeclaration(mozilla::DeclarationBlock* aDecl) override;
358 : virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) override;
359 : nsDOMCSSDeclaration::ServoCSSParsingEnvironment GetServoCSSParsingEnvironment() const final;
360 : virtual nsIDocument* DocToUpdate() override;
361 :
362 : NS_DECL_CYCLE_COLLECTING_ISUPPORTS
363 0 : NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsCSSPageStyleDeclaration,
364 : nsICSSDeclaration)
365 :
366 : virtual nsINode *GetParentObject() override;
367 :
368 : protected:
369 : virtual ~nsCSSPageStyleDeclaration();
370 :
371 : // This reference is not reference-counted. The rule object tells us
372 : // when it's about to go away.
373 : nsCSSPageRule* MOZ_NON_OWNING_REF mRule;
374 : };
375 :
376 : class nsCSSPageRule final : public mozilla::dom::CSSPageRule
377 : {
378 : public:
379 0 : nsCSSPageRule(mozilla::css::Declaration* aDeclaration,
380 : uint32_t aLineNumber, uint32_t aColumnNumber)
381 0 : : mozilla::dom::CSSPageRule(aLineNumber, aColumnNumber)
382 0 : , mDeclaration(aDeclaration)
383 : {
384 0 : mDeclaration->SetOwningRule(this);
385 0 : }
386 : private:
387 : nsCSSPageRule(const nsCSSPageRule& aCopy);
388 : ~nsCSSPageRule();
389 : public:
390 : NS_DECL_ISUPPORTS_INHERITED
391 0 : NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsCSSPageRule, mozilla::dom::CSSPageRule)
392 : virtual bool IsCCLeaf() const override;
393 :
394 : #ifdef DEBUG
395 : virtual void List(FILE* out = stdout, int32_t aIndent = 0) const override;
396 : #endif
397 : virtual already_AddRefed<mozilla::css::Rule> Clone() const override;
398 :
399 : // WebIDL interfaces
400 : virtual void GetCssTextImpl(nsAString& aCssText) const override;
401 : virtual nsICSSDeclaration* Style() override;
402 :
403 0 : mozilla::css::Declaration* Declaration() { return mDeclaration; }
404 :
405 : void ChangeDeclaration(mozilla::css::Declaration* aDeclaration);
406 :
407 : virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const override;
408 :
409 : private:
410 : RefPtr<mozilla::css::Declaration> mDeclaration;
411 : // lazily created when needed:
412 : RefPtr<nsCSSPageStyleDeclaration> mDOMDeclaration;
413 : };
414 :
415 : namespace mozilla {
416 :
417 : class CSSSupportsRule final : public dom::CSSSupportsRule
418 : {
419 : public:
420 : CSSSupportsRule(bool aConditionMet, const nsString& aCondition,
421 : uint32_t aLineNumber, uint32_t aColumnNumber);
422 : CSSSupportsRule(const CSSSupportsRule& aCopy);
423 :
424 : // Rule methods
425 : #ifdef DEBUG
426 : virtual void List(FILE* out = stdout, int32_t aIndent = 0) const override;
427 : #endif
428 : virtual already_AddRefed<mozilla::css::Rule> Clone() const override;
429 : virtual bool UseForPresentation(nsPresContext* aPresContext,
430 : nsMediaQueryResultCacheKey& aKey) override;
431 :
432 : NS_DECL_ISUPPORTS_INHERITED
433 :
434 : // nsIDOMCSSConditionRule interface
435 : NS_DECL_NSIDOMCSSCONDITIONRULE
436 :
437 : // WebIDL interface
438 : void GetCssTextImpl(nsAString& aCssText) const override;
439 : using dom::CSSSupportsRule::SetConditionText;
440 :
441 : virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const override;
442 :
443 : protected:
444 : virtual ~CSSSupportsRule();
445 :
446 : bool mUseGroup;
447 : nsString mCondition;
448 : };
449 :
450 : } // namespace mozilla
451 :
452 : #endif /* !defined(nsCSSRules_h_) */
|