| Index: Source/core/editing/TextIterator.cpp
|
| diff --git a/Source/core/editing/TextIterator.cpp b/Source/core/editing/TextIterator.cpp
|
| index f806c98df89e1187bd7e88b26f7ffa9211a591ee..21d38bd22f6bebb14d53a26a38adc84870973ed1 100644
|
| --- a/Source/core/editing/TextIterator.cpp
|
| +++ b/Source/core/editing/TextIterator.cpp
|
| @@ -759,31 +759,28 @@ void TextIterator::handleTextBox()
|
| }
|
| }
|
|
|
| -static inline RenderText* firstRenderTextInFirstLetter(RenderBoxModelObject* firstLetter)
|
| +static RenderObject* firstLetterPseudoElement(RenderObject* fragment)
|
| {
|
| - if (!firstLetter)
|
| - return 0;
|
| -
|
| - // FIXME: Should this check descendent objects?
|
| - for (RenderObject* current = firstLetter->slowFirstChild(); current; current = current->nextSibling()) {
|
| - if (current->isText())
|
| - return toRenderText(current);
|
| - }
|
| - return 0;
|
| + RenderObject* previousSibling = fragment->previousSibling();
|
| + if (previousSibling && previousSibling->isPseudoElement() && previousSibling->node()->isFirstLetterPseudoElement())
|
| + return previousSibling;
|
| + return nullptr;
|
| }
|
|
|
| void TextIterator::handleTextNodeFirstLetter(RenderTextFragment* renderer)
|
| {
|
| - if (renderer->firstLetter()) {
|
| - RenderBoxModelObject* r = renderer->firstLetter();
|
| - if (r->style()->visibility() != VISIBLE && !m_ignoresStyleVisibility)
|
| + RenderObject* pseudoElement = firstLetterPseudoElement(renderer);
|
| + if (pseudoElement) {
|
| + if (pseudoElement->style()->visibility() != VISIBLE && !m_ignoresStyleVisibility)
|
| return;
|
| - if (RenderText* firstLetter = firstRenderTextInFirstLetter(r)) {
|
| + // First letter pseudo elements only have one child which is the text.
|
| + if (RenderObject* firstLetter = pseudoElement->slowFirstChild()) {
|
| + ASSERT(firstLetter->isText());
|
| m_handledFirstLetter = true;
|
| m_remainingTextBox = m_textBox;
|
| - m_textBox = firstLetter->firstTextBox();
|
| + m_textBox = toRenderText(firstLetter)->firstTextBox();
|
| m_sortedTextBoxes.clear();
|
| - m_firstLetterText = firstLetter;
|
| + m_firstLetterText = toRenderText(firstLetter);
|
| }
|
| }
|
| m_handledFirstLetter = true;
|
| @@ -849,8 +846,8 @@ bool TextIterator::hasVisibleTextNode(RenderText* renderer)
|
| if (renderer->style()->visibility() == VISIBLE)
|
| return true;
|
| if (renderer->isTextFragment()) {
|
| - RenderTextFragment* fragment = toRenderTextFragment(renderer);
|
| - if (fragment->firstLetter() && fragment->firstLetter()->style()->visibility() == VISIBLE)
|
| + RenderObject* pseudoElement = firstLetterPseudoElement(renderer);
|
| + if (pseudoElement && pseudoElement->style()->visibility() == VISIBLE)
|
| return true;
|
| }
|
| return false;
|
| @@ -1526,7 +1523,10 @@ RenderText* SimplifiedBackwardsTextIterator::handleFirstLetter(int& startOffset,
|
|
|
| m_shouldHandleFirstLetter = false;
|
| offsetInNode = 0;
|
| - RenderText* firstLetterRenderer = firstRenderTextInFirstLetter(fragment->firstLetter());
|
| +
|
| + RenderObject* pseudoElement = firstLetterPseudoElement(fragment);
|
| + ASSERT(pseudoElement && pseudoElement->slowFirstChild());
|
| + RenderText* firstLetterRenderer = toRenderText(pseudoElement->slowFirstChild());
|
|
|
| m_offset = firstLetterRenderer->caretMaxOffset();
|
| m_offset += collapsedSpaceLength(firstLetterRenderer, m_offset);
|
|
|