2007-07-13 Mitz Pettel <mitz@webkit.org>
authorbdash <bdash@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Jul 2007 11:51:40 +0000 (11:51 +0000)
committerbdash <bdash@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Jul 2007 11:51:40 +0000 (11:51 +0000)
        Reviewed by Dave Hyatt.

        - fix http://bugs.webkit.org/show_bug.cgi?id=14395
          When a <p> is inside <li> two <BR>s are rendered

        Test: fast/lists/marker-before-empty-inline.html

        * rendering/RenderBlock.h:
        * rendering/RenderListItem.cpp:
        (WebCore::getParentOfFirstLineBox): Changed to skip empty inline flows that
        do not actually generate any line boxes. Limited the nested lists quirk to
        the case where the list is a child of the list item, to match Firefox.
        * rendering/bidi.cpp:
        (WebCore::requiresLineBox): Added. Factored out of skipWhitespace.
        (WebCore::RenderBlock::generatesLineBoxesForInlineChild): Added. Checkes
        whether the child or any of its siblings following it will generate a line
        box in the flow.
        (WebCore::RenderBlock::skipWhitespace):

2007-07-13  Mitz Pettel  <mitz@webkit.org>

        Reviewed by Dave Hyatt.

        - test and updated results for http://bugs.webkit.org/show_bug.cgi?id=14395
          When a <p> is inside <li> two <BR>s are rendered

        * editing/pasteboard/4861080-expected.checksum:
        * editing/pasteboard/4861080-expected.png:
        * editing/pasteboard/4861080-expected.txt:
        * fast/lists/marker-before-empty-inline-expected.checksum: Added.
        * fast/lists/marker-before-empty-inline-expected.png: Added.
        * fast/lists/marker-before-empty-inline-expected.txt: Added.
        * fast/lists/marker-before-empty-inline.html: Added.

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

12 files changed:
LayoutTests/ChangeLog
LayoutTests/editing/pasteboard/4861080-expected.checksum
LayoutTests/editing/pasteboard/4861080-expected.png
LayoutTests/editing/pasteboard/4861080-expected.txt
LayoutTests/fast/lists/marker-before-empty-inline-expected.checksum [new file with mode: 0644]
LayoutTests/fast/lists/marker-before-empty-inline-expected.png [new file with mode: 0644]
LayoutTests/fast/lists/marker-before-empty-inline-expected.txt [new file with mode: 0644]
LayoutTests/fast/lists/marker-before-empty-inline.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/rendering/RenderBlock.h
WebCore/rendering/RenderListItem.cpp
WebCore/rendering/bidi.cpp

index ce1a2af..9467c0b 100644 (file)
@@ -1,3 +1,18 @@
+2007-07-13  Mitz Pettel  <mitz@webkit.org>
+
+        Reviewed by Dave Hyatt.
+
+        - test and updated results for http://bugs.webkit.org/show_bug.cgi?id=14395
+          When a <p> is inside <li> two <BR>s are rendered
+
+        * editing/pasteboard/4861080-expected.checksum:
+        * editing/pasteboard/4861080-expected.png:
+        * editing/pasteboard/4861080-expected.txt:
+        * fast/lists/marker-before-empty-inline-expected.checksum: Added.
+        * fast/lists/marker-before-empty-inline-expected.png: Added.
+        * fast/lists/marker-before-empty-inline-expected.txt: Added.
+        * fast/lists/marker-before-empty-inline.html: Added.
+
 2007-07-12  David Kilzer  <ddkilzer@apple.com>
 
         Reviewed by NOBODY.
index c0520c0..cd8b58f 100644 (file)
@@ -1 +1 @@
-2715a54c10a36f6c4b276e39882b6b9d
\ No newline at end of file
+ded7c555a653b9a49002c767e6b5a0f3
\ No newline at end of file
index 4d1c525..23ee058 100644 (file)
Binary files a/LayoutTests/editing/pasteboard/4861080-expected.png and b/LayoutTests/editing/pasteboard/4861080-expected.png differ
index a18c62b..823fad5 100644 (file)
@@ -8,21 +8,21 @@ layer at (0,0) size 800x600
           text run at (0,0) width 741: "This tests dropping content into the unwanted space above a list items content when the content is wrapped in a span. "
           text run at (741,0) width 28: "You"
           text run at (0,18) width 234: "should see 'DragMe DropAboveMe'."
-      RenderBlock {DIV} at (0,52) size 784x58
-        RenderListItem {LI} at (0,0) size 784x40 [border: (1px solid #000000)]
-          RenderBlock (anonymous) at (1,1) size 782x18
-            RenderListMarker at (-1,0) size 7x18: bullet
-            RenderInline {SPAN} at (0,0) size 0x18
-          RenderBlock (anonymous) at (1,19) size 782x20
+      RenderBlock {DIV} at (0,52) size 784x40
+        RenderListItem {LI} at (0,0) size 784x22 [border: (1px solid #000000)]
+          RenderBlock (anonymous) at (1,1) size 782x0
+            RenderInline {SPAN} at (0,0) size 0x0
+          RenderBlock (anonymous) at (1,1) size 782x20
             RenderBlock {DIV} at (0,0) size 782x20 [border: (1px solid #FF0000)]
-              RenderText {#text} at (1,1) size 57x18
-                text run at (1,1) width 57: "DragMe "
-              RenderText {#text} at (58,1) size 97x18
-                text run at (58,1) width 97: "DropAboveMe"
-          RenderBlock (anonymous) at (1,39) size 782x0
+              RenderListMarker at (0,1) size 7x18: bullet
+              RenderText {#text} at (15,1) size 97x18
+                text run at (15,1) width 97: "DropAboveMe"
+              RenderText {#text} at (112,1) size 57x18
+                text run at (112,1) width 57: " DragMe"
+          RenderBlock (anonymous) at (1,21) size 782x0
             RenderInline {SPAN} at (0,0) size 0x0
-        RenderBlock {DIV} at (0,40) size 784x18
+        RenderBlock {DIV} at (0,22) size 784x18
           RenderBR {BR} at (0,0) size 0x18
-      RenderBlock {UL} at (0,126) size 784x0
-selection start: position 0 of child 0 {#text} of child 0 {DIV} of child 0 {SPAN} of child 1 {LI} of child 2 {DIV} of child 0 {BODY} of child 0 {HTML} of document
-selection end:   position 7 of child 0 {#text} of child 0 {DIV} of child 0 {SPAN} of child 1 {LI} of child 2 {DIV} of child 0 {BODY} of child 0 {HTML} of document
+      RenderBlock {UL} at (0,108) size 784x0
+selection start: position 0 of child 1 {#text} of child 0 {DIV} of child 0 {SPAN} of child 1 {LI} of child 2 {DIV} of child 0 {BODY} of child 0 {HTML} of document
+selection end:   position 7 of child 1 {#text} of child 0 {DIV} of child 0 {SPAN} of child 1 {LI} of child 2 {DIV} of child 0 {BODY} of child 0 {HTML} of document
diff --git a/LayoutTests/fast/lists/marker-before-empty-inline-expected.checksum b/LayoutTests/fast/lists/marker-before-empty-inline-expected.checksum
new file mode 100644 (file)
index 0000000..c7f40bb
--- /dev/null
@@ -0,0 +1 @@
+87cb9cd37737c03ce6c5b81736d08239
\ No newline at end of file
diff --git a/LayoutTests/fast/lists/marker-before-empty-inline-expected.png b/LayoutTests/fast/lists/marker-before-empty-inline-expected.png
new file mode 100644 (file)
index 0000000..14e6ca3
Binary files /dev/null and b/LayoutTests/fast/lists/marker-before-empty-inline-expected.png differ
diff --git a/LayoutTests/fast/lists/marker-before-empty-inline-expected.txt b/LayoutTests/fast/lists/marker-before-empty-inline-expected.txt
new file mode 100644 (file)
index 0000000..5133bf4
--- /dev/null
@@ -0,0 +1,113 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x576
+      RenderBlock {P} at (0,0) size 784x18
+        RenderText {#text} at (0,0) size 53x18
+          text run at (0,0) width 53: "Test for "
+        RenderInline {I} at (0,0) size 641x18
+          RenderInline {A} at (0,0) size 301x18 [color=#0000EE]
+            RenderText {#text} at (53,0) size 301x18
+              text run at (53,0) width 301: "http://bugs.webkit.org/show_bug.cgi?id=14395"
+          RenderText {#text} at (354,0) size 340x18
+            text run at (354,0) width 4: " "
+            text run at (358,0) width 336: "When a <p> is inside <li> two <BR>s are rendered"
+        RenderText {#text} at (694,0) size 4x18
+          text run at (694,0) width 4: "."
+      RenderBlock {P} at (0,34) size 784x18
+        RenderText {#text} at (0,0) size 487x18
+          text run at (0,0) width 487: "In all of the following, the bullets should be lined up with the first line of text."
+      RenderBlock {UL} at (0,68) size 784x18
+        RenderListItem {LI} at (40,0) size 744x18
+          RenderBlock (anonymous) at (0,0) size 744x0
+            RenderInline {SPAN} at (0,0) size 0x0
+              RenderText {#text} at (0,0) size 0x0
+          RenderBlock (anonymous) at (0,0) size 744x18
+            RenderBlock {DIV} at (0,0) size 744x18
+              RenderListMarker at (-17,0) size 7x18: bullet
+              RenderText {#text} at (0,0) size 27x18
+                text run at (0,0) width 27: "item"
+          RenderBlock (anonymous) at (0,18) size 744x0
+            RenderInline {SPAN} at (0,0) size 0x0
+      RenderBlock {UL} at (0,102) size 784x18
+        RenderListItem {LI} at (40,0) size 744x18
+          RenderBlock (anonymous) at (0,0) size 744x0
+            RenderInline {SPAN} at (0,0) size 0x0
+              RenderText {#text} at (0,0) size 0x0
+            RenderText {#text} at (0,0) size 0x0
+          RenderBlock {DIV} at (0,0) size 744x18
+            RenderListMarker at (-17,0) size 7x18: bullet
+            RenderText {#text} at (0,0) size 27x18
+              text run at (0,0) width 27: "item"
+      RenderBlock {UL} at (0,136) size 784x18
+        RenderListItem {LI} at (40,0) size 744x18
+          RenderBlock (anonymous) at (0,0) size 744x0
+            RenderInline {SPAN} at (0,0) size 0x0
+              RenderText {#text} at (0,0) size 0x0
+              RenderInline {I} at (0,0) size 0x0
+                RenderText {#text} at (0,0) size 0x0
+          RenderBlock (anonymous) at (0,0) size 744x18
+            RenderBlock {DIV} at (0,0) size 744x18
+              RenderListMarker at (-17,0) size 7x18: bullet
+              RenderText {#text} at (0,0) size 27x18
+                text run at (0,0) width 27: "item"
+          RenderBlock (anonymous) at (0,18) size 744x0
+            RenderInline {SPAN} at (0,0) size 0x0
+              RenderInline {I} at (0,0) size 0x0
+              RenderText {#text} at (0,0) size 0x0
+            RenderText {#text} at (0,0) size 0x0
+      RenderBlock {UL} at (0,170) size 784x36
+        RenderListItem {LI} at (40,0) size 744x36
+          RenderBlock (anonymous) at (0,0) size 744x18
+            RenderListMarker at (-17,0) size 7x18: bullet
+            RenderInline {SPAN} at (0,0) size 40x18
+              RenderInline (generated) at (0,0) size 40x18
+                RenderText at (0,0) size 40x18
+                  text run at (0,0) width 40: "before"
+              RenderText {#text} at (0,0) size 0x0
+          RenderBlock (anonymous) at (0,18) size 744x18
+            RenderBlock {DIV} at (0,0) size 744x18
+              RenderText {#text} at (0,0) size 27x18
+                text run at (0,0) width 27: "item"
+          RenderBlock (anonymous) at (0,36) size 744x0
+            RenderInline {SPAN} at (0,0) size 0x0
+      RenderBlock {UL} at (0,222) size 784x36
+        RenderListItem {LI} at (40,0) size 744x36
+          RenderBlock (anonymous) at (0,0) size 744x0
+            RenderInline {SPAN} at (0,0) size 0x0
+          RenderBlock (anonymous) at (0,0) size 744x18
+            RenderBlock {UL} at (0,0) size 744x18
+              RenderListItem {LI} at (40,0) size 704x18
+                RenderListMarker at (-57,0) size 7x18: bullet
+                RenderListMarker at (-17,0) size 7x18: white bullet
+                RenderText {#text} at (0,0) size 27x18
+                  text run at (0,0) width 27: "item"
+          RenderBlock (anonymous) at (0,18) size 744x18
+            RenderInline {SPAN} at (0,0) size 0x0
+            RenderBR {BR} at (0,0) size 0x18
+      RenderBlock {UL} at (0,274) size 784x36
+        RenderListItem {LI} at (40,0) size 744x36
+          RenderBlock {DIV} at (0,0) size 744x18
+            RenderBlock {UL} at (0,0) size 744x18
+              RenderListItem {LI} at (40,0) size 704x18
+                RenderListMarker at (-57,0) size 7x18: bullet
+                RenderListMarker at (-17,0) size 7x18: white bullet
+                RenderText {#text} at (0,0) size 27x18
+                  text run at (0,0) width 27: "item"
+          RenderBlock (anonymous) at (0,18) size 744x18
+            RenderBR {BR} at (0,0) size 0x18
+      RenderBlock {P} at (0,326) size 784x18
+        RenderText {#text} at (0,0) size 522x18
+          text run at (0,0) width 522: "In this case, the solid bullet should be one line above the hollow bullet and the text."
+      RenderBlock {UL} at (0,360) size 784x54
+        RenderListItem {LI} at (40,0) size 744x54
+          RenderBlock (anonymous) at (0,0) size 744x18
+            RenderListMarker at (-17,0) size 7x18: bullet
+          RenderBlock {UL} at (0,18) size 744x18
+            RenderListItem {LI} at (40,0) size 704x18
+              RenderListMarker at (-17,0) size 7x18: white bullet
+              RenderText {#text} at (0,0) size 27x18
+                text run at (0,0) width 27: "item"
+          RenderBlock (anonymous) at (0,36) size 744x18
+            RenderBR {BR} at (0,0) size 0x18
diff --git a/LayoutTests/fast/lists/marker-before-empty-inline.html b/LayoutTests/fast/lists/marker-before-empty-inline.html
new file mode 100644 (file)
index 0000000..2e6b196
--- /dev/null
@@ -0,0 +1,34 @@
+<html>
+<head>
+    <style>
+        .generate:before {content: 'before';}
+    </style>
+</head>
+<body>
+    <p>
+        Test for <i><a href="http://bugs.webkit.org/show_bug.cgi?id=14395">http://bugs.webkit.org/show_bug.cgi?id=14395</a>
+        When a &lt;p> is inside &lt;li> two &lt;BR>s are rendered</i>.
+    </p>
+    <p>
+        In all of the following, the bullets should be lined up with the first line of text.
+    </p>
+    
+    <ul><li> <span> <div>item</div></span></li></ul>
+    
+    <ul><li> <span> </span> <div>item</div></li></ul>
+    
+    <ul><li> <span> <i> <div>item</div> </i> </span> </li></ul>
+    
+    <ul><li> <span class="generate"> <div>item</div></span></li></ul>
+    
+    <ul><li><span><ul><li>item</li></ul></span><br></li></ul>
+    
+    <ul><li><div><ul><li>item</li></ul></div><br></li></ul>
+    
+    <p>
+        In this case, the solid bullet should be one line above the hollow bullet and the text.
+    </p>
+    
+    <ul><li><ul><li>item</li></ul><br></li></ul>
+</body>
+</html>
index 8b7f5b6..af9f8bb 100644 (file)
@@ -1,3 +1,24 @@
+2007-07-13  Mitz Pettel  <mitz@webkit.org>
+
+        Reviewed by Dave Hyatt.
+
+        - fix http://bugs.webkit.org/show_bug.cgi?id=14395
+          When a <p> is inside <li> two <BR>s are rendered
+
+        Test: fast/lists/marker-before-empty-inline.html
+
+        * rendering/RenderBlock.h:
+        * rendering/RenderListItem.cpp:
+        (WebCore::getParentOfFirstLineBox): Changed to skip empty inline flows that
+        do not actually generate any line boxes. Limited the nested lists quirk to
+        the case where the list is a child of the list item, to match Firefox.
+        * rendering/bidi.cpp:
+        (WebCore::requiresLineBox): Added. Factored out of skipWhitespace.
+        (WebCore::RenderBlock::generatesLineBoxesForInlineChild): Added. Checkes
+        whether the child or any of its siblings following it will generate a line
+        box in the flow.
+        (WebCore::RenderBlock::skipWhitespace):
+
 2007-07-13  Holger Hans Peter Freyther  <zecke@selfish.org>
 
         Reviewed by Alexey.
index 0bf70d3..1cf31b6 100644 (file)
@@ -129,6 +129,7 @@ public:
     bool matchedEndLine(const BidiIterator& start, const BidiStatus& status, BidiContext* context,
                         const BidiIterator& endLineStart, const BidiStatus& endLineStatus, BidiContext* endLineContext,
                         RootInlineBox*& endLine, int& endYPos, int& repaintBottom, int& repaintTop);
+    bool generatesLineBoxesForInlineChild(RenderObject*);
     int skipWhitespace(BidiIterator&, BidiState&);
     BidiIterator findNextLineBreak(BidiIterator& start, BidiState& info);
     RootInlineBox* constructLine(const BidiIterator& start, const BidiIterator& end);
index 61cf61c..ba77300 100644 (file)
@@ -135,7 +135,7 @@ bool RenderListItem::isEmpty() const
     return lastChild() == m_marker;
 }
 
-static RenderObject* getParentOfFirstLineBox(RenderObject* curr, RenderObject* marker)
+static RenderObject* getParentOfFirstLineBox(RenderBlock* curr, RenderObject* marker)
 {
     RenderObject* firstChild = curr->firstChild();
     if (!firstChild)
@@ -145,7 +145,7 @@ static RenderObject* getParentOfFirstLineBox(RenderObject* curr, RenderObject* m
         if (currChild == marker)
             continue;
 
-        if (currChild->isInline())
+        if (currChild->isInline() && (!currChild->isInlineFlow() || curr->generatesLineBoxesForInlineChild(currChild)))
             return curr;
 
         if (currChild->isFloating() || currChild->isPositioned())
@@ -154,11 +154,11 @@ static RenderObject* getParentOfFirstLineBox(RenderObject* curr, RenderObject* m
         if (currChild->isTable() || !currChild->isRenderBlock())
             break;
 
-        if (currChild->style()->htmlHacks() && currChild->element() &&
+        if (curr->isListItem() && currChild->style()->htmlHacks() && currChild->element() &&
             (currChild->element()->hasTagName(ulTag)|| currChild->element()->hasTagName(olTag)))
             break;
 
-        RenderObject* lineBox = getParentOfFirstLineBox(currChild, marker);
+        RenderObject* lineBox = getParentOfFirstLineBox(static_cast<RenderBlock*>(currChild), marker);
         if (lineBox)
             return lineBox;
     }
index 569f0c5..782c585 100644 (file)
@@ -2006,6 +2006,29 @@ static inline bool shouldPreserveNewline(RenderObject* object)
     return object->style()->preserveNewline();
 }
 
+static inline bool requiresLineBox(BidiIterator& it)
+{
+    if (it.obj->isFloatingOrPositioned() || it.obj->isInlineFlow())
+        return false;
+    if (!shouldCollapseWhiteSpace(it.obj->style()) || it.obj->isBR())
+        return true;
+
+    UChar current = it.current();
+    return current != ' ' && current != '\t' && current != softHyphen && (current != '\n' || shouldPreserveNewline(it.obj)) && !skipNonBreakingSpace(it);
+}
+
+bool RenderBlock::generatesLineBoxesForInlineChild(RenderObject* inlineObj)
+{
+    ASSERT(inlineObj->parent() == this);
+
+    BidiIterator it(this, inlineObj, 0);
+    BidiState state;
+    while (!it.atEnd() && !requiresLineBox(it))
+        it.increment(state);
+
+    return !it.atEnd();
+}
+
 int RenderBlock::skipWhitespace(BidiIterator &it, BidiState &bidi)
 {
     // FIXME: The entire concept of the skipWhitespace function is flawed, since we really need to be building
@@ -2013,10 +2036,9 @@ int RenderBlock::skipWhitespace(BidiIterator &it, BidiState &bidi)
     // elements quite right.  In other words, we need to build this function's work into the normal line
     // object iteration process.
     int w = lineWidth(m_height);
-    while (!it.atEnd() && (it.obj->isFloatingOrPositioned() || it.obj->isInlineFlow() || 
-           (shouldCollapseWhiteSpace(it.obj->style()) && !it.obj->isBR() &&
-            (it.current() == ' ' || it.current() == '\t' || (!shouldPreserveNewline(it.obj) && it.current() == '\n') ||
-             it.current() == softHyphen || skipNonBreakingSpace(it))))) {
+    bidi.adjustEmbedding = true;
+
+    while (!it.atEnd() && !requiresLineBox(it)) {
         if (it.obj->isFloatingOrPositioned()) {
             RenderObject *o = it.obj;
             // add to special objects...
@@ -2053,11 +2075,10 @@ int RenderBlock::skipWhitespace(BidiIterator &it, BidiState &bidi)
                     o->setStaticY(m_height);
             }
         }
-        
-        bidi.adjustEmbedding = true;
         it.increment(bidi);
-        bidi.adjustEmbedding = false;
     }
+
+    bidi.adjustEmbedding = false;
     return w;
 }