1 /* vim: set shiftwidth=2 tabstop=8 autoindent cindent expandtab: */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 /* CSS Custom Property assignments for a Declaration at a given priority */
7 
8 #ifndef mozilla_CSSVariableDeclarations_h
9 #define mozilla_CSSVariableDeclarations_h
10 
11 #include "nsDataHashtable.h"
12 
13 namespace mozilla {
14 class CSSVariableResolver;
15 } // namespace mozilla
16 struct nsRuleData;
17 
18 namespace mozilla {
19 
20 class CSSVariableDeclarations
21 {
22 public:
23   CSSVariableDeclarations();
24   CSSVariableDeclarations(const CSSVariableDeclarations& aOther);
25 #ifdef DEBUG
26   ~CSSVariableDeclarations();
27 #endif
28   CSSVariableDeclarations& operator=(const CSSVariableDeclarations& aOther);
29 
30   /**
31    * Returns whether this set of variable declarations includes a variable
32    * with a given name.
33    *
34    * @param aName The variable name (not including any "--" prefix that would
35    *   be part of the custom property name).
36    */
37   bool Has(const nsAString& aName) const;
38 
39   /**
40    * Represents the type of a variable value.
41    */
42   enum Type {
43     eTokenStream,  // a stream of CSS tokens (the usual type for variables)
44     eInitial,      // 'initial'
45     eInherit,      // 'inherit'
46     eUnset         // 'unset'
47   };
48 
49   /**
50    * Gets the value of a variable in this set of variable declarations.
51    *
52    * @param aName The variable name (not including any "--" prefix that would
53    *   be part of the custom property name).
54    * @param aType Out parameter into which the type of the variable value will
55    *   be stored.
56    * @param aValue Out parameter into which the value of the variable will
57    *   be stored.  If the variable is 'initial', 'inherit' or 'unset', this will
58    *   be the empty string.
59    * @return Whether a variable with the given name was found.  When false
60    *   is returned, aType and aValue will not be modified.
61    */
62   bool Get(const nsAString& aName, Type& aType, nsString& aValue) const;
63 
64   /**
65    * Adds or modifies an existing entry in this set of variable declarations
66    * to have the value 'initial'.
67    *
68    * @param aName The variable name (not including any "--" prefix that would
69    *   be part of the custom property name) whose value is to be set.
70    */
71   void PutInitial(const nsAString& aName);
72 
73   /**
74    * Adds or modifies an existing entry in this set of variable declarations
75    * to have the value 'inherit'.
76    *
77    * @param aName The variable name (not including any "--" prefix that would
78    *   be part of the custom property name) whose value is to be set.
79    */
80   void PutInherit(const nsAString& aName);
81 
82   /**
83    * Adds or modifies an existing entry in this set of variable declarations
84    * to have the value 'unset'.
85    *
86    * @param aName The variable name (not including any "--" prefix that would
87    *   be part of the custom property name) whose value is to be set.
88    */
89   void PutUnset(const nsAString& aName);
90 
91   /**
92    * Adds or modifies an existing entry in this set of variable declarations
93    * to have a token stream value.
94    *
95    * @param aName The variable name (not including any "--" prefix that would
96    *   be part of the custom property name) whose value is to be set.
97    * @param aTokenStream The CSS token stream.
98    */
99   void PutTokenStream(const nsAString& aName, const nsString& aTokenStream);
100 
101   /**
102    * Removes an entry in this set of variable declarations.
103    *
104    * @param aName The variable name (not including any "--" prefix that would
105    *   be part of the custom property name) whose entry is to be removed.
106    */
107   void Remove(const nsAString& aName);
108 
109   /**
110    * Returns the number of entries in this set of variable declarations.
111    */
Count()112   uint32_t Count() const { return mVariables.Count(); }
113 
114   /**
115    * Copies each variable value from this object into aRuleData, unless that
116    * variable already exists on aRuleData.
117    */
118   void MapRuleInfoInto(nsRuleData* aRuleData);
119 
120   /**
121    * Copies the variables from this object into aResolver, marking them as
122    * specified values.
123    */
124   void AddVariablesToResolver(CSSVariableResolver* aResolver) const;
125 
126   size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
127 
128 private:
129   /**
130    * Adds all the variable declarations from aOther into this object.
131    */
132   void CopyVariablesFrom(const CSSVariableDeclarations& aOther);
133 
134   nsDataHashtable<nsStringHashKey, nsString> mVariables;
135 };
136 
137 } // namespace mozilla
138 
139 #endif
140