diff options
Diffstat (limited to 'layout/style/ServoDeclarationBlock.cpp')
-rw-r--r-- | layout/style/ServoDeclarationBlock.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/layout/style/ServoDeclarationBlock.cpp b/layout/style/ServoDeclarationBlock.cpp new file mode 100644 index 000000000..1dc691bfb --- /dev/null +++ b/layout/style/ServoDeclarationBlock.cpp @@ -0,0 +1,110 @@ +/* -*- Mode: C++; tab-width: 2; 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/. */ + +#include "mozilla/ServoDeclarationBlock.h" + +#include "mozilla/ServoBindings.h" + +#include "nsCSSProps.h" + +namespace mozilla { + +/* static */ already_AddRefed<ServoDeclarationBlock> +ServoDeclarationBlock::FromCssText(const nsAString& aCssText) +{ + NS_ConvertUTF16toUTF8 value(aCssText); + RefPtr<RawServoDeclarationBlock> + raw = Servo_ParseStyleAttribute(&value).Consume(); + RefPtr<ServoDeclarationBlock> decl = new ServoDeclarationBlock(raw.forget()); + return decl.forget(); +} + +/** + * An RAII class holding an atom for the given property. + */ +class MOZ_STACK_CLASS PropertyAtomHolder +{ +public: + explicit PropertyAtomHolder(const nsAString& aProperty) + { + nsCSSPropertyID propID = + nsCSSProps::LookupProperty(aProperty, CSSEnabledState::eForAllContent); + if (propID == eCSSPropertyExtra_variable) { + mIsCustomProperty = true; + mAtom = NS_Atomize( + Substring(aProperty, CSS_CUSTOM_NAME_PREFIX_LENGTH)).take(); + } else { + mIsCustomProperty = false; + if (propID != eCSSProperty_UNKNOWN) { + mAtom = nsCSSProps::AtomForProperty(propID); + } else { + mAtom = nullptr; + } + } + } + + ~PropertyAtomHolder() + { + if (mIsCustomProperty) { + NS_RELEASE(mAtom); + } + } + + explicit operator bool() const { return !!mAtom; } + nsIAtom* Atom() const { MOZ_ASSERT(mAtom); return mAtom; } + bool IsCustomProperty() const { return mIsCustomProperty; } + +private: + nsIAtom* mAtom; + bool mIsCustomProperty; +}; + +void +ServoDeclarationBlock::GetPropertyValue(const nsAString& aProperty, + nsAString& aValue) const +{ + if (PropertyAtomHolder holder{aProperty}) { + Servo_DeclarationBlock_GetPropertyValue( + mRaw, holder.Atom(), holder.IsCustomProperty(), &aValue); + } +} + +void +ServoDeclarationBlock::GetPropertyValueByID(nsCSSPropertyID aPropID, + nsAString& aValue) const +{ + nsIAtom* atom = nsCSSProps::AtomForProperty(aPropID); + Servo_DeclarationBlock_GetPropertyValue(mRaw, atom, false, &aValue); +} + +bool +ServoDeclarationBlock::GetPropertyIsImportant(const nsAString& aProperty) const +{ + if (PropertyAtomHolder holder{aProperty}) { + return Servo_DeclarationBlock_GetPropertyIsImportant( + mRaw, holder.Atom(), holder.IsCustomProperty()); + } + return false; +} + +void +ServoDeclarationBlock::RemoveProperty(const nsAString& aProperty) +{ + AssertMutable(); + if (PropertyAtomHolder holder{aProperty}) { + Servo_DeclarationBlock_RemoveProperty(mRaw, holder.Atom(), + holder.IsCustomProperty()); + } +} + +void +ServoDeclarationBlock::RemovePropertyByID(nsCSSPropertyID aPropID) +{ + AssertMutable(); + nsIAtom* atom = nsCSSProps::AtomForProperty(aPropID); + Servo_DeclarationBlock_RemoveProperty(mRaw, atom, false); +} + +} // namespace mozilla |