Bug 1363805 - Part 2: Add a flag to note that a child has LaterSiblings hint. r=heycam

This flag is only used by nsComputedDOMStyle.

MozReview-Commit-ID: 2EzIYXCt5Rj

--HG--
extra : rebase_source : 2a61c6bd8b6005a24c641e31a77951bcd1dff56f
This commit is contained in:
Wei-Cheng Pan 2017-09-13 16:47:03 +08:00
parent 5e7583d760
commit 619e849e4c
3 changed files with 20 additions and 3 deletions

View File

@ -139,6 +139,11 @@ enum {
// restyle hint.
ELEMENT_IS_CONDITIONAL_RESTYLE_ANCESTOR = ELEMENT_FLAG_BIT(4),
// Set if a child element has later-sibling restyle hint. This is needed for
// nsComputedDOMStyle to decide when should we need to flush style (only used
// in Gecko).
ELEMENT_HAS_CHILD_WITH_LATER_SIBLINGS_HINT = ELEMENT_FLAG_BIT(5),
// Just the HAS_PENDING bits, for convenience
ELEMENT_PENDING_RESTYLE_FLAGS =
ELEMENT_HAS_PENDING_RESTYLE |
@ -154,8 +159,6 @@ enum {
ELEMENT_POTENTIAL_RESTYLE_ROOT_FLAGS |
ELEMENT_IS_CONDITIONAL_RESTYLE_ANCESTOR,
// ELEMENT_FLAG_BIT(5) is currently unused
// Remaining bits are for subclasses
ELEMENT_TYPE_SPECIFIC_BITS_OFFSET = NODE_TYPE_SPECIFIC_BITS_OFFSET + 6
};
@ -1815,7 +1818,8 @@ inline const mozilla::dom::Element* nsINode::AsElement() const
inline void nsINode::UnsetRestyleFlagsIfGecko()
{
if (IsElement() && !AsElement()->IsStyledByServo()) {
UnsetFlags(ELEMENT_ALL_RESTYLE_FLAGS);
UnsetFlags(ELEMENT_ALL_RESTYLE_FLAGS |
ELEMENT_HAS_CHILD_WITH_LATER_SIBLINGS_HINT);
}
}

View File

@ -207,6 +207,10 @@ RestyleTracker::DoProcessRestyles()
NS_ASSERTION(found, "Where did our entry go?");
data->mRestyleHint =
nsRestyleHint(data->mRestyleHint & ~eRestyle_LaterSiblings);
if (Element* parent = element->GetFlattenedTreeParentElement()) {
parent->UnsetFlags(ELEMENT_HAS_CHILD_WITH_LATER_SIBLINGS_HINT);
}
}
LOG_RESTYLE("%d pending restyles after expanding out "

View File

@ -356,6 +356,15 @@ RestyleTracker::AddPendingRestyle(Element* aElement,
}
}
// If we need to restyle later siblings, we will need a flag on parent to note
// that some children need restyle for nsComputedDOMStyle.
if (aRestyleHint & eRestyle_LaterSiblings) {
nsIContent* parent = aElement->GetFlattenedTreeParent();
if (parent && parent->IsElement()) {
parent->SetFlags(ELEMENT_HAS_CHILD_WITH_LATER_SIBLINGS_HINT);
}
}
mHaveLaterSiblingRestyles =
mHaveLaterSiblingRestyles || (aRestyleHint & eRestyle_LaterSiblings) != 0;
return hadRestyleLaterSiblings;