| Index: Source/core/editing/TextIterator.cpp
|
| diff --git a/Source/core/editing/TextIterator.cpp b/Source/core/editing/TextIterator.cpp
|
| index ff95f367e7ddc020aa33be2921325c7d91a975d0..068ad9a665e6ab79510a6f6a5e662f656a2efa0c 100644
|
| --- a/Source/core/editing/TextIterator.cpp
|
| +++ b/Source/core/editing/TextIterator.cpp
|
| @@ -30,7 +30,6 @@
|
| #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"
|
| @@ -762,28 +761,34 @@ void TextIterator::handleTextBox()
|
| }
|
| }
|
|
|
| -void TextIterator::handleTextNodeFirstLetter(RenderTextFragment* renderer)
|
| +static inline RenderText* firstRenderTextInFirstLetter(RenderBoxModelObject* firstLetter)
|
| {
|
| - m_handledFirstLetter = true;
|
| -
|
| - if (!renderer->isRemainingTextRenderer())
|
| - return;
|
| -
|
| - FirstLetterPseudoElement* firstLetterElement = renderer->firstLetterPseudoElement();
|
| - if (!firstLetterElement)
|
| - return;
|
| -
|
| - RenderObject* pseudoRenderer = firstLetterElement->renderer();
|
| - if (pseudoRenderer->style()->visibility() != VISIBLE && !m_ignoresStyleVisibility)
|
| - return;
|
| + if (!firstLetter)
|
| + return 0;
|
|
|
| - RenderObject* firstLetter = pseudoRenderer->slowFirstChild();
|
| - ASSERT(firstLetter);
|
| + // FIXME: Should this check descendent objects?
|
| + for (RenderObject* current = firstLetter->slowFirstChild(); current; current = current->nextSibling()) {
|
| + if (current->isText())
|
| + return toRenderText(current);
|
| + }
|
| + return 0;
|
| +}
|
|
|
| - m_remainingTextBox = m_textBox;
|
| - m_textBox = toRenderText(firstLetter)->firstTextBox();
|
| - m_sortedTextBoxes.clear();
|
| - m_firstLetterText = toRenderText(firstLetter);
|
| +void TextIterator::handleTextNodeFirstLetter(RenderTextFragment* renderer)
|
| +{
|
| + if (renderer->firstLetter()) {
|
| + RenderBoxModelObject* r = renderer->firstLetter();
|
| + if (r->style()->visibility() != VISIBLE && !m_ignoresStyleVisibility)
|
| + return;
|
| + if (RenderText* firstLetter = firstRenderTextInFirstLetter(r)) {
|
| + m_handledFirstLetter = true;
|
| + m_remainingTextBox = m_textBox;
|
| + m_textBox = firstLetter->firstTextBox();
|
| + m_sortedTextBoxes.clear();
|
| + m_firstLetterText = firstLetter;
|
| + }
|
| + }
|
| + m_handledFirstLetter = true;
|
| }
|
|
|
| bool TextIterator::handleReplacedElement()
|
| @@ -845,18 +850,11 @@ bool TextIterator::hasVisibleTextNode(RenderText* renderer)
|
| {
|
| if (renderer->style()->visibility() == VISIBLE)
|
| return true;
|
| -
|
| - if (!renderer->isTextFragment())
|
| - return false;
|
| -
|
| - RenderTextFragment* fragment = toRenderTextFragment(renderer);
|
| - if (!fragment->isRemainingTextRenderer())
|
| - return false;
|
| -
|
| - RenderObject* pseudoElementRenderer = fragment->firstLetterPseudoElement()->renderer();
|
| - if (pseudoElementRenderer && pseudoElementRenderer->style()->visibility() == VISIBLE)
|
| - return true;
|
| -
|
| + if (renderer->isTextFragment()) {
|
| + RenderTextFragment* fragment = toRenderTextFragment(renderer);
|
| + if (fragment->firstLetter() && fragment->firstLetter()->style()->visibility() == VISIBLE)
|
| + return true;
|
| + }
|
| return false;
|
| }
|
|
|
| @@ -1530,14 +1528,7 @@ RenderText* SimplifiedBackwardsTextIterator::handleFirstLetter(int& startOffset,
|
|
|
| m_shouldHandleFirstLetter = false;
|
| offsetInNode = 0;
|
| -
|
| - ASSERT(fragment->isRemainingTextRenderer());
|
| - ASSERT(fragment->firstLetterPseudoElement());
|
| -
|
| - RenderObject* pseudoElementRenderer = fragment->firstLetterPseudoElement()->renderer();
|
| - ASSERT(pseudoElementRenderer);
|
| - ASSERT(pseudoElementRenderer->slowFirstChild());
|
| - RenderText* firstLetterRenderer = toRenderText(pseudoElementRenderer->slowFirstChild());
|
| + RenderText* firstLetterRenderer = firstRenderTextInFirstLetter(fragment->firstLetter());
|
|
|
| m_offset = firstLetterRenderer->caretMaxOffset();
|
| m_offset += collapsedSpaceLength(firstLetterRenderer, m_offset);
|
|
|