--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -118,32 +118,30 @@ static already_AddRefed<imgRequestProxy>
CreateImageRequest(nsPresContext* aPresContext, const nsCSSValue& aValue)
{
RefPtr<imgRequestProxy> req =
aValue.GetPossiblyStaticImageValue(aPresContext->Document(),
aPresContext);
return req.forget();
}
-static void
-SetStyleImageRequest(std::function<void(nsStyleImageRequest*)> aCallback,
- nsPresContext* aPresContext,
- const nsCSSValue& aValue,
- nsStyleImageRequest::Mode aModeFlags =
- nsStyleImageRequest::Mode::Track)
+static already_AddRefed<nsStyleImageRequest>
+CreateStyleImageRequest(nsPresContext* aPresContext, const nsCSSValue& aValue,
+ nsStyleImageRequest::Mode aModeFlags =
+ nsStyleImageRequest::Mode::Track)
{
css::ImageValue* imageValue = aValue.GetImageStructValue();
ImageTracker* imageTracker =
(aModeFlags & nsStyleImageRequest::Mode::Track)
? aPresContext->Document()->ImageTracker()
: nullptr;
RefPtr<imgRequestProxy> proxy = CreateImageRequest(aPresContext, aValue);
RefPtr<nsStyleImageRequest> request =
new nsStyleImageRequest(aModeFlags, proxy, imageValue, imageTracker);
- aCallback(request);
+ return request.forget();
}
template<typename ReferenceBox>
static void
SetStyleShapeSourceToCSSValue(StyleShapeSource<ReferenceBox>* aShapeSource,
const nsCSSValue* aValue,
nsStyleContext* aStyleContext,
nsPresContext* aPresContext,
@@ -1307,19 +1305,18 @@ static void SetStyleImageToImageRect(nsS
aValue.EqualsFunction(eCSSKeyword__moz_image_rect),
"the value is not valid -moz-image-rect()");
nsCSSValue::Array* arr = aValue.GetArrayValue();
MOZ_ASSERT(arr && arr->Count() == 6, "invalid number of arguments");
// <uri>
if (arr->Item(1).GetUnit() == eCSSUnit_Image) {
- SetStyleImageRequest([&](nsStyleImageRequest* req) {
- aResult.SetImageRequest(do_AddRef(req));
- }, aStyleContext->PresContext(), arr->Item(1));
+ nsPresContext* pc = aStyleContext->PresContext();
+ aResult.SetImageRequest(CreateStyleImageRequest(pc, arr->Item(1)));
} else {
NS_WARNING("nsCSSValue::Image::Image() failed?");
}
// <top>, <right>, <bottom>, <left>
nsStyleSides cropRect;
NS_FOR_CSS_SIDES(side) {
nsStyleCoord coord;
@@ -1341,34 +1338,32 @@ static void SetStyleImage(nsStyleContext
RuleNodeCacheConditions& aConditions)
{
if (aValue.GetUnit() == eCSSUnit_Null) {
return;
}
aResult.SetNull();
+ nsPresContext* presContext = aStyleContext->PresContext();
switch (aValue.GetUnit()) {
case eCSSUnit_Image:
- SetStyleImageRequest([&](nsStyleImageRequest* req) {
- aResult.SetImageRequest(do_AddRef(req));
- }, aStyleContext->PresContext(), aValue);
+ aResult.SetImageRequest(CreateStyleImageRequest(presContext, aValue));
break;
case eCSSUnit_Function:
if (aValue.EqualsFunction(eCSSKeyword__moz_image_rect)) {
SetStyleImageToImageRect(aStyleContext, aValue, aResult);
} else {
NS_NOTREACHED("-moz-image-rect() is the only expected function");
}
break;
case eCSSUnit_Gradient:
{
nsStyleGradient* gradient = new nsStyleGradient();
- SetGradient(aValue, aStyleContext->PresContext(), aStyleContext,
- *gradient, aConditions);
+ SetGradient(aValue, presContext, aStyleContext, *gradient, aConditions);
aResult.SetGradientData(gradient);
break;
}
case eCSSUnit_Element:
aResult.SetElementId(aValue.GetStringBufferValue());
break;
case eCSSUnit_Initial:
case eCSSUnit_Unset:
@@ -1390,17 +1385,17 @@ static void SetStyleImage(nsStyleContext
// eCSSUnit_Image here.
// Check #2.
bool isLocalRef = aValue.GetURLStructValue()->IsLocalRef();
// Check #3.
bool isEqualExceptRef = false;
if (!isLocalRef) {
- nsIDocument* currentDoc = aStyleContext->PresContext()->Document();
+ nsIDocument* currentDoc = presContext->Document();
nsIURI* docURI = currentDoc->GetDocumentURI();
nsIURI* imageURI = aValue.GetURLValue();
imageURI->EqualsExceptRef(docURI, &isEqualExceptRef);
}
MOZ_ASSERT(aStyleContext->IsStyleIfVisited() || isEqualExceptRef ||
isLocalRef,
"unexpected unit; maybe nsCSSValue::Image::Image() failed?");
@@ -5162,26 +5157,25 @@ nsRuleNode::ComputeUserInterfaceData(voi
else {
// The parser will never create a list that is *all* URL values --
// that's invalid.
MOZ_ASSERT(cursorUnit == eCSSUnit_List || cursorUnit == eCSSUnit_ListDep,
"unrecognized cursor unit");
const nsCSSValueList* list = cursorValue->GetListValue();
for ( ; list->mValue.GetUnit() == eCSSUnit_Array; list = list->mNext) {
nsCSSValue::Array* arr = list->mValue.GetArrayValue();
- SetStyleImageRequest([&](nsStyleImageRequest* req) {
- nsCursorImage* item = ui->mCursorImages.AppendElement();
- item->mImage = req;
- if (arr->Item(1).GetUnit() != eCSSUnit_Null) {
- item->mHaveHotspot = true;
- item->mHotspotX = arr->Item(1).GetFloatValue();
- item->mHotspotY = arr->Item(2).GetFloatValue();
- }
- }, aContext->PresContext(), arr->Item(0),
- nsStyleImageRequest::Mode::Discard);
+ nsCursorImage* item = ui->mCursorImages.AppendElement();
+ item->mImage =
+ CreateStyleImageRequest(aContext->PresContext(), arr->Item(0),
+ nsStyleImageRequest::Mode::Discard);
+ if (arr->Item(1).GetUnit() != eCSSUnit_Null) {
+ item->mHaveHotspot = true;
+ item->mHotspotX = arr->Item(1).GetFloatValue();
+ item->mHotspotY = arr->Item(2).GetFloatValue();
+ }
}
NS_ASSERTION(list, "Must have non-array value at the end");
NS_ASSERTION(list->mValue.GetUnit() == eCSSUnit_Enumerated,
"Unexpected fallback value at end of cursor list");
ui->mCursor = list->mValue.GetIntValue();
}
}
@@ -8010,19 +8004,18 @@ nsRuleNode::ComputeListData(void* aStart
break;
default:
NS_NOTREACHED("Unexpected value unit");
}
// list-style-image: url, none, inherit
const nsCSSValue* imageValue = aRuleData->ValueForListStyleImage();
if (eCSSUnit_Image == imageValue->GetUnit()) {
- SetStyleImageRequest([&](nsStyleImageRequest* req) {
- list->mListStyleImage = req;
- }, mPresContext, *imageValue, nsStyleImageRequest::Mode(0));
+ list->mListStyleImage = CreateStyleImageRequest(
+ mPresContext, *imageValue, nsStyleImageRequest::Mode(0));
}
else if (eCSSUnit_None == imageValue->GetUnit() ||
eCSSUnit_Initial == imageValue->GetUnit()) {
list->mListStyleImage = nullptr;
}
else if (eCSSUnit_Inherit == imageValue->GetUnit() ||
eCSSUnit_Unset == imageValue->GetUnit()) {
conditions.SetUncacheable();