WebCore:

        Reviewed by Darin Adler.

        - fix <rdar://problem/5637569> CrashTracer: [REGRESSION] 620 crashes in Safari at com.apple.WebCore: WebCore::RenderBox::setStaticY + 15

        Test: fast/text/wbr-styled.html

        Changed RenderWordBreak to inherit from RenderText instead of
        RenderInline.

        * rendering/RenderBlock.cpp:
        (WebCore::RenderBlock::calcInlinePrefWidths):
        * rendering/RenderFlow.h:
        * rendering/RenderText.cpp:
        (WebCore::RenderText::renderName):
        (WebCore::RenderText::isTextFragment):
        (WebCore::RenderText::isWordBreak):
        * rendering/RenderText.h:
        * rendering/RenderWordBreak.cpp:
        (WebCore::RenderWordBreak::RenderWordBreak):
        * rendering/RenderWordBreak.h:
        * rendering/bidi.cpp:
        (WebCore::RenderBlock::findNextLineBreak):

LayoutTests:

        Reviewed by Darin Adler.

        - test for <rdar://problem/5637569> CrashTracer: [REGRESSION] 620 crashes in Safari at com.apple.WebCore: WebCore::RenderBox::setStaticY + 15

        * fast/text/wbr-styled.html: Added.
        * platform/mac-leopard/fast/text/wbr-styled-expected.checksum: Added.
        * platform/mac-leopard/fast/text/wbr-styled-expected.png: Added.
        * platform/mac/fast/css-generated-content/wbr-with-before-content-expected.txt:
        * platform/mac/fast/text/wbr-pre-expected.txt:
        * platform/mac/fast/text/wbr-styled-expected.txt: Added.



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@30412 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/rendering/bidi.cpp b/WebCore/rendering/bidi.cpp
index 5e63c0b..77b37a9 100644
--- a/WebCore/rendering/bidi.cpp
+++ b/WebCore/rendering/bidi.cpp
@@ -1506,12 +1506,6 @@
                 }
             }
 
-            if (static_cast<RenderFlow*>(o)->isWordBreak()) {
-                w += tmpW;
-                tmpW = 0;
-                lBreak.obj = o;
-                lBreak.pos = 0;
-            }
             tmpW += o->marginLeft() + o->borderLeft() + o->paddingLeft() +
                     o->marginRight() + o->borderRight() + o->paddingRight();
         } else if (o->isReplaced()) {
@@ -1547,6 +1541,7 @@
                 tmpW += o->width() + o->marginLeft() + o->marginRight() + inlineWidth(o);
         } else if (o->isText()) {
             RenderText* t = static_cast<RenderText*>(o);
+
             int strlen = t->textLength();
             int len = strlen - pos;
             const UChar* str = t->characters();
@@ -1569,6 +1564,14 @@
             bool midWordBreak = false;
             bool breakAll = o->style()->wordBreak() == BreakAllWordBreak && autoWrap;
 
+            if (t->isWordBreak()) {
+                w += tmpW;
+                tmpW = 0;
+                lBreak.obj = o;
+                lBreak.pos = 0;
+                ASSERT(!len);
+            }
+
             while (len) {
                 bool previousCharacterIsSpace = currentCharacterIsSpace;
                 bool previousCharacterIsWS = currentCharacterIsWS;
@@ -1799,7 +1802,7 @@
                 len--;
                 atStart = false;
             }
-            
+
             // IMPORTANT: pos is > length here!
             if (!ignoringSpaces)
                 tmpW += t->width(lastSpace, pos - lastSpace, f, w+tmpW) + lastSpaceWordSpacing;
@@ -1818,14 +1821,15 @@
                 else {
                     checkForBreak = false;
                     RenderText* nextText = static_cast<RenderText*>(next);
-                    if (nextText->textLength() != 0) {
+                    if (nextText->textLength()) {
                         UChar c = nextText->characters()[0];
                         if (c == ' ' || c == '\t' || (c == '\n' && !shouldPreserveNewline(next)))
                             // If the next item on the line is text, and if we did not end with
                             // a space, then the next text run continues our word (and so it needs to
                             // keep adding to |tmpW|.  Just update and continue.
                             checkForBreak = true;
-                    }
+                    } else if (nextText->isWordBreak())
+                        checkForBreak = true;
                     bool willFitOnLine = (w + tmpW <= width);
                     bool canPlaceOnLine = willFitOnLine || !autoWrapWasEverTrueOnLine;
                     if (canPlaceOnLine && checkForBreak) {