Bug 1345804 part 2 - Add new AtomIdent unit to nsCSSValue. r=heycam

MozReview-Commit-ID: 4Qc3POvHrJg

--HG--
extra : rebase_source : 80b4ca720db36d47fc0b9e69bd6c4f03de758ce2
This commit is contained in:
Xidorn Quan 2017-03-10 15:53:56 +11:00
Родитель cf27123d34
Коммит 404a4a6ca2
2 изменённых файлов: 40 добавлений и 0 удалений

Просмотреть файл

@ -226,6 +226,10 @@ nsCSSValue::nsCSSValue(const nsCSSValue& aCopy)
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");
}
@ -321,6 +325,9 @@ bool nsCSSValue::operator==(const nsCSSValue& aOther) const
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;
}
@ -453,6 +460,8 @@ void nsCSSValue::DoReset()
DO_RELEASE(mGridTemplateAreas);
} else if (eCSSUnit_FontFamilyList == mUnit) {
DO_RELEASE(mFontFamilyList);
} else if (eCSSUnit_AtomIdent == mUnit) {
DO_RELEASE(mAtom);
}
mUnit = eCSSUnit_Null;
}
@ -975,6 +984,16 @@ nsCSSValue::BufferFromString(const nsString& aValue)
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 {
@ -1966,6 +1985,9 @@ nsCSSValue::AppendToString(nsCSSPropertyID aProperty, nsAString& 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) {
@ -1986,6 +2008,7 @@ nsCSSValue::AppendToString(nsCSSPropertyID aProperty, nsAString& aResult,
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;
@ -2183,6 +2206,10 @@ nsCSSValue::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const
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:

Просмотреть файл

@ -34,6 +34,7 @@
#include <type_traits>
class imgRequestProxy;
class nsIAtom;
class nsIContent;
class nsIDocument;
class nsIPrincipal;
@ -491,6 +492,9 @@ enum nsCSSUnit {
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
@ -880,6 +884,11 @@ public:
return mValue.mFloatColor;
}
nsIAtom* GetAtomValue() const {
MOZ_ASSERT(mUnit == eCSSUnit_AtomIdent);
return mValue.mAtom;
}
void Reset() // sets to null
{
if (mUnit != eCSSUnit_Null)
@ -964,6 +973,9 @@ public:
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
@ -1008,6 +1020,7 @@ protected:
// 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;