1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/layout/style/nsCSSRules.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,649 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +// vim:cindent:ts=2:et:sw=2: 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +/* rules in a CSS stylesheet other than style rules (e.g., @import rules) */ 1.11 + 1.12 +#ifndef nsCSSRules_h_ 1.13 +#define nsCSSRules_h_ 1.14 + 1.15 +#include "mozilla/Attributes.h" 1.16 + 1.17 +#include "mozilla/MemoryReporting.h" 1.18 +#include "mozilla/css/GroupRule.h" 1.19 +#include "mozilla/Preferences.h" 1.20 +#include "nsIDOMCSSConditionRule.h" 1.21 +#include "nsIDOMCSSFontFaceRule.h" 1.22 +#include "nsIDOMCSSFontFeatureValuesRule.h" 1.23 +#include "nsIDOMCSSGroupingRule.h" 1.24 +#include "nsIDOMCSSMediaRule.h" 1.25 +#include "nsIDOMCSSMozDocumentRule.h" 1.26 +#include "nsIDOMCSSSupportsRule.h" 1.27 +#include "nsIDOMMozCSSKeyframeRule.h" 1.28 +#include "nsIDOMMozCSSKeyframesRule.h" 1.29 +#include "nsAutoPtr.h" 1.30 +#include "nsCSSProperty.h" 1.31 +#include "nsCSSValue.h" 1.32 +#include "nsIDOMCSSCharsetRule.h" 1.33 +#include "nsTArray.h" 1.34 +#include "nsDOMCSSDeclaration.h" 1.35 +#include "Declaration.h" 1.36 +#include "nsIDOMCSSPageRule.h" 1.37 +#include "StyleRule.h" 1.38 +#include "gfxFontFeatures.h" 1.39 + 1.40 +class nsMediaList; 1.41 + 1.42 +namespace mozilla { 1.43 + 1.44 +class ErrorResult; 1.45 + 1.46 +namespace css { 1.47 + 1.48 +class MediaRule MOZ_FINAL : public GroupRule, 1.49 + public nsIDOMCSSMediaRule 1.50 +{ 1.51 +public: 1.52 + MediaRule(); 1.53 +private: 1.54 + MediaRule(const MediaRule& aCopy); 1.55 + ~MediaRule(); 1.56 +public: 1.57 + 1.58 + NS_DECL_ISUPPORTS_INHERITED 1.59 + 1.60 + // nsIStyleRule methods 1.61 +#ifdef DEBUG 1.62 + virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE; 1.63 +#endif 1.64 + 1.65 + // Rule methods 1.66 + virtual void SetStyleSheet(nsCSSStyleSheet* aSheet); //override GroupRule 1.67 + virtual int32_t GetType() const; 1.68 + virtual already_AddRefed<Rule> Clone() const; 1.69 + virtual nsIDOMCSSRule* GetDOMRule() 1.70 + { 1.71 + return this; 1.72 + } 1.73 + virtual nsIDOMCSSRule* GetExistingDOMRule() 1.74 + { 1.75 + return this; 1.76 + } 1.77 + 1.78 + // nsIDOMCSSRule interface 1.79 + NS_DECL_NSIDOMCSSRULE 1.80 + 1.81 + // nsIDOMCSSGroupingRule interface 1.82 + NS_DECL_NSIDOMCSSGROUPINGRULE 1.83 + 1.84 + // nsIDOMCSSConditionRule interface 1.85 + NS_DECL_NSIDOMCSSCONDITIONRULE 1.86 + 1.87 + // nsIDOMCSSMediaRule interface 1.88 + NS_DECL_NSIDOMCSSMEDIARULE 1.89 + 1.90 + // rest of GroupRule 1.91 + virtual bool UseForPresentation(nsPresContext* aPresContext, 1.92 + nsMediaQueryResultCacheKey& aKey); 1.93 + 1.94 + // @media rule methods 1.95 + nsresult SetMedia(nsMediaList* aMedia); 1.96 + 1.97 + virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) 1.98 + const MOZ_MUST_OVERRIDE; 1.99 + 1.100 +protected: 1.101 + void AppendConditionText(nsAString& aOutput); 1.102 + 1.103 + nsRefPtr<nsMediaList> mMedia; 1.104 +}; 1.105 + 1.106 +class DocumentRule MOZ_FINAL : public GroupRule, 1.107 + public nsIDOMCSSMozDocumentRule 1.108 +{ 1.109 +public: 1.110 + DocumentRule(); 1.111 +private: 1.112 + DocumentRule(const DocumentRule& aCopy); 1.113 + ~DocumentRule(); 1.114 +public: 1.115 + 1.116 + NS_DECL_ISUPPORTS_INHERITED 1.117 + 1.118 + // nsIStyleRule methods 1.119 +#ifdef DEBUG 1.120 + virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE; 1.121 +#endif 1.122 + 1.123 + // Rule methods 1.124 + virtual int32_t GetType() const; 1.125 + virtual already_AddRefed<Rule> Clone() const; 1.126 + virtual nsIDOMCSSRule* GetDOMRule() 1.127 + { 1.128 + return this; 1.129 + } 1.130 + virtual nsIDOMCSSRule* GetExistingDOMRule() 1.131 + { 1.132 + return this; 1.133 + } 1.134 + 1.135 + // nsIDOMCSSRule interface 1.136 + NS_DECL_NSIDOMCSSRULE 1.137 + 1.138 + // nsIDOMCSSGroupingRule interface 1.139 + NS_DECL_NSIDOMCSSGROUPINGRULE 1.140 + 1.141 + // nsIDOMCSSConditionRule interface 1.142 + NS_DECL_NSIDOMCSSCONDITIONRULE 1.143 + 1.144 + // nsIDOMCSSMozDocumentRule interface 1.145 + NS_DECL_NSIDOMCSSMOZDOCUMENTRULE 1.146 + 1.147 + // rest of GroupRule 1.148 + virtual bool UseForPresentation(nsPresContext* aPresContext, 1.149 + nsMediaQueryResultCacheKey& aKey); 1.150 + 1.151 + enum Function { 1.152 + eURL, 1.153 + eURLPrefix, 1.154 + eDomain, 1.155 + eRegExp 1.156 + }; 1.157 + 1.158 + struct URL { 1.159 + Function func; 1.160 + nsCString url; 1.161 + URL *next; 1.162 + 1.163 + URL() : next(nullptr) {} 1.164 + URL(const URL& aOther) 1.165 + : func(aOther.func) 1.166 + , url(aOther.url) 1.167 + , next(aOther.next ? new URL(*aOther.next) : nullptr) 1.168 + { 1.169 + } 1.170 + ~URL(); 1.171 + }; 1.172 + 1.173 + void SetURLs(URL *aURLs) { mURLs = aURLs; } 1.174 + 1.175 + virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) 1.176 + const MOZ_MUST_OVERRIDE; 1.177 + 1.178 +protected: 1.179 + void AppendConditionText(nsAString& aOutput); 1.180 + 1.181 + nsAutoPtr<URL> mURLs; // linked list of |struct URL| above. 1.182 +}; 1.183 + 1.184 +} // namespace css 1.185 +} // namespace mozilla 1.186 + 1.187 +// A nsCSSFontFaceStyleDecl is always embedded in a nsCSSFontFaceRule. 1.188 +class nsCSSFontFaceRule; 1.189 +class nsCSSFontFaceStyleDecl : public nsICSSDeclaration 1.190 +{ 1.191 +public: 1.192 + NS_DECL_ISUPPORTS_INHERITED 1.193 + NS_DECL_NSIDOMCSSSTYLEDECLARATION_HELPER 1.194 + NS_DECL_NSICSSDECLARATION 1.195 + virtual already_AddRefed<mozilla::dom::CSSValue> 1.196 + GetPropertyCSSValue(const nsAString& aProp, mozilla::ErrorResult& aRv) 1.197 + MOZ_OVERRIDE; 1.198 + using nsICSSDeclaration::GetPropertyCSSValue; 1.199 + 1.200 + nsCSSFontFaceStyleDecl() 1.201 + { 1.202 + SetIsDOMBinding(); 1.203 + } 1.204 + 1.205 + virtual nsINode *GetParentObject() MOZ_OVERRIDE; 1.206 + virtual void IndexedGetter(uint32_t aIndex, bool& aFound, nsAString& aPropName) MOZ_OVERRIDE; 1.207 + 1.208 + nsresult GetPropertyValue(nsCSSFontDesc aFontDescID, 1.209 + nsAString & aResult) const; 1.210 + 1.211 + virtual JSObject* WrapObject(JSContext *cx) MOZ_OVERRIDE; 1.212 + 1.213 +protected: 1.214 + friend class nsCSSFontFaceRule; 1.215 +#define CSS_FONT_DESC(name_, method_) nsCSSValue m##method_; 1.216 +#include "nsCSSFontDescList.h" 1.217 +#undef CSS_FONT_DESC 1.218 + 1.219 + static nsCSSValue nsCSSFontFaceStyleDecl::* const Fields[]; 1.220 + inline nsCSSFontFaceRule* ContainingRule(); 1.221 + inline const nsCSSFontFaceRule* ContainingRule() const; 1.222 + 1.223 +private: 1.224 + // NOT TO BE IMPLEMENTED 1.225 + // This object cannot be allocated on its own, only as part of 1.226 + // nsCSSFontFaceRule. 1.227 + void* operator new(size_t size) CPP_THROW_NEW; 1.228 +}; 1.229 + 1.230 +class nsCSSFontFaceRule MOZ_FINAL : public mozilla::css::Rule, 1.231 + public nsIDOMCSSFontFaceRule 1.232 +{ 1.233 +public: 1.234 + nsCSSFontFaceRule() {} 1.235 + 1.236 + nsCSSFontFaceRule(const nsCSSFontFaceRule& aCopy) 1.237 + // copy everything except our reference count 1.238 + : mozilla::css::Rule(aCopy), mDecl(aCopy.mDecl) {} 1.239 + 1.240 + NS_DECL_CYCLE_COLLECTING_ISUPPORTS 1.241 + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsCSSFontFaceRule, 1.242 + mozilla::css::Rule) 1.243 + 1.244 + // nsIStyleRule methods 1.245 +#ifdef DEBUG 1.246 + virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE; 1.247 +#endif 1.248 + 1.249 + // Rule methods 1.250 + DECL_STYLE_RULE_INHERIT 1.251 + 1.252 + virtual int32_t GetType() const MOZ_OVERRIDE; 1.253 + virtual already_AddRefed<mozilla::css::Rule> Clone() const; 1.254 + 1.255 + // nsIDOMCSSRule interface 1.256 + NS_DECL_NSIDOMCSSRULE 1.257 + 1.258 + // nsIDOMCSSFontFaceRule interface 1.259 + NS_DECL_NSIDOMCSSFONTFACERULE 1.260 + 1.261 + void SetDesc(nsCSSFontDesc aDescID, nsCSSValue const & aValue); 1.262 + void GetDesc(nsCSSFontDesc aDescID, nsCSSValue & aValue); 1.263 + 1.264 + virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE; 1.265 + 1.266 +protected: 1.267 + friend class nsCSSFontFaceStyleDecl; 1.268 + nsCSSFontFaceStyleDecl mDecl; 1.269 +}; 1.270 + 1.271 +// nsFontFaceRuleContainer - used for associating sheet type with 1.272 +// specific @font-face rules 1.273 +struct nsFontFaceRuleContainer { 1.274 + nsRefPtr<nsCSSFontFaceRule> mRule; 1.275 + uint8_t mSheetType; 1.276 +}; 1.277 + 1.278 +inline nsCSSFontFaceRule* 1.279 +nsCSSFontFaceStyleDecl::ContainingRule() 1.280 +{ 1.281 + return reinterpret_cast<nsCSSFontFaceRule*> 1.282 + (reinterpret_cast<char*>(this) - offsetof(nsCSSFontFaceRule, mDecl)); 1.283 +} 1.284 + 1.285 +inline const nsCSSFontFaceRule* 1.286 +nsCSSFontFaceStyleDecl::ContainingRule() const 1.287 +{ 1.288 + return reinterpret_cast<const nsCSSFontFaceRule*> 1.289 + (reinterpret_cast<const char*>(this) - offsetof(nsCSSFontFaceRule, mDecl)); 1.290 +} 1.291 + 1.292 +class nsCSSFontFeatureValuesRule MOZ_FINAL : 1.293 + public mozilla::css::Rule, 1.294 + public nsIDOMCSSFontFeatureValuesRule 1.295 +{ 1.296 +public: 1.297 + nsCSSFontFeatureValuesRule() {} 1.298 + 1.299 + nsCSSFontFeatureValuesRule(const nsCSSFontFeatureValuesRule& aCopy) 1.300 + // copy everything except our reference count 1.301 + : mozilla::css::Rule(aCopy), 1.302 + mFamilyList(aCopy.mFamilyList), 1.303 + mFeatureValues(aCopy.mFeatureValues) {} 1.304 + 1.305 + NS_DECL_ISUPPORTS 1.306 + 1.307 + // nsIStyleRule methods 1.308 +#ifdef DEBUG 1.309 + virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE; 1.310 +#endif 1.311 + 1.312 + // Rule methods 1.313 + DECL_STYLE_RULE_INHERIT 1.314 + 1.315 + virtual int32_t GetType() const MOZ_OVERRIDE; 1.316 + virtual already_AddRefed<mozilla::css::Rule> Clone() const MOZ_OVERRIDE; 1.317 + 1.318 + // nsIDOMCSSRule interface 1.319 + NS_DECL_NSIDOMCSSRULE 1.320 + 1.321 + // nsIDOMCSSFontFaceRule interface 1.322 + NS_DECL_NSIDOMCSSFONTFEATUREVALUESRULE 1.323 + 1.324 + const nsTArray<nsString>& GetFamilyList() { return mFamilyList; } 1.325 + void SetFamilyList(const nsAString& aFamilyList, bool& aContainsGeneric); 1.326 + 1.327 + void AddValueList(int32_t aVariantAlternate, 1.328 + nsTArray<gfxFontFeatureValueSet::ValueList>& aValueList); 1.329 + 1.330 + const nsTArray<gfxFontFeatureValueSet::FeatureValues>& GetFeatureValues() 1.331 + { 1.332 + return mFeatureValues; 1.333 + } 1.334 + 1.335 + virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE; 1.336 + 1.337 + static bool PrefEnabled() 1.338 + { 1.339 + // font-variant-alternates enabled ==> layout.css.font-features.enabled is true 1.340 + bool fontFeaturesEnabled = 1.341 + nsCSSProps::IsEnabled(eCSSProperty_font_variant_alternates); 1.342 + 1.343 + return fontFeaturesEnabled; 1.344 + } 1.345 + 1.346 +protected: 1.347 + nsTArray<nsString> mFamilyList; 1.348 + nsTArray<gfxFontFeatureValueSet::FeatureValues> mFeatureValues; 1.349 +}; 1.350 + 1.351 +namespace mozilla { 1.352 +namespace css { 1.353 + 1.354 +class CharsetRule MOZ_FINAL : public Rule, 1.355 + public nsIDOMCSSCharsetRule 1.356 +{ 1.357 +public: 1.358 + CharsetRule(const nsAString& aEncoding); 1.359 +private: 1.360 + // For |Clone| 1.361 + CharsetRule(const CharsetRule& aCopy); 1.362 + ~CharsetRule() {} 1.363 + 1.364 +public: 1.365 + NS_DECL_ISUPPORTS 1.366 + 1.367 + DECL_STYLE_RULE_INHERIT 1.368 + 1.369 + // nsIStyleRule methods 1.370 +#ifdef DEBUG 1.371 + virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE; 1.372 +#endif 1.373 + 1.374 + // Rule methods 1.375 + virtual int32_t GetType() const; 1.376 + virtual already_AddRefed<Rule> Clone() const; 1.377 + 1.378 + // nsIDOMCSSRule interface 1.379 + NS_DECL_NSIDOMCSSRULE 1.380 + 1.381 + // nsIDOMCSSCharsetRule methods 1.382 + NS_IMETHOD GetEncoding(nsAString& aEncoding) MOZ_OVERRIDE; 1.383 + NS_IMETHOD SetEncoding(const nsAString& aEncoding) MOZ_OVERRIDE; 1.384 + 1.385 + virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const; 1.386 + 1.387 +private: 1.388 + nsString mEncoding; 1.389 +}; 1.390 + 1.391 +} // namespace css 1.392 +} // namespace mozilla 1.393 + 1.394 +class nsCSSKeyframeRule; 1.395 + 1.396 +class nsCSSKeyframeStyleDeclaration MOZ_FINAL : public nsDOMCSSDeclaration 1.397 +{ 1.398 +public: 1.399 + nsCSSKeyframeStyleDeclaration(nsCSSKeyframeRule *aRule); 1.400 + virtual ~nsCSSKeyframeStyleDeclaration(); 1.401 + 1.402 + NS_IMETHOD GetParentRule(nsIDOMCSSRule **aParent) MOZ_OVERRIDE; 1.403 + void DropReference() { mRule = nullptr; } 1.404 + virtual mozilla::css::Declaration* GetCSSDeclaration(bool aAllocate) MOZ_OVERRIDE; 1.405 + virtual nsresult SetCSSDeclaration(mozilla::css::Declaration* aDecl) MOZ_OVERRIDE; 1.406 + virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) MOZ_OVERRIDE; 1.407 + virtual nsIDocument* DocToUpdate() MOZ_OVERRIDE; 1.408 + 1.409 + NS_DECL_CYCLE_COLLECTING_ISUPPORTS 1.410 + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsCSSKeyframeStyleDeclaration, 1.411 + nsICSSDeclaration) 1.412 + 1.413 + virtual nsINode* GetParentObject() MOZ_OVERRIDE; 1.414 + 1.415 +protected: 1.416 + // This reference is not reference-counted. The rule object tells us 1.417 + // when it's about to go away. 1.418 + nsCSSKeyframeRule *mRule; 1.419 +}; 1.420 + 1.421 +class nsCSSKeyframeRule MOZ_FINAL : public mozilla::css::Rule, 1.422 + public nsIDOMMozCSSKeyframeRule 1.423 +{ 1.424 +public: 1.425 + // WARNING: Steals the contents of aKeys *and* aDeclaration 1.426 + nsCSSKeyframeRule(InfallibleTArray<float>& aKeys, 1.427 + nsAutoPtr<mozilla::css::Declaration> aDeclaration) 1.428 + : mDeclaration(aDeclaration) 1.429 + { 1.430 + mKeys.SwapElements(aKeys); 1.431 + } 1.432 +private: 1.433 + nsCSSKeyframeRule(const nsCSSKeyframeRule& aCopy); 1.434 + ~nsCSSKeyframeRule(); 1.435 +public: 1.436 + NS_DECL_CYCLE_COLLECTING_ISUPPORTS 1.437 + NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsCSSKeyframeRule, nsIStyleRule) 1.438 + 1.439 + // nsIStyleRule methods 1.440 +#ifdef DEBUG 1.441 + virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE; 1.442 +#endif 1.443 + 1.444 + // Rule methods 1.445 + DECL_STYLE_RULE_INHERIT 1.446 + virtual int32_t GetType() const MOZ_OVERRIDE; 1.447 + virtual already_AddRefed<mozilla::css::Rule> Clone() const; 1.448 + 1.449 + // nsIDOMCSSRule interface 1.450 + NS_DECL_NSIDOMCSSRULE 1.451 + 1.452 + // nsIDOMMozCSSKeyframeRule interface 1.453 + NS_DECL_NSIDOMMOZCSSKEYFRAMERULE 1.454 + 1.455 + const nsTArray<float>& GetKeys() const { return mKeys; } 1.456 + mozilla::css::Declaration* Declaration() { return mDeclaration; } 1.457 + 1.458 + void ChangeDeclaration(mozilla::css::Declaration* aDeclaration); 1.459 + 1.460 + virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE; 1.461 + 1.462 + void DoGetKeyText(nsAString &aKeyText) const; 1.463 + 1.464 +private: 1.465 + nsTArray<float> mKeys; 1.466 + nsAutoPtr<mozilla::css::Declaration> mDeclaration; 1.467 + // lazily created when needed: 1.468 + nsRefPtr<nsCSSKeyframeStyleDeclaration> mDOMDeclaration; 1.469 +}; 1.470 + 1.471 +class nsCSSKeyframesRule MOZ_FINAL : public mozilla::css::GroupRule, 1.472 + public nsIDOMMozCSSKeyframesRule 1.473 +{ 1.474 +public: 1.475 + nsCSSKeyframesRule(const nsSubstring& aName) 1.476 + : mName(aName) 1.477 + { 1.478 + } 1.479 +private: 1.480 + nsCSSKeyframesRule(const nsCSSKeyframesRule& aCopy); 1.481 + ~nsCSSKeyframesRule(); 1.482 +public: 1.483 + NS_DECL_ISUPPORTS_INHERITED 1.484 + 1.485 + // nsIStyleRule methods 1.486 +#ifdef DEBUG 1.487 + virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE; 1.488 +#endif 1.489 + 1.490 + // Rule methods 1.491 + virtual int32_t GetType() const; 1.492 + virtual already_AddRefed<mozilla::css::Rule> Clone() const; 1.493 + virtual nsIDOMCSSRule* GetDOMRule() 1.494 + { 1.495 + return this; 1.496 + } 1.497 + virtual nsIDOMCSSRule* GetExistingDOMRule() 1.498 + { 1.499 + return this; 1.500 + } 1.501 + 1.502 + // nsIDOMCSSRule interface 1.503 + NS_DECL_NSIDOMCSSRULE 1.504 + 1.505 + // nsIDOMMozCSSKeyframesRule interface 1.506 + NS_DECL_NSIDOMMOZCSSKEYFRAMESRULE 1.507 + 1.508 + // rest of GroupRule 1.509 + virtual bool UseForPresentation(nsPresContext* aPresContext, 1.510 + nsMediaQueryResultCacheKey& aKey) MOZ_OVERRIDE; 1.511 + 1.512 + const nsString& GetName() { return mName; } 1.513 + 1.514 + virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE; 1.515 + 1.516 +private: 1.517 + uint32_t FindRuleIndexForKey(const nsAString& aKey); 1.518 + 1.519 + nsString mName; 1.520 +}; 1.521 + 1.522 +class nsCSSPageRule; 1.523 + 1.524 +class nsCSSPageStyleDeclaration MOZ_FINAL : public nsDOMCSSDeclaration 1.525 +{ 1.526 +public: 1.527 + nsCSSPageStyleDeclaration(nsCSSPageRule *aRule); 1.528 + virtual ~nsCSSPageStyleDeclaration(); 1.529 + 1.530 + NS_IMETHOD GetParentRule(nsIDOMCSSRule **aParent) MOZ_OVERRIDE; 1.531 + void DropReference() { mRule = nullptr; } 1.532 + virtual mozilla::css::Declaration* GetCSSDeclaration(bool aAllocate) MOZ_OVERRIDE; 1.533 + virtual nsresult SetCSSDeclaration(mozilla::css::Declaration* aDecl) MOZ_OVERRIDE; 1.534 + virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) MOZ_OVERRIDE; 1.535 + virtual nsIDocument* DocToUpdate() MOZ_OVERRIDE; 1.536 + 1.537 + NS_DECL_CYCLE_COLLECTING_ISUPPORTS 1.538 + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsCSSPageStyleDeclaration, 1.539 + nsICSSDeclaration) 1.540 + 1.541 + virtual nsINode *GetParentObject() MOZ_OVERRIDE; 1.542 + 1.543 +protected: 1.544 + // This reference is not reference-counted. The rule object tells us 1.545 + // when it's about to go away. 1.546 + nsCSSPageRule *mRule; 1.547 +}; 1.548 + 1.549 +class nsCSSPageRule MOZ_FINAL : public mozilla::css::Rule, 1.550 + public nsIDOMCSSPageRule 1.551 +{ 1.552 +public: 1.553 + // WARNING: Steals the contents of aDeclaration 1.554 + nsCSSPageRule(nsAutoPtr<mozilla::css::Declaration> aDeclaration) 1.555 + : mDeclaration(aDeclaration), 1.556 + mImportantRule(nullptr) 1.557 + { 1.558 + } 1.559 +private: 1.560 + nsCSSPageRule(const nsCSSPageRule& aCopy); 1.561 + ~nsCSSPageRule(); 1.562 +public: 1.563 + NS_DECL_CYCLE_COLLECTING_ISUPPORTS 1.564 + NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsCSSPageRule, nsIDOMCSSPageRule) 1.565 + 1.566 + // nsIStyleRule methods 1.567 +#ifdef DEBUG 1.568 + virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE; 1.569 +#endif 1.570 + 1.571 + // Rule methods 1.572 + DECL_STYLE_RULE_INHERIT 1.573 + virtual int32_t GetType() const MOZ_OVERRIDE; 1.574 + virtual already_AddRefed<mozilla::css::Rule> Clone() const; 1.575 + 1.576 + // nsIDOMCSSRule interface 1.577 + NS_DECL_NSIDOMCSSRULE 1.578 + 1.579 + // nsIDOMCSSPageRule interface 1.580 + NS_DECL_NSIDOMCSSPAGERULE 1.581 + 1.582 + mozilla::css::Declaration* Declaration() { return mDeclaration; } 1.583 + 1.584 + void ChangeDeclaration(mozilla::css::Declaration* aDeclaration); 1.585 + 1.586 + mozilla::css::ImportantRule* GetImportantRule(); 1.587 + 1.588 + virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE; 1.589 +private: 1.590 + nsAutoPtr<mozilla::css::Declaration> mDeclaration; 1.591 + // lazily created when needed: 1.592 + nsRefPtr<nsCSSPageStyleDeclaration> mDOMDeclaration; 1.593 + nsRefPtr<mozilla::css::ImportantRule> mImportantRule; 1.594 +}; 1.595 + 1.596 +namespace mozilla { 1.597 + 1.598 +class CSSSupportsRule : public css::GroupRule, 1.599 + public nsIDOMCSSSupportsRule 1.600 +{ 1.601 +public: 1.602 + CSSSupportsRule(bool aConditionMet, const nsString& aCondition); 1.603 + CSSSupportsRule(const CSSSupportsRule& aCopy); 1.604 + 1.605 + // nsIStyleRule methods 1.606 +#ifdef DEBUG 1.607 + virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE; 1.608 +#endif 1.609 + 1.610 + // Rule methods 1.611 + virtual int32_t GetType() const; 1.612 + virtual already_AddRefed<mozilla::css::Rule> Clone() const; 1.613 + virtual bool UseForPresentation(nsPresContext* aPresContext, 1.614 + nsMediaQueryResultCacheKey& aKey); 1.615 + virtual nsIDOMCSSRule* GetDOMRule() 1.616 + { 1.617 + return this; 1.618 + } 1.619 + virtual nsIDOMCSSRule* GetExistingDOMRule() 1.620 + { 1.621 + return this; 1.622 + } 1.623 + 1.624 + NS_DECL_ISUPPORTS_INHERITED 1.625 + 1.626 + // nsIDOMCSSRule interface 1.627 + NS_DECL_NSIDOMCSSRULE 1.628 + 1.629 + // nsIDOMCSSGroupingRule interface 1.630 + NS_DECL_NSIDOMCSSGROUPINGRULE 1.631 + 1.632 + // nsIDOMCSSConditionRule interface 1.633 + NS_DECL_NSIDOMCSSCONDITIONRULE 1.634 + 1.635 + // nsIDOMCSSSupportsRule interface 1.636 + NS_DECL_NSIDOMCSSSUPPORTSRULE 1.637 + 1.638 + virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const; 1.639 + 1.640 + static bool PrefEnabled() 1.641 + { 1.642 + return Preferences::GetBool("layout.css.supports-rule.enabled"); 1.643 + } 1.644 + 1.645 +protected: 1.646 + bool mUseGroup; 1.647 + nsString mCondition; 1.648 +}; 1.649 + 1.650 +} // namespace mozilla 1.651 + 1.652 +#endif /* !defined(nsCSSRules_h_) */