From 49765b53af01284a5d5479dfb8bb56da0ba87ca5 Mon Sep 17 00:00:00 2001 From: athenian200 Date: Fri, 23 Oct 2020 14:34:55 -0500 Subject: Issue #1673 - Part 1: Allow tab-size to accept . Currently -moz-tab-size only accepts values, and both Chrome and Firefox currently support values and have for some time now. So with this you would be able to support sizes in px or em, for instance. This was implemented in Firefox 53 and was trivial to backport. --- layout/style/nsCSSPropList.h | 2 +- layout/style/nsComputedDOMStyle.cpp | 2 +- layout/style/nsRuleNode.cpp | 96 +++++++++++++++++++++++++--------- layout/style/nsStyleStruct.cpp | 4 +- layout/style/nsStyleStruct.h | 2 +- layout/style/test/property_database.js | 6 ++- 6 files changed, 79 insertions(+), 33 deletions(-) (limited to 'layout/style') diff --git a/layout/style/nsCSSPropList.h b/layout/style/nsCSSPropList.h index 4f79db5a5..5c5cfcda1 100644 --- a/layout/style/nsCSSPropList.h +++ b/layout/style/nsCSSPropList.h @@ -3885,7 +3885,7 @@ CSS_PROP_TEXT( CSS_PROPERTY_PARSE_VALUE | CSS_PROPERTY_VALUE_NONNEGATIVE, "", - VARIANT_HI, + VARIANT_INHERIT | VARIANT_LNCALC, nullptr, offsetof(nsStyleText, mTabSize), eStyleAnimType_Discrete) diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index 080932af2..748f990b7 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -4013,7 +4013,7 @@ already_AddRefed nsComputedDOMStyle::DoGetTabSize() { RefPtr val = new nsROCSSPrimitiveValue; - val->SetNumber(StyleText()->mTabSize); + SetValueToCoord(val, StyleText()->mTabSize, true); return val.forget(); } diff --git a/layout/style/nsRuleNode.cpp b/layout/style/nsRuleNode.cpp index c32369e9b..e41857db7 100644 --- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp @@ -4507,20 +4507,20 @@ TruncateStringToSingleGrapheme(nsAString& aStr) } } -struct LineHeightCalcObj +struct LengthNumberCalcObj { - float mLineHeight; + float LengthNumberCalcObj; bool mIsNumber; }; -struct SetLineHeightCalcOps : public css::NumbersAlreadyNormalizedOps +struct LengthNumberCalcOps : public css::FloatCoeffsAlreadyNormalizedOps { - typedef LineHeightCalcObj result_type; + typedef LengthNumberCalcObj result_type; nsStyleContext* const mStyleContext; nsPresContext* const mPresContext; RuleNodeCacheConditions& mConditions; - SetLineHeightCalcOps(nsStyleContext* aStyleContext, + LengthNumberCalcOps(nsStyleContext* aStyleContext, nsPresContext* aPresContext, RuleNodeCacheConditions& aConditions) : mStyleContext(aStyleContext), @@ -4535,15 +4535,15 @@ struct SetLineHeightCalcOps : public css::NumbersAlreadyNormalizedOps { MOZ_ASSERT(aValue1.mIsNumber == aValue2.mIsNumber); - LineHeightCalcObj result; + LengthNumberCalcObj result; result.mIsNumber = aValue1.mIsNumber; if (aCalcFunction == eCSSUnit_Calc_Plus) { - result.mLineHeight = aValue1.mLineHeight + aValue2.mLineHeight; + result.mValue = aValue1.mValue + aValue2.mValue; return result; } MOZ_ASSERT(aCalcFunction == eCSSUnit_Calc_Minus, "unexpected unit"); - result.mLineHeight = aValue1.mLineHeight - aValue2.mLineHeight; + result.mValue = aValue1.mValue - aValue2.mValue; return result; } @@ -4553,9 +4553,9 @@ struct SetLineHeightCalcOps : public css::NumbersAlreadyNormalizedOps { MOZ_ASSERT(aCalcFunction == eCSSUnit_Calc_Times_L, "unexpected unit"); - LineHeightCalcObj result; + LengthNumberCalcObj result; result.mIsNumber = aValue2.mIsNumber; - result.mLineHeight = aValue1 * aValue2.mLineHeight; + result.mValue = aValue1 * aValue2.mValue; return result; } @@ -4563,39 +4563,69 @@ struct SetLineHeightCalcOps : public css::NumbersAlreadyNormalizedOps MergeMultiplicativeR(nsCSSUnit aCalcFunction, result_type aValue1, float aValue2) { - LineHeightCalcObj result; + LengthNumberCalcObj result; result.mIsNumber = aValue1.mIsNumber; if (aCalcFunction == eCSSUnit_Calc_Times_R) { - result.mLineHeight = aValue1.mLineHeight * aValue2; + result.mValue = aValue1.mValue * aValue2; return result; } MOZ_ASSERT(aCalcFunction == eCSSUnit_Calc_Divided, "unexpected unit"); - result.mLineHeight = aValue1.mLineHeight / aValue2; + result.mValue = aValue1.mValue / aValue2; return result; } result_type ComputeLeafValue(const nsCSSValue& aValue) { - LineHeightCalcObj result; + LengthNumberCalcObj result; if (aValue.IsLengthUnit()) { result.mIsNumber = false; - result.mLineHeight = CalcLength(aValue, mStyleContext, + result.mValue = CalcLength(aValue, mStyleContext, + mPresContext, mConditions); + } + else if (eCSSUnit_Number == aValue.GetUnit()) { + result.mIsNumber = true; + result.mValue = aValue.GetFloatValue(); + } else { + MOZ_ASSERT(false, "unexpected value"); + result.mIsNumber = true; + result.mValue = 1.0f; + } + + return result; + } +}; + +struct SetLineHeightCalcOps : public LengthNumberCalcOps +{ + SetLineHeightCalcOps(nsStyleContext* aStyleContext, + nsPresContext* aPresContext, + RuleNodeCacheConditions& aConditions) + : LengthNumberCalcOps(aStyleContext, aPresContext, aConditions) + { + } + + result_type ComputeLeafValue(const nsCSSValue& aValue) + { + LengthNumberCalcObj result; + if (aValue.IsLengthUnit()) { + result.mIsNumber = false; + result.mValue = CalcLength(aValue, mStyleContext, mPresContext, mConditions); } else if (eCSSUnit_Percent == aValue.GetUnit()) { mConditions.SetUncacheable(); result.mIsNumber = false; nscoord fontSize = mStyleContext->StyleFont()->mFont.size; - result.mLineHeight = fontSize * aValue.GetPercentValue(); + result.mValue = fontSize * aValue.GetPercentValue(); } else if (eCSSUnit_Number == aValue.GetUnit()) { result.mIsNumber = true; - result.mLineHeight = aValue.GetFloatValue(); + result.mValue = aValue.GetFloatValue(); } else { MOZ_ASSERT(false, "unexpected value"); result.mIsNumber = true; - result.mLineHeight = 1.0f; + result.mValue = 1.0f; } return result; @@ -4619,11 +4649,25 @@ nsRuleNode::ComputeTextData(void* aStartStruct, mPresContext, text->*aField, conditions); }; - // tab-size: integer, inherit - SetValue(*aRuleData->ValueForTabSize(), - text->mTabSize, conditions, - SETVAL_INTEGER | SETVAL_UNSET_INHERIT, parentText->mTabSize, - NS_STYLE_TABSIZE_INITIAL); + // tab-size: number, length, calc, inherit + const nsCSSValue* tabSizeValue = aRuleData->ValueForTabSize(); + if (tabSizeValue->GetUnit() == eCSSUnit_Initial) { + text->mTabSize = nsStyleCoord(float(NS_STYLE_TABSIZE_INITIAL), eStyleUnit_Factor); + } else if (eCSSUnit_Calc == tabSizeValue->GetUnit()) { + LengthNumberCalcOps ops(aContext, mPresContext, conditions); + LengthNumberCalcObj obj = css::ComputeCalc(*tabSizeValue, ops); + float value = obj.mValue < 0 ? 0 : obj.mValue; + if (obj.mIsNumber) { + text->mTabSize.SetFactorValue(value); + } else { + text->mTabSize.SetCoordValue( + NSToCoordRoundWithClamp(value)); + } + } else { + SetCoord(*tabSizeValue, text->mTabSize, parentText->mTabSize, + SETCOORD_LH | SETCOORD_FACTOR | SETCOORD_UNSET_INHERIT, + aContext, mPresContext, conditions); + } // letter-spacing: normal, length, inherit SetCoord(*aRuleData->ValueForLetterSpacing(), @@ -4666,12 +4710,12 @@ nsRuleNode::ComputeTextData(void* aStartStruct, } else if (eCSSUnit_Calc == lineHeightValue->GetUnit()) { SetLineHeightCalcOps ops(aContext, mPresContext, conditions); - LineHeightCalcObj obj = css::ComputeCalc(*lineHeightValue, ops); + LengthNumberCalcObj obj = css::ComputeCalc(*lineHeightValue, ops); if (obj.mIsNumber) { - text->mLineHeight.SetFactorValue(obj.mLineHeight); + text->mLineHeight.SetFactorValue(obj.mValue); } else { text->mLineHeight.SetCoordValue( - NSToCoordRoundWithClamp(obj.mLineHeight)); + NSToCoordRoundWithClamp(obj.mValue)); } } else { diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp index c0ea9c256..073cfcd5e 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp @@ -3806,10 +3806,10 @@ nsStyleText::nsStyleText(StyleStructContext aContext) , mControlCharacterVisibility(nsCSSParser::ControlCharVisibilityDefault()) , mTextEmphasisStyle(NS_STYLE_TEXT_EMPHASIS_STYLE_NONE) , mTextRendering(NS_STYLE_TEXT_RENDERING_AUTO) - , mTabSize(NS_STYLE_TABSIZE_INITIAL) , mTextEmphasisColor(StyleComplexColor::CurrentColor()) , mWebkitTextFillColor(StyleComplexColor::CurrentColor()) , mWebkitTextStrokeColor(StyleComplexColor::CurrentColor()) + , mTabSize(float(NS_STYLE_TABSIZE_INITIAL), eStyleUnit_Factor) , mWordSpacing(0, nsStyleCoord::CoordConstructor) , mLetterSpacing(eStyleUnit_Normal) , mLineHeight(eStyleUnit_Normal) @@ -3844,10 +3844,10 @@ nsStyleText::nsStyleText(const nsStyleText& aSource) , mTextEmphasisPosition(aSource.mTextEmphasisPosition) , mTextEmphasisStyle(aSource.mTextEmphasisStyle) , mTextRendering(aSource.mTextRendering) - , mTabSize(aSource.mTabSize) , mTextEmphasisColor(aSource.mTextEmphasisColor) , mWebkitTextFillColor(aSource.mWebkitTextFillColor) , mWebkitTextStrokeColor(aSource.mWebkitTextStrokeColor) + , mTabSize(aSource.mTabSize) , mWordSpacing(aSource.mWordSpacing) , mLetterSpacing(aSource.mLetterSpacing) , mLineHeight(aSource.mLineHeight) diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h index 88000c722..831808edf 100644 --- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h @@ -2087,11 +2087,11 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleText uint8_t mTextEmphasisPosition; // [inherited] see nsStyleConsts.h uint8_t mTextEmphasisStyle; // [inherited] see nsStyleConsts.h uint8_t mTextRendering; // [inherited] see nsStyleConsts.h - int32_t mTabSize; // [inherited] see nsStyleConsts.h mozilla::StyleComplexColor mTextEmphasisColor; // [inherited] mozilla::StyleComplexColor mWebkitTextFillColor; // [inherited] mozilla::StyleComplexColor mWebkitTextStrokeColor; // [inherited] + nsStyleCoord mTabSize; // [inherited] coord, factor, calc nsStyleCoord mWordSpacing; // [inherited] coord, percent, calc nsStyleCoord mLetterSpacing; // [inherited] coord, normal nsStyleCoord mLineHeight; // [inherited] coord, factor, normal diff --git a/layout/style/test/property_database.js b/layout/style/test/property_database.js index d647b5716..5182dd89c 100644 --- a/layout/style/test/property_database.js +++ b/layout/style/test/property_database.js @@ -2032,8 +2032,10 @@ var gCSSProperties = { inherited: true, type: CSS_TYPE_LONGHAND, initial_values: [ "8" ], - other_values: [ "0", "3", "99", "12000" ], - invalid_values: [ "-1", "-808", "3.0", "17.5" ] + other_values: [ "0", "2.5", "3", "99", "12000", "0px", "1em", + "calc(1px + 1em)", "calc(1px - 2px)", "calc(1 + 1)", "calc(-2.5)" ], + invalid_values: [ "9%", "calc(9% + 1px)", "calc(1 + 1em)", "-1", "-808", + "auto" ] }, "-moz-text-size-adjust": { domProp: "MozTextSizeAdjust", -- cgit v1.2.3