Bug 1265342 Part 1: Add shape-margin to style system (Gecko bindings).
MozReview-Commit-ID: 3G0ZpWDrumg
--- a/layout/style/nsCSSPropList.h
+++ b/layout/style/nsCSSPropList.h
@@ -3753,16 +3753,27 @@ CSS_PROP_DISPLAY(
ShapeImageThreshold,
CSS_PROPERTY_PARSE_VALUE,
"layout.css.shape-outside.enabled",
VARIANT_HN,
nullptr,
offsetof(nsStyleDisplay, mShapeImageThreshold),
eStyleAnimType_float)
CSS_PROP_DISPLAY(
+ shape-margin,
+ shape_margin,
+ ShapeMargin,
+ CSS_PROPERTY_PARSE_VALUE |
+ CSS_PROPERTY_VALUE_NONNEGATIVE,
+ "layout.css.shape-outside.enabled",
+ VARIANT_HLP | VARIANT_CALC,
+ nullptr,
+ offsetof(nsStyleDisplay, mShapeMargin),
+ eStyleAnimType_Coord)
+CSS_PROP_DISPLAY(
shape-outside,
shape_outside,
ShapeOutside,
CSS_PROPERTY_PARSE_VALUE |
CSS_PROPERTY_VALUE_PARSER_FUNCTION |
CSS_PROPERTY_APPLIES_TO_FIRST_LETTER |
CSS_PROPERTY_START_IMAGE_LOADS |
CSS_PROPERTY_LOAD_USE_CORS |
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -6776,16 +6776,24 @@ already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetShapeImageThreshold()
{
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
val->SetNumber(StyleDisplay()->mShapeImageThreshold);
return val.forget();
}
already_AddRefed<CSSValue>
+nsComputedDOMStyle::DoGetShapeMargin()
+{
+ RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
+ SetValueToCoord(val, StyleDisplay()->mShapeMargin, true);
+ return val.forget();
+}
+
+already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetShapeOutside()
{
return GetShapeSource(StyleDisplay()->mShapeOutside,
nsCSSProps::kShapeOutsideShapeBoxKTable);
}
void
nsComputedDOMStyle::SetCssTextToCoord(nsAString& aCssText,
--- a/layout/style/nsComputedDOMStyle.h
+++ b/layout/style/nsComputedDOMStyle.h
@@ -518,16 +518,17 @@ private:
already_AddRefed<CSSValue> DoGetScrollSnapType();
already_AddRefed<CSSValue> DoGetScrollSnapTypeX();
already_AddRefed<CSSValue> DoGetScrollSnapTypeY();
already_AddRefed<CSSValue> DoGetScrollSnapPointsX();
already_AddRefed<CSSValue> DoGetScrollSnapPointsY();
already_AddRefed<CSSValue> DoGetScrollSnapDestination();
already_AddRefed<CSSValue> DoGetScrollSnapCoordinate();
already_AddRefed<CSSValue> DoGetShapeImageThreshold();
+ already_AddRefed<CSSValue> DoGetShapeMargin();
already_AddRefed<CSSValue> DoGetShapeOutside();
/* User interface properties */
already_AddRefed<CSSValue> DoGetCaretColor();
already_AddRefed<CSSValue> DoGetCursor();
already_AddRefed<CSSValue> DoGetForceBrokenImageIcon();
already_AddRefed<CSSValue> DoGetIMEMode();
already_AddRefed<CSSValue> DoGetUserFocus();
--- a/layout/style/nsComputedDOMStylePropertyList.h
+++ b/layout/style/nsComputedDOMStylePropertyList.h
@@ -230,16 +230,17 @@ COMPUTED_STYLE_PROP(scale,
COMPUTED_STYLE_PROP(scroll_behavior, ScrollBehavior)
COMPUTED_STYLE_PROP(scroll_snap_coordinate, ScrollSnapCoordinate)
COMPUTED_STYLE_PROP(scroll_snap_destination, ScrollSnapDestination)
COMPUTED_STYLE_PROP(scroll_snap_points_x, ScrollSnapPointsX)
COMPUTED_STYLE_PROP(scroll_snap_points_y, ScrollSnapPointsY)
COMPUTED_STYLE_PROP(scroll_snap_type_x, ScrollSnapTypeX)
COMPUTED_STYLE_PROP(scroll_snap_type_y, ScrollSnapTypeY)
COMPUTED_STYLE_PROP(shape_image_threshold, ShapeImageThreshold)
+COMPUTED_STYLE_PROP(shape_margin, ShapeMargin)
COMPUTED_STYLE_PROP(shape_outside, ShapeOutside)
//// COMPUTED_STYLE_PROP(size, Size)
COMPUTED_STYLE_PROP(table_layout, TableLayout)
COMPUTED_STYLE_PROP(text_align, TextAlign)
COMPUTED_STYLE_PROP(text_align_last, TextAlignLast)
COMPUTED_STYLE_PROP(text_combine_upright, TextCombineUpright)
COMPUTED_STYLE_PROP(text_decoration, TextDecoration)
COMPUTED_STYLE_PROP(text_decoration_color, TextDecorationColor)
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -6435,16 +6435,24 @@ nsRuleNode::ComputeDisplayData(void* aSt
StyleOrient::Inline);
// shape-image-threshold: number, inherit, initial
SetFactor(*aRuleData->ValueForShapeImageThreshold(),
display->mShapeImageThreshold, conditions,
parentDisplay->mShapeImageThreshold, 0.0f,
SETFCT_OPACITY | SETFCT_UNSET_INITIAL);
+ // shape-margin: length, percentage, inherit, initial
+ SetCoord(*aRuleData->ValueForShapeMargin(),
+ display->mShapeMargin,
+ parentDisplay->mShapeMargin,
+ SETCOORD_LPH | SETCOORD_INITIAL_ZERO | SETCOORD_STORE_CALC |
+ SETCOORD_CALC_CLAMP_NONNEGATIVE | SETCOORD_UNSET_INITIAL,
+ aContext, mPresContext, conditions);
+
// shape-outside: none | [ <basic-shape> || <shape-box> ] | <image>
const nsCSSValue* shapeOutsideValue = aRuleData->ValueForShapeOutside();
switch (shapeOutsideValue->GetUnit()) {
case eCSSUnit_Null:
break;
case eCSSUnit_None:
case eCSSUnit_Initial:
case eCSSUnit_Unset:
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -3635,16 +3635,17 @@ nsStyleDisplay::nsStyleDisplay(const nsP
, mAnimationTimingFunctionCount(1)
, mAnimationDurationCount(1)
, mAnimationDelayCount(1)
, mAnimationNameCount(1)
, mAnimationDirectionCount(1)
, mAnimationFillModeCount(1)
, mAnimationPlayStateCount(1)
, mAnimationIterationCountCount(1)
+ , mShapeMargin(0, nsStyleCoord::CoordConstructor)
{
MOZ_COUNT_CTOR(nsStyleDisplay);
// Initial value for mScrollSnapDestination is "0px 0px"
mScrollSnapDestination.SetInitialZeroValues();
mTransitions[0].SetInitialValues();
mAnimations[0].SetInitialValues();
@@ -3708,16 +3709,17 @@ nsStyleDisplay::nsStyleDisplay(const nsS
, mAnimationDurationCount(aSource.mAnimationDurationCount)
, mAnimationDelayCount(aSource.mAnimationDelayCount)
, mAnimationNameCount(aSource.mAnimationNameCount)
, mAnimationDirectionCount(aSource.mAnimationDirectionCount)
, mAnimationFillModeCount(aSource.mAnimationFillModeCount)
, mAnimationPlayStateCount(aSource.mAnimationPlayStateCount)
, mAnimationIterationCountCount(aSource.mAnimationIterationCountCount)
, mShapeImageThreshold(aSource.mShapeImageThreshold)
+ , mShapeMargin(aSource.mShapeMargin)
, mShapeOutside(aSource.mShapeOutside)
{
MOZ_COUNT_CTOR(nsStyleDisplay);
}
static
void ReleaseSharedListOnMainThread(const char* aName,
@@ -3857,35 +3859,36 @@ nsStyleDisplay::CalcDifference(const nsS
*/
if (mFloat != aNewData.mFloat) {
// Changing which side we're floating on (float:none was handled above).
hint |= nsChangeHint_ReflowHintsForFloatAreaChange;
}
if (mShapeOutside != aNewData.mShapeOutside ||
+ mShapeMargin != aNewData.mShapeMargin ||
mShapeImageThreshold != aNewData.mShapeImageThreshold) {
if (aNewData.mFloat != StyleFloat::None) {
- // If we are floating, and our shape-outside or shape-image-threshold
- // are changed, our descendants are not impacted, but our ancestor and
- // siblings are.
+ // If we are floating, and our shape-outside or or shape-margin
+ // or shape-image-threshold are changed, our descendants are not
+ // impacted, but our ancestor and siblings are.
//
// This is similar to a float-only change, but since the ISize of the
// float area changes arbitrarily along its block axis, more is required
// to get the siblings to adjust properly. Hinting overflow change is
// sufficient to trigger the correct calculation, but may be too
// heavyweight.
// XXX What is the minimum hint to ensure mShapeInfo is regenerated in
// the next reflow?
hint |= nsChangeHint_ReflowHintsForFloatAreaChange |
nsChangeHint_CSSOverflowChange;
} else {
- // shape-outside or shape-image-threshold changed, but we don't need
- // to reflow because we're not floating.
+ // shape-outside or shape-margin or shape-image-threshold changed,
+ // but we don't need to reflow because we're not floating.
hint |= nsChangeHint_NeutralChange;
}
}
if (mVerticalAlign != aNewData.mVerticalAlign) {
// XXX Can this just be AllReflowHints + RepaintFrame, and be included in
// the block below?
hint |= NS_STYLE_HINT_REFLOW;
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -2543,16 +2543,19 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsSt
const nsTimingFunction& GetAnimationTimingFunction(uint32_t aIndex) const
{
return mAnimations[aIndex % mAnimationTimingFunctionCount].GetTimingFunction();
}
// The threshold used for extracting a shape from shape-outside: <image>.
float mShapeImageThreshold = 0.0f; // [reset]
+ // The margin around a shape-outside: <image>.
+ nsStyleCoord mShapeMargin;
+
mozilla::StyleShapeSource mShapeOutside; // [reset]
bool IsBlockInsideStyle() const {
return mozilla::StyleDisplay::Block == mDisplay ||
mozilla::StyleDisplay::ListItem == mDisplay ||
mozilla::StyleDisplay::InlineBlock == mDisplay ||
mozilla::StyleDisplay::TableCaption == mDisplay ||
mozilla::StyleDisplay::FlowRoot == mDisplay;