Chromium Code Reviews| Index: Source/core/editing/TextIterator.cpp |
| diff --git a/Source/core/editing/TextIterator.cpp b/Source/core/editing/TextIterator.cpp |
| index 0b48f881ad8c46e93780de8646050ba26e34a898..ff6b9e958f6f8f1b7cd7f87d9ddd26a8730af519 100644 |
| --- a/Source/core/editing/TextIterator.cpp |
| +++ b/Source/core/editing/TextIterator.cpp |
| @@ -30,6 +30,7 @@ |
| #include "bindings/core/v8/ExceptionStatePlaceholder.h" |
| #include "core/HTMLNames.h" |
| #include "core/dom/Document.h" |
| +#include "core/dom/FirstLetterPseudoElement.h" |
| #include "core/dom/NodeTraversal.h" |
| #include "core/dom/shadow/ShadowRoot.h" |
| #include "core/editing/VisiblePosition.h" |
| @@ -761,31 +762,19 @@ void TextIterator::handleTextBox() |
| } |
| } |
| -static inline RenderText* firstRenderTextInFirstLetter(RenderBoxModelObject* firstLetter) |
| -{ |
| - 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; |
| -} |
| - |
| void TextIterator::handleTextNodeFirstLetter(RenderTextFragment* renderer) |
| { |
| - if (renderer->firstLetter()) { |
| - RenderBoxModelObject* r = renderer->firstLetter(); |
| - if (r->style()->visibility() != VISIBLE && !m_ignoresStyleVisibility) |
| + if (renderer->firstLetterPseudoElement()) { |
|
Julien - ping for review
2014/10/09 18:24:48
if (FirstLetterPseudoElement* firstLetterElement =
dsinclair
2014/10/09 21:14:22
Done.
|
| + RenderObject* pseudoRenderer = renderer->firstLetterPseudoElement()->renderer(); |
| + if (pseudoRenderer->style()->visibility() != VISIBLE && !m_ignoresStyleVisibility) |
| return; |
| - if (RenderText* firstLetter = firstRenderTextInFirstLetter(r)) { |
| + // First letter pseudo elements only have one child which is the text. |
|
Julien - ping for review
2014/10/09 18:24:48
This comment sounds like the following 'if' is not
dsinclair
2014/10/09 21:14:22
Changed it to an ASSERT as it should always exist.
|
| + if (RenderObject* firstLetter = pseudoRenderer->slowFirstChild()) { |
| 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; |
| @@ -850,9 +839,9 @@ 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) |
| + if (renderer->isTextFragment() && toRenderTextFragment(renderer)->firstLetterPseudoElement()) { |
| + RenderObject* pseudoElement = toRenderTextFragment(renderer)->firstLetterPseudoElement()->renderer(); |
|
Julien - ping for review
2014/10/09 18:24:48
We do a lot of NULL-check against the :first-lette
dsinclair
2014/10/09 21:14:22
The spec doesn't list display as valid in first-le
|
| + if (pseudoElement && pseudoElement->style()->visibility() == VISIBLE) |
| return true; |
| } |
| return false; |
| @@ -1528,7 +1517,12 @@ RenderText* SimplifiedBackwardsTextIterator::handleFirstLetter(int& startOffset, |
| m_shouldHandleFirstLetter = false; |
| offsetInNode = 0; |
| - RenderText* firstLetterRenderer = firstRenderTextInFirstLetter(fragment->firstLetter()); |
| + |
| + ASSERT(fragment->firstLetterPseudoElement()); |
| + |
| + RenderObject* pseudoElement = fragment->firstLetterPseudoElement()->renderer(); |
|
Julien - ping for review
2014/10/09 18:24:48
s/pseudoElement/pseudoElementRenderer/
dsinclair
2014/10/09 21:14:22
Done.
|
| + ASSERT(pseudoElement && pseudoElement->slowFirstChild()); |
| + RenderText* firstLetterRenderer = toRenderText(pseudoElement->slowFirstChild()); |
| m_offset = firstLetterRenderer->caretMaxOffset(); |
| m_offset += collapsedSpaceLength(firstLetterRenderer, m_offset); |