| Index: Source/core/dom/Text.cpp
|
| diff --git a/Source/core/dom/Text.cpp b/Source/core/dom/Text.cpp
|
| index 2426009c6edb92702b679096b4140bc7abb6aa20..eee103c9790e4b37044ef4c8f54f3eefa35dbdc7 100644
|
| --- a/Source/core/dom/Text.cpp
|
| +++ b/Source/core/dom/Text.cpp
|
| @@ -276,7 +276,7 @@ bool Text::textRendererIsNeeded(const RenderStyle& style, const RenderObject& pa
|
| RenderObject* first = parent.slowFirstChild();
|
| while (first && first->isFloatingOrOutOfFlowPositioned() && maxSiblingsToVisit--)
|
| first = first->nextSibling();
|
| - if (!first || NodeRenderingTraversal::nextSiblingRenderer(this) == first)
|
| + if (!first || first == renderer() || NodeRenderingTraversal::nextSiblingRenderer(this) == first)
|
| // Whitespace at the start of a block just goes away. Don't even
|
| // make a render object for this text.
|
| return false;
|
| @@ -308,6 +308,32 @@ void Text::attach(const AttachContext& context)
|
| CharacterData::attach(context);
|
| }
|
|
|
| +void Text::reattachIfNeeded(const AttachContext& context)
|
| +{
|
| + bool rendererIsNeeded = false;
|
| + ContainerNode* renderingParent = NodeRenderingTraversal::parent(this);
|
| + if (renderingParent) {
|
| + if (RenderObject* parentRenderer = renderingParent->renderer()) {
|
| + if (textRendererIsNeeded(*parentRenderer->style(), *parentRenderer))
|
| + rendererIsNeeded = true;
|
| + }
|
| + }
|
| +
|
| + if (rendererIsNeeded == !!renderer())
|
| + return;
|
| +
|
| + // The following is almost the same as Node::reattach() except that we create renderer only if needed.
|
| + // Not calling reattach() to avoid repeated calls to Text::textRendererIsNeeded().
|
| + AttachContext reattachContext(context);
|
| + reattachContext.performingReattach = true;
|
| +
|
| + if (styleChangeType() < NeedsReattachStyleChange)
|
| + detach(reattachContext);
|
| + if (rendererIsNeeded)
|
| + RenderTreeBuilderForText(this, renderingParent->renderer()).createRenderer();
|
| + CharacterData::attach(reattachContext);
|
| +}
|
| +
|
| void Text::recalcTextStyle(StyleRecalcChange change, Text* nextTextSibling)
|
| {
|
| if (RenderText* renderer = this->renderer()) {
|
| @@ -319,7 +345,7 @@ void Text::recalcTextStyle(StyleRecalcChange change, Text* nextTextSibling)
|
| } else if (needsStyleRecalc() || needsWhitespaceRenderer()) {
|
| reattach();
|
| if (this->renderer())
|
| - reattachWhitespaceSiblings(nextTextSibling);
|
| + reattachWhitespaceSiblingsIfNeeded(nextTextSibling);
|
| }
|
| }
|
|
|
|
|