Bug 1341761 - Convert nsStyleImage::mElementId to use nsIAtom. r=xidorn
MozReview-Commit-ID: 9YcbhMmXYoi
--- a/layout/painting/nsImageRenderer.cpp
+++ b/layout/painting/nsImageRenderer.cpp
@@ -169,17 +169,17 @@ nsImageRenderer::PrepareImage()
}
case eStyleImageType_Gradient:
mGradientData = mImage->GetGradientData();
mPrepareResult = DrawResult::SUCCESS;
break;
case eStyleImageType_Element:
{
nsAutoString elementId =
- NS_LITERAL_STRING("#") + nsDependentString(mImage->GetElementId());
+ NS_LITERAL_STRING("#") + nsDependentAtomString(mImage->GetElementId());
nsCOMPtr<nsIURI> targetURI;
nsCOMPtr<nsIURI> base = mForFrame->GetContent()->GetBaseURI();
nsContentUtils::NewURIWithDocumentCharset(getter_AddRefs(targetURI), elementId,
mForFrame->GetContent()->GetUncomposedDoc(), base);
nsSVGPaintingProperty* property = nsSVGEffects::GetPaintingPropertyForURI(
targetURI, mForFrame->FirstContinuation(),
nsSVGEffects::BackgroundImageProperty());
if (!property) {
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -2288,17 +2288,18 @@ nsComputedDOMStyle::SetValueToStyleImage
gradientString);
aValue->SetString(gradientString);
break;
}
case eStyleImageType_Element:
{
nsAutoString elementId;
nsStyleUtil::AppendEscapedCSSIdent(
- nsDependentString(aStyleImage.GetElementId()), elementId);
+ nsDependentAtomString(aStyleImage.GetElementId()),
+ elementId);
nsAutoString elementString = NS_LITERAL_STRING("-moz-element(#") +
elementId +
NS_LITERAL_STRING(")");
aValue->SetString(elementString);
break;
}
case eStyleImageType_Null:
aValue->SetIdent(eCSSKeyword_none);
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -1384,18 +1384,21 @@ static void SetStyleImage(nsStyleContext
case eCSSUnit_Gradient:
{
nsStyleGradient* gradient = new nsStyleGradient();
SetGradient(aValue, presContext, aStyleContext, *gradient, aConditions);
aResult.SetGradientData(gradient);
break;
}
case eCSSUnit_Element:
- aResult.SetElementId(aValue.GetStringBufferValue());
- break;
+ {
+ nsCOMPtr<nsIAtom> atom = NS_Atomize(aValue.GetStringBufferValue());
+ aResult.SetElementId(atom.forget());
+ break;
+ }
case eCSSUnit_Initial:
case eCSSUnit_Unset:
case eCSSUnit_None:
break;
case eCSSUnit_URL:
{
#ifdef DEBUG
// eCSSUnit_URL is expected only if
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -2181,17 +2181,17 @@ nsStyleImage::DoCopy(const nsStyleImage&
{
SetNull();
if (aOther.mType == eStyleImageType_Image) {
SetImageRequest(do_AddRef(aOther.mImage));
} else if (aOther.mType == eStyleImageType_Gradient) {
SetGradientData(aOther.mGradient);
} else if (aOther.mType == eStyleImageType_Element) {
- SetElementId(aOther.mElementId);
+ SetElementId(do_AddRef(aOther.mElementId));
} else if (aOther.mType == eStyleImageType_URL) {
SetURLValue(do_AddRef(aOther.mURLValue));
}
UniquePtr<nsStyleSides> cropRectCopy;
if (aOther.mCropRect) {
cropRectCopy = MakeUnique<nsStyleSides>(*aOther.mCropRect.get());
}
@@ -2201,17 +2201,17 @@ nsStyleImage::DoCopy(const nsStyleImage&
void
nsStyleImage::SetNull()
{
if (mType == eStyleImageType_Gradient) {
mGradient->Release();
} else if (mType == eStyleImageType_Image) {
NS_RELEASE(mImage);
} else if (mType == eStyleImageType_Element) {
- free(mElementId);
+ NS_RELEASE(mElementId);
} else if (mType == eStyleImageType_URL) {
NS_RELEASE(mURLValue);
}
mType = eStyleImageType_Null;
mCropRect = nullptr;
}
@@ -2246,24 +2246,24 @@ nsStyleImage::SetGradientData(nsStyleGra
if (aGradient) {
mGradient = aGradient;
mType = eStyleImageType_Gradient;
}
}
void
-nsStyleImage::SetElementId(const char16_t* aElementId)
+nsStyleImage::SetElementId(already_AddRefed<nsIAtom> aElementId)
{
if (mType != eStyleImageType_Null) {
SetNull();
}
- if (aElementId) {
- mElementId = NS_strdup(aElementId);
+ if (nsCOMPtr<nsIAtom> atom = aElementId) {
+ mElementId = atom.forget().take();
mType = eStyleImageType_Element;
}
}
void
nsStyleImage::SetCropRect(UniquePtr<nsStyleSides> aCropRect)
{
mCropRect = Move(aCropRect);
@@ -2495,17 +2495,17 @@ nsStyleImage::operator==(const nsStyleIm
return DefinitelyEqualImages(mImage, aOther.mImage);
}
if (mType == eStyleImageType_Gradient) {
return *mGradient == *aOther.mGradient;
}
if (mType == eStyleImageType_Element) {
- return NS_strcmp(mElementId, aOther.mElementId) == 0;
+ return mElementId == aOther.mElementId;
}
if (mType == eStyleImageType_URL) {
return DefinitelyEqualURIs(mURLValue, aOther.mURLValue);
}
return true;
}
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -427,17 +427,17 @@ struct nsStyleImage
nsStyleImage();
~nsStyleImage();
nsStyleImage(const nsStyleImage& aOther);
nsStyleImage& operator=(const nsStyleImage& aOther);
void SetNull();
void SetImageRequest(already_AddRefed<nsStyleImageRequest> aImage);
void SetGradientData(nsStyleGradient* aGradient);
- void SetElementId(const char16_t* aElementId);
+ void SetElementId(already_AddRefed<nsIAtom> aElementId);
void SetCropRect(mozilla::UniquePtr<nsStyleSides> aCropRect);
void SetURLValue(already_AddRefed<URLValue> aData);
void ResolveImage(nsPresContext* aContext) {
MOZ_ASSERT(mType != eStyleImageType_Image || mImage);
if (mType == eStyleImageType_Image && !mImage->IsResolved()) {
mImage->Resolve(aContext);
}
@@ -453,17 +453,17 @@ struct nsStyleImage
}
imgRequestProxy* GetImageData() const {
return GetImageRequest()->get();
}
nsStyleGradient* GetGradientData() const {
NS_ASSERTION(mType == eStyleImageType_Gradient, "Data is not a gradient!");
return mGradient;
}
- const char16_t* GetElementId() const {
+ const nsIAtom* GetElementId() const {
NS_ASSERTION(mType == eStyleImageType_Element, "Data is not an element!");
return mElementId;
}
const mozilla::UniquePtr<nsStyleSides>& GetCropRect() const {
NS_ASSERTION(mType == eStyleImageType_Image,
"Only image data can have a crop rect");
return mCropRect;
}
@@ -553,17 +553,17 @@ private:
nsStyleImageType mType;
union {
nsStyleImageRequest* mImage;
nsStyleGradient* mGradient;
URLValue* mURLValue; // See the comment in SetStyleImage's 'case
// eCSSUnit_URL' section to know why we need to
// store URLValues separately from mImage.
- char16_t* mElementId;
+ nsIAtom* mElementId;
};
// This is _currently_ used only in conjunction with eStyleImageType_Image.
mozilla::UniquePtr<nsStyleSides> mCropRect;
};
struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleColor
{