123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- /*
- * representation of a declaration block in a CSS stylesheet, or of
- * a style attribute
- */
- #ifndef mozilla_DeclarationBlock_h
- #define mozilla_DeclarationBlock_h
- #include "mozilla/ServoUtils.h"
- #include "mozilla/StyleBackendType.h"
- #include "nsCSSPropertyID.h"
- class nsHTMLCSSStyleSheet;
- namespace mozilla {
- class ServoDeclarationBlock;
- namespace css {
- class Declaration;
- class Rule;
- } // namespace css
- class DeclarationBlock
- {
- protected:
- explicit DeclarationBlock(StyleBackendType aType)
- : mImmutable(false), mType(aType) { mContainer.mRaw = 0; }
- DeclarationBlock(const DeclarationBlock& aCopy)
- : DeclarationBlock(aCopy.mType) {}
- public:
- MOZ_DECL_STYLO_METHODS(css::Declaration, ServoDeclarationBlock)
- inline MozExternalRefCountType AddRef();
- inline MozExternalRefCountType Release();
- inline already_AddRefed<DeclarationBlock> Clone() const;
- /**
- * Return whether |this| may be modified.
- */
- bool IsMutable() const {
- return !mImmutable;
- }
- /**
- * Crash if |this| cannot be modified.
- */
- void AssertMutable() const {
- MOZ_ASSERT(IsMutable(), "someone forgot to call EnsureMutable");
- }
- /**
- * Mark this declaration as unmodifiable. It's 'const' so it can
- * be called from ToString.
- */
- void SetImmutable() const { mImmutable = true; }
- /**
- * Copy |this|, if necessary to ensure that it can be modified.
- */
- inline already_AddRefed<DeclarationBlock> EnsureMutable();
- void SetOwningRule(css::Rule* aRule) {
- MOZ_ASSERT(!mContainer.mOwningRule || !aRule,
- "should never overwrite one rule with another");
- mContainer.mOwningRule = aRule;
- }
- css::Rule* GetOwningRule() const {
- if (mContainer.mRaw & 0x1) {
- return nullptr;
- }
- return mContainer.mOwningRule;
- }
- void SetHTMLCSSStyleSheet(nsHTMLCSSStyleSheet* aHTMLCSSStyleSheet) {
- MOZ_ASSERT(!mContainer.mHTMLCSSStyleSheet || !aHTMLCSSStyleSheet,
- "should never overwrite one sheet with another");
- mContainer.mHTMLCSSStyleSheet = aHTMLCSSStyleSheet;
- if (aHTMLCSSStyleSheet) {
- mContainer.mRaw |= uintptr_t(1);
- }
- }
- nsHTMLCSSStyleSheet* GetHTMLCSSStyleSheet() const {
- if (!(mContainer.mRaw & 0x1)) {
- return nullptr;
- }
- auto c = mContainer;
- c.mRaw &= ~uintptr_t(1);
- return c.mHTMLCSSStyleSheet;
- }
- inline void ToString(nsAString& aString) const;
- inline uint32_t Count() const;
- inline bool GetNthProperty(uint32_t aIndex, nsAString& aReturn) const;
- inline void GetPropertyValue(const nsAString& aProperty,
- nsAString& aValue) const;
- inline void GetPropertyValueByID(nsCSSPropertyID aPropID,
- nsAString& aValue) const;
- inline void GetAuthoredPropertyValue(const nsAString& aProperty,
- nsAString& aValue) const;
- inline bool GetPropertyIsImportant(const nsAString& aProperty) const;
- inline void RemoveProperty(const nsAString& aProperty);
- inline void RemovePropertyByID(nsCSSPropertyID aProperty);
- private:
- union {
- // We only ever have one of these since we have an
- // nsHTMLCSSStyleSheet only for style attributes, and style
- // attributes never have an owning rule.
- // It's an nsHTMLCSSStyleSheet if the low bit is set.
- uintptr_t mRaw;
- // The style rule that owns this declaration. May be null.
- css::Rule* mOwningRule;
- // The nsHTMLCSSStyleSheet that is responsible for this declaration.
- // Only non-null for style attributes.
- nsHTMLCSSStyleSheet* mHTMLCSSStyleSheet;
- } mContainer;
- // set when declaration put in the rule tree;
- // also by ToString (hence the 'mutable').
- mutable bool mImmutable;
- const StyleBackendType mType;
- };
- } // namespace mozilla
- #endif // mozilla_DeclarationBlock_h
|