Fix for 3604241, simple space collapsing results in a doubled character. Simplify...
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Mar 2004 18:43:12 +0000 (18:43 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Mar 2004 18:43:12 +0000 (18:43 +0000)
whitespace and make sure it works across absolutely positioned spans.

        Reviewed by darin

        * khtml/rendering/bidi.cpp:
        (khtml::RenderBlock::findNextLineBreak):

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

LayoutTests/fast/block/positioning/auto/005-expected.txt
LayoutTests/fast/block/positioning/auto/006-expected.txt
LayoutTests/fast/clip/007-expected.txt
LayoutTests/fast/clip/008-expected.txt
LayoutTests/fast/invalid/014-expected.txt
WebCore/ChangeLog-2005-08-23
WebCore/khtml/rendering/bidi.cpp

index dcb2f78afbd3f33df93efe5d0cdd7c702627425d..5c0c55798779010b979c6413b2002a1d269d9b69 100644 (file)
@@ -12,10 +12,8 @@ layer at (0,0) size 800x88
         text run at (0,36) width 326: "pixels of padding on the right side of the box stack. "
         text run at (326,36) width 455: "The black box's top should be aligned with the end of the last line in this"
         text run at (0,54) width 470: "parargaph and its left side should begin right after the end of this sentence. "
-      RenderText {TEXT} at (470,54) size 4x18
-        text run at (470,54) width 4: " "
-      RenderText {TEXT} at (474,54) size 4x18
-        text run at (474,54) width 4: " "
+      RenderText {TEXT} at (0,0) size 0x0
+      RenderText {TEXT} at (0,0) size 0x0
 layer at (478,62) size 240x340
   RenderBlock (positioned) {SPAN} at (478,62) size 240x340 [border: (20px solid #000000)]
     RenderText {TEXT} at (0,0) size 0x0
index 928ed811a758e378530a70ffc20d4a0da8cbebcd..7c7ec99ad1de3c03d34095434821144f733348b2 100644 (file)
@@ -16,8 +16,7 @@ layer at (0,0) size 800x130
           text run at (14,0) width 770: "The black box's top should be aligned with the end of the last line in this parargaph and its left side should begin right after"
           text run at (629,18) width 8: ". "
           text run at (637,18) width 147: "the end of this sentence"
-        RenderText {TEXT} at (625,18) size 4x18
-          text run at (625,18) width 4: " "
+        RenderText {TEXT} at (0,0) size 0x0
 layer at (397,96) size 240x340
   RenderBlock (positioned) {SPAN} at (397,96) size 240x340 [border: (20px solid #000000)]
     RenderText {TEXT} at (0,0) size 0x0
index f335e4cdcff86e2265ece8b33a5c6aaa15207184..db9756b95e03769f27c2caace4e443b8f56aae19 100644 (file)
@@ -11,8 +11,7 @@ layer at (0,0) size 800x70
         text run at (0,18) width 293: "checking to make sure overflow is done using "
         text run at (293,18) width 446: "a containing block model, and that a fixed positioned element inside an"
         text run at (0,36) width 353: "absolute positioned element is not considered overflow. "
-      RenderText {TEXT} at (353,36) size 4x18
-        text run at (353,36) width 4: " "
+      RenderText {TEXT} at (0,0) size 0x0
 layer at (8,62) size 100x100
   RenderBlock (positioned) {DIV} at (8,62) size 100x100
     RenderText {TEXT} at (0,0) size 0x0
index b66d11c399b590706edf854c3b21612688493eb6..018cb0a92c786df06ad17f90f36882b837d5c516 100644 (file)
@@ -11,8 +11,7 @@ layer at (0,0) size 800x70
         text run at (0,18) width 293: "checking to make sure overflow is done using "
         text run at (293,18) width 446: "a containing block model, and that a fixed positioned element inside an"
         text run at (0,36) width 353: "absolute positioned element is not considered overflow. "
-      RenderText {TEXT} at (353,36) size 4x18
-        text run at (353,36) width 4: " "
+      RenderText {TEXT} at (0,0) size 0x0
 layer at (8,62) size 100x100
   RenderBlock (positioned) {DIV} at (8,62) size 100x100
     RenderText {TEXT} at (0,0) size 0x0
index 9621a49a5408c3891eedc21934aa08528dce0391..450c7c8ce691a6831c6588c63c104efcb3cb7977 100644 (file)
@@ -7,8 +7,7 @@ layer at (0,0) size 800x64
         RenderText {TEXT} at (0,0) size 603x18
           text run at (0,0) width 282: "Random tests of some bizarre combinations. "
           text run at (282,0) width 321: "H2 should allow a form inside it, but p should not. "
-        RenderText {TEXT} at (603,0) size 4x18
-          text run at (603,0) width 4: "  "
+        RenderText {TEXT} at (0,0) size 0x0
       RenderBlock {FORM} at (0,18) size 784x22
         RenderSelect {SELECT} at (2,2) size 39x18
         RenderText {TEXT} at (0,0) size 0x0
index cdbb2a8203fb96ee53963ebf3b3915bbf5ed2d12..32cff56ecbacade0bd880cfb963a3a9da6778c73 100644 (file)
@@ -1,3 +1,13 @@
+2004-03-30  David Hyatt  <hyatt@apple.com>
+
+       Fix for 3604241, simple space collapsing results in a doubled character.  Simplify the ignoring of
+       whitespace and make sure it works across absolutely positioned spans.
+       
+        Reviewed by darin
+
+        * khtml/rendering/bidi.cpp:
+        (khtml::RenderBlock::findNextLineBreak):
+
 2004-03-30  Darin Adler  <darin@apple.com>
 
         Reviewed by Dave.
index 5c2205a5d62267ba59176fc7a501f9ffe355f9a8..c4ad942f87ea9141661b0400f833c9f6c55ad2a7 100644 (file)
@@ -2,7 +2,7 @@
  * This file is part of the html renderer for KDE.
  *
  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
- * Copyright (C) 2003 Apple Computer, Inc.
+ * Copyright (C) 2004 Apple Computer, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -1718,17 +1718,14 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
     // This variable is used only if whitespace isn't set to PRE, and it tells us whether
     // or not we are currently ignoring whitespace.
     bool ignoringSpaces = false;
+    BidiIterator ignoreStart;
     
     // This variable tracks whether the very last character we saw was a space.  We use
     // this to detect when we encounter a second space so we know we have to terminate
     // a run.
     bool currentCharacterIsSpace = false;
     RenderObject* trailingSpaceObject = 0;
-    
-    // The pos of the last whitespace char we saw, not to be confused with the lastSpace
-    // variable below, which is really the last breakable char.
-    int lastSpacePos = 0;
-    
+
     BidiIterator lBreak = start;
 
     RenderObject *o = start.obj;
@@ -1803,12 +1800,13 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
                 // then start ignoring spaces again.
                 if (needToSetStaticX || needToSetStaticY) {
                     trailingSpaceObject = 0;
+                    ignoreStart.obj = o;
+                    ignoreStart.pos = 0;
                     if (ignoringSpaces) {
-                        BidiIterator startMid( 0, o, 0 );
-                        BidiIterator stopMid ( 0, o, 1 );
-                        addMidpoint(startMid); // Stop ignoring spaces.
-                        addMidpoint(stopMid); // Start ignoring again.
+                        addMidpoint(ignoreStart); // Stop ignoring spaces.
+                        addMidpoint(ignoreStart); // Start ignoring again.
                     }
+                    
                 }
             }
         } else if (o->isInlineFlow()) {
@@ -1848,7 +1846,6 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
             isLineEmpty = false;
             ignoringSpaces = false;
             currentCharacterIsSpace = false;
-            lastSpacePos = 0;
             trailingSpaceObject = 0;
             
             if (o->isListMarker() && o->style()->listStylePosition() == OUTSIDE) {
@@ -1924,7 +1921,6 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
                             // Stop ignoring spaces and begin at this
                             // new point.
                             ignoringSpaces = false;
-                            lastSpacePos = 0;
                             lastSpace = pos; // e.g., "Foo    goo", don't add in any of the ignored spaces.
                             BidiIterator startMid ( 0, o, pos );
                             addMidpoint(startMid);
@@ -1937,8 +1933,6 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
                         }
                     }
 
-                    if (currentCharacterIsSpace && !previousCharacterIsSpace)
-                        lastSpacePos = pos;
                     tmpW += t->width(lastSpace, pos - lastSpace, f);
                     if (!appliedStartWidth) {
                         tmpW += inlineWidth(o, true, false);
@@ -2007,16 +2001,13 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
                         // If we encounter a newline, or if we encounter a
                         // second space, we need to go ahead and break up this
                         // run and enter a mode where we start collapsing spaces.
-                        if (currentCharacterIsSpace && previousCharacterIsSpace){
+                        if (currentCharacterIsSpace && previousCharacterIsSpace) {
                             ignoringSpaces = true;
-                        }
-                        
-                        if (ignoringSpaces) {
+                            
                             // We just entered a mode where we are ignoring
                             // spaces. Create a midpoint to terminate the run
                             // before the second space. 
-                            BidiIterator endMid ( 0, trailingSpaceObject ? trailingSpaceObject : o, lastSpacePos );
-                            addMidpoint(endMid);
+                            addMidpoint(ignoreStart);
                             lastSpace = pos;
                         }
                     }
@@ -2025,11 +2016,15 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi
                     // Stop ignoring spaces and begin at this
                     // new point.
                     ignoringSpaces = false;
-                    lastSpacePos = 0;
                     lastSpace = pos; // e.g., "Foo    goo", don't add in any of the ignored spaces.
                     BidiIterator startMid ( 0, o, pos );
                     addMidpoint(startMid);
                 }
+
+                if (currentCharacterIsSpace && !previousCharacterIsSpace) {
+                    ignoreStart.obj = o;
+                    ignoreStart.pos = pos;
+                }
                 
                 if (!isPre && currentCharacterIsSpace && !ignoringSpaces)
                     trailingSpaceObject = o;