LayoutTests:

        Reviewed by Dave Hyatt.

        - test for http://bugzilla.opendarwin.org/show_bug.cgi?id=7216
          white-space: pre-wrap collapses leading whitespace following a newline

        * fast/text/whitespace/pre-wrap-spaces-after-newline-expected.checksum: Added.
        * fast/text/whitespace/pre-wrap-spaces-after-newline-expected.png: Added.
        * fast/text/whitespace/pre-wrap-spaces-after-newline-expected.txt: Added.
        * fast/text/whitespace/pre-wrap-spaces-after-newline.html: Added.

WebCore:

        Test: fast/text/whitespace/pre-wrap-spaces-after-newline.html

        Reviewed by Dave Hyatt.

        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=7216
          white-space: pre-wrap collapses leading whitespace following a newline

        * rendering/bidi.cpp:
        (khtml::RenderBlock::bidiReorderLine): Use previousLineBrokeCleanly instead of
        resetBidiAtEnd now that the former is always correct.
        (khtml::RenderBlock::layoutInlineChildren): Use new skipTrailingNewline flag.
        (khtml::RenderBlock::findNextLineBreak): Set previousLineBrokeCleanly for line breaks
        caused by newlines as well. Added skipTrailingNewline flag.



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@12868 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/rendering/bidi.cpp b/WebCore/rendering/bidi.cpp
index 0265ff6..b5179c5 100644
--- a/WebCore/rendering/bidi.cpp
+++ b/WebCore/rendering/bidi.cpp
@@ -100,6 +100,7 @@
 
 static bool isLineEmpty = true;
 static bool previousLineBrokeCleanly = true;
+static bool skipTrailingNewline = false;
 static bool emptyRun = true;
 static int numSpaces;
 
@@ -1008,18 +1009,17 @@
     bidi.current = start;
     bidi.last = bidi.current;
     bool pastEnd = false;
-    bool resetBidiAtEnd = false;
     BidiState stateAtEnd;
 
     while (true) {
         QChar::Direction dirCurrent;
-        if (pastEnd && (resetBidiAtEnd || bidi.current.atEnd())) {
+        if (pastEnd && (previousLineBrokeCleanly || bidi.current.atEnd())) {
             //kdDebug(6041) << "atEnd" << endl;
             BidiContext *c = bidi.context.get();
             while (c->parent)
                 c = c->parent;
             dirCurrent = c->dir;
-            if (resetBidiAtEnd) {
+            if (previousLineBrokeCleanly) {
                 // A deviation from the Unicode Bidi Algorithm in order to match
                 // Mac OS X text and WinIE: a hard line break resets bidi state.
                 stateAtEnd.context = c;
@@ -1360,7 +1360,6 @@
             stateAtEnd = bidi;
             bidi.endOfLine = bidi.last;
             pastEnd = true;
-            resetBidiAtEnd = previousLineBrokeCleanly || (end.obj && end.obj->style()->preserveNewline() && end.current() == '\n');
         }
     }
 
@@ -1628,7 +1627,7 @@
                     }
                 }
                 
-                if (end == start || (!previousLineBrokeCleanly && end.obj && end.obj->style()->preserveNewline() && end.current() == '\n')) {
+                if (end == start || skipTrailingNewline) {
                     bidi.adjustEmbedding = true;
                     end.increment(bidi);
                     bidi.adjustEmbedding = false;
@@ -1973,6 +1972,7 @@
 
     bool prevLineBrokeCleanly = previousLineBrokeCleanly;
     previousLineBrokeCleanly = false;
+    skipTrailingNewline = false;
     
     while (o) {
         if (o->isBR()) {
@@ -2246,6 +2246,10 @@
                                     skipWhitespace(lBreak, bidi);
                                 }
                             }
+                            if (lBreak.obj && lBreak.obj->style()->preserveNewline() && lBreak.obj->isText() && static_cast<RenderText*>(lBreak.obj)->text()[lBreak.pos] == '\n') {
+                                previousLineBrokeCleanly = true;
+                                skipTrailingNewline = true;
+                            }
                             goto end; // Didn't fit. Jump to the end.
                         } else {
                             if (midWordBreak)
@@ -2256,9 +2260,11 @@
                         }
                     }
 
-                    if (*(str+pos) == '\n' && o->style()->preserveNewline()) {
+                    if (c == '\n' && o->style()->preserveNewline()) {
                         lBreak.obj = o;
                         lBreak.pos = pos;
+                        previousLineBrokeCleanly = true;
+                        skipTrailingNewline = true;
                         return lBreak;
                     }