Reviewed by Darin.
authorharrison <harrison@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Aug 2005 19:25:06 +0000 (19:25 +0000)
committerharrison <harrison@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Aug 2005 19:25:06 +0000 (19:25 +0000)
        <rdar://problem/4226539> REGRESSION: Blank content at http://www.the-leaky-cauldron.org/ with Denver and TOT

        Test cases added:
        * layout-tests/fast/parser/comments-expected.txt: Added.
        * layout-tests/fast/parser/comments.html: Added.

        * khtml/html/htmltokenizer.cpp:
        (khtml::HTMLTokenizer::parseComment):
        When non-space follows comment end, ignore that comment end.

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

LayoutTests/fast/parser/comments-expected.txt [new file with mode: 0644]
LayoutTests/fast/parser/comments.html [new file with mode: 0644]
WebCore/ChangeLog-2005-08-23
WebCore/khtml/html/htmltokenizer.cpp

diff --git a/LayoutTests/fast/parser/comments-expected.txt b/LayoutTests/fast/parser/comments-expected.txt
new file mode 100644 (file)
index 0000000..14989bc
--- /dev/null
@@ -0,0 +1,56 @@
+layer at (0,0) size 800x600
+  RenderCanvas at (0,0) size 800x600
+layer at (0,0) size 800x539
+  RenderBlock {HTML} at (0,0) size 800x539
+    RenderBody {BODY} at (8,21) size 784x510
+      RenderBlock {H1} at (0,0) size 784x37
+        RenderText {TEXT} at (0,0) size 189x37
+          text run at (0,0) width 189: "Success cases:"
+      RenderBlock {P} at (0,58) size 784x18
+        RenderText {TEXT} at (0,0) size 100x18
+          text run at (0,0) width 100: "basic comments"
+      RenderBlock {P} at (0,92) size 784x0
+      RenderBlock {P} at (0,92) size 784x18
+        RenderText {TEXT} at (0,0) size 97x18
+          text run at (0,0) width 97: "comment series"
+      RenderBlock {P} at (0,126) size 784x0
+      RenderBlock {P} at (0,126) size 784x18
+        RenderText {TEXT} at (0,0) size 60x18
+          text run at (0,0) width 60: "dash runs"
+      RenderBlock {P} at (0,160) size 784x0
+      RenderBlock {P} at (0,160) size 784x18
+        RenderText {TEXT} at (0,0) size 107x18
+          text run at (0,0) width 107: "empty comments"
+      RenderBlock {P} at (0,194) size 784x0
+      RenderBlock {P} at (0,194) size 784x18
+        RenderText {TEXT} at (0,0) size 84x18
+          text run at (0,0) width 84: "multiple lines"
+      RenderBlock {P} at (0,228) size 784x0
+      RenderBlock {P} at (0,228) size 784x18
+        RenderText {TEXT} at (0,0) size 82x18
+          text run at (0,0) width 82: "compatibility"
+      RenderBlock {P} at (0,262) size 784x0
+      RenderBlock {H1} at (0,267) size 784x37
+        RenderText {TEXT} at (0,0) size 187x37
+          text run at (0,0) width 187: "Failure cases:"
+      RenderBlock {P} at (0,325) size 784x18
+        RenderText {TEXT} at (0,0) size 149x18
+          text run at (0,0) width 149: "tab after comment close"
+      RenderBlock {P} at (0,359) size 784x0
+      RenderBlock {P} at (0,359) size 784x18
+        RenderText {TEXT} at (0,0) size 153x18
+          text run at (0,0) width 153: "text after comment close"
+      RenderBlock {P} at (0,393) size 784x0
+      RenderBlock {H1} at (0,398) size 784x37
+        RenderText {TEXT} at (0,0) size 356x37
+          text run at (0,0) width 356: "Failure cases with output:"
+      RenderBlock (anonymous) at (0,456) size 784x54
+        RenderText {TEXT} at (0,0) size 331x18
+          text run at (0,0) width 331: "extra comment end and markup declaration close -->"
+        RenderBR {BR} at (0,0) size 0x0
+        RenderText {TEXT} at (0,18) size 386x18
+          text run at (0,18) width 386: "extra comment end w/space and markup declaration close -->"
+        RenderBR {BR} at (0,0) size 0x0
+        RenderText {TEXT} at (0,36) size 161x18
+          text run at (0,36) width 161: "outer nested comment -->"
+        RenderText {TEXT} at (0,0) size 0x0
diff --git a/LayoutTests/fast/parser/comments.html b/LayoutTests/fast/parser/comments.html
new file mode 100644 (file)
index 0000000..c4c3bc1
--- /dev/null
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<body>
+<h1>Success cases:</h1>
+<p>basic comments<p>
+<!-- basic comment -->
+<!-- basic comment with spaces after comment end --    >
+<p>comment series<p>
+<!-- comment -- -- series-->
+<!-- comment -- -- series with spaces after comment end-- >
+<p>dash runs<p>
+<!------ Hello -->
+<!------ Hello -- >
+<!-- --- Hello -->
+<!-- Hello --->
+<p>empty comments<p>
+<!---->
+<!---- >
+<!>
+<p>multiple lines<p>
+<!-- here's a comment, a little longer,
+    which occupies more than one line -->
+<!-- here's a comment, a little longer,
+    which occupies more than one line -- >
+
+
+<p>compatibility<p>
+<!-- Compatibility: comment series with --extraneous-- text -- between -- the comments -->
+<!-- Compatibility: comment series with --extraneous-- text -- between -- the comments -- >
+<!-- Compatibility: <!--extra comment start like www.the-leaky-cauldron.com has <rdar://problem/4226539>-->
+<!-- Compatibility: <!--extra comment start like www.the-leaky-cauldron.com has <rdar://problem/4226539> -- >
+
+<h1>Failure cases:</h1>
+<p>tab after comment close<p>
+<!-- tab after comment close-- ><p> error! </p>-->
+<p>text after comment close<p>
+<!-- text after comment close--ouch><p> error! </p>-->
+
+<h1>Failure cases with output:</h1>
+
+<!-- this must fail --> extra comment end and markup declaration close --><br>
+<!-- this must fail -- > extra comment end w/space and markup declaration close --><br>
+<!-- nested: <!--inner comment --> outer nested comment -->
+
+</body>
+</html>
index 7569356..4f373bf 100644 (file)
@@ -1,3 +1,17 @@
+2005-08-23  David Harrison  <harrison@apple.com>
+
+        Reviewed by Darin.
+
+        <rdar://problem/4226539> REGRESSION: Blank content at http://www.the-leaky-cauldron.org/ with Denver and TOT
+
+        Test cases added:
+        * layout-tests/fast/parser/comments-expected.txt: Added.
+        * layout-tests/fast/parser/comments.html: Added.
+
+        * khtml/html/htmltokenizer.cpp:
+        (khtml::HTMLTokenizer::parseComment):
+        When non-space follows comment end, ignore that comment end.
+
 2005-08-23  Justin Garcia  <justin.garcia@apple.com>
 
         Reviewed by mjs
index 1c3b466..ba33646 100644 (file)
@@ -585,19 +585,7 @@ void HTMLTokenizer::parseComment(TokenizerString &src)
                QConstString((QChar*)src.current(), kMin(16, src.length())).string().latin1());
 #endif
 
-        if (strict) {
-            if (src->unicode() == '-') {
-                delimiterCount++;
-                if (delimiterCount == 2) {
-                    delimiterCount = 0;
-                    canClose = !canClose;
-                }
-            }
-            else
-                delimiterCount = 0;
-        }
-
-        if ((!strict || canClose) && src->unicode() == '>') {
+        if ((!strict || canClose) && *src == '>') {
             bool handleBrokenComments = brokenComments && !(script || style);
             int endCharsCount = 1; // start off with one for the '>' character
             if (!strict) {
@@ -633,6 +621,26 @@ void HTMLTokenizer::parseComment(TokenizerString &src)
                 return; // Finished parsing comment
             }
         }
+
+        if (strict) {
+            if (*src == '-') {
+                delimiterCount++;
+                if (delimiterCount == 2) {
+                    delimiterCount = 0;
+                    canClose = !canClose;
+                }
+            } else {
+                delimiterCount = 0;
+                // Bad markup.  Non-space between the comment end and the markup
+                // declaration close ('>').  Keep scanning as comment, but set
+                // the state back to where we need to see another comment end
+                // followed by a declaration close.
+                // This is not exactly to spec, but is better for compatiblility.
+                if (canClose && *src != ' ')
+                    canClose = false;
+            }
+        }
+
         ++src;
     }
 }