Bug 1097499 part 4 - Adjust computed value of writing-mode on text frames when text-combine-upright is used. r=heycam
MozReview-Commit-ID: KNRe0ZpzxGr
--- a/layout/base/RestyleManager.cpp
+++ b/layout/base/RestyleManager.cpp
@@ -3663,16 +3663,24 @@ ElementRestyler::ComputeRestyleResultFro
if (oldContext->IsInDisplayNoneSubtree() !=
aNewContext->IsInDisplayNoneSubtree()) {
LOG_RESTYLE_CONTINUE("NS_STYLE_IN_DISPLAY_NONE_SUBTREE differs between old"
" and new style contexts");
aRestyleResult = eRestyleResult_Continue;
aCanStopWithStyleChange = false;
return;
}
+
+ if (oldContext->IsTextCombined() != aNewContext->IsTextCombined()) {
+ LOG_RESTYLE_CONTINUE("NS_STYLE_IS_TEXT_COMBINED differs between "
+ "old and new style contexts");
+ aRestyleResult = eRestyleResult_Continue;
+ aCanStopWithStyleChange = false;
+ return;
+ }
}
bool
ElementRestyler::SelectorMatchesForRestyle(Element* aElement)
{
if (!aElement) {
return false;
}
--- a/layout/style/nsStyleContext.cpp
+++ b/layout/style/nsStyleContext.cpp
@@ -637,16 +637,34 @@ ShouldBlockifyChildren(const nsStyleDisp
}
void
nsStyleContext::ApplyStyleFixups(bool aSkipParentDisplayBasedStyleFixup)
{
#define GET_UNIQUE_STYLE_DATA(name_) \
static_cast<nsStyle##name_*>(GetUniqueStyleData(eStyleStruct_##name_))
+ // Change writing mode of text frame for text-combine-upright. We use
+ // style structs of the parent to avoid triggering computation before
+ // we change the writing mode.
+ // It is safe to look at the parent's style because we are looking at
+ // inherited properties, and ::-moz-text never matches any rules.
+ if (mPseudoTag == nsCSSAnonBoxes::mozText && mParent &&
+ mParent->StyleVisibility()->mWritingMode !=
+ NS_STYLE_WRITING_MODE_HORIZONTAL_TB &&
+ mParent->StyleText()->mTextCombineUpright ==
+ NS_STYLE_TEXT_COMBINE_UPRIGHT_ALL) {
+ MOZ_ASSERT(!PeekStyleVisibility(), "If StyleVisibility was already "
+ "computed, some properties may have been computed "
+ "incorrectly based on the old writing mode value");
+ nsStyleVisibility* mutableVis = GET_UNIQUE_STYLE_DATA(Visibility);
+ mutableVis->mWritingMode = NS_STYLE_WRITING_MODE_HORIZONTAL_TB;
+ AddStyleBit(NS_STYLE_IS_TEXT_COMBINED);
+ }
+
// See if we have any text decorations.
// First see if our parent has text decorations. If our parent does, then we inherit the bit.
if (mParent && mParent->HasTextDecorationLines()) {
mBits |= NS_STYLE_HAS_TEXT_DECORATION_LINES;
} else {
// We might have defined a decoration.
if (StyleTextReset()->HasTextDecorationLines()) {
mBits |= NS_STYLE_HAS_TEXT_DECORATION_LINES;
--- a/layout/style/nsStyleContext.h
+++ b/layout/style/nsStyleContext.h
@@ -204,16 +204,21 @@ public:
// instead of this method.
bool ShouldSuppressLineBreak() const
{ return !!(mBits & NS_STYLE_SUPPRESS_LINEBREAK); }
// Does this style context or any of its ancestors have display:none set?
bool IsInDisplayNoneSubtree() const
{ return !!(mBits & NS_STYLE_IN_DISPLAY_NONE_SUBTREE); }
+ // Is this horizontal-in-vertical (tate-chu-yoko) text? This flag is
+ // only set on style contexts whose pseudo is nsCSSAnonBoxes::mozText.
+ bool IsTextCombined() const
+ { return !!(mBits & NS_STYLE_IS_TEXT_COMBINED); }
+
// Does this style context represent the style for a pseudo-element or
// inherit data from such a style context? Whether this returns true
// is equivalent to whether it or any of its ancestors returns
// non-null for GetPseudo.
bool HasPseudoElementData() const
{ return !!(mBits & NS_STYLE_HAS_PSEUDO_ELEMENT_DATA); }
bool HasChildThatUsesResetStyle() const
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -77,18 +77,20 @@ struct nsStyleVisibility;
// See nsStyleContext::ShouldSuppressLineBreak
#define NS_STYLE_SUPPRESS_LINEBREAK 0x080000000
// See nsStyleContext::IsInDisplayNoneSubtree
#define NS_STYLE_IN_DISPLAY_NONE_SUBTREE 0x100000000
// See nsStyleContext::FindChildWithRules
#define NS_STYLE_INELIGIBLE_FOR_SHARING 0x200000000
// See nsStyleContext::HasChildThatUsesResetStyle
#define NS_STYLE_HAS_CHILD_THAT_USES_RESET_STYLE 0x400000000
+// See nsStyleContext::IsTextCombined
+#define NS_STYLE_IS_TEXT_COMBINED 0x800000000
// See nsStyleContext::GetPseudoEnum
-#define NS_STYLE_CONTEXT_TYPE_SHIFT 35
+#define NS_STYLE_CONTEXT_TYPE_SHIFT 36
// Additional bits for nsRuleNode's mDependentBits:
#define NS_RULE_NODE_IS_ANIMATION_RULE 0x01000000
// Free bit 0x02000000
#define NS_RULE_NODE_USED_DIRECTLY 0x04000000
#define NS_RULE_NODE_IS_IMPORTANT 0x08000000
#define NS_RULE_NODE_LEVEL_MASK 0xf0000000
#define NS_RULE_NODE_LEVEL_SHIFT 28