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); |
esprehn
2014/09/30 09:00:31
Move this into the if (RenderObject* pseudoElement
|
+ 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); |