--- a/layout/inspector/inDOMUtils.cpp
+++ b/layout/inspector/inDOMUtils.cpp
@@ -770,18 +770,20 @@ PropertySupportsVariant(nsCSSProperty aP
break;
case eCSSProperty_border_top_left_radius:
case eCSSProperty_border_top_right_radius:
case eCSSProperty_border_bottom_left_radius:
case eCSSProperty_border_bottom_right_radius:
case eCSSProperty_background_position:
case eCSSProperty_background_size:
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
case eCSSProperty_mask_position:
case eCSSProperty_mask_size:
+#endif
case eCSSProperty_grid_auto_columns:
case eCSSProperty_grid_auto_rows:
case eCSSProperty_grid_template_columns:
case eCSSProperty_grid_template_rows:
case eCSSProperty_object_position:
case eCSSProperty_scroll_snap_coordinate:
case eCSSProperty_scroll_snap_destination:
case eCSSProperty_transform_origin:
--- a/layout/style/Declaration.cpp
+++ b/layout/style/Declaration.cpp
@@ -346,17 +346,21 @@ Declaration::GetImageLayerValue(
if (aTable == nsStyleImageLayers::kBackgroundLayerTable) {
if (repeat || position || clip || origin || size || attachment) {
// Uneven length lists, so can't be serialized as shorthand.
aValue.Truncate();
return;
}
// This layer is an mask layer
} else {
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
MOZ_ASSERT(aTable == nsStyleImageLayers::kMaskLayerTable);
+#else
+ MOZ_ASSERT_UNREACHABLE("Should never get here when mask-as-shorthand is disable");
+#endif
if (repeat || position || clip || origin || size || composite || mode) {
// Uneven length lists, so can't be serialized as shorthand.
aValue.Truncate();
return;
}
}
break;
}
@@ -365,17 +369,21 @@ Declaration::GetImageLayerValue(
if (aTable == nsStyleImageLayers::kBackgroundLayerTable) {
if (!repeat || !position || !clip || !origin || !size || !attachment) {
// Uneven length lists, so can't be serialized as shorthand.
aValue.Truncate();
return;
}
// This layer is an mask layer
} else {
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
MOZ_ASSERT(aTable == nsStyleImageLayers::kMaskLayerTable);
+#else
+ MOZ_ASSERT_UNREACHABLE("Should never get here when mask-as-shorthand is disable");
+#endif
if (!repeat || !position || !clip || !origin || !size ||
!composite || !mode) {
// Uneven length lists, so can't be serialized as shorthand.
aValue.Truncate();
return;
}
}
aValue.Append(char16_t(','));
@@ -652,21 +660,23 @@ Declaration::GetValue(nsCSSProperty aPro
}
break;
}
case eCSSProperty_background: {
GetImageLayerValue(data, aValue, aSerialization,
nsStyleImageLayers::kBackgroundLayerTable);
break;
}
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
case eCSSProperty_mask: {
GetImageLayerValue(data, aValue, aSerialization,
nsStyleImageLayers::kMaskLayerTable);
break;
}
+#endif
case eCSSProperty_font: {
// systemFont might not be present; other values are guaranteed to be
// available based on the shorthand check at the beginning of the
// function, as long as the prop is enabled
const nsCSSValue *systemFont =
data->ValueFor(eCSSProperty__x_system_font);
const nsCSSValue *style =
data->ValueFor(eCSSProperty_font_style);
--- a/layout/style/StyleAnimationValue.cpp
+++ b/layout/style/StyleAnimationValue.cpp
@@ -3426,38 +3426,38 @@ StyleAnimationValue::ExtractComputedValu
}
case eCSSProperty_background_position: {
const nsStyleImageLayers& layers =
static_cast<const nsStyleBackground*>(styleStruct)->mImage;
ExtractImageLayerPositionList(layers, aComputedValue);
break;
}
-
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
case eCSSProperty_mask_position: {
const nsStyleImageLayers& layers =
static_cast<const nsStyleSVGReset*>(styleStruct)->mMask;
ExtractImageLayerPositionList(layers, aComputedValue);
break;
}
-
+#endif
case eCSSProperty_background_size: {
const nsStyleImageLayers& layers =
static_cast<const nsStyleBackground*>(styleStruct)->mImage;
ExtractImageLayerSizePairList(layers, aComputedValue);
break;
}
-
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
case eCSSProperty_mask_size: {
const nsStyleImageLayers& layers =
static_cast<const nsStyleSVGReset*>(styleStruct)->mMask;
ExtractImageLayerSizePairList(layers, aComputedValue);
break;
}
-
+#endif
case eCSSProperty_filter: {
const nsStyleSVGReset *svgReset =
static_cast<const nsStyleSVGReset*>(styleStruct);
const nsTArray<nsStyleFilter>& filters = svgReset->mFilters;
nsAutoPtr<nsCSSValueList> result;
nsCSSValueList **resultTail = getter_Transfers(result);
for (uint32_t i = 0; i < filters.Length(); ++i) {
nsCSSValueList *item = new nsCSSValueList;
--- a/layout/style/nsCSSParser.cpp
+++ b/layout/style/nsCSSParser.cpp
@@ -11438,24 +11438,26 @@ CSSParserImpl::ParsePropertyByFunction(n
case eCSSProperty_marker:
return ParseMarker();
case eCSSProperty_paint_order:
return ParsePaintOrder();
case eCSSProperty_clip_path:
return ParseClipPath();
case eCSSProperty_scroll_snap_type:
return ParseScrollSnapType();
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
case eCSSProperty_mask:
return ParseImageLayers(nsStyleImageLayers::kMaskLayerTable);
case eCSSProperty_mask_repeat:
return ParseImageLayerRepeat(eCSSProperty_mask_repeat);
case eCSSProperty_mask_position:
return ParseImageLayerPosition(eCSSProperty_mask_position);
case eCSSProperty_mask_size:
return ParseImageLayerSize(eCSSProperty_mask_size);
+#endif
case eCSSProperty_all:
return ParseAll();
default:
MOZ_ASSERT(false, "should not be called");
return false;
}
}
--- a/layout/style/nsCSSPropAliasList.h
+++ b/layout/style/nsCSSPropAliasList.h
@@ -341,16 +341,17 @@ CSS_PROP_ALIAS(-webkit-box-pack,
WebkitBoxPack,
WEBKIT_PREFIX_PREF)
CSS_PROP_ALIAS(-webkit-user-select,
user_select,
WebkitUserSelect,
WEBKIT_PREFIX_PREF)
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
CSS_PROP_ALIAS(-webkit-mask,
mask,
WebkitMask,
WEBKIT_PREFIX_PREF)
CSS_PROP_ALIAS(-webkit-mask-clip,
mask_clip,
WebkitMaskClip,
WEBKIT_PREFIX_PREF)
@@ -373,10 +374,10 @@ CSS_PROP_ALIAS(-webkit-mask-position,
CSS_PROP_ALIAS(-webkit-mask-repeat,
mask_repeat,
WebkitMaskRepeat,
WEBKIT_PREFIX_PREF)
CSS_PROP_ALIAS(-webkit-mask-size,
mask_size,
WebkitMaskSize,
WEBKIT_PREFIX_PREF)
-
+#endif
#undef WEBKIT_PREFIX_PREF
--- a/layout/style/nsCSSPropList.h
+++ b/layout/style/nsCSSPropList.h
@@ -4070,16 +4070,17 @@ CSS_PROP_SVG(
marker_start,
MarkerStart,
CSS_PROPERTY_PARSE_VALUE,
"",
VARIANT_HUO,
nullptr,
CSS_PROP_NO_OFFSET,
eStyleAnimType_None)
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
CSS_PROP_SHORTHAND(
mask,
mask,
Mask,
CSS_PROPERTY_PARSE_FUNCTION,
"")
CSS_PROP_SVGRESET(
mask-clip,
@@ -4169,16 +4170,29 @@ CSS_PROP_SVGRESET(
CSS_PROPERTY_VALUE_LIST_USES_COMMAS |
CSS_PROPERTY_VALUE_NONNEGATIVE |
CSS_PROPERTY_STORES_CALC,
"",
0,
kImageLayerSizeKTable,
CSS_PROP_NO_OFFSET,
eStyleAnimType_Custom)
+#else
+CSS_PROP_SVGRESET(
+ mask,
+ mask,
+ Mask,
+ CSS_PROPERTY_PARSE_VALUE |
+ CSS_PROPERTY_CREATES_STACKING_CONTEXT,
+ "",
+ VARIANT_HUO,
+ nullptr,
+ CSS_PROP_NO_OFFSET,
+ eStyleAnimType_None)
+#endif
CSS_PROP_SVGRESET(
mask-type,
mask_type,
MaskType,
CSS_PROPERTY_PARSE_VALUE,
"layout.css.masking.enabled",
VARIANT_HK,
kMaskTypeKTable,
--- a/layout/style/nsCSSProps.cpp
+++ b/layout/style/nsCSSProps.cpp
@@ -2925,29 +2925,29 @@ static const nsCSSProperty gMozTransform
eCSSProperty_UNKNOWN
};
static const nsCSSProperty gScrollSnapTypeSubpropTable[] = {
eCSSProperty_scroll_snap_type_x,
eCSSProperty_scroll_snap_type_y,
eCSSProperty_UNKNOWN
};
-
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
static const nsCSSProperty gMaskSubpropTable[] = {
eCSSProperty_mask_image,
eCSSProperty_mask_repeat,
eCSSProperty_mask_position,
eCSSProperty_mask_clip,
eCSSProperty_mask_origin,
eCSSProperty_mask_size,
eCSSProperty_mask_composite,
eCSSProperty_mask_mode,
eCSSProperty_UNKNOWN
};
-
+#endif
// FIXME: mask-border tables should be added when we implement
// mask-border properties.
const nsCSSProperty *const
nsCSSProps::kSubpropertyTable[eCSSProperty_COUNT - eCSSProperty_COUNT_no_shorthands] = {
#define CSS_PROP_PUBLIC_OR_PRIVATE(publicname_, privatename_) privatename_
// Need an extra level of macro nesting to force expansion of method_
// params before they get pasted.
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -6033,16 +6033,17 @@ nsComputedDOMStyle::DoGetMask()
val->SetURI(firstLayer.mSourceURI);
} else {
val->SetIdent(eCSSKeyword_none);
}
return val.forget();
}
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetMaskClip()
{
return GetBackgroundList(&nsStyleImageLayers::Layer::mClip,
&nsStyleImageLayers::mClipCount,
StyleSVGReset()->mMask,
nsCSSProps::kImageLayerOriginKTable);
}
@@ -6096,16 +6097,17 @@ nsComputedDOMStyle::DoGetMaskRepeat()
}
already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetMaskSize()
{
const nsStyleImageLayers& layers = StyleSVGReset()->mMask;
return DoGetImageLayerSize(layers);
}
+#endif
already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetMaskType()
{
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
val->SetIdent(
nsCSSProps::ValueToKeywordEnum(StyleSVGReset()->mMaskType,
nsCSSProps::kMaskTypeKTable));
--- a/layout/style/nsComputedDOMStyle.h
+++ b/layout/style/nsComputedDOMStyle.h
@@ -299,25 +299,26 @@ private:
already_AddRefed<CSSValue> DoGetBackgroundRepeat();
already_AddRefed<CSSValue> DoGetBackgroundClip();
already_AddRefed<CSSValue> DoGetBackgroundBlendMode();
already_AddRefed<CSSValue> DoGetBackgroundOrigin();
already_AddRefed<CSSValue> DoGetBackgroundSize();
/* Mask properties */
already_AddRefed<CSSValue> DoGetMask();
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
already_AddRefed<CSSValue> DoGetMaskImage();
already_AddRefed<CSSValue> DoGetMaskPosition();
already_AddRefed<CSSValue> DoGetMaskRepeat();
already_AddRefed<CSSValue> DoGetMaskClip();
already_AddRefed<CSSValue> DoGetMaskOrigin();
already_AddRefed<CSSValue> DoGetMaskSize();
already_AddRefed<CSSValue> DoGetMaskMode();
already_AddRefed<CSSValue> DoGetMaskComposite();
-
+#endif
/* Padding properties */
already_AddRefed<CSSValue> DoGetPaddingTop();
already_AddRefed<CSSValue> DoGetPaddingBottom();
already_AddRefed<CSSValue> DoGetPaddingLeft();
already_AddRefed<CSSValue> DoGetPaddingRight();
/* Table Properties */
already_AddRefed<CSSValue> DoGetBorderCollapse();
--- a/layout/style/nsComputedDOMStylePropertyList.h
+++ b/layout/style/nsComputedDOMStylePropertyList.h
@@ -313,24 +313,26 @@ COMPUTED_STYLE_PROP(filter,
COMPUTED_STYLE_PROP(flood_color, FloodColor)
COMPUTED_STYLE_PROP(flood_opacity, FloodOpacity)
COMPUTED_STYLE_PROP(image_rendering, ImageRendering)
COMPUTED_STYLE_PROP(lighting_color, LightingColor)
COMPUTED_STYLE_PROP(marker_end, MarkerEnd)
COMPUTED_STYLE_PROP(marker_mid, MarkerMid)
COMPUTED_STYLE_PROP(marker_start, MarkerStart)
COMPUTED_STYLE_PROP(mask, Mask)
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
COMPUTED_STYLE_PROP(mask_clip, MaskClip)
COMPUTED_STYLE_PROP(mask_composite, MaskComposite)
COMPUTED_STYLE_PROP(mask_image, MaskImage)
COMPUTED_STYLE_PROP(mask_mode, MaskMode)
COMPUTED_STYLE_PROP(mask_origin, MaskOrigin)
COMPUTED_STYLE_PROP(mask_position, MaskPosition)
COMPUTED_STYLE_PROP(mask_repeat, MaskRepeat)
COMPUTED_STYLE_PROP(mask_size, MaskSize)
+#endif
COMPUTED_STYLE_PROP(mask_type, MaskType)
COMPUTED_STYLE_PROP(paint_order, PaintOrder)
COMPUTED_STYLE_PROP(shape_rendering, ShapeRendering)
COMPUTED_STYLE_PROP(stop_color, StopColor)
COMPUTED_STYLE_PROP(stop_opacity, StopOpacity)
COMPUTED_STYLE_PROP(stroke, Stroke)
COMPUTED_STYLE_PROP(stroke_dasharray, StrokeDasharray)
COMPUTED_STYLE_PROP(stroke_dashoffset, StrokeDashoffset)
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -9754,16 +9754,17 @@ nsRuleNode::ComputeSVGResetData(void* aS
// mask-type: enum, inherit, initial
SetDiscrete(*aRuleData->ValueForMaskType(),
svgReset->mMaskType,
conditions,
SETDSC_ENUMERATED | SETDSC_UNSET_INITIAL,
parentSVGReset->mMaskType,
NS_STYLE_MASK_TYPE_LUMINANCE, 0, 0, 0, 0);
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
uint32_t maxItemCount = 1;
bool rebuild = false;
// mask-image: none | <url> | <image-list> | <element-reference> | <gradient>
nsStyleImage initialImage;
SetImageLayerList(aContext, *aRuleData->ValueForMaskImage(),
svgReset->mMask.mLayers,
parentSVGReset->mMask.mLayers,
@@ -9880,16 +9881,31 @@ nsRuleNode::ComputeSVGResetData(void* aS
svgReset->mMask.mSizeCount, fillCount);
FillBackgroundList(svgReset->mMask.mLayers,
&nsStyleImageLayers::Layer::mMaskMode,
svgReset->mMask.mMaskModeCount, fillCount);
FillBackgroundList(svgReset->mMask.mLayers,
&nsStyleImageLayers::Layer::mComposite,
svgReset->mMask.mCompositeCount, fillCount);
}
+#else
+ // mask: none | <url>
+ const nsCSSValue* maskValue = aRuleData->ValueForMask();
+ if (eCSSUnit_URL == maskValue->GetUnit()) {
+ svgReset->mMask.mLayers[0].mSourceURI = maskValue->GetURLValue();
+ } else if (eCSSUnit_None == maskValue->GetUnit() ||
+ eCSSUnit_Initial == maskValue->GetUnit() ||
+ eCSSUnit_Unset == maskValue->GetUnit()) {
+ svgReset->mMask.mLayers[0].mSourceURI = nullptr;
+ } else if (eCSSUnit_Inherit == maskValue->GetUnit()) {
+ conditions.SetUncacheable();
+ svgReset->mMask.mLayers[0].mSourceURI =
+ parentSVGReset->mMask.mLayers[0].mSourceURI;
+ }
+#endif
svgReset->mMask.TrackImages(aContext->PresContext());
COMPUTE_END_RESET(SVGReset, svgReset)
}
const void*
nsRuleNode::ComputeVariablesData(void* aStartStruct,
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -2245,29 +2245,31 @@ const nsCSSProperty nsStyleImageLayers::
eCSSProperty_background_clip, // clip
eCSSProperty_background_origin, // origin
eCSSProperty_background_size, // size
eCSSProperty_background_attachment, // attachment
eCSSProperty_UNKNOWN, // maskMode
eCSSProperty_UNKNOWN // composite
};
+#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
const nsCSSProperty nsStyleImageLayers::kMaskLayerTable[] = {
eCSSProperty_mask, // shorthand
eCSSProperty_UNKNOWN, // color
eCSSProperty_mask_image, // image
eCSSProperty_mask_repeat, // repeat
eCSSProperty_mask_position, // position
eCSSProperty_mask_clip, // clip
eCSSProperty_mask_origin, // origin
eCSSProperty_mask_size, // size
eCSSProperty_UNKNOWN, // attachment
eCSSProperty_mask_mode, // maskMode
eCSSProperty_mask_composite // composite
};
+#endif
nsStyleImageLayers::nsStyleImageLayers()
: mAttachmentCount(1)
, mClipCount(1)
, mOriginCount(1)
, mRepeatCount(1)
, mPositionCount(1)
, mImageCount(1)