2006-04-23 Eric Seidel <eseidel@apple.com>
authoreseidel <eseidel@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 23 Apr 2006 09:19:29 +0000 (09:19 +0000)
committereseidel <eseidel@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 23 Apr 2006 09:19:29 +0000 (09:19 +0000)
        Reviewed by hyatt.

        Reproducible crasher with <li value=1234567890 type=A>
        http://bugzilla.opendarwin.org/show_bug.cgi?id=8542

        Fixed our alphabetical list generation to match WinIE (not FireFox)
        Previously our alphabetical lists were completely wrong past 26 items.

        Tests:
        * fast/lists/alpha-list-wrap.html
        * fast/lists/li-style-alpha-huge-value-crash.html

        * rendering/render_list.cpp:
        (WebCore::toLetterString):
        (WebCore::toHebrew):
        (WebCore::RenderListMarker::calcMinMaxWidth):

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

LayoutTests/ChangeLog
LayoutTests/fast/lists/alpha-list-wrap-expected.checksum [new file with mode: 0644]
LayoutTests/fast/lists/alpha-list-wrap-expected.png [new file with mode: 0644]
LayoutTests/fast/lists/alpha-list-wrap-expected.txt [new file with mode: 0644]
LayoutTests/fast/lists/alpha-list-wrap.html [new file with mode: 0644]
LayoutTests/fast/lists/li-style-alpha-huge-value-crash-expected.checksum [new file with mode: 0644]
LayoutTests/fast/lists/li-style-alpha-huge-value-crash-expected.png [new file with mode: 0644]
LayoutTests/fast/lists/li-style-alpha-huge-value-crash-expected.txt [new file with mode: 0644]
LayoutTests/fast/lists/li-style-alpha-huge-value-crash.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/rendering/render_list.cpp

index 4323f5a2c9e18c44ec3bcbe9bc9e20b0d36edae6..d3666902185748e304599695ebbbdabe553a6972 100644 (file)
@@ -1,3 +1,19 @@
+2006-04-22  Eric Seidel  <eseidel@apple.com>
+
+        Reviewed by hyatt.
+
+        Reproducible crasher with <li value=1234567890 type=A>
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=8542
+
+        * fast/lists/alpha-list-wrap-expected.checksum: Added.
+        * fast/lists/alpha-list-wrap-expected.png: Added.
+        * fast/lists/alpha-list-wrap-expected.txt: Added.
+        * fast/lists/alpha-list-wrap.html: Added.
+        * fast/lists/li-style-alpha-huge-value-crash-expected.checksum: Added.
+        * fast/lists/li-style-alpha-huge-value-crash-expected.png: Added.
+        * fast/lists/li-style-alpha-huge-value-crash-expected.txt: Added.
+        * fast/lists/li-style-alpha-huge-value-crash.html: Added.
+
 2006-04-22  Geoffrey Garen  <ggaren@apple.com>
 
         Reviewed by Darin.
diff --git a/LayoutTests/fast/lists/alpha-list-wrap-expected.checksum b/LayoutTests/fast/lists/alpha-list-wrap-expected.checksum
new file mode 100644 (file)
index 0000000..7163dcd
--- /dev/null
@@ -0,0 +1 @@
+1794d3c229cdbaa38a0fe52bd7b4e21a
\ No newline at end of file
diff --git a/LayoutTests/fast/lists/alpha-list-wrap-expected.png b/LayoutTests/fast/lists/alpha-list-wrap-expected.png
new file mode 100644 (file)
index 0000000..7e73423
Binary files /dev/null and b/LayoutTests/fast/lists/alpha-list-wrap-expected.png differ
diff --git a/LayoutTests/fast/lists/alpha-list-wrap-expected.txt b/LayoutTests/fast/lists/alpha-list-wrap-expected.txt
new file mode 100644 (file)
index 0000000..1a66896
--- /dev/null
@@ -0,0 +1,124 @@
+layer at (0,0) size 785x1086
+  RenderCanvas at (0,0) size 785x600
+layer at (0,0) size 785x1086
+  RenderBlock {HTML} at (0,0) size 785x1086
+    RenderBody {BODY} at (8,8) size 769x1062
+      RenderBlock {OL} at (0,0) size 769x1062
+        RenderListItem {LI} at (40,0) size 729x18
+          RenderListMarker at (-24,0) size 20x18
+        RenderListItem {LI} at (40,18) size 729x18
+          RenderListMarker at (-27,0) size 23x18
+        RenderListItem {LI} at (40,36) size 729x18
+          RenderListMarker at (-24,0) size 20x18
+        RenderListItem {LI} at (40,54) size 729x18
+          RenderListMarker at (-24,0) size 20x18
+        RenderListItem {LI} at (40,72) size 729x18
+          RenderListMarker at (-22,0) size 18x18
+        RenderListItem {LI} at (40,90) size 729x18
+          RenderListMarker at (-36,0) size 32x18
+        RenderListItem {LI} at (40,108) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,126) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,144) size 729x18
+          RenderListMarker at (-36,0) size 32x18
+        RenderListItem {LI} at (40,162) size 729x18
+          RenderListMarker at (-34,0) size 30x18
+        RenderListItem {LI} at (40,180) size 729x18
+          RenderListMarker at (-33,0) size 29x18
+        RenderListItem {LI} at (40,198) size 729x18
+          RenderListMarker at (-36,0) size 32x18
+        RenderListItem {LI} at (40,216) size 729x18
+          RenderListMarker at (-36,0) size 32x18
+        RenderListItem {LI} at (40,234) size 729x18
+          RenderListMarker at (-29,0) size 25x18
+        RenderListItem {LI} at (40,252) size 729x18
+          RenderListMarker at (-30,0) size 26x18
+        RenderListItem {LI} at (40,270) size 729x18
+          RenderListMarker at (-36,0) size 32x18
+        RenderListItem {LI} at (40,288) size 729x18
+          RenderListMarker at (-34,0) size 30x18
+        RenderListItem {LI} at (40,306) size 729x18
+          RenderListMarker at (-38,0) size 34x18
+        RenderListItem {LI} at (40,324) size 729x18
+          RenderListMarker at (-36,0) size 32x18
+        RenderListItem {LI} at (40,342) size 729x18
+          RenderListMarker at (-36,0) size 32x18
+        RenderListItem {LI} at (40,360) size 729x18
+          RenderListMarker at (-33,0) size 29x18
+        RenderListItem {LI} at (40,378) size 729x18
+          RenderListMarker at (-36,0) size 32x18
+        RenderListItem {LI} at (40,396) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,414) size 729x18
+          RenderListMarker at (-33,0) size 29x18
+        RenderListItem {LI} at (40,432) size 729x18
+          RenderListMarker at (-34,0) size 30x18
+        RenderListItem {LI} at (40,450) size 729x18
+          RenderListMarker at (-36,0) size 32x18
+        RenderListItem {LI} at (40,468) size 729x18
+          RenderListMarker at (-36,0) size 32x18
+        RenderListItem {LI} at (40,486) size 729x18
+          RenderListMarker at (-39,0) size 35x18
+        RenderListItem {LI} at (40,504) size 729x18
+          RenderListMarker at (-36,0) size 32x18
+        RenderListItem {LI} at (40,522) size 729x18
+          RenderListMarker at (-36,0) size 32x18
+        RenderListItem {LI} at (40,540) size 729x18
+          RenderListMarker at (-34,0) size 30x18
+        RenderListItem {LI} at (40,558) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,576) size 729x18
+          RenderListMarker at (-34,0) size 30x18
+        RenderListItem {LI} at (40,594) size 729x18
+          RenderListMarker at (-34,0) size 30x18
+        RenderListItem {LI} at (40,612) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,630) size 729x18
+          RenderListMarker at (-33,0) size 29x18
+        RenderListItem {LI} at (40,648) size 729x18
+          RenderListMarker at (-32,0) size 28x18
+        RenderListItem {LI} at (40,666) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,684) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,702) size 729x18
+          RenderListMarker at (-28,0) size 24x18
+        RenderListItem {LI} at (40,720) size 729x18
+          RenderListMarker at (-29,0) size 25x18
+        RenderListItem {LI} at (40,738) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,756) size 729x18
+          RenderListMarker at (-33,0) size 29x18
+        RenderListItem {LI} at (40,774) size 729x18
+          RenderListMarker at (-37,0) size 33x18
+        RenderListItem {LI} at (40,792) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,810) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,828) size 729x18
+          RenderListMarker at (-32,0) size 28x18
+        RenderListItem {LI} at (40,846) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,864) size 729x18
+          RenderListMarker at (-34,0) size 30x18
+        RenderListItem {LI} at (40,882) size 729x18
+          RenderListMarker at (-32,0) size 28x18
+        RenderListItem {LI} at (40,900) size 729x18
+          RenderListMarker at (-33,0) size 29x18
+        RenderListItem {LI} at (40,918) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,936) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,954) size 729x18
+          RenderListMarker at (-38,0) size 34x18
+        RenderListItem {LI} at (40,972) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,990) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,1008) size 729x18
+          RenderListMarker at (-33,0) size 29x18
+        RenderListItem {LI} at (40,1026) size 729x18
+          RenderListMarker at (-35,0) size 31x18
+        RenderListItem {LI} at (40,1044) size 729x18
+          RenderListMarker at (-34,0) size 30x18
diff --git a/LayoutTests/fast/lists/alpha-list-wrap.html b/LayoutTests/fast/lists/alpha-list-wrap.html
new file mode 100644 (file)
index 0000000..8f6e111
--- /dev/null
@@ -0,0 +1,9 @@
+<ol id="test" start="22" type=A>
+
+<script>
+var list = document.getElementById("test");
+for (var n = 1; n < 60; n++) {
+    var li = document.createElement("li");
+    list.appendChild(li);
+}
+</script>
\ No newline at end of file
diff --git a/LayoutTests/fast/lists/li-style-alpha-huge-value-crash-expected.checksum b/LayoutTests/fast/lists/li-style-alpha-huge-value-crash-expected.checksum
new file mode 100644 (file)
index 0000000..2106729
--- /dev/null
@@ -0,0 +1 @@
+7c1b772742f511e9f2a2d1909ed7ea87
\ No newline at end of file
diff --git a/LayoutTests/fast/lists/li-style-alpha-huge-value-crash-expected.png b/LayoutTests/fast/lists/li-style-alpha-huge-value-crash-expected.png
new file mode 100644 (file)
index 0000000..ebdfaa1
Binary files /dev/null and b/LayoutTests/fast/lists/li-style-alpha-huge-value-crash-expected.png differ
diff --git a/LayoutTests/fast/lists/li-style-alpha-huge-value-crash-expected.txt b/LayoutTests/fast/lists/li-style-alpha-huge-value-crash-expected.txt
new file mode 100644 (file)
index 0000000..64aab31
--- /dev/null
@@ -0,0 +1,15 @@
+layer at (0,0) size 800x600
+  RenderCanvas 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 {BLOCKQUOTE} at (40,0) size 704x54
+        RenderBlock {BLOCKQUOTE} at (40,0) size 624x54
+          RenderBlock {OL} at (0,0) size 624x54
+            RenderListItem {LI} at (40,0) size 584x54
+              RenderListMarker at (-92,0) size 88x18
+              RenderBR {BR} at (0,0) size 0x18
+              RenderText {#text} at (0,18) size 487x36
+                text run at (0,18) width 189: "SUCCESS (you didn't crash) "
+                text run at (189,18) width 298: "Our behavior here matches WinIE not FireFox."
+                text run at (0,36) width 343: "http://bugzilla.opendarwin.org/show_bug.cgi?id=8542"
diff --git a/LayoutTests/fast/lists/li-style-alpha-huge-value-crash.html b/LayoutTests/fast/lists/li-style-alpha-huge-value-crash.html
new file mode 100644 (file)
index 0000000..2c10abd
--- /dev/null
@@ -0,0 +1,7 @@
+<blockquote>
+<blockquote>
+<ol>
+<li value=1234567890 type=A>
+<br>
+SUCCESS (you didn't crash)  Our behavior here matches WinIE not FireFox.
+http://bugzilla.opendarwin.org/show_bug.cgi?id=8542
index b017358ddf23b514560080b2a8c5c0144dcaa67c..e63922b73075b7f3ed8e683442967936704c0b06 100644 (file)
@@ -1,3 +1,22 @@
+2006-04-23  Eric Seidel  <eseidel@apple.com>
+
+        Reviewed by hyatt.
+
+        Reproducible crasher with <li value=1234567890 type=A>
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=8542
+
+        Fixed our alphabetical list generation to match WinIE (not FireFox)
+        Previously our alphabetical lists were completely wrong past 26 items.
+
+        Tests:
+        * fast/lists/alpha-list-wrap.html
+        * fast/lists/li-style-alpha-huge-value-crash.html
+
+        * rendering/render_list.cpp:
+        (WebCore::toLetterString):
+        (WebCore::toHebrew):
+        (WebCore::RenderListMarker::calcMinMaxWidth):
+
 2006-04-22  Geoffrey Garen  <ggaren@apple.com>
 
         Reviewed by Darin.
index ab3367d13ab54feb27a4cb697b0c14ee546f2153..ec73d6259df0eae8c2deeb5a3a8f1a0463f16949 100644 (file)
@@ -73,48 +73,50 @@ static DeprecatedString toRoman( int number, bool upper )
     return roman;
 }
 
-static DeprecatedString toLetter( int number, int base ) {
-    number--;
-    DeprecatedString letter = (QChar) (base + (number % 26));
-    // Add a single quote at the end of the alphabet.
-    for (int i = 0; i < (number / 26); i++) {
-       letter += '\'';
+static DeprecatedString toLetterString(int number, int letterA)
+{
+    if (number < 2)
+        return (QChar)letterA; // match WinIE (A.) not FireFox (0.)
+    
+    DeprecatedString letterString;
+    while (number > 0) {
+        int onesDigit = ((number - 1) % 26);
+        letterString = (QChar)(letterA + onesDigit) + letterString;
+        number -= onesDigit;
+        number /= 26;
     }
-    return letter;
+    
+    return letterString;
 }
 
 static DeprecatedString toHebrew( int number ) {
     const QChar tenDigit[] = {1497, 1499, 1500, 1502, 1504, 1505, 1506, 1508, 1510};
 
     DeprecatedString letter;
-    if (number>999) {
+    if (number > 999) {
         letter = toHebrew(number/1000) + "'";
-        number = number%1000;
+        number = number % 1000;
     }
 
     int hunderts = (number/400);
     if (hunderts > 0) {
-        for(int i=0; i<hunderts; i++) {
+        for (int i=0; i<hunderts; i++)
             letter += QChar(1511 + 3);
-        }
     }
     number = number % 400;
-    if ((number / 100) != 0) {
+    if ((number / 100) != 0)
         letter += QChar (1511 + (number / 100) -1);
-    }
     number = number % 100;
     int tens = number/10;
-    if (tens > 0 && !(number == 15 || number == 16)) {
+    if (tens > 0 && !(number == 15 || number == 16))
         letter += tenDigit[tens-1];
-    }
     if (number == 15 || number == 16) { // special because of religious
         letter += QChar(1487 + 9);       // reasons
         letter += QChar(1487 + number - 9);
     } else {
         number = number % 10;
-        if (number != 0) {
+        if (number != 0)
             letter += QChar (1487 + number);
-        }
     }
     return letter;
 }
@@ -383,7 +385,8 @@ void RenderListMarker::paint(PaintInfo& i, int _tx, int _ty)
     if (i.phase != PaintPhaseForeground)
         return;
     
-    if (style()->visibility() != VISIBLE)  return;
+    if (style()->visibility() != VISIBLE)
+        return;
 
     IntRect marker = getRelativeMarkerRect();
     marker.move(_tx, _ty);
@@ -543,11 +546,11 @@ void RenderListMarker::calcMinMaxWidth()
         break;
     case LOWER_ALPHA:
     case LOWER_LATIN:
-        m_item = toLetter( m_listItem->value(), 'a' );
+        m_item = toLetterString(m_listItem->value(), 'a');
         break;
     case UPPER_ALPHA:
     case UPPER_LATIN:
-        m_item = toLetter( m_listItem->value(), 'A' );
+        m_item = toLetterString(m_listItem->value(), 'A');
         break;
     case LNONE:
         break;