<https://webkit.org/b/123714>
Reviewed by Antti Koivisto.
* editing/TextIterator.cpp:
(WebCore::firstRenderTextInFirstLetter):
Use iterator helper to find first RenderText child.
(WebCore::TextIterator::handleTextNodeFirstLetter):
Tightening through type inference.
* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::updateFirstLetterStyle):
(WebCore::RenderBlock::createFirstLetterRenderer):
* rendering/RenderTextFragment.h:
The first letter renderer is always a RenderBoxModelObject,
so make the code deal in that instead of RenderObject.
* rendering/RenderChildIterator.h:
(WebCore::RenderChildIteratorAdapter::first):
(WebCore::RenderChildIteratorAdapter::last):
Remove excess ampersands that were keeping this from building.
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@158551
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
2013-11-03 Andreas Kling <akling@apple.com>
+ RenderTextFragment: Tighten first-letter logic.
+ <https://webkit.org/b/123714>
+
+ Reviewed by Antti Koivisto.
+
+ * editing/TextIterator.cpp:
+ (WebCore::firstRenderTextInFirstLetter):
+
+ Use iterator helper to find first RenderText child.
+
+ (WebCore::TextIterator::handleTextNodeFirstLetter):
+
+ Tightening through type inference.
+
+ * rendering/RenderBlock.cpp:
+ (WebCore::RenderBlock::updateFirstLetterStyle):
+ (WebCore::RenderBlock::createFirstLetterRenderer):
+ * rendering/RenderTextFragment.h:
+
+ The first letter renderer is always a RenderBoxModelObject,
+ so make the code deal in that instead of RenderObject.
+
+ * rendering/RenderChildIterator.h:
+ (WebCore::RenderChildIteratorAdapter::first):
+ (WebCore::RenderChildIteratorAdapter::last):
+
+ Remove excess ampersands that were keeping this from building.
+
+2013-11-03 Andreas Kling <akling@apple.com>
+
CSSPrimitiveValue identifier constructors should return PassRef.
<https://webkit.org/b/123712>
#include "InlineTextBox.h"
#include "NodeTraversal.h"
#include "RenderImage.h"
+#include "RenderIterator.h"
#include "RenderTableCell.h"
#include "RenderTableRow.h"
#include "RenderTextControl.h"
}
}
-static inline RenderText* firstRenderTextInFirstLetter(RenderObject* firstLetter)
+static inline RenderText* firstRenderTextInFirstLetter(RenderBoxModelObject* firstLetter)
{
if (!firstLetter)
- return 0;
+ return nullptr;
// FIXME: Should this check descendent objects?
- for (RenderObject* current = firstLetter->firstChildSlow(); current; current = current->nextSibling()) {
- if (current->isText())
- return toRenderText(current);
- }
- return 0;
+ return childrenOfType<RenderText>(*firstLetter).first();
}
void TextIterator::handleTextNodeFirstLetter(RenderTextFragment* renderer)
{
- if (renderer->firstLetter()) {
- RenderObject* r = renderer->firstLetter();
- if (r->style().visibility() != VISIBLE && !m_ignoresStyleVisibility)
+ if (auto firstLetter = renderer->firstLetter()) {
+ if (firstLetter->style().visibility() != VISIBLE && !m_ignoresStyleVisibility)
return;
- if (RenderText* firstLetter = firstRenderTextInFirstLetter(r)) {
+ if (RenderText* firstLetterText = firstRenderTextInFirstLetter(firstLetter)) {
m_handledFirstLetter = true;
m_remainingTextBox = m_textBox;
- m_textBox = firstLetter->firstTextBox();
+ m_textBox = firstLetterText->firstTextBox();
m_sortedTextBoxes.clear();
- m_firstLetterText = firstLetter;
+ m_firstLetterText = firstLetterText;
}
}
m_handledFirstLetter = true;
if (RenderTextFragment* remainingText = toRenderBoxModelObject(firstLetter)->firstLetterRemainingText()) {
ASSERT(remainingText->isAnonymous() || remainingText->textNode()->renderer() == remainingText);
// Replace the old renderer with the new one.
- remainingText->setFirstLetter(newFirstLetter);
+ remainingText->setFirstLetter(*newFirstLetter);
newFirstLetter->setFirstLetterRemainingText(remainingText);
}
// To prevent removal of single anonymous block in RenderBlock::removeChild and causing
firstLetterContainer->addChild(remainingText, currentTextChild);
firstLetterContainer->removeChild(*currentTextChild);
- remainingText->setFirstLetter(firstLetter);
+ remainingText->setFirstLetter(*firstLetter);
firstLetter->setFirstLetterRemainingText(remainingText);
// construct text fragment for the first letter
template <typename T>
inline T* RenderChildIteratorAdapter<T>::first()
{
- return RenderTraversal::firstChild<T>(&m_parent);
+ return RenderTraversal::firstChild<T>(m_parent);
}
template <typename T>
inline T* RenderChildIteratorAdapter<T>::last()
{
- return RenderTraversal::lastChild<T>(&m_parent);
+ return RenderTraversal::lastChild<T>(m_parent);
}
// RenderChildConstIteratorAdapter
unsigned start() const { return m_start; }
unsigned end() const { return m_end; }
- RenderObject* firstLetter() const { return m_firstLetter; }
- void setFirstLetter(RenderObject* firstLetter) { m_firstLetter = firstLetter; }
+ RenderBoxModelObject* firstLetter() const { return m_firstLetter; }
+ void setFirstLetter(RenderBoxModelObject& firstLetter) { m_firstLetter = &firstLetter; }
StringImpl* contentString() const { return m_contentString.impl(); }
virtual String originalText() const OVERRIDE;
unsigned m_start;
unsigned m_end;
String m_contentString;
- RenderObject* m_firstLetter;
+ RenderBoxModelObject* m_firstLetter;
};
inline RenderTextFragment* toRenderTextFragment(RenderObject* object)