mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-07 00:08:39 +09:00
Issue #1673 - Part 1: Allow tab-size to accept <length>.
Currently -moz-tab-size only accepts <number> values, and both Chrome and Firefox currently support <length> 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.
This commit is contained in:
parent
b28dba9f03
commit
633d50eb3f
7 changed files with 124 additions and 62 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue