Bug 1345804 part 2 - Add new AtomIdent unit to nsCSSValue. r?heycam
MozReview-Commit-ID: 4Qc3POvHrJg
--- a/layout/style/nsCSSValue.cpp
+++ b/layout/style/nsCSSValue.cpp
@@ -221,16 +221,20 @@ nsCSSValue::nsCSSValue(const nsCSSValue&
else if (eCSSUnit_GridTemplateAreas == mUnit) {
mValue.mGridTemplateAreas = aCopy.mValue.mGridTemplateAreas;
mValue.mGridTemplateAreas->AddRef();
}
else if (eCSSUnit_FontFamilyList == mUnit) {
mValue.mFontFamilyList = aCopy.mValue.mFontFamilyList;
mValue.mFontFamilyList->AddRef();
}
+ else if (eCSSUnit_AtomIdent == mUnit) {
+ mValue.mAtom = aCopy.mValue.mAtom;
+ mValue.mAtom->AddRef();
+ }
else {
MOZ_ASSERT(false, "unknown unit");
}
}
nsCSSValue& nsCSSValue::operator=(const nsCSSValue& aCopy)
{
if (this != &aCopy) {
@@ -316,16 +320,19 @@ bool nsCSSValue::operator==(const nsCSSV
aOther.mValue.mPairList);
}
else if (eCSSUnit_GridTemplateAreas == mUnit) {
return *mValue.mGridTemplateAreas == *aOther.mValue.mGridTemplateAreas;
}
else if (eCSSUnit_FontFamilyList == mUnit) {
return *mValue.mFontFamilyList == *aOther.mValue.mFontFamilyList;
}
+ else if (eCSSUnit_AtomIdent == mUnit) {
+ return mValue.mAtom == aOther.mValue.mAtom;
+ }
else {
return mValue.mFloat == aOther.mValue.mFloat;
}
}
return false;
}
double
@@ -448,16 +455,18 @@ void nsCSSValue::DoReset()
} else if (eCSSUnit_SharedList == mUnit) {
DO_RELEASE(mSharedList);
} else if (eCSSUnit_PairList == mUnit) {
DO_RELEASE(mPairList);
} else if (eCSSUnit_GridTemplateAreas == mUnit) {
DO_RELEASE(mGridTemplateAreas);
} else if (eCSSUnit_FontFamilyList == mUnit) {
DO_RELEASE(mFontFamilyList);
+ } else if (eCSSUnit_AtomIdent == mUnit) {
+ DO_RELEASE(mAtom);
}
mUnit = eCSSUnit_Null;
}
#undef DO_RELEASE
void nsCSSValue::SetIntValue(int32_t aValue, nsCSSUnit aUnit)
{
@@ -970,16 +979,26 @@ nsCSSValue::BufferFromString(const nsStr
char16_t* data = static_cast<char16_t*>(buffer->Data());
nsCharTraits<char16_t>::copy(data, aValue.get(), length);
// Null-terminate.
data[length] = 0;
return buffer.forget();
}
+void
+nsCSSValue::AtomizeIdentValue()
+{
+ MOZ_ASSERT(mUnit == eCSSUnit_Ident);
+ nsCOMPtr<nsIAtom> atom = NS_Atomize(GetStringBufferValue());
+ Reset();
+ mUnit = eCSSUnit_AtomIdent;
+ mValue.mAtom = atom.forget().take();
+}
+
namespace {
struct CSSValueSerializeCalcOps {
CSSValueSerializeCalcOps(nsCSSPropertyID aProperty, nsAString& aResult,
nsCSSValue::Serialization aSerialization)
: mProperty(aProperty),
mResult(aResult),
mValueSerialization(aSerialization)
@@ -1961,16 +1980,19 @@ nsCSSValue::AppendToString(nsCSSProperty
nsStyleUtil::AppendEscapedCSSString(areas->mTemplates[0], aResult);
for (uint32_t i = 1; i < areas->mTemplates.Length(); i++) {
aResult.Append(char16_t(' '));
nsStyleUtil::AppendEscapedCSSString(areas->mTemplates[i], aResult);
}
} else if (eCSSUnit_FontFamilyList == unit) {
nsStyleUtil::AppendEscapedCSSFontFamilyList(*mValue.mFontFamilyList,
aResult);
+ } else if (eCSSUnit_AtomIdent == unit) {
+ nsDependentAtomString buffer(GetAtomValue());
+ nsStyleUtil::AppendEscapedCSSIdent(buffer, aResult);
}
switch (unit) {
case eCSSUnit_Null: break;
case eCSSUnit_Auto: aResult.AppendLiteral("auto"); break;
case eCSSUnit_Inherit: aResult.AppendLiteral("inherit"); break;
case eCSSUnit_Initial: aResult.AppendLiteral("initial"); break;
case eCSSUnit_Unset: aResult.AppendLiteral("unset"); break;
@@ -1981,16 +2003,17 @@ nsCSSValue::AppendToString(nsCSSProperty
case eCSSUnit_Dummy:
case eCSSUnit_DummyInherit:
MOZ_ASSERT(false, "should never serialize");
break;
case eCSSUnit_FontFamilyList: break;
case eCSSUnit_String: break;
case eCSSUnit_Ident: break;
+ case eCSSUnit_AtomIdent: break;
case eCSSUnit_URL: break;
case eCSSUnit_Image: break;
case eCSSUnit_Element: break;
case eCSSUnit_Array: break;
case eCSSUnit_Attr:
case eCSSUnit_Cubic_Bezier:
case eCSSUnit_Steps:
case eCSSUnit_Symbols:
@@ -2178,16 +2201,20 @@ nsCSSValue::SizeOfExcludingThis(mozilla:
case eCSSUnit_GridTemplateAreas:
n += mValue.mGridTemplateAreas->SizeOfIncludingThis(aMallocSizeOf);
break;
case eCSSUnit_FontFamilyList:
n += mValue.mFontFamilyList->SizeOfIncludingThis(aMallocSizeOf);
break;
+ // Atom is always shared, and thus should not be counted.
+ case eCSSUnit_AtomIdent:
+ break;
+
// Int: nothing extra to measure.
case eCSSUnit_Integer:
case eCSSUnit_Enumerated:
case eCSSUnit_EnumColor:
break;
// Integer Color: nothing extra to measure.
case eCSSUnit_RGBColor:
--- a/layout/style/nsCSSValue.h
+++ b/layout/style/nsCSSValue.h
@@ -29,16 +29,17 @@
#include "nsString.h"
#include "nsStringBuffer.h"
#include "nsTArray.h"
#include "nsStyleConsts.h"
#include "nsStyleCoord.h"
#include "gfxFontFamilyList.h"
class imgRequestProxy;
+class nsIAtom;
class nsIContent;
class nsIDocument;
class nsIPrincipal;
class nsIURI;
class nsPresContext;
template <class T>
class nsPtrHashKey;
@@ -484,16 +485,19 @@ enum nsCSSUnit {
eCSSUnit_SharedList = 55, // (nsCSSValueSharedList*) same as list
// but reference counted and shared
eCSSUnit_PairList = 56, // (nsCSSValuePairList*) list of value pairs
eCSSUnit_PairListDep = 57, // (nsCSSValuePairList*) same as PairList
// but does not own the list
eCSSUnit_FontFamilyList = 58, // (FontFamilyList*) value
+ // Atom units
+ eCSSUnit_AtomIdent = 60, // (nsIAtom*) for its string as an identifier
+
eCSSUnit_Integer = 70, // (int) simple value
eCSSUnit_Enumerated = 71, // (int) value has enumerated meaning
eCSSUnit_EnumColor = 80, // (int) enumerated color (kColorKTable)
eCSSUnit_RGBColor = 81, // (nscolor) an opaque RGBA value specified as rgb()
eCSSUnit_RGBAColor = 82, // (nscolor) an RGBA value specified as rgba()
eCSSUnit_HexColor = 83, // (nscolor) an opaque RGBA value specified as #rrggbb
eCSSUnit_ShortHexColor = 84, // (nscolor) an opaque RGBA value specified as #rgb
@@ -873,16 +877,21 @@ public:
nscoord GetPixelLength() const;
nsCSSValueFloatColor* GetFloatColorValue() const
{
MOZ_ASSERT(IsFloatColorUnit(), "not a float color value");
return mValue.mFloatColor;
}
+ nsIAtom* GetAtomValue() const {
+ MOZ_ASSERT(mUnit == eCSSUnit_AtomIdent);
+ return mValue.mAtom;
+ }
+
void Reset() // sets to null
{
if (mUnit != eCSSUnit_Null)
DoReset();
}
private:
void DoReset();
@@ -957,16 +966,19 @@ public:
// Checks if this is a function value with the specified function id.
bool EqualsFunction(nsCSSKeyword aFunctionId) const;
// Returns an already addrefed buffer. Guaranteed to return non-null.
// (Will abort on allocation failure.)
static already_AddRefed<nsStringBuffer>
BufferFromString(const nsString& aValue);
+ // Convert the given Ident value into AtomIdent.
+ void AtomizeIdentValue();
+
size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
static void
AppendSidesShorthandToString(const nsCSSPropertyID aProperties[],
const nsCSSValue* aValues[],
nsAString& aString,
Serialization aSerialization);
static void
@@ -1001,16 +1013,17 @@ protected:
nsCSSUnit mUnit;
union {
int32_t mInt;
float mFloat;
// Note: the capacity of the buffer may exceed the length of the string.
// If we're of a string type, mString is not null.
nsStringBuffer* MOZ_OWNING_REF mString;
nscolor mColor;
+ nsIAtom* MOZ_OWNING_REF mAtom;
Array* MOZ_OWNING_REF mArray;
mozilla::css::URLValue* MOZ_OWNING_REF mURL;
mozilla::css::ImageValue* MOZ_OWNING_REF mImage;
mozilla::css::GridTemplateAreasValue* MOZ_OWNING_REF mGridTemplateAreas;
nsCSSValueGradient* MOZ_OWNING_REF mGradient;
nsCSSValueTokenStream* MOZ_OWNING_REF mTokenStream;
nsCSSValuePair_heap* MOZ_OWNING_REF mPair;
nsCSSRect_heap* MOZ_OWNING_REF mRect;