Bug 1292618: Specialize ServoStyleSet::ResolveStyleForText to take into account generated nodes. r=heycam

Eventually, we might want to use the same mechanism that Gecko uses directly,
and stop styling text nodes from Servo.

This would have the benefit of removing the "stash the change on the parent"
thing.

MozReview-Commit-ID: IOxNR05jkh
Signed-off-by: Emilio Cobos Álvarez <ecoal95@gmail.com>
This commit is contained in:
Emilio Cobos Álvarez 2016-08-12 11:30:29 -07:00
Родитель 6ca7e9e4f1
Коммит 84de3367d5
1 изменённых файлов: 38 добавлений и 4 удалений

Просмотреть файл

@ -96,7 +96,8 @@ ServoStyleSet::GetContext(nsIContent* aContent,
nsIAtom* aPseudoTag,
CSSPseudoElementType aPseudoType)
{
RefPtr<ServoComputedValues> computedValues = Servo_GetComputedValues(aContent).Consume();
RefPtr<ServoComputedValues> computedValues =
Servo_GetComputedValues(aContent).Consume();
MOZ_ASSERT(computedValues);
return GetContext(computedValues.forget(), aParentContext, aPseudoTag, aPseudoType);
}
@ -133,8 +134,40 @@ ServoStyleSet::ResolveStyleForText(nsIContent* aTextNode,
nsStyleContext* aParentContext)
{
MOZ_ASSERT(aTextNode && aTextNode->IsNodeOfType(nsINode::eTEXT));
return GetContext(aTextNode, aParentContext, nsCSSAnonBoxes::mozText,
CSSPseudoElementType::AnonBox);
MOZ_ASSERT(aTextNode->GetParent());
nsIContent* parent = aTextNode->GetParent();
nsIAtom* parentName = parent->NodeInfo()->NameAtom();
// If this text node is a child of a generated content node, it'll never have
// been traversed by Servo, and thus isn't styled.
//
// We inherit the style from the parent here, but also taking into account
// that only the frame of the parent has the correct style, given we take it
// from the map, and the content hasn't also being traversed from Servo.
//
// Otherwise, we rely on the fact that this text node should have been
// traversed by servo to just grab the computed values as appropriate.
//
// TODO: We might want to just do this and skip styling nodes entirely from
// Servo. This would accidentally fix the issue of having to stash
// change-hints from children in the parent element just because of inherited
// style struct changes.
RefPtr<ServoComputedValues> computedValues;
if (parent->IsRootOfAnonymousSubtree() &&
(parentName == nsGkAtoms::mozgeneratedcontentbefore ||
parentName == nsGkAtoms::mozgeneratedcontentafter)) {
MOZ_ASSERT(aParentContext);
ServoComputedValues* parentComputedValues =
aParentContext->StyleSource().AsServoComputedValues();
computedValues =
Servo_InheritComputedValues(parentComputedValues).Consume();
} else {
computedValues = Servo_GetComputedValues(aTextNode).Consume();
}
return GetContext(computedValues.forget(), aParentContext,
nsCSSAnonBoxes::mozText, CSSPseudoElementType::AnonBox);
}
already_AddRefed<nsStyleContext>
@ -144,7 +177,8 @@ ServoStyleSet::ResolveStyleForOtherNonElement(nsStyleContext* aParentContext)
// with the root of an anonymous subtree.
ServoComputedValues* parent =
aParentContext ? aParentContext->StyleSource().AsServoComputedValues() : nullptr;
RefPtr<ServoComputedValues> computedValues = Servo_InheritComputedValues(parent).Consume();
RefPtr<ServoComputedValues> computedValues =
Servo_InheritComputedValues(parent).Consume();
MOZ_ASSERT(computedValues);
return GetContext(computedValues.forget(), aParentContext,