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); |