Reviewed by John
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 25 Oct 2004 18:48:44 +0000 (18:48 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 25 Oct 2004 18:48:44 +0000 (18:48 +0000)
        * khtml/rendering/bidi.cpp:
        (khtml::RenderBlock::findNextLineBreak): I did not get my fix for 3848343 and 3848224
    yesterday quite right: words that should have been placed on the next line were instead
        appearing on the line before, beyond the right margin. This was a one-word only error
        based on moving the line break object when it should have stayed put. Here is the rule:
        The line break object only moves to after the whitespace on the end of a line if that
        whitespace caused line overflow when its width is added in.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@7888 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-08-23
WebCore/khtml/rendering/bidi.cpp

index 1298aad380e4128b6fb3f6c54dc1e03d83d30732..622606961695887a8719815734a3eeb48211c5bf 100644 (file)
@@ -1,3 +1,15 @@
+2004-10-25  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by John
+
+        * khtml/rendering/bidi.cpp:
+        (khtml::RenderBlock::findNextLineBreak): I did not get my fix for 3848343 and 3848224
+           yesterday quite right: words that should have been placed on the next line were instead
+        appearing on the line before, beyond the right margin. This was a one-word only error
+        based on moving the line break object when it should have stayed put. Here is the rule:
+        The line break object only moves to after the whitespace on the end of a line if that 
+        whitespace caused line overflow when its width is added in.
+
 2004-10-25  Adele Amchan  <adele@apple.com>
 
         Reviewed by Darin.
 2004-10-25  Adele Amchan  <adele@apple.com>
 
         Reviewed by Darin.
index c0d7f0a717328de246f9ca11c49d3c2a2c909816..1edb498bab2290944af852804ef382e1e8429202 100644 (file)
@@ -1967,7 +1967,7 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
             bool appliedEndWidth = false;
 
             int wrapW = tmpW;
             bool appliedEndWidth = false;
 
             int wrapW = tmpW;
-            
+
             while(len) {
                 bool previousCharacterIsSpace = currentCharacterIsSpace;
                 const QChar c = str[pos];
             while(len) {
                 bool previousCharacterIsSpace = currentCharacterIsSpace;
                 const QChar c = str[pos];
@@ -2059,12 +2059,21 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
                     }
         
                     if (o->style()->whiteSpace() == NORMAL) {
                     }
         
                     if (o->style()->whiteSpace() == NORMAL) {
+                        // In AFTER_WHITE_SPACE mode, consider the current character
+                        // as candidate width for this line.
                         int charWidth = o->style()->khtmlLineBreak() == AFTER_WHITE_SPACE ? t->width(pos, 1, f) : 0;
                         if (w + tmpW + charWidth > width) {
                             if (o->style()->khtmlLineBreak() == AFTER_WHITE_SPACE) {
                         int charWidth = o->style()->khtmlLineBreak() == AFTER_WHITE_SPACE ? t->width(pos, 1, f) : 0;
                         if (w + tmpW + charWidth > width) {
                             if (o->style()->khtmlLineBreak() == AFTER_WHITE_SPACE) {
-                                lBreak.obj = o;
-                                lBreak.pos = pos;
-                                skipWhitespace(lBreak, bidi);
+                                // Check if line is too big even without the extra space
+                                // at the end of the line. If it is not, do nothing. 
+                                // If the line needs the extra whitespace to be too long, 
+                                // then move the line break to the space and skip all 
+                                // additional whitespace.
+                                if (w + tmpW < width) {
+                                    lBreak.obj = o;
+                                    lBreak.pos = pos;
+                                    skipWhitespace(lBreak, bidi);
+                                }
                             }
                             goto end; // Didn't fit. Jump to the end.
                         }
                             }
                             goto end; // Didn't fit. Jump to the end.
                         }