michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: /* computed CSS Variable values */ michael@0: michael@0: #include "CSSVariableValues.h" michael@0: michael@0: #include "CSSVariableResolver.h" michael@0: michael@0: namespace mozilla { michael@0: michael@0: CSSVariableValues::CSSVariableValues() michael@0: { michael@0: MOZ_COUNT_CTOR(CSSVariableValues); michael@0: } michael@0: michael@0: CSSVariableValues::CSSVariableValues(const CSSVariableValues& aOther) michael@0: { michael@0: MOZ_COUNT_CTOR(CSSVariableValues); michael@0: CopyVariablesFrom(aOther); michael@0: } michael@0: michael@0: #ifdef DEBUG michael@0: CSSVariableValues::~CSSVariableValues() michael@0: { michael@0: MOZ_COUNT_DTOR(CSSVariableValues); michael@0: } michael@0: #endif michael@0: michael@0: CSSVariableValues& michael@0: CSSVariableValues::operator=(const CSSVariableValues& aOther) michael@0: { michael@0: if (this == &aOther) { michael@0: return *this; michael@0: } michael@0: michael@0: mVariableIDs.Clear(); michael@0: mVariables.Clear(); michael@0: CopyVariablesFrom(aOther); michael@0: return *this; michael@0: } michael@0: michael@0: bool michael@0: CSSVariableValues::operator==(const CSSVariableValues& aOther) const michael@0: { michael@0: if (mVariables.Length() != aOther.mVariables.Length()) { michael@0: return false; michael@0: } michael@0: michael@0: for (size_t thisIndex = 0; thisIndex < mVariables.Length(); ++thisIndex) { michael@0: size_t otherIndex; michael@0: if (!aOther.mVariableIDs.Get(mVariables[thisIndex].mVariableName, michael@0: &otherIndex)) { michael@0: return false; michael@0: } michael@0: const nsString& otherValue = aOther.mVariables[otherIndex].mValue; michael@0: if (!mVariables[thisIndex].mValue.Equals(otherValue)) { michael@0: return false; michael@0: } michael@0: } michael@0: michael@0: return true; michael@0: } michael@0: michael@0: size_t michael@0: CSSVariableValues::Count() const michael@0: { michael@0: return mVariables.Length(); michael@0: } michael@0: michael@0: bool michael@0: CSSVariableValues::Get(const nsAString& aName, nsString& aValue) const michael@0: { michael@0: size_t id; michael@0: if (!mVariableIDs.Get(aName, &id)) { michael@0: return false; michael@0: } michael@0: aValue = mVariables[id].mValue; michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: CSSVariableValues::Get(const nsAString& aName, michael@0: nsString& aValue, michael@0: nsCSSTokenSerializationType& aFirstToken, michael@0: nsCSSTokenSerializationType& aLastToken) const michael@0: { michael@0: size_t id; michael@0: if (!mVariableIDs.Get(aName, &id)) { michael@0: return false; michael@0: } michael@0: aValue = mVariables[id].mValue; michael@0: aFirstToken = mVariables[id].mFirstToken; michael@0: aLastToken = mVariables[id].mLastToken; michael@0: return true; michael@0: } michael@0: michael@0: void michael@0: CSSVariableValues::GetVariableAt(size_t aIndex, nsAString& aName) const michael@0: { michael@0: aName = mVariables[aIndex].mVariableName; michael@0: } michael@0: michael@0: void michael@0: CSSVariableValues::Put(const nsAString& aName, michael@0: nsString aValue, michael@0: nsCSSTokenSerializationType aFirstToken, michael@0: nsCSSTokenSerializationType aLastToken) michael@0: { michael@0: size_t id; michael@0: if (mVariableIDs.Get(aName, &id)) { michael@0: mVariables[id].mValue = aValue; michael@0: mVariables[id].mFirstToken = aFirstToken; michael@0: mVariables[id].mLastToken = aLastToken; michael@0: } else { michael@0: id = mVariables.Length(); michael@0: mVariableIDs.Put(aName, id); michael@0: mVariables.AppendElement(Variable(aName, aValue, aFirstToken, aLastToken)); michael@0: } michael@0: } michael@0: michael@0: void michael@0: CSSVariableValues::CopyVariablesFrom(const CSSVariableValues& aOther) michael@0: { michael@0: for (size_t i = 0, n = aOther.mVariables.Length(); i < n; i++) { michael@0: Put(aOther.mVariables[i].mVariableName, michael@0: aOther.mVariables[i].mValue, michael@0: aOther.mVariables[i].mFirstToken, michael@0: aOther.mVariables[i].mLastToken); michael@0: } michael@0: } michael@0: michael@0: void michael@0: CSSVariableValues::AddVariablesToResolver(CSSVariableResolver* aResolver) const michael@0: { michael@0: for (size_t i = 0, n = mVariables.Length(); i < n; i++) { michael@0: aResolver->Put(mVariables[i].mVariableName, michael@0: mVariables[i].mValue, michael@0: mVariables[i].mFirstToken, michael@0: mVariables[i].mLastToken, michael@0: true); michael@0: } michael@0: } michael@0: michael@0: } // namespace mozilla