diff options
Diffstat (limited to 'layout/style/CSSVariableValues.cpp')
-rw-r--r-- | layout/style/CSSVariableValues.cpp | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/layout/style/CSSVariableValues.cpp b/layout/style/CSSVariableValues.cpp new file mode 100644 index 000000000..e6f1faf26 --- /dev/null +++ b/layout/style/CSSVariableValues.cpp @@ -0,0 +1,147 @@ +/* -*- 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/. */ + +/* computed CSS Variable values */ + +#include "CSSVariableValues.h" + +#include "CSSVariableResolver.h" + +namespace mozilla { + +CSSVariableValues::CSSVariableValues() +{ + MOZ_COUNT_CTOR(CSSVariableValues); +} + +CSSVariableValues::CSSVariableValues(const CSSVariableValues& aOther) +{ + MOZ_COUNT_CTOR(CSSVariableValues); + CopyVariablesFrom(aOther); +} + +#ifdef DEBUG +CSSVariableValues::~CSSVariableValues() +{ + MOZ_COUNT_DTOR(CSSVariableValues); +} +#endif + +CSSVariableValues& +CSSVariableValues::operator=(const CSSVariableValues& aOther) +{ + if (this == &aOther) { + return *this; + } + + mVariableIDs.Clear(); + mVariables.Clear(); + CopyVariablesFrom(aOther); + return *this; +} + +bool +CSSVariableValues::operator==(const CSSVariableValues& aOther) const +{ + if (mVariables.Length() != aOther.mVariables.Length()) { + return false; + } + + for (size_t thisIndex = 0; thisIndex < mVariables.Length(); ++thisIndex) { + size_t otherIndex; + if (!aOther.mVariableIDs.Get(mVariables[thisIndex].mVariableName, + &otherIndex)) { + return false; + } + const nsString& otherValue = aOther.mVariables[otherIndex].mValue; + if (!mVariables[thisIndex].mValue.Equals(otherValue)) { + return false; + } + } + + return true; +} + +size_t +CSSVariableValues::Count() const +{ + return mVariables.Length(); +} + +bool +CSSVariableValues::Get(const nsAString& aName, nsString& aValue) const +{ + size_t id; + if (!mVariableIDs.Get(aName, &id)) { + return false; + } + aValue = mVariables[id].mValue; + return true; +} + +bool +CSSVariableValues::Get(const nsAString& aName, + nsString& aValue, + nsCSSTokenSerializationType& aFirstToken, + nsCSSTokenSerializationType& aLastToken) const +{ + size_t id; + if (!mVariableIDs.Get(aName, &id)) { + return false; + } + aValue = mVariables[id].mValue; + aFirstToken = mVariables[id].mFirstToken; + aLastToken = mVariables[id].mLastToken; + return true; +} + +void +CSSVariableValues::GetVariableAt(size_t aIndex, nsAString& aName) const +{ + aName = mVariables[aIndex].mVariableName; +} + +void +CSSVariableValues::Put(const nsAString& aName, + nsString aValue, + nsCSSTokenSerializationType aFirstToken, + nsCSSTokenSerializationType aLastToken) +{ + size_t id; + if (mVariableIDs.Get(aName, &id)) { + mVariables[id].mValue = aValue; + mVariables[id].mFirstToken = aFirstToken; + mVariables[id].mLastToken = aLastToken; + } else { + id = mVariables.Length(); + mVariableIDs.Put(aName, id); + mVariables.AppendElement(Variable(aName, aValue, aFirstToken, aLastToken)); + } +} + +void +CSSVariableValues::CopyVariablesFrom(const CSSVariableValues& aOther) +{ + for (size_t i = 0, n = aOther.mVariables.Length(); i < n; i++) { + Put(aOther.mVariables[i].mVariableName, + aOther.mVariables[i].mValue, + aOther.mVariables[i].mFirstToken, + aOther.mVariables[i].mLastToken); + } +} + +void +CSSVariableValues::AddVariablesToResolver(CSSVariableResolver* aResolver) const +{ + for (size_t i = 0, n = mVariables.Length(); i < n; i++) { + aResolver->Put(mVariables[i].mVariableName, + mVariables[i].mValue, + mVariables[i].mFirstToken, + mVariables[i].mLastToken, + true); + } +} + +} // namespace mozilla |