void HTMLElement::adjustDirectionalityIfNeededAfterChildrenChanged(Node* beforeChange, int childCountDelta) { if ((!document() || document()->renderer()) && childCountDelta < 0) { Node* node = beforeChange ? NodeTraversal::nextSkippingChildren(beforeChange) : 0; for (int counter = 0; node && counter < childCountDelta; counter++, node = NodeTraversal::nextSkippingChildren(node)) { if (elementAffectsDirectionality(node)) continue; setHasDirAutoFlagRecursively(node, false); } } if (!selfOrAncestorHasDirAutoAttribute()) return; Node* oldMarkedNode = beforeChange ? NodeTraversal::nextSkippingChildren(beforeChange) : 0; while (oldMarkedNode && elementAffectsDirectionality(oldMarkedNode)) oldMarkedNode = NodeTraversal::nextSkippingChildren(oldMarkedNode, this); if (oldMarkedNode) setHasDirAutoFlagRecursively(oldMarkedNode, false); for (Element* elementToAdjust = this; elementToAdjust; elementToAdjust = elementToAdjust->parentElement()) { if (elementAffectsDirectionality(elementToAdjust)) { toHTMLElement(elementToAdjust)->calculateAndAdjustDirectionality(); return; } } }
void HTMLElement::adjustDirectionalityIfNeededAfterChildrenChanged(Element* beforeChange, ChildChangeType changeType) { // FIXME: This function looks suspicious. if (document().renderView() && (changeType == ElementRemoved || changeType == TextRemoved)) { Node* node = beforeChange ? beforeChange->nextSibling() : 0; for (; node; node = node->nextSibling()) { if (elementAffectsDirectionality(node)) continue; setHasDirAutoFlagRecursively(node, false); } } if (!selfOrAncestorHasDirAutoAttribute()) return; Node* oldMarkedNode = 0; if (beforeChange) oldMarkedNode = changeType == ElementInserted ? ElementTraversal::nextSibling(beforeChange) : beforeChange->nextSibling(); while (oldMarkedNode && elementAffectsDirectionality(oldMarkedNode)) oldMarkedNode = oldMarkedNode->nextSibling(); if (oldMarkedNode) setHasDirAutoFlagRecursively(oldMarkedNode, false); auto lineage = lineageOfType<HTMLElement>(this); for (auto elementToAdjust = lineage.begin(), end = lineage.end(); elementToAdjust != end; ++elementToAdjust) { if (elementAffectsDirectionality(&*elementToAdjust)) { elementToAdjust->calculateAndAdjustDirectionality(); return; } } }
void HTMLElement::adjustDirectionalityIfNeededAfterChildrenChanged(const ChildrenChange& change) { if (!selfOrAncestorHasDirAutoAttribute()) return; updateDistribution(); for (Element* elementToAdjust = this; elementToAdjust; elementToAdjust = ComposedTreeTraversal::parentElement(*elementToAdjust)) { if (elementAffectsDirectionality(elementToAdjust)) { toHTMLElement(elementToAdjust)->calculateAndAdjustDirectionality(); return; } } }
void HTMLElement::adjustDirectionalityIfNeededAfterChildAttributeChanged(Element* child) { ASSERT(selfOrAncestorHasDirAutoAttribute()); TextDirection textDirection = directionality(); if (layoutObject() && layoutObject()->style() && layoutObject()->style()->direction() != textDirection) { Element* elementToAdjust = this; for (; elementToAdjust; elementToAdjust = ComposedTreeTraversal::parentElement(*elementToAdjust)) { if (elementAffectsDirectionality(elementToAdjust)) { elementToAdjust->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::WritingModeChange)); return; } } } }
void HTMLElement::adjustDirectionalityIfNeededAfterChildAttributeChanged(Element* child) { ASSERT(selfOrAncestorHasDirAutoAttribute()); Node* strongDirectionalityTextNode; TextDirection textDirection = directionality(&strongDirectionalityTextNode); setHasDirAutoFlagRecursively(child, false); if (renderer() && renderer()->style() && renderer()->style()->direction() != textDirection) { Element* elementToAdjust = this; for (; elementToAdjust; elementToAdjust = elementToAdjust->parentElement()) { if (elementAffectsDirectionality(elementToAdjust)) { elementToAdjust->setNeedsStyleRecalc(); return; } } } }
void HTMLElement::adjustDirectionalityIfNeededAfterChildAttributeChanged(Element* child) { ASSERT(selfOrAncestorHasDirAutoAttribute()); Node* strongDirectionalityTextNode; TextDirection textDirection = directionality(&strongDirectionalityTextNode); setHasDirAutoFlagRecursively(child, false); if (!renderer() || !renderer()->style() || renderer()->style()->direction() == textDirection) return; auto lineage = elementLineage(this); for (auto elementToAdjust = lineage.begin(), end = lineage.end(); elementToAdjust != end; ++elementToAdjust) { if (elementAffectsDirectionality(&*elementToAdjust)) { elementToAdjust->setNeedsStyleRecalc(); return; } } }
static void setHasDirAutoFlagRecursively(Node* firstNode, bool flag, Node* lastNode = 0) { firstNode->setSelfOrAncestorHasDirAutoAttribute(flag); Node* node = firstNode->firstChild(); while (node) { if (node->selfOrAncestorHasDirAutoAttribute() == flag) return; if (elementAffectsDirectionality(node)) { if (node == lastNode) return; node = NodeTraversal::nextSkippingChildren(node, firstNode); continue; } node->setSelfOrAncestorHasDirAutoAttribute(flag); if (node == lastNode) return; node = NodeTraversal::next(node, firstNode); } }