Bug 773296 - Part 2: Parse CSS variable declarations and store them on Declaration objects. p=ebassi,heycam r=dbaron
Patch co-authored by Emmanuele Bassi <ebassi@gmail.com>
This defines a CSSVariableDeclarations class that holds a set of
variable declarations. This is at the specified value stage, so values
can either be 'initial', 'inherit' or a token stream (which is what you
normally have). The variables are stored in a hash table. Although
it's a bit of a hack, we store 'initial' and 'inherit' using special
string values that can't be valid token streams (we use "!" and ";").
Declaration objects now can have two CSSVariableDeclarations objects
on them, to store normal and !important variable declarations. So that
we keep preserving the order of declarations on the object, we inflate
mOrder to store uint32_ts, where values from eCSSProperty_COUNT onwards
represent custom properties. mVariableOrder stores the names of the
variables corresponding to those entries in mOrder.
We also add a new nsCSSProperty value, eCSSPropertyExtra_variable, which
is used to represent any custom property name.
nsCSSProps::LookupProperty can return this value.
The changes to nsCSSParser are straightforward. Custom properties
are parsed and checked for syntactic validity (e.g. "var(a,)" being
invalid) and stored on the Declaration. We use nsCSSScanner's
recording ability to grab the unparsed CSS string corresponding to
the variable's value.
2013-12-12 02:09:40 +00:00
|
|
|
/* -*- 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/. */
|
|
|
|
|
2013-12-12 02:09:41 +00:00
|
|
|
/* CSS Custom Property assignments for a Declaration at a given priority */
|
|
|
|
|
Bug 773296 - Part 2: Parse CSS variable declarations and store them on Declaration objects. p=ebassi,heycam r=dbaron
Patch co-authored by Emmanuele Bassi <ebassi@gmail.com>
This defines a CSSVariableDeclarations class that holds a set of
variable declarations. This is at the specified value stage, so values
can either be 'initial', 'inherit' or a token stream (which is what you
normally have). The variables are stored in a hash table. Although
it's a bit of a hack, we store 'initial' and 'inherit' using special
string values that can't be valid token streams (we use "!" and ";").
Declaration objects now can have two CSSVariableDeclarations objects
on them, to store normal and !important variable declarations. So that
we keep preserving the order of declarations on the object, we inflate
mOrder to store uint32_ts, where values from eCSSProperty_COUNT onwards
represent custom properties. mVariableOrder stores the names of the
variables corresponding to those entries in mOrder.
We also add a new nsCSSProperty value, eCSSPropertyExtra_variable, which
is used to represent any custom property name.
nsCSSProps::LookupProperty can return this value.
The changes to nsCSSParser are straightforward. Custom properties
are parsed and checked for syntactic validity (e.g. "var(a,)" being
invalid) and stored on the Declaration. We use nsCSSScanner's
recording ability to grab the unparsed CSS string corresponding to
the variable's value.
2013-12-12 02:09:40 +00:00
|
|
|
#include "CSSVariableDeclarations.h"
|
|
|
|
|
2013-12-12 02:09:41 +00:00
|
|
|
#include "CSSVariableResolver.h"
|
|
|
|
#include "nsCSSScanner.h"
|
2013-12-12 02:09:41 +00:00
|
|
|
#include "nsRuleData.h"
|
|
|
|
|
2013-12-12 02:09:47 +00:00
|
|
|
// These three special string values are used to represent specified values of
|
|
|
|
// 'initial', 'inherit' and 'unset'. (Note that none of these are valid
|
|
|
|
// variable values.)
|
Bug 773296 - Part 2: Parse CSS variable declarations and store them on Declaration objects. p=ebassi,heycam r=dbaron
Patch co-authored by Emmanuele Bassi <ebassi@gmail.com>
This defines a CSSVariableDeclarations class that holds a set of
variable declarations. This is at the specified value stage, so values
can either be 'initial', 'inherit' or a token stream (which is what you
normally have). The variables are stored in a hash table. Although
it's a bit of a hack, we store 'initial' and 'inherit' using special
string values that can't be valid token streams (we use "!" and ";").
Declaration objects now can have two CSSVariableDeclarations objects
on them, to store normal and !important variable declarations. So that
we keep preserving the order of declarations on the object, we inflate
mOrder to store uint32_ts, where values from eCSSProperty_COUNT onwards
represent custom properties. mVariableOrder stores the names of the
variables corresponding to those entries in mOrder.
We also add a new nsCSSProperty value, eCSSPropertyExtra_variable, which
is used to represent any custom property name.
nsCSSProps::LookupProperty can return this value.
The changes to nsCSSParser are straightforward. Custom properties
are parsed and checked for syntactic validity (e.g. "var(a,)" being
invalid) and stored on the Declaration. We use nsCSSScanner's
recording ability to grab the unparsed CSS string corresponding to
the variable's value.
2013-12-12 02:09:40 +00:00
|
|
|
#define INITIAL_VALUE "!"
|
|
|
|
#define INHERIT_VALUE ";"
|
2013-12-12 02:09:47 +00:00
|
|
|
#define UNSET_VALUE ")"
|
Bug 773296 - Part 2: Parse CSS variable declarations and store them on Declaration objects. p=ebassi,heycam r=dbaron
Patch co-authored by Emmanuele Bassi <ebassi@gmail.com>
This defines a CSSVariableDeclarations class that holds a set of
variable declarations. This is at the specified value stage, so values
can either be 'initial', 'inherit' or a token stream (which is what you
normally have). The variables are stored in a hash table. Although
it's a bit of a hack, we store 'initial' and 'inherit' using special
string values that can't be valid token streams (we use "!" and ";").
Declaration objects now can have two CSSVariableDeclarations objects
on them, to store normal and !important variable declarations. So that
we keep preserving the order of declarations on the object, we inflate
mOrder to store uint32_ts, where values from eCSSProperty_COUNT onwards
represent custom properties. mVariableOrder stores the names of the
variables corresponding to those entries in mOrder.
We also add a new nsCSSProperty value, eCSSPropertyExtra_variable, which
is used to represent any custom property name.
nsCSSProps::LookupProperty can return this value.
The changes to nsCSSParser are straightforward. Custom properties
are parsed and checked for syntactic validity (e.g. "var(a,)" being
invalid) and stored on the Declaration. We use nsCSSScanner's
recording ability to grab the unparsed CSS string corresponding to
the variable's value.
2013-12-12 02:09:40 +00:00
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
|
|
|
|
CSSVariableDeclarations::CSSVariableDeclarations()
|
|
|
|
{
|
|
|
|
MOZ_COUNT_CTOR(CSSVariableDeclarations);
|
|
|
|
}
|
|
|
|
|
|
|
|
CSSVariableDeclarations::CSSVariableDeclarations(const CSSVariableDeclarations& aOther)
|
|
|
|
{
|
|
|
|
MOZ_COUNT_CTOR(CSSVariableDeclarations);
|
|
|
|
CopyVariablesFrom(aOther);
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
CSSVariableDeclarations::~CSSVariableDeclarations()
|
|
|
|
{
|
|
|
|
MOZ_COUNT_DTOR(CSSVariableDeclarations);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
CSSVariableDeclarations&
|
|
|
|
CSSVariableDeclarations::operator=(const CSSVariableDeclarations& aOther)
|
|
|
|
{
|
2013-12-12 02:09:41 +00:00
|
|
|
if (this == &aOther) {
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
Bug 773296 - Part 2: Parse CSS variable declarations and store them on Declaration objects. p=ebassi,heycam r=dbaron
Patch co-authored by Emmanuele Bassi <ebassi@gmail.com>
This defines a CSSVariableDeclarations class that holds a set of
variable declarations. This is at the specified value stage, so values
can either be 'initial', 'inherit' or a token stream (which is what you
normally have). The variables are stored in a hash table. Although
it's a bit of a hack, we store 'initial' and 'inherit' using special
string values that can't be valid token streams (we use "!" and ";").
Declaration objects now can have two CSSVariableDeclarations objects
on them, to store normal and !important variable declarations. So that
we keep preserving the order of declarations on the object, we inflate
mOrder to store uint32_ts, where values from eCSSProperty_COUNT onwards
represent custom properties. mVariableOrder stores the names of the
variables corresponding to those entries in mOrder.
We also add a new nsCSSProperty value, eCSSPropertyExtra_variable, which
is used to represent any custom property name.
nsCSSProps::LookupProperty can return this value.
The changes to nsCSSParser are straightforward. Custom properties
are parsed and checked for syntactic validity (e.g. "var(a,)" being
invalid) and stored on the Declaration. We use nsCSSScanner's
recording ability to grab the unparsed CSS string corresponding to
the variable's value.
2013-12-12 02:09:40 +00:00
|
|
|
mVariables.Clear();
|
|
|
|
CopyVariablesFrom(aOther);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* static */ PLDHashOperator
|
|
|
|
CSSVariableDeclarations::EnumerateVariableForCopy(const nsAString& aName,
|
|
|
|
nsString aValue,
|
|
|
|
void* aData)
|
|
|
|
{
|
|
|
|
CSSVariableDeclarations* variables = static_cast<CSSVariableDeclarations*>(aData);
|
|
|
|
variables->mVariables.Put(aName, aValue);
|
|
|
|
return PL_DHASH_NEXT;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CSSVariableDeclarations::CopyVariablesFrom(const CSSVariableDeclarations& aOther)
|
|
|
|
{
|
|
|
|
aOther.mVariables.EnumerateRead(EnumerateVariableForCopy, this);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CSSVariableDeclarations::Has(const nsAString& aName) const
|
|
|
|
{
|
|
|
|
nsString value;
|
|
|
|
return mVariables.Get(aName, &value);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CSSVariableDeclarations::Get(const nsAString& aName,
|
|
|
|
Type& aType,
|
|
|
|
nsString& aTokenStream) const
|
|
|
|
{
|
|
|
|
nsString value;
|
|
|
|
if (!mVariables.Get(aName, &value)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (value.EqualsLiteral(INITIAL_VALUE)) {
|
|
|
|
aType = eInitial;
|
|
|
|
aTokenStream.Truncate();
|
|
|
|
} else if (value.EqualsLiteral(INHERIT_VALUE)) {
|
|
|
|
aType = eInitial;
|
|
|
|
aTokenStream.Truncate();
|
2013-12-12 02:09:47 +00:00
|
|
|
} else if (value.EqualsLiteral(UNSET_VALUE)) {
|
|
|
|
aType = eUnset;
|
|
|
|
aTokenStream.Truncate();
|
Bug 773296 - Part 2: Parse CSS variable declarations and store them on Declaration objects. p=ebassi,heycam r=dbaron
Patch co-authored by Emmanuele Bassi <ebassi@gmail.com>
This defines a CSSVariableDeclarations class that holds a set of
variable declarations. This is at the specified value stage, so values
can either be 'initial', 'inherit' or a token stream (which is what you
normally have). The variables are stored in a hash table. Although
it's a bit of a hack, we store 'initial' and 'inherit' using special
string values that can't be valid token streams (we use "!" and ";").
Declaration objects now can have two CSSVariableDeclarations objects
on them, to store normal and !important variable declarations. So that
we keep preserving the order of declarations on the object, we inflate
mOrder to store uint32_ts, where values from eCSSProperty_COUNT onwards
represent custom properties. mVariableOrder stores the names of the
variables corresponding to those entries in mOrder.
We also add a new nsCSSProperty value, eCSSPropertyExtra_variable, which
is used to represent any custom property name.
nsCSSProps::LookupProperty can return this value.
The changes to nsCSSParser are straightforward. Custom properties
are parsed and checked for syntactic validity (e.g. "var(a,)" being
invalid) and stored on the Declaration. We use nsCSSScanner's
recording ability to grab the unparsed CSS string corresponding to
the variable's value.
2013-12-12 02:09:40 +00:00
|
|
|
} else {
|
|
|
|
aType = eTokenStream;
|
|
|
|
aTokenStream = value;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CSSVariableDeclarations::PutTokenStream(const nsAString& aName,
|
|
|
|
const nsString& aTokenStream)
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(!aTokenStream.EqualsLiteral(INITIAL_VALUE) &&
|
2013-12-12 02:09:47 +00:00
|
|
|
!aTokenStream.EqualsLiteral(INHERIT_VALUE) &&
|
|
|
|
!aTokenStream.EqualsLiteral(UNSET_VALUE));
|
Bug 773296 - Part 2: Parse CSS variable declarations and store them on Declaration objects. p=ebassi,heycam r=dbaron
Patch co-authored by Emmanuele Bassi <ebassi@gmail.com>
This defines a CSSVariableDeclarations class that holds a set of
variable declarations. This is at the specified value stage, so values
can either be 'initial', 'inherit' or a token stream (which is what you
normally have). The variables are stored in a hash table. Although
it's a bit of a hack, we store 'initial' and 'inherit' using special
string values that can't be valid token streams (we use "!" and ";").
Declaration objects now can have two CSSVariableDeclarations objects
on them, to store normal and !important variable declarations. So that
we keep preserving the order of declarations on the object, we inflate
mOrder to store uint32_ts, where values from eCSSProperty_COUNT onwards
represent custom properties. mVariableOrder stores the names of the
variables corresponding to those entries in mOrder.
We also add a new nsCSSProperty value, eCSSPropertyExtra_variable, which
is used to represent any custom property name.
nsCSSProps::LookupProperty can return this value.
The changes to nsCSSParser are straightforward. Custom properties
are parsed and checked for syntactic validity (e.g. "var(a,)" being
invalid) and stored on the Declaration. We use nsCSSScanner's
recording ability to grab the unparsed CSS string corresponding to
the variable's value.
2013-12-12 02:09:40 +00:00
|
|
|
mVariables.Put(aName, aTokenStream);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CSSVariableDeclarations::PutInitial(const nsAString& aName)
|
|
|
|
{
|
|
|
|
mVariables.Put(aName, NS_LITERAL_STRING(INITIAL_VALUE));
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CSSVariableDeclarations::PutInherit(const nsAString& aName)
|
|
|
|
{
|
|
|
|
mVariables.Put(aName, NS_LITERAL_STRING(INHERIT_VALUE));
|
|
|
|
}
|
|
|
|
|
2013-12-12 02:09:47 +00:00
|
|
|
void
|
|
|
|
CSSVariableDeclarations::PutUnset(const nsAString& aName)
|
|
|
|
{
|
|
|
|
mVariables.Put(aName, NS_LITERAL_STRING(UNSET_VALUE));
|
|
|
|
}
|
|
|
|
|
Bug 773296 - Part 2: Parse CSS variable declarations and store them on Declaration objects. p=ebassi,heycam r=dbaron
Patch co-authored by Emmanuele Bassi <ebassi@gmail.com>
This defines a CSSVariableDeclarations class that holds a set of
variable declarations. This is at the specified value stage, so values
can either be 'initial', 'inherit' or a token stream (which is what you
normally have). The variables are stored in a hash table. Although
it's a bit of a hack, we store 'initial' and 'inherit' using special
string values that can't be valid token streams (we use "!" and ";").
Declaration objects now can have two CSSVariableDeclarations objects
on them, to store normal and !important variable declarations. So that
we keep preserving the order of declarations on the object, we inflate
mOrder to store uint32_ts, where values from eCSSProperty_COUNT onwards
represent custom properties. mVariableOrder stores the names of the
variables corresponding to those entries in mOrder.
We also add a new nsCSSProperty value, eCSSPropertyExtra_variable, which
is used to represent any custom property name.
nsCSSProps::LookupProperty can return this value.
The changes to nsCSSParser are straightforward. Custom properties
are parsed and checked for syntactic validity (e.g. "var(a,)" being
invalid) and stored on the Declaration. We use nsCSSScanner's
recording ability to grab the unparsed CSS string corresponding to
the variable's value.
2013-12-12 02:09:40 +00:00
|
|
|
void
|
|
|
|
CSSVariableDeclarations::Remove(const nsAString& aName)
|
|
|
|
{
|
|
|
|
mVariables.Remove(aName);
|
|
|
|
}
|
|
|
|
|
2013-12-12 02:09:41 +00:00
|
|
|
/* static */ PLDHashOperator
|
|
|
|
CSSVariableDeclarations::EnumerateVariableForMapRuleInfoInto(
|
|
|
|
const nsAString& aName,
|
|
|
|
nsString aValue,
|
|
|
|
void* aData)
|
|
|
|
{
|
|
|
|
nsDataHashtable<nsStringHashKey, nsString>* variables =
|
|
|
|
static_cast<nsDataHashtable<nsStringHashKey, nsString>*>(aData);
|
|
|
|
if (!variables->Contains(aName)) {
|
|
|
|
variables->Put(aName, aValue);
|
|
|
|
}
|
|
|
|
return PL_DHASH_NEXT;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CSSVariableDeclarations::MapRuleInfoInto(nsRuleData* aRuleData)
|
|
|
|
{
|
|
|
|
if (!(aRuleData->mSIDs & NS_STYLE_INHERIT_BIT(Variables))) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!aRuleData->mVariables) {
|
|
|
|
aRuleData->mVariables = new CSSVariableDeclarations(*this);
|
|
|
|
} else {
|
|
|
|
mVariables.EnumerateRead(EnumerateVariableForMapRuleInfoInto,
|
|
|
|
aRuleData->mVariables.get());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-12-12 02:09:41 +00:00
|
|
|
/* static */ PLDHashOperator
|
|
|
|
CSSVariableDeclarations::EnumerateVariableForAddVariablesToResolver(
|
|
|
|
const nsAString& aName,
|
|
|
|
nsString aValue,
|
|
|
|
void* aData)
|
|
|
|
{
|
|
|
|
CSSVariableResolver* resolver = static_cast<CSSVariableResolver*>(aData);
|
|
|
|
if (aValue.EqualsLiteral(INITIAL_VALUE)) {
|
|
|
|
// Values of 'initial' are treated the same as an invalid value in the
|
|
|
|
// variable resolver.
|
|
|
|
resolver->Put(aName, EmptyString(),
|
|
|
|
eCSSTokenSerialization_Nothing,
|
|
|
|
eCSSTokenSerialization_Nothing,
|
|
|
|
false);
|
2013-12-12 02:09:47 +00:00
|
|
|
} else if (aValue.EqualsLiteral(INHERIT_VALUE) ||
|
|
|
|
aValue.EqualsLiteral(UNSET_VALUE)) {
|
|
|
|
// Values of 'inherit' and 'unset' don't need any handling, since it means
|
|
|
|
// we just need to keep whatever value is currently in the resolver.
|
|
|
|
// Values of 'inherit' and 'unset' don't need any handling, since it means
|
|
|
|
// we just need to keep whatever value is currently in the resolver. This
|
|
|
|
// is because the specified variable declarations already have only the
|
|
|
|
// winning declaration for the variable and no longer have any of the
|
|
|
|
// others.
|
2013-12-12 02:09:41 +00:00
|
|
|
} else {
|
|
|
|
// At this point, we don't know what token types are at the start and end
|
|
|
|
// of the specified variable value. These will be determined later during
|
|
|
|
// the resolving process.
|
|
|
|
resolver->Put(aName, aValue,
|
|
|
|
eCSSTokenSerialization_Nothing,
|
|
|
|
eCSSTokenSerialization_Nothing,
|
|
|
|
false);
|
|
|
|
}
|
|
|
|
return PL_DHASH_NEXT;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CSSVariableDeclarations::AddVariablesToResolver(
|
|
|
|
CSSVariableResolver* aResolver) const
|
|
|
|
{
|
|
|
|
mVariables.EnumerateRead(EnumerateVariableForAddVariablesToResolver,
|
|
|
|
aResolver);
|
|
|
|
}
|
|
|
|
|
Bug 773296 - Part 2: Parse CSS variable declarations and store them on Declaration objects. p=ebassi,heycam r=dbaron
Patch co-authored by Emmanuele Bassi <ebassi@gmail.com>
This defines a CSSVariableDeclarations class that holds a set of
variable declarations. This is at the specified value stage, so values
can either be 'initial', 'inherit' or a token stream (which is what you
normally have). The variables are stored in a hash table. Although
it's a bit of a hack, we store 'initial' and 'inherit' using special
string values that can't be valid token streams (we use "!" and ";").
Declaration objects now can have two CSSVariableDeclarations objects
on them, to store normal and !important variable declarations. So that
we keep preserving the order of declarations on the object, we inflate
mOrder to store uint32_ts, where values from eCSSProperty_COUNT onwards
represent custom properties. mVariableOrder stores the names of the
variables corresponding to those entries in mOrder.
We also add a new nsCSSProperty value, eCSSPropertyExtra_variable, which
is used to represent any custom property name.
nsCSSProps::LookupProperty can return this value.
The changes to nsCSSParser are straightforward. Custom properties
are parsed and checked for syntactic validity (e.g. "var(a,)" being
invalid) and stored on the Declaration. We use nsCSSScanner's
recording ability to grab the unparsed CSS string corresponding to
the variable's value.
2013-12-12 02:09:40 +00:00
|
|
|
static size_t
|
|
|
|
SizeOfTableEntry(const nsAString& aKey,
|
|
|
|
const nsString& aValue,
|
|
|
|
MallocSizeOf aMallocSizeOf,
|
|
|
|
void* aUserArg)
|
|
|
|
{
|
|
|
|
size_t n = 0;
|
|
|
|
n += aKey.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
|
|
|
|
n += aValue.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t
|
|
|
|
CSSVariableDeclarations::SizeOfIncludingThis(
|
|
|
|
mozilla::MallocSizeOf aMallocSizeOf) const
|
|
|
|
{
|
|
|
|
size_t n = aMallocSizeOf(this);
|
|
|
|
n += mVariables.SizeOfExcludingThis(SizeOfTableEntry, aMallocSizeOf);
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace mozilla
|