Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(790)

Unified Diff: Source/core/editing/TextIterator.cpp

Issue 571603003: Convert first letter into a pseudo element. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/editing/TextIterator.cpp
diff --git a/Source/core/editing/TextIterator.cpp b/Source/core/editing/TextIterator.cpp
index 32bc25c6781e39d607c8da1a6323486b01c41739..fedfc67349e3a2654780996097d41521991a19f3 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())
Julien - ping for review 2014/10/06 17:47:33 Isn't the previousSibling->isPseudoElement() call
dsinclair 2014/10/07 19:36:21 No. I don't know if I have a node() unless I know
+ 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());
Julien - ping for review 2014/10/06 17:47:33 This ASSERT is redundant with the toRenderText bel
dsinclair 2014/10/07 19:36:21 Done.
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);

Powered by Google App Engine
This is Rietveld 408576698