--- a/devtools/shared/css/generated/properties-db.js
+++ b/devtools/shared/css/generated/properties-db.js
@@ -3040,16 +3040,17 @@ exports.CSS_PROPERTIES = {
"text-decoration-color",
"text-decoration-line",
"text-decoration-style",
"text-emphasis-color",
"text-emphasis-position",
"text-emphasis-style",
"-webkit-text-fill-color",
"text-indent",
+ "text-justify",
"text-orientation",
"text-overflow",
"text-rendering",
"text-shadow",
"-moz-text-size-adjust",
"-webkit-text-stroke-color",
"-webkit-text-stroke-width",
"text-transform",
@@ -9482,16 +9483,20 @@ exports.PREFERENCES = [
"text-combine-upright",
"layout.css.text-combine-upright.enabled"
],
[
"-webkit-text-fill-color",
"layout.css.prefixes.webkit"
],
[
+ "text-justify",
+ "layout.css.text-justify.enabled"
+ ],
+ [
"-webkit-text-stroke",
"layout.css.prefixes.webkit"
],
[
"-webkit-text-stroke-color",
"layout.css.prefixes.webkit"
],
[
--- a/dom/ipc/ContentPrefs.cpp
+++ b/dom/ipc/ContentPrefs.cpp
@@ -136,16 +136,17 @@ const char* mozilla::dom::ContentPrefs::
"layout.css.scope-pseudo.enabled",
"layout.css.scroll-behavior.property-enabled",
"layout.css.scroll-snap.enabled",
"layout.css.servo.enabled",
"layout.css.shape-outside.enabled",
"layout.css.text-align-unsafe-value.enabled",
"layout.css.text-combine-upright-digits.enabled",
"layout.css.text-combine-upright.enabled",
+ "layout.css.text-justify.enabled",
"layout.css.touch_action.enabled",
"layout.css.unprefixing-service.enabled",
"layout.css.unprefixing-service.globally-whitelisted",
"layout.css.unprefixing-service.include-test-domains",
"layout.css.variables.enabled",
"layout.css.visited_links_enabled",
"layout.idle_period.required_quiescent_frames",
"layout.idle_period.time_limit",
--- a/layout/style/nsCSSKeywordList.h
+++ b/layout/style/nsCSSKeywordList.h
@@ -230,16 +230,17 @@ CSS_KEY(diagonal-fractions, diagonal_fra
CSS_KEY(dialog, dialog)
CSS_KEY(difference, difference)
CSS_KEY(digits, digits)
CSS_KEY(disabled, disabled)
CSS_KEY(disc, disc)
CSS_KEY(disclosure-closed, disclosure_closed)
CSS_KEY(disclosure-open, disclosure_open)
CSS_KEY(discretionary-ligatures, discretionary_ligatures)
+CSS_KEY(distribute, distribute)
CSS_KEY(dot, dot)
CSS_KEY(dotted, dotted)
CSS_KEY(double, double)
CSS_KEY(double-circle, double_circle)
CSS_KEY(double-struck, double_struck)
CSS_KEY(drag, drag)
CSS_KEY(drop-shadow, drop_shadow)
CSS_KEY(e-resize, e_resize)
@@ -326,17 +327,18 @@ CSS_KEY(inline-axis, inline_axis)
CSS_KEY(inline-block, inline_block)
CSS_KEY(inline-end, inline_end)
CSS_KEY(inline-flex, inline_flex)
CSS_KEY(inline-grid, inline_grid)
CSS_KEY(inline-start, inline_start)
CSS_KEY(inline-table, inline_table)
CSS_KEY(inset, inset)
CSS_KEY(inside, inside)
-// CSS_KEY(inter-character, inter_character) // TODO see bug 1055672
+CSS_KEY(inter-character, inter_character)
+CSS_KEY(inter-word, inter_word)
CSS_KEY(interpolatematrix, interpolatematrix)
CSS_KEY(accumulatematrix, accumulatematrix)
CSS_KEY(intersect, intersect)
CSS_KEY(isolate, isolate)
CSS_KEY(isolate-override, isolate_override)
CSS_KEY(invert, invert)
CSS_KEY(italic, italic)
CSS_KEY(japanese-formal, japanese_formal)
--- a/layout/style/nsCSSPropList.h
+++ b/layout/style/nsCSSPropList.h
@@ -4047,16 +4047,27 @@ CSS_PROP_TEXT(
CSS_PROPERTY_PARSE_VALUE |
CSS_PROPERTY_STORES_CALC |
CSS_PROPERTY_UNITLESS_LENGTH_QUIRK,
"",
VARIANT_HLP | VARIANT_CALC,
nullptr,
offsetof(nsStyleText, mTextIndent),
eStyleAnimType_Coord)
+CSS_PROP_TEXT(
+ text-justify,
+ text_justify,
+ TextJustify,
+ CSS_PROPERTY_PARSE_VALUE |
+ CSS_PROPERTY_APPLIES_TO_PLACEHOLDER,
+ "layout.css.text-justify.enabled",
+ VARIANT_HK,
+ kTextJustifyKTable,
+ CSS_PROP_NO_OFFSET,
+ eStyleAnimType_Discrete)
CSS_PROP_VISIBILITY(
text-orientation,
text_orientation,
TextOrientation,
CSS_PROPERTY_PARSE_VALUE,
"",
VARIANT_HK,
kTextOrientationKTable,
--- a/layout/style/nsCSSProps.cpp
+++ b/layout/style/nsCSSProps.cpp
@@ -1995,16 +1995,27 @@ KTableEntry nsCSSProps::kTextAlignLastKT
{ eCSSKeyword_center, NS_STYLE_TEXT_ALIGN_CENTER },
{ eCSSKeyword_justify, NS_STYLE_TEXT_ALIGN_JUSTIFY },
{ eCSSKeyword_start, NS_STYLE_TEXT_ALIGN_START },
{ eCSSKeyword_end, NS_STYLE_TEXT_ALIGN_END },
{ eCSSKeyword_unsafe, NS_STYLE_TEXT_ALIGN_UNSAFE },
{ eCSSKeyword_UNKNOWN, -1 }
};
+const KTableEntry nsCSSProps::kTextJustifyKTable[] = {
+ { eCSSKeyword_none, StyleTextJustify::None },
+ { eCSSKeyword_auto, StyleTextJustify::Auto },
+ { eCSSKeyword_inter_word, StyleTextJustify::InterWord },
+ { eCSSKeyword_inter_character, StyleTextJustify::InterCharacter },
+ // For legacy reasons, UAs must also support the keyword "distribute" with
+ // the exact same meaning and behavior as "inter-character".
+ { eCSSKeyword_distribute, StyleTextJustify::InterCharacter },
+ { eCSSKeyword_UNKNOWN, -1 }
+};
+
const KTableEntry nsCSSProps::kTextCombineUprightKTable[] = {
{ eCSSKeyword_none, NS_STYLE_TEXT_COMBINE_UPRIGHT_NONE },
{ eCSSKeyword_all, NS_STYLE_TEXT_COMBINE_UPRIGHT_ALL },
{ eCSSKeyword_digits, NS_STYLE_TEXT_COMBINE_UPRIGHT_DIGITS_2 }, // w/o number ==> 2
{ eCSSKeyword_UNKNOWN, -1 }
};
const KTableEntry nsCSSProps::kTextDecorationLineKTable[] = {
--- a/layout/style/nsCSSProps.h
+++ b/layout/style/nsCSSProps.h
@@ -842,16 +842,17 @@ public:
static KTableEntry kTextAlignKTable[];
static KTableEntry kTextAlignLastKTable[];
static const KTableEntry kTextCombineUprightKTable[];
static const KTableEntry kTextDecorationLineKTable[];
static const KTableEntry kTextDecorationStyleKTable[];
static const KTableEntry kTextEmphasisPositionKTable[];
static const KTableEntry kTextEmphasisStyleFillKTable[];
static const KTableEntry kTextEmphasisStyleShapeKTable[];
+ static const KTableEntry kTextJustifyKTable[];
static const KTableEntry kTextOrientationKTable[];
static const KTableEntry kTextOverflowKTable[];
static const KTableEntry kTextSizeAdjustKTable[];
static const KTableEntry kTextTransformKTable[];
static const KTableEntry kTouchActionKTable[];
static const KTableEntry kTopLayerKTable[];
static const KTableEntry kTransformBoxKTable[];
static const KTableEntry kTransitionTimingFunctionKTable[];
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -4045,16 +4045,26 @@ already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetTextIndent()
{
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
SetValueToCoord(val, StyleText()->mTextIndent, false);
return val.forget();
}
already_AddRefed<CSSValue>
+nsComputedDOMStyle::DoGetTextJustify()
+{
+ RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
+ val->SetIdent(
+ nsCSSProps::ValueToKeywordEnum(StyleText()->mTextJustify,
+ nsCSSProps::kTextJustifyKTable));
+ return val.forget();
+}
+
+already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetTextOrientation()
{
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
val->SetIdent(
nsCSSProps::ValueToKeywordEnum(StyleVisibility()->mTextOrientation,
nsCSSProps::kTextOrientationKTable));
return val.forget();
}
--- a/layout/style/nsComputedDOMStyle.h
+++ b/layout/style/nsComputedDOMStyle.h
@@ -429,16 +429,17 @@ private:
already_AddRefed<CSSValue> DoGetTextDecoration();
already_AddRefed<CSSValue> DoGetTextDecorationColor();
already_AddRefed<CSSValue> DoGetTextDecorationLine();
already_AddRefed<CSSValue> DoGetTextDecorationStyle();
already_AddRefed<CSSValue> DoGetTextEmphasisColor();
already_AddRefed<CSSValue> DoGetTextEmphasisPosition();
already_AddRefed<CSSValue> DoGetTextEmphasisStyle();
already_AddRefed<CSSValue> DoGetTextIndent();
+ already_AddRefed<CSSValue> DoGetTextJustify();
already_AddRefed<CSSValue> DoGetTextOrientation();
already_AddRefed<CSSValue> DoGetTextOverflow();
already_AddRefed<CSSValue> DoGetTextShadow();
already_AddRefed<CSSValue> DoGetTextSizeAdjust();
already_AddRefed<CSSValue> DoGetTextTransform();
already_AddRefed<CSSValue> DoGetLetterSpacing();
already_AddRefed<CSSValue> DoGetWordSpacing();
already_AddRefed<CSSValue> DoGetWhiteSpace();
--- a/layout/style/nsComputedDOMStylePropertyList.h
+++ b/layout/style/nsComputedDOMStylePropertyList.h
@@ -236,16 +236,17 @@ COMPUTED_STYLE_PROP(text_decoration,
COMPUTED_STYLE_PROP(text_decoration_color, TextDecorationColor)
COMPUTED_STYLE_PROP(text_decoration_line, TextDecorationLine)
COMPUTED_STYLE_PROP(text_decoration_style, TextDecorationStyle)
//// COMPUTED_STYLE_PROP(text_emphasis, TextEmphasis)
COMPUTED_STYLE_PROP(text_emphasis_color, TextEmphasisColor)
COMPUTED_STYLE_PROP(text_emphasis_position, TextEmphasisPosition)
COMPUTED_STYLE_PROP(text_emphasis_style, TextEmphasisStyle)
COMPUTED_STYLE_PROP(text_indent, TextIndent)
+COMPUTED_STYLE_PROP(text_justify, TextJustify)
COMPUTED_STYLE_PROP(text_orientation, TextOrientation)
COMPUTED_STYLE_PROP(text_overflow, TextOverflow)
COMPUTED_STYLE_PROP(text_shadow, TextShadow)
COMPUTED_STYLE_PROP(text_transform, TextTransform)
COMPUTED_STYLE_PROP(top, Top)
COMPUTED_STYLE_PROP(touch_action, TouchAction)
COMPUTED_STYLE_PROP(transform, Transform)
COMPUTED_STYLE_PROP(transform_box, TransformBox)
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -1444,16 +1444,17 @@ struct SetEnumValueHelper
DEFINE_ENUM_CLASS_SETTER(StyleBoxOrient, Horizontal, Vertical)
DEFINE_ENUM_CLASS_SETTER(StyleBoxPack, Start, Justify)
DEFINE_ENUM_CLASS_SETTER(StyleBoxSizing, Content, Border)
DEFINE_ENUM_CLASS_SETTER(StyleClear, None, Both)
DEFINE_ENUM_CLASS_SETTER(StyleFillRule, Nonzero, Evenodd)
DEFINE_ENUM_CLASS_SETTER(StyleFloat, None, InlineEnd)
DEFINE_ENUM_CLASS_SETTER(StyleFloatEdge, ContentBox, MarginBox)
DEFINE_ENUM_CLASS_SETTER(StyleHyphens, None, Auto)
+ DEFINE_ENUM_CLASS_SETTER(StyleTextJustify, None, InterCharacter)
DEFINE_ENUM_CLASS_SETTER(StyleUserFocus, None, SelectMenu)
DEFINE_ENUM_CLASS_SETTER(StyleUserSelect, None, MozText)
DEFINE_ENUM_CLASS_SETTER(StyleUserInput, None, Auto)
DEFINE_ENUM_CLASS_SETTER(StyleUserModify, ReadOnly, WriteOnly)
DEFINE_ENUM_CLASS_SETTER(StyleWindowDragging, Default, NoDrag)
DEFINE_ENUM_CLASS_SETTER(StyleOrient, Inline, Vertical)
#ifdef MOZ_XUL
DEFINE_ENUM_CLASS_SETTER(StyleDisplay, None, MozPopup)
@@ -4871,16 +4872,22 @@ nsRuleNode::ComputeTextData(void* aStart
NS_STYLE_TEXT_ALIGN_AUTO);
// text-indent: length, percent, calc, inherit, initial
SetCoord(*aRuleData->ValueForTextIndent(), text->mTextIndent, parentText->mTextIndent,
SETCOORD_LPH | SETCOORD_INITIAL_ZERO | SETCOORD_STORE_CALC |
SETCOORD_UNSET_INHERIT,
aContext, mPresContext, conditions);
+ // text-justify: enum, inherit, initial
+ SetValue(*aRuleData->ValueForTextJustify(), text->mTextJustify, conditions,
+ SETVAL_ENUMERATED | SETVAL_UNSET_INHERIT,
+ parentText->mTextJustify,
+ StyleTextJustify::Auto);
+
// text-transform: enum, inherit, initial
SetValue(*aRuleData->ValueForTextTransform(), text->mTextTransform, conditions,
SETVAL_ENUMERATED | SETVAL_UNSET_INHERIT,
parentText->mTextTransform,
NS_STYLE_TEXT_TRANSFORM_NONE);
// white-space: enum, inherit, initial
SetValue(*aRuleData->ValueForWhiteSpace(), text->mWhiteSpace, conditions,
--- a/layout/style/nsStyleConsts.h
+++ b/layout/style/nsStyleConsts.h
@@ -153,16 +153,24 @@ enum class StyleShapeRadius : uint8_t {
// Shape source type
enum class StyleShapeSourceType : uint8_t {
None,
URL,
Shape,
Box,
};
+// text-justify
+enum class StyleTextJustify : uint8_t {
+ None,
+ Auto,
+ InterWord,
+ InterCharacter,
+};
+
// user-focus
enum class StyleUserFocus : uint8_t {
None,
Ignore,
Normal,
SelectAll,
SelectBefore,
SelectAfter,
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -3841,16 +3841,17 @@ AreShadowArraysEqual(nsCSSShadowArray* l
// nsStyleText
//
nsStyleText::nsStyleText(const nsPresContext* aContext)
: mTextAlign(NS_STYLE_TEXT_ALIGN_START)
, mTextAlignLast(NS_STYLE_TEXT_ALIGN_AUTO)
, mTextAlignTrue(false)
, mTextAlignLastTrue(false)
+ , mTextJustify(StyleTextJustify::Auto)
, mTextTransform(NS_STYLE_TEXT_TRANSFORM_NONE)
, mWhiteSpace(NS_STYLE_WHITESPACE_NORMAL)
, mWordBreak(NS_STYLE_WORDBREAK_NORMAL)
, mOverflowWrap(NS_STYLE_OVERFLOWWRAP_NORMAL)
, mHyphens(StyleHyphens::Manual)
, mRubyAlign(NS_STYLE_RUBY_ALIGN_SPACE_AROUND)
, mRubyPosition(NS_STYLE_RUBY_POSITION_OVER)
, mTextSizeAdjust(NS_STYLE_TEXT_SIZE_ADJUST_AUTO)
@@ -3877,16 +3878,17 @@ nsStyleText::nsStyleText(const nsPresCon
NS_STYLE_TEXT_EMPHASIS_POSITION_DEFAULT;
}
nsStyleText::nsStyleText(const nsStyleText& aSource)
: mTextAlign(aSource.mTextAlign)
, mTextAlignLast(aSource.mTextAlignLast)
, mTextAlignTrue(false)
, mTextAlignLastTrue(false)
+ , mTextJustify(aSource.mTextJustify)
, mTextTransform(aSource.mTextTransform)
, mWhiteSpace(aSource.mWhiteSpace)
, mWordBreak(aSource.mWordBreak)
, mOverflowWrap(aSource.mOverflowWrap)
, mHyphens(aSource.mHyphens)
, mRubyAlign(aSource.mRubyAlign)
, mRubyPosition(aSource.mRubyPosition)
, mTextSizeAdjust(aSource.mTextSizeAdjust)
@@ -3939,16 +3941,17 @@ nsStyleText::CalcDifference(const nsStyl
(mOverflowWrap != aNewData.mOverflowWrap) ||
(mHyphens != aNewData.mHyphens) ||
(mRubyAlign != aNewData.mRubyAlign) ||
(mRubyPosition != aNewData.mRubyPosition) ||
(mTextSizeAdjust != aNewData.mTextSizeAdjust) ||
(mLetterSpacing != aNewData.mLetterSpacing) ||
(mLineHeight != aNewData.mLineHeight) ||
(mTextIndent != aNewData.mTextIndent) ||
+ (mTextJustify != aNewData.mTextJustify) ||
(mWordSpacing != aNewData.mWordSpacing) ||
(mTabSize != aNewData.mTabSize)) {
return NS_STYLE_HINT_REFLOW;
}
if (HasTextEmphasis() != aNewData.HasTextEmphasis() ||
(HasTextEmphasis() &&
mTextEmphasisPosition != aNewData.mTextEmphasisPosition)) {
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -2097,16 +2097,17 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsSt
nsChangeHint_ReflowChangesSizeOrPosition |
nsChangeHint_ClearAncestorIntrinsics;
}
uint8_t mTextAlign; // [inherited] see nsStyleConsts.h
uint8_t mTextAlignLast; // [inherited] see nsStyleConsts.h
bool mTextAlignTrue : 1; // [inherited] see nsStyleConsts.h
bool mTextAlignLastTrue : 1; // [inherited] see nsStyleConsts.h
+ mozilla::StyleTextJustify mTextJustify; // [inherited]
uint8_t mTextTransform; // [inherited] see nsStyleConsts.h
uint8_t mWhiteSpace; // [inherited] see nsStyleConsts.h
uint8_t mWordBreak; // [inherited] see nsStyleConsts.h
uint8_t mOverflowWrap; // [inherited] see nsStyleConsts.h
mozilla::StyleHyphens mHyphens; // [inherited] see nsStyleConsts.h
uint8_t mRubyAlign; // [inherited] see nsStyleConsts.h
uint8_t mRubyPosition; // [inherited] see nsStyleConsts.h
uint8_t mTextSizeAdjust; // [inherited] see nsStyleConsts.h
--- a/layout/style/test/property_database.js
+++ b/layout/style/test/property_database.js
@@ -5565,16 +5565,27 @@ if (IsCSSPropertyPrefEnabled("layout.css
"digits 3 all", "digits foo", "digits all", "digits 3.0" ]
};
if (IsCSSPropertyPrefEnabled("layout.css.text-combine-upright-digits.enabled")) {
gCSSProperties["text-combine-upright"].other_values.push(
"digits", "digits 2", "digits 3", "digits 4", "digits 3");
}
}
+if (IsCSSPropertyPrefEnabled("layout.css.text-justify.enabled")) {
+ gCSSProperties["text-justify"] = {
+ domProp: "textJustify",
+ inherited: true,
+ type: CSS_TYPE_LONGHAND,
+ initial_values: [ "auto" ],
+ other_values: [ "none", "inter-word", "inter-character", "distribute" ],
+ invalid_values: []
+ };
+}
+
if (IsCSSPropertyPrefEnabled("layout.css.font-variations.enabled")) {
gCSSProperties["font-variation-settings"] = {
domProp: "fontVariationSettings",
inherited: true,
type: CSS_TYPE_LONGHAND,
initial_values: [ "normal" ],
other_values: [
"'wdth' 0", "'wdth' -.1", "\"wdth\" 1", "'wdth' 2, 'wght' 3", "\"XXXX\" 0"
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -2571,16 +2571,19 @@ pref("layout.css.getBoxQuads.enabled", t
pref("layout.css.convertFromNode.enabled", false);
#else
pref("layout.css.convertFromNode.enabled", true);
#endif
// Is support for CSS "text-align: unsafe X" enabled?
pref("layout.css.text-align-unsafe-value.enabled", false);
+// Is support for CSS text-justify property enabled?
+pref("layout.css.text-justify.enabled", false);
+
// Is support for CSS "float: inline-{start,end}" and
// "clear: inline-{start,end}" enabled?
#if defined(MOZ_B2G) || !defined(RELEASE_OR_BETA)
pref("layout.css.float-logical-values.enabled", true);
#else
pref("layout.css.float-logical-values.enabled", false);
#endif
--- a/testing/profiles/prefs_general.js
+++ b/testing/profiles/prefs_general.js
@@ -183,16 +183,19 @@ user_pref("layout.css.object-fit-and-pos
user_pref("layout.css.prefixes.webkit", true);
// Enable -webkit-{min|max}-device-pixel-ratio media queries for testing
user_pref("layout.css.prefixes.device-pixel-ratio-webkit", true);
// Enable CSS shape-outside for testing
user_pref("layout.css.shape-outside.enabled", true);
+// Enable CSS text-justify for testing
+user_pref("layout.css.text-justify.enabled", true);
+
// Disable spammy layout warnings because they pollute test logs
user_pref("layout.spammy_warnings.enabled", false);
// Enable Media Source Extensions for testing
user_pref("media.mediasource.mp4.enabled", true);
user_pref("media.mediasource.webm.enabled", true);
// Make sure the disk cache doesn't get auto disabled