ASSERT failure due to combine-text with preceding spaces
https://bugs.webkit.org/show_bug.cgi?id=65147

Patch by Ken Buchanan <kenrb@chromium.org> on 2012-01-06
Reviewed by David Hyatt.

Source/WebCore:

A couple of ASSERTs were failing due to a parsing problem when
advancing an inline iterator to the next linebreak in a
RenderCombineText. skipLeadingWhitespace advances the iterator
over leading whitespace but when searching for the line break
nextLineBreak would call RenderCombineText::combineText(),
collapsing the text so that the iterator is pointing past the
end of it.

This patch causes combineText() to be called during
skipLeadingWhiteSpace before iteration over the RenderCombineText
begins.

* rendering/RenderBlockLineLayout.cpp:
(WebCore::RenderBlock::LineBreaker::nextLineBreak):
(WebCore::RenderBlock::LineBreaker::skipLeadingWhitespace):

LayoutTests:

New test with combine-text that begins with mutiple spaces,
showing ASSERT failures in bug 65147.

* fast/text/international/spaces-combined-in-vertical-text.html: Added
* fast/text/international/spaces-combined-in-vertical-text-expected.txt: Added

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@104322 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/rendering/RenderBlockLineLayout.cpp b/Source/WebCore/rendering/RenderBlockLineLayout.cpp
index 92dceb1..77c3ce3 100755
--- a/Source/WebCore/rendering/RenderBlockLineLayout.cpp
+++ b/Source/WebCore/rendering/RenderBlockLineLayout.cpp
@@ -1889,6 +1889,10 @@
             }
         } else if (object->isFloating())
             m_block->positionNewFloatOnLine(m_block->insertFloatingObject(toRenderBox(object)), lastFloatFromPreviousLine, lineInfo, width);
+        else if (object->isText() && object->style()->hasTextCombine() && object->isCombineText()) {
+            toRenderCombineText(object)->combineText();
+            continue;
+        }
         resolver.increment();
     }
     resolver.commitExplicitEmbedding();
@@ -2279,7 +2283,7 @@
 #endif
 
             RenderStyle* style = t->style(lineInfo.isFirstLine());
-            if (style->hasTextCombine() && current.m_obj->isCombineText())
+            if (style->hasTextCombine() && current.m_obj->isCombineText() && !toRenderCombineText(current.m_obj)->isCombined())
                 toRenderCombineText(current.m_obj)->combineText();
 
             const Font& f = style->font();