void FirstLetterPseudoElement::updateTextFragments() { String oldText = m_remainingTextLayoutObject->completeText(); ASSERT(oldText.impl()); unsigned length = FirstLetterPseudoElement::firstLetterLength(oldText); m_remainingTextLayoutObject->setTextFragment(oldText.impl()->substring(length, oldText.length()), length, oldText.length() - length); m_remainingTextLayoutObject->dirtyLineBoxes(); for (auto child = layoutObject()->slowFirstChild(); child; child = child->nextSibling()) { if (!child->isText() || !toLayoutText(child)->isTextFragment()) continue; LayoutTextFragment* childFragment = toLayoutTextFragment(child); if (childFragment->firstLetterPseudoElement() != this) continue; childFragment->setTextFragment(oldText.impl()->substring(0, length), 0, length); childFragment->dirtyLineBoxes(); // Make sure the first-letter layoutObject is set to require a layout as it // needs to re-create the line boxes. The remaining text layoutObject // will be marked by the LayoutText::setText. childFragment->setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::TextChanged); break; } }
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; }