layout/style/CSSVariableDeclarations.cpp

Wed, 31 Dec 2014 13:27:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 13:27:57 +0100
branch
TOR_BUG_3246
changeset 6
8bccb770b82d
permissions
-rw-r--r--

Ignore runtime configuration files generated during quality assurance.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     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/. */
     6 /* CSS Custom Property assignments for a Declaration at a given priority */
     8 #include "CSSVariableDeclarations.h"
    10 #include "CSSVariableResolver.h"
    11 #include "nsCSSScanner.h"
    12 #include "nsRuleData.h"
    14 // These three special string values are used to represent specified values of
    15 // 'initial', 'inherit' and 'unset'.  (Note that none of these are valid
    16 // variable values.)
    17 #define INITIAL_VALUE "!"
    18 #define INHERIT_VALUE ";"
    19 #define UNSET_VALUE   ")"
    21 namespace mozilla {
    23 CSSVariableDeclarations::CSSVariableDeclarations()
    24 {
    25   MOZ_COUNT_CTOR(CSSVariableDeclarations);
    26 }
    28 CSSVariableDeclarations::CSSVariableDeclarations(const CSSVariableDeclarations& aOther)
    29 {
    30   MOZ_COUNT_CTOR(CSSVariableDeclarations);
    31   CopyVariablesFrom(aOther);
    32 }
    34 #ifdef DEBUG
    35 CSSVariableDeclarations::~CSSVariableDeclarations()
    36 {
    37   MOZ_COUNT_DTOR(CSSVariableDeclarations);
    38 }
    39 #endif
    41 CSSVariableDeclarations&
    42 CSSVariableDeclarations::operator=(const CSSVariableDeclarations& aOther)
    43 {
    44   if (this == &aOther) {
    45     return *this;
    46   }
    48   mVariables.Clear();
    49   CopyVariablesFrom(aOther);
    50   return *this;
    51 }
    53 /* static */ PLDHashOperator
    54 CSSVariableDeclarations::EnumerateVariableForCopy(const nsAString& aName,
    55                                                   nsString aValue,
    56                                                   void* aData)
    57 {
    58   CSSVariableDeclarations* variables = static_cast<CSSVariableDeclarations*>(aData);
    59   variables->mVariables.Put(aName, aValue);
    60   return PL_DHASH_NEXT;
    61 }
    63 void
    64 CSSVariableDeclarations::CopyVariablesFrom(const CSSVariableDeclarations& aOther)
    65 {
    66   aOther.mVariables.EnumerateRead(EnumerateVariableForCopy, this);
    67 }
    69 bool
    70 CSSVariableDeclarations::Has(const nsAString& aName) const
    71 {
    72   nsString value;
    73   return mVariables.Get(aName, &value);
    74 }
    76 bool
    77 CSSVariableDeclarations::Get(const nsAString& aName,
    78                              Type& aType,
    79                              nsString& aTokenStream) const
    80 {
    81   nsString value;
    82   if (!mVariables.Get(aName, &value)) {
    83     return false;
    84   }
    85   if (value.EqualsLiteral(INITIAL_VALUE)) {
    86     aType = eInitial;
    87     aTokenStream.Truncate();
    88   } else if (value.EqualsLiteral(INHERIT_VALUE)) {
    89     aType = eInitial;
    90     aTokenStream.Truncate();
    91   } else if (value.EqualsLiteral(UNSET_VALUE)) {
    92     aType = eUnset;
    93     aTokenStream.Truncate();
    94   } else {
    95     aType = eTokenStream;
    96     aTokenStream = value;
    97   }
    98   return true;
    99 }
   101 void
   102 CSSVariableDeclarations::PutTokenStream(const nsAString& aName,
   103                                         const nsString& aTokenStream)
   104 {
   105   MOZ_ASSERT(!aTokenStream.EqualsLiteral(INITIAL_VALUE) &&
   106              !aTokenStream.EqualsLiteral(INHERIT_VALUE) &&
   107              !aTokenStream.EqualsLiteral(UNSET_VALUE));
   108   mVariables.Put(aName, aTokenStream);
   109 }
   111 void
   112 CSSVariableDeclarations::PutInitial(const nsAString& aName)
   113 {
   114   mVariables.Put(aName, NS_LITERAL_STRING(INITIAL_VALUE));
   115 }
   117 void
   118 CSSVariableDeclarations::PutInherit(const nsAString& aName)
   119 {
   120   mVariables.Put(aName, NS_LITERAL_STRING(INHERIT_VALUE));
   121 }
   123 void
   124 CSSVariableDeclarations::PutUnset(const nsAString& aName)
   125 {
   126   mVariables.Put(aName, NS_LITERAL_STRING(UNSET_VALUE));
   127 }
   129 void
   130 CSSVariableDeclarations::Remove(const nsAString& aName)
   131 {
   132   mVariables.Remove(aName);
   133 }
   135 /* static */ PLDHashOperator
   136 CSSVariableDeclarations::EnumerateVariableForMapRuleInfoInto(
   137                                                          const nsAString& aName,
   138                                                          nsString aValue,
   139                                                          void* aData)
   140 {
   141   nsDataHashtable<nsStringHashKey, nsString>* variables =
   142     static_cast<nsDataHashtable<nsStringHashKey, nsString>*>(aData);
   143   if (!variables->Contains(aName)) {
   144     variables->Put(aName, aValue);
   145   }
   146   return PL_DHASH_NEXT;
   147 }
   149 void
   150 CSSVariableDeclarations::MapRuleInfoInto(nsRuleData* aRuleData)
   151 {
   152   if (!(aRuleData->mSIDs & NS_STYLE_INHERIT_BIT(Variables))) {
   153     return;
   154   }
   156   if (!aRuleData->mVariables) {
   157     aRuleData->mVariables = new CSSVariableDeclarations(*this);
   158   } else {
   159     mVariables.EnumerateRead(EnumerateVariableForMapRuleInfoInto,
   160                              aRuleData->mVariables.get());
   161   }
   162 }
   164 /* static */ PLDHashOperator
   165 CSSVariableDeclarations::EnumerateVariableForAddVariablesToResolver(
   166                                                          const nsAString& aName,
   167                                                          nsString aValue,
   168                                                          void* aData)
   169 {
   170   CSSVariableResolver* resolver = static_cast<CSSVariableResolver*>(aData);
   171   if (aValue.EqualsLiteral(INITIAL_VALUE)) {
   172     // Values of 'initial' are treated the same as an invalid value in the
   173     // variable resolver.
   174     resolver->Put(aName, EmptyString(),
   175                   eCSSTokenSerialization_Nothing,
   176                   eCSSTokenSerialization_Nothing,
   177                   false);
   178   } else if (aValue.EqualsLiteral(INHERIT_VALUE) ||
   179              aValue.EqualsLiteral(UNSET_VALUE)) {
   180     // Values of 'inherit' and 'unset' don't need any handling, since it means
   181     // we just need to keep whatever value is currently in the resolver.
   182     // Values of 'inherit' and 'unset' don't need any handling, since it means
   183     // we just need to keep whatever value is currently in the resolver.  This
   184     // is because the specified variable declarations already have only the
   185     // winning declaration for the variable and no longer have any of the
   186     // others.
   187   } else {
   188     // At this point, we don't know what token types are at the start and end
   189     // of the specified variable value.  These will be determined later during
   190     // the resolving process.
   191     resolver->Put(aName, aValue,
   192                   eCSSTokenSerialization_Nothing,
   193                   eCSSTokenSerialization_Nothing,
   194                   false);
   195   }
   196   return PL_DHASH_NEXT;
   197 }
   199 void
   200 CSSVariableDeclarations::AddVariablesToResolver(
   201                                            CSSVariableResolver* aResolver) const
   202 {
   203   mVariables.EnumerateRead(EnumerateVariableForAddVariablesToResolver,
   204                            aResolver);
   205 }
   207 static size_t
   208 SizeOfTableEntry(const nsAString& aKey,
   209                  const nsString& aValue,
   210                  MallocSizeOf aMallocSizeOf,
   211                  void* aUserArg)
   212 {
   213   size_t n = 0;
   214   n += aKey.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
   215   n += aValue.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
   216   return n;
   217 }
   219 size_t
   220 CSSVariableDeclarations::SizeOfIncludingThis(
   221                                       mozilla::MallocSizeOf aMallocSizeOf) const
   222 {
   223   size_t n = aMallocSizeOf(this);
   224   n += mVariables.SizeOfExcludingThis(SizeOfTableEntry, aMallocSizeOf);
   225   return n;
   226 }
   228 } // namespace mozilla

mercurial