Bug 1292618: Specialize ServoStyleSet::ResolveStyleForText to take into account generated nodes. r?heycam draft
authorEmilio Cobos Álvarez <ecoal95@gmail.com>
Fri, 12 Aug 2016 11:30:29 -0700
changeset 401337 408a73703e078035d891efce901a397ffd13925b
parent 401336 05ab44ec4ca86b857269000dd37b86c2317f93a7
child 401338 394f71df5d69fa1744c4fd36b6b87a677450e10e
push id26436
push userbmo:ealvarez@mozilla.com
push dateTue, 16 Aug 2016 21:55:11 +0000
reviewersheycam
bugs1292618
milestone51.0a1
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
layout/style/ServoStyleSet.cpp
--- a/layout/style/ServoStyleSet.cpp
+++ b/layout/style/ServoStyleSet.cpp
@@ -128,28 +128,60 @@ ServoStyleSet::ResolveStyleFor(Element* 
   return ResolveStyleFor(aElement, aParentContext);
 }
 
 already_AddRefed<nsStyleContext>
 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 (parentName == nsGkAtoms::mozgeneratedcontentbefore ||
+      parentName == nsGkAtoms::mozgeneratedcontentafter) {
+    MOZ_ASSERT(aParentContext);
+    ServoComputedValues* parentComputedValues =
+      aParentContext->StyleSource().AsServoComputedValues();
+    computedValues =
+      dont_AddRef(Servo_InheritComputedValues(parentComputedValues));
+  } else {
+    computedValues = dont_AddRef(Servo_GetComputedValues(aTextNode));
+  }
+
+  return GetContext(computedValues.forget(), aParentContext,
+                    nsCSSAnonBoxes::mozText, CSSPseudoElementType::AnonBox);
 }
 
 already_AddRefed<nsStyleContext>
 ServoStyleSet::ResolveStyleForOtherNonElement(nsStyleContext* aParentContext)
 {
   // The parent context can be null if the non-element share a style context
   // with the root of an anonymous subtree.
   ServoComputedValues* parent =
     aParentContext ? aParentContext->StyleSource().AsServoComputedValues() : nullptr;
-  RefPtr<ServoComputedValues> computedValues = dont_AddRef(Servo_InheritComputedValues(parent));
+  RefPtr<ServoComputedValues> computedValues =
+    dont_AddRef(Servo_InheritComputedValues(parent));
   MOZ_ASSERT(computedValues);
 
   return GetContext(computedValues.forget(), aParentContext,
                     nsCSSAnonBoxes::mozOtherNonElement,
                     CSSPseudoElementType::AnonBox);
 }
 
 already_AddRefed<nsStyleContext>