summaryrefslogtreecommitdiffstats
path: root/layout/style/CSSVariableValues.h
diff options
context:
space:
mode:
Diffstat (limited to 'layout/style/CSSVariableValues.h')
-rw-r--r--layout/style/CSSVariableValues.h147
1 files changed, 147 insertions, 0 deletions
diff --git a/layout/style/CSSVariableValues.h b/layout/style/CSSVariableValues.h
new file mode 100644
index 000000000..e26566be1
--- /dev/null
+++ b/layout/style/CSSVariableValues.h
@@ -0,0 +1,147 @@
+/* vim: set shiftwidth=2 tabstop=8 autoindent cindent expandtab: */
+/* 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 */
+
+#ifndef mozilla_CSSVariableValues_h
+#define mozilla_CSSVariableValues_h
+
+#include "nsCSSScanner.h"
+#include "nsDataHashtable.h"
+#include "nsTArray.h"
+
+namespace mozilla {
+
+class CSSVariableResolver;
+
+class CSSVariableValues
+{
+public:
+ CSSVariableValues();
+ CSSVariableValues(const CSSVariableValues& aOther);
+#ifdef DEBUG
+ ~CSSVariableValues();
+#endif
+ CSSVariableValues& operator=(const CSSVariableValues& aOther);
+
+ bool operator==(const CSSVariableValues& aOther) const;
+ bool operator!=(const CSSVariableValues& aOther) const
+ { return !(*this == aOther); }
+
+ /**
+ * Gets the value of a variable in this set of computed variables.
+ *
+ * @param aName The variable name (not including any "--" prefix that would
+ * be part of the custom property name).
+ * @param aValue Out parameter into which the value of the variable will
+ * be stored.
+ * @return Whether a variable with the given name was found. When false
+ * is returned, aValue will not be modified.
+ */
+ bool Get(const nsAString& aName, nsString& aValue) const;
+
+ /**
+ * Gets the value of a variable in this set of computed variables, along
+ * with information on the types of tokens that appear at the start and
+ * end of the token stream.
+ *
+ * @param aName The variable name (not including any "--" prefix that would
+ * be part of the custom property name).
+ * @param aValue Out parameter into which the value of the variable will
+ * be stored.
+ * @param aFirstToken The type of token at the start of the variable value.
+ * @param aLastToken The type of token at the en of the variable value.
+ * @return Whether a variable with the given name was found. When false
+ * is returned, aValue, aFirstToken and aLastToken will not be modified.
+ */
+ bool Get(const nsAString& aName,
+ nsString& aValue,
+ nsCSSTokenSerializationType& aFirstToken,
+ nsCSSTokenSerializationType& aLastToken) const;
+
+ /**
+ * Gets the name of the variable at the given index.
+ *
+ * Variables on this object are ordered, and that order is just determined
+ * based on the order that they are added to the object. A consistent
+ * ordering is required for CSSDeclaration objects in the DOM.
+ * CSSDeclarations expose property names as indexed properties, which need to
+ * be stable.
+ *
+ * @param aIndex The index of the variable to get.
+ * @param aName Out parameter into which the name of the variable will be
+ * stored.
+ */
+ void GetVariableAt(size_t aIndex, nsAString& aName) const;
+
+ /**
+ * Gets the number of variables stored on this object.
+ */
+ size_t Count() const;
+
+ /**
+ * Adds or modifies an existing entry in this set of variable values.
+ *
+ * @param aName The variable name (not including any "--" prefix that would
+ * be part of the custom property name) whose value is to be set.
+ * @param aValue The variable value.
+ * @param aFirstToken The type of token at the start of the variable value.
+ * @param aLastToken The type of token at the en of the variable value.
+ */
+ void Put(const nsAString& aName,
+ nsString aValue,
+ nsCSSTokenSerializationType aFirstToken,
+ nsCSSTokenSerializationType aLastToken);
+
+ /**
+ * Copies the variables from this object into aResolver, marking them as
+ * computed, inherited values.
+ */
+ void AddVariablesToResolver(CSSVariableResolver* aResolver) const;
+
+private:
+ struct Variable
+ {
+ Variable()
+ : mFirstToken(eCSSTokenSerialization_Nothing)
+ , mLastToken(eCSSTokenSerialization_Nothing)
+ {}
+
+ Variable(const nsAString& aVariableName,
+ nsString aValue,
+ nsCSSTokenSerializationType aFirstToken,
+ nsCSSTokenSerializationType aLastToken)
+ : mVariableName(aVariableName)
+ , mValue(aValue)
+ , mFirstToken(aFirstToken)
+ , mLastToken(aLastToken)
+ {}
+
+ nsString mVariableName;
+ nsString mValue;
+ nsCSSTokenSerializationType mFirstToken;
+ nsCSSTokenSerializationType mLastToken;
+ };
+
+ /**
+ * Adds all the variables from aOther into this object.
+ */
+ void CopyVariablesFrom(const CSSVariableValues& aOther);
+
+ /**
+ * Map of variable names to IDs. Variable IDs are indexes into
+ * mVariables.
+ */
+ nsDataHashtable<nsStringHashKey, size_t> mVariableIDs;
+
+ /**
+ * Array of variables, indexed by variable ID.
+ */
+ nsTArray<Variable> mVariables;
+};
+
+} // namespace mozilla
+
+#endif