LayoutTextFragment* LayoutQuote::findFragmentChild() const { // We walk from the end of the child list because, if we've had a first-letter // LayoutObject inserted then the remaining text will be at the end. while (LayoutObject* child = lastChild()) { if (child->isText() && toLayoutText(child)->isTextFragment()) return toLayoutTextFragment(child); } return nullptr; }
// Passing both |textNode| and its layout object because repeated calls to // |Node::layoutObject()| are discouraged. static bool shouldUpdateLayoutByReattaching(const Text& textNode, LayoutText* textLayoutObject) { ASSERT(textNode.layoutObject() == textLayoutObject); if (!textLayoutObject) return true; if (!textNode.textLayoutObjectIsNeeded(*textLayoutObject->style(), *textLayoutObject->parent())) return true; if (textLayoutObject->isTextFragment()) { FirstLetterPseudoElement* pseudo = toLayoutTextFragment(textLayoutObject)->firstLetterPseudoElement(); if (pseudo && !FirstLetterPseudoElement::firstLetterTextLayoutObject(*pseudo)) return true; } return false; }
LayoutText* SimplifiedBackwardsTextIteratorAlgorithm<Strategy>::handleFirstLetter(int& startOffset, int& offsetInNode) { LayoutText* layoutObject = toLayoutText(m_node->layoutObject()); startOffset = (m_node == m_startNode) ? m_startOffset : 0; if (!layoutObject->isTextFragment()) { offsetInNode = 0; return layoutObject; } LayoutTextFragment* fragment = toLayoutTextFragment(layoutObject); int offsetAfterFirstLetter = fragment->start(); if (startOffset >= offsetAfterFirstLetter) { ASSERT(!m_shouldHandleFirstLetter); offsetInNode = offsetAfterFirstLetter; return layoutObject; } if (!m_shouldHandleFirstLetter && offsetAfterFirstLetter < m_offset) { m_shouldHandleFirstLetter = true; offsetInNode = offsetAfterFirstLetter; return layoutObject; } m_shouldHandleFirstLetter = false; offsetInNode = 0; ASSERT(fragment->isRemainingTextLayoutObject()); ASSERT(fragment->firstLetterPseudoElement()); LayoutObject* pseudoElementLayoutObject = fragment->firstLetterPseudoElement()->layoutObject(); ASSERT(pseudoElementLayoutObject); ASSERT(pseudoElementLayoutObject->slowFirstChild()); LayoutText* firstLetterLayoutObject = toLayoutText(pseudoElementLayoutObject->slowFirstChild()); m_offset = firstLetterLayoutObject->caretMaxOffset(); m_offset += collapsedSpaceLength(firstLetterLayoutObject, m_offset); return firstLetterLayoutObject; }