Reviewed by Maciej.
authorap@webkit.org <ap@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 18 Nov 2007 09:46:05 +0000 (09:46 +0000)
committerap@webkit.org <ap@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 18 Nov 2007 09:46:05 +0000 (09:46 +0000)
        <rdar://problem/5546393> Whitespace handling doesn't match HTML5.

        HTML5 definition is the same as MSIE's, with the exception that the latter strips null
        characters. Firefox also treats U+0008 as whitespace, but not U+000B or U+000C.

        Test: fast/parser/html-whitespace.html

        * html/HTMLTokenizer.cpp:
        (WebCore::HTMLTokenizer::parseSpecial):
        (WebCore::HTMLTokenizer::parseTag):
        Use isASCIISpace, which matches HTML5 definition of whitespace, and also what we use to
        check for whitespace almost everywhere.

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

LayoutTests/ChangeLog
LayoutTests/fast/parser/html-whitespace-expected.txt [new file with mode: 0644]
LayoutTests/fast/parser/html-whitespace.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/html/HTMLTokenizer.cpp

index 1381dce..90eeecc 100644 (file)
@@ -1,3 +1,12 @@
+2007-11-18  Alexey Proskuryakov  <ap@webkit.org>
+
+        Reviewed by Maciej.
+
+        <rdar://problem/5546393> Whitespace handling doesn't match HTML5.
+
+        * fast/parser/html-whitespace-expected.txt: Added.
+        * fast/parser/html-whitespace.html: Added.
+
 2007-11-16  Dan Bernstein  <mitz@apple.com>
 
         Reviewed by Darin Adler.
diff --git a/LayoutTests/fast/parser/html-whitespace-expected.txt b/LayoutTests/fast/parser/html-whitespace-expected.txt
new file mode 100644 (file)
index 0000000..0d6851c
--- /dev/null
@@ -0,0 +1,32 @@
+00 rgb(0, 128, 0)
+01 rgb(0, 128, 0)
+02 rgb(0, 128, 0)
+03 rgb(0, 128, 0)
+04 rgb(0, 128, 0)
+05 rgb(0, 128, 0)
+06 rgb(0, 128, 0)
+07 rgb(0, 128, 0)
+08 rgb(0, 128, 0)
+09 rgb(0, 128, 0)
+0a rgb(0, 128, 0)
+0b rgb(0, 128, 0)
+0c rgb(0, 128, 0)
+0d rgb(0, 128, 0)
+0e rgb(0, 128, 0)
+0f rgb(0, 128, 0)
+10 rgb(0, 128, 0)
+11 rgb(0, 128, 0)
+12 rgb(0, 128, 0)
+13 rgb(0, 128, 0)
+14 rgb(0, 128, 0)
+15 rgb(0, 128, 0)
+16 rgb(0, 128, 0)
+17 rgb(0, 128, 0)
+18 rgb(0, 128, 0)
+19 rgb(0, 128, 0)
+1a rgb(0, 128, 0)
+1b rgb(0, 128, 0)
+1c rgb(0, 128, 0)
+1d rgb(0, 128, 0)
+1e rgb(0, 128, 0)
+1f rgb(0, 128, 0)
diff --git a/LayoutTests/fast/parser/html-whitespace.html b/LayoutTests/fast/parser/html-whitespace.html
new file mode 100644 (file)
index 0000000..7f5f271
Binary files /dev/null and b/LayoutTests/fast/parser/html-whitespace.html differ
index 3db3e6c..8593a0b 100644 (file)
@@ -1,3 +1,20 @@
+2007-11-18  Alexey Proskuryakov  <ap@webkit.org>
+
+        Reviewed by Maciej.
+
+        <rdar://problem/5546393> Whitespace handling doesn't match HTML5.
+
+        HTML5 definition is the same as MSIE's, with the exception that the latter strips null
+        characters. Firefox also treats U+0008 as whitespace, but not U+000B or U+000C.
+
+        Test: fast/parser/html-whitespace.html
+
+        * html/HTMLTokenizer.cpp:
+        (WebCore::HTMLTokenizer::parseSpecial):
+        (WebCore::HTMLTokenizer::parseTag):
+        Use isASCIISpace, which matches HTML5 definition of whitespace, and also what we use to
+        check for whitespace almost everywhere.
+
 2007-11-17  Mark Rowe  <mrowe@apple.com>
 
         Reviewed by Darin Adler.
index 3c7f8a4..cfd5bf4 100644 (file)
@@ -345,7 +345,7 @@ HTMLTokenizer::State HTMLTokenizer::parseSpecial(SegmentedString &src, State sta
             return state;
         }
         // possible end of tagname, lets check.
-        if (!scriptCodeResync && !state.escaped() && !src.escaped() && (ch == '>' || ch == '/' || ch <= ' ') && ch &&
+        if (!scriptCodeResync && !state.escaped() && !src.escaped() && (ch == '>' || ch == '/' || isASCIISpace(ch)) &&
              scriptCodeSize >= searchStopperLen &&
              tagMatch( searchStopper, scriptCode+scriptCodeSize-searchStopperLen, searchStopperLen )) {
             scriptCodeResync = scriptCodeSize-searchStopperLen+1;
@@ -892,7 +892,7 @@ HTMLTokenizer::State HTMLTokenizer::parseTag(SegmentedString &src, State state)
             unsigned int ll = min(src.length(), CBUFLEN - cBufferPos);
             while (ll--) {
                 UChar curchar = *src;
-                if (curchar <= ' ' || curchar == '>' || curchar == '<') {
+                if (isASCIISpace(curchar) || curchar == '>' || curchar == '<') {
                     finish = true;
                     break;
                 }
@@ -945,7 +945,7 @@ HTMLTokenizer::State HTMLTokenizer::parseTag(SegmentedString &src, State state)
             while(!src.isEmpty()) {
                 UChar curchar = *src;
                 // In this mode just ignore any quotes we encounter and treat them like spaces.
-                if (curchar > ' ' && curchar != '\'' && curchar != '"') {
+                if (!isASCIISpace(curchar) && curchar != '\'' && curchar != '"') {
                     if (curchar == '<' || curchar == '>')
                         state.setTagState(SearchEnd);
                     else
@@ -969,7 +969,7 @@ HTMLTokenizer::State HTMLTokenizer::parseTag(SegmentedString &src, State state)
                 UChar curchar = *src;
                 // If we encounter a "/" when scanning an attribute name, treat it as a delimiter.  This allows the 
                 // cases like <input type=checkbox checked/> to work (and accommodates XML-style syntax as per HTML5).
-                if (curchar <= '>' && (curchar >= '<' || curchar <= ' ' || curchar == '/')) {
+                if (curchar <= '>' && (curchar >= '<' || isASCIISpace(curchar) || curchar == '/')) {
                     cBuffer[cBufferPos] = '\0';
                     attrName = AtomicString(cBuffer);
                     dest = buffer;
@@ -1015,7 +1015,7 @@ HTMLTokenizer::State HTMLTokenizer::parseTag(SegmentedString &src, State state)
                 }
 
                 // In this mode just ignore any quotes or slashes we encounter and treat them like spaces.
-                if (curchar > ' ' && curchar != '\'' && curchar != '"' && curchar != '/') {
+                if (!isASCIISpace(curchar) && curchar != '\'' && curchar != '"' && curchar != '/') {
                     if(curchar == '=') {
 #ifdef TOKEN_DEBUG
                         kdDebug(6036) << "found equal" << endl;
@@ -1042,10 +1042,10 @@ HTMLTokenizer::State HTMLTokenizer::parseTag(SegmentedString &src, State state)
             }
             break;
         case SearchValue:
-            while(!src.isEmpty()) {
+            while (!src.isEmpty()) {
                 UChar curchar = *src;
-                if(curchar > ' ') {
-                    if(( curchar == '\'' || curchar == '\"' )) {
+                if (!isASCIISpace(curchar)) {
+                    if (curchar == '\'' || curchar == '\"') {
                         tquote = curchar == '\"' ? DoubleQuote : SingleQuote;
                         state.setTagState(QuotedValue);
                         if (inViewSourceMode())
@@ -1142,8 +1142,7 @@ HTMLTokenizer::State HTMLTokenizer::parseTag(SegmentedString &src, State state)
                     }
                     // no quotes. Every space means end of value
                     // '/' does not delimit in IE!
-                    if ( curchar <= ' ' || curchar == '>' )
-                    {
+                    if (isASCIISpace(curchar) || curchar == '>') {
                         AtomicString v(buffer+1, dest-buffer-1);
                         currToken.addAttribute(m_doc, attrName, v, inViewSourceMode());
                         if (inViewSourceMode())