Reviewed by Eric.
authorap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 3 Sep 2006 16:59:12 +0000 (16:59 +0000)
committerap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 3 Sep 2006 16:59:12 +0000 (16:59 +0000)
        http://bugzilla.opendarwin.org/show_bug.cgi?id=10697
        REGRESSION (r16175): Errors in incremental decoding of UTF-8

        Tests:
        - http/tests/incremental/slow-utf8-html.pl
        - fast/encoding/charset-invalid.html

        * loader/Decoder.cpp:
        (Decoder::Decoder): Ensure that we have a valid encoding. Get its name via TextEncoding, to match
        the logic in setEncodingName().
        (Decoder::setEncodingName): Only set m_encodingName if the encoding is valid. Rely on TextEncoding
        constructor to lowercase it if necessary.
        (Decoder::decode): Use setEncodingName() to apply encoding from BOM. Don't try to ensure the
        validity of encoding - it is enforced by class constructor and setEncodingName().

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

LayoutTests/ChangeLog
LayoutTests/fast/encoding/charset-invalid-expected.txt [new file with mode: 0644]
LayoutTests/fast/encoding/charset-invalid.html [new file with mode: 0644]
LayoutTests/http/tests/incremental/slow-utf8-html-expected.txt [new file with mode: 0644]
LayoutTests/http/tests/incremental/slow-utf8-html.pl [new file with mode: 0644]
WebCore/ChangeLog
WebCore/loader/Decoder.cpp

index 22d84ba7aac6c13362fb10d804954b9c36104d6a..ade64a964bbc5a0e29065c7ab9fcdab08f661a11 100644 (file)
@@ -1,3 +1,15 @@
+2006-09-03  Alexey Proskuryakov  <ap@nypop.com>
+
+        Reviewed by Eric.
+
+        Tests for http://bugzilla.opendarwin.org/show_bug.cgi?id=10697
+        REGRESSION (r16175): Errors in incremental decoding of UTF-8
+
+        * fast/encoding/charset-invalid-expected.txt: Added.
+        * fast/encoding/charset-invalid.html: Added.
+        * http/tests/incremental/slow-utf8-html-expected.txt: Added.
+        * http/tests/incremental/slow-utf8-html.pl: Added.
+
 2006-09-03  Alexey Proskuryakov  <ap@nypop.com>
 
         Reviewed by Tim H.
diff --git a/LayoutTests/fast/encoding/charset-invalid-expected.txt b/LayoutTests/fast/encoding/charset-invalid-expected.txt
new file mode 100644 (file)
index 0000000..925c824
--- /dev/null
@@ -0,0 +1,5 @@
+Should be your browser default encoding: ISO-8859-1
+
+If it's latin-1 (ISO-8859-1), this should be accented e: é
+
+
diff --git a/LayoutTests/fast/encoding/charset-invalid.html b/LayoutTests/fast/encoding/charset-invalid.html
new file mode 100644 (file)
index 0000000..ae81286
--- /dev/null
@@ -0,0 +1,15 @@
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=invalid-encoding">
+<title>Invalid encoding</title>
+</head>
+<body>
+<script>
+if (window.layoutTestController)
+       layoutTestController.dumpAsText();
+document.write("<p>Should be your browser default encoding: " + document.characterSet + "</p>");
+document.write("<p>If it's latin-1 (ISO-8859-1), this should be accented e: é</p>");
+</script>
+
+</body>
+</html>
diff --git a/LayoutTests/http/tests/incremental/slow-utf8-html-expected.txt b/LayoutTests/http/tests/incremental/slow-utf8-html-expected.txt
new file mode 100644 (file)
index 0000000..5139fb1
--- /dev/null
@@ -0,0 +1,5 @@
+Test for bug 10697: Errors in incremental decoding of UTF-8.
+
+Should be a blank page (except for this description).
+
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
diff --git a/LayoutTests/http/tests/incremental/slow-utf8-html.pl b/LayoutTests/http/tests/incremental/slow-utf8-html.pl
new file mode 100644 (file)
index 0000000..505411e
--- /dev/null
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+
+# flush the buffers after each print
+select (STDOUT);
+$| = 1;
+
+print "Content-Type: text/html\n";
+print "Expires: Thu, 01 Dec 2003 16:00:00 GMT\n";
+print "Cache-Control: no-store, no-cache, must-revalidate\n";
+print "Pragma: no-cache\n";
+print "\n";
+
+print "\xef\xbb\xbf<body><p>Test for bug 10697: Errors in incremental decoding of UTF-8.</p>\n";
+print "<p>Should be a blank page (except for this description).</p>\n";
+print "<script>\n";
+print "if (window.layoutTestController)\n";
+print "        layoutTestController.dumpAsText();\n";
+print "</script>\n";
+
+# U+2003 = UTF-8 E28083 = EM SPACE
+print "\xe2";
+for ($count=1; $count<4000; $count++) {
+    print "\x80\x83\xe2";
+}
+print "\x80";
+for ($count=1; $count<4000; $count++) {
+    print "\x83\xe2\x80";
+}
+print "\x83";
index 1c8b38b9a518902fb51f29b9e679dcd0764a9f66..0171b3b01efb52597cfb7a20201c9df20602f189 100644 (file)
@@ -1,3 +1,22 @@
+2006-09-03  Alexey Proskuryakov  <ap@nypop.com>
+
+        Reviewed by Eric.
+
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=10697
+        REGRESSION (r16175): Errors in incremental decoding of UTF-8
+
+        Tests:
+        - http/tests/incremental/slow-utf8-html.pl
+        - fast/encoding/charset-invalid.html
+
+        * loader/Decoder.cpp:
+        (Decoder::Decoder): Ensure that we have a valid encoding. Get its name via TextEncoding, to match
+        the logic in setEncodingName().
+        (Decoder::setEncodingName): Only set m_encodingName if the encoding is valid. Rely on TextEncoding
+        constructor to lowercase it if necessary.
+        (Decoder::decode): Use setEncodingName() to apply encoding from BOM. Don't try to ensure the
+        validity of encoding - it is enforced by class constructor and setEncodingName().
+
 2006-09-02  Sam Weinig  <sam.weinig@gmail.com>
 
         Reviewed by Tim H.
index d33b0b31d0f5389edb9cd6991e40bf832efeee47..8b6769d41b83e467e54723c800d0b48f814f7d5b 100644 (file)
@@ -253,7 +253,7 @@ breakBreak:
 
 Decoder::Decoder(const String& mimeType, const String& defaultEncodingName)
   : m_encoding(defaultEncodingName.isNull() ? "iso8859-1" : defaultEncodingName.latin1())
-  , m_encodingName(defaultEncodingName.isNull() ? "iso8859-1" : defaultEncodingName.latin1())
+  , m_encodingName(m_encoding.name())
   , m_type(DefaultEncoding)
   , m_reachedBody(false)
   , m_checkedForCSSCharset(false)
@@ -272,7 +272,10 @@ Decoder::Decoder(const String& mimeType, const String& defaultEncodingName)
     } else
         m_contentType = PlainText;
 
-    m_decoder.set(StreamingTextDecoder::create(m_encoding));
+    if (m_encoding.isValid())
+        m_decoder.set(StreamingTextDecoder::create(m_encoding));
+    else
+        setEncodingName("iso-8859-1", DefaultEncoding);
 }
 
 Decoder::~Decoder()
@@ -281,18 +284,15 @@ Decoder::~Decoder()
 
 void Decoder::setEncodingName(const char* encodingName, EncodingSource type)
 {
-    m_encodingName = encodingName;
-    m_encodingName = m_encodingName.lower();
-
-    if (m_encodingName.isEmpty())
+    if (encodingName[0] == '\0')
         return;
 
     bool eightBitOnly = type == EncodingFromMetaTag || type == EncodingFromXMLHeader || type == EncodingFromCSSCharset;
-    TextEncoding encoding = TextEncoding(m_encodingName, eightBitOnly);
+    TextEncoding encoding = TextEncoding(encodingName, eightBitOnly);
 
     // in case the encoding didn't exist, we keep the old one (fixes some sites specifying invalid encodings)
     if (encoding.isValid()) {
-        m_encodingName = encoding.name();
+        m_encodingName = encoding.name(); // use a standard name for the encoding
         m_encoding = encoding;
         m_type = type;
         m_decoder.set(StreamingTextDecoder::create(m_encoding));
@@ -408,13 +408,8 @@ DeprecatedString Decoder::decode(const char *data, int len)
             }
 
             // If we found a BOM, use the encoding it implies.
-            if (autoDetectedEncoding != 0) {
-                m_type = AutoDetectedEncoding;
-                m_encoding = TextEncoding(autoDetectedEncoding);
-                ASSERT(m_encoding.isValid());
-                m_encodingName = m_encoding.name();
-                m_decoder.set(StreamingTextDecoder::create(m_encoding));
-            }
+            if (autoDetectedEncoding != 0)
+                setEncodingName(autoDetectedEncoding, AutoDetectedEncoding);
         }
         m_checkedForBOM = true;
     }
@@ -621,13 +616,7 @@ DeprecatedString Decoder::decode(const char *data, int len)
             setEncodingName(autoDetectedEncoding, AutoDetectedEncoding);
     }
 
-    // If we still haven't found an encoding, assume latin1
-    // (this can happen if an empty name is passed from outside).
-    if (m_encodingName.isEmpty() || !m_encoding.isValid()) {
-        m_encodingName = "iso8859-1";
-        m_encoding = TextEncoding(Latin1Encoding);
-    }
-    m_decoder.set(StreamingTextDecoder::create(m_encoding));
+    ASSERT(m_encoding.isValid());
 
     DeprecatedString out;