Reviewed by Darin.
authorap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 19 Jun 2006 16:15:31 +0000 (16:15 +0000)
committerap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 19 Jun 2006 16:15:31 +0000 (16:15 +0000)
        - http://bugzilla.opendarwin.org/show_bug.cgi?id=8972
        REGRESSION: invalid UTF-8 sequences are not displayed

        Test: LayoutTests/fast/encoding/invalid-UTF-8.html

        * dom/xml_tokenizer.cpp:
        (WebCore::getXHTMLEntity): Properly null-terminate the result. This didn't matter
        before, because the garbage at the end was guaranteed to be invalid UTF-8, and was
        omitted in appendOmittingUnwanted();

        * platform/StreamingTextDecoder.cpp:
        (WebCore::StreamingTextDecoder::appendOmittingBOM): Only omit BOM characters.
        Renamed back from appendOmittingUnwanted();

        (WebCore::StreamingTextDecoder::convertUsingICU):
        * platform/StreamingTextDecoder.h:
        Update for the above function renaming.

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

LayoutTests/ChangeLog
LayoutTests/fast/encoding/invalid-UTF-8-expected.checksum
LayoutTests/fast/encoding/invalid-UTF-8-expected.png
LayoutTests/fast/encoding/invalid-UTF-8-expected.txt
LayoutTests/fast/encoding/invalid-UTF-8.html
WebCore/ChangeLog
WebCore/dom/xml_tokenizer.cpp
WebCore/platform/StreamingTextDecoder.cpp
WebCore/platform/StreamingTextDecoder.h

index 71fb44000bab51aaa5519ac0e25afbd34d896894..ed479cc902b59c17fc44800858aad63288112f31 100644 (file)
@@ -1,3 +1,15 @@
+2006-06-19  Alexey Proskuryakov  <ap@nypop.com>
+
+        Reviewed by Darin.
+
+        - test for http://bugzilla.opendarwin.org/show_bug.cgi?id=8972
+        REGRESSION: invalid UTF-8 sequences are not displayed
+
+        * fast/encoding/invalid-UTF-8-expected.checksum:
+        * fast/encoding/invalid-UTF-8-expected.png:
+        * fast/encoding/invalid-UTF-8-expected.txt:
+        * fast/encoding/invalid-UTF-8.html:
+
 2006-06-18  David Kilzer  <ddkilzer@kilzer.net>
 
         Reviewed by ggaren.
index 6576d9697b0274157d188a4f880e443055e57de1..6e602d23681ac1117c80adf6bba8c2bce1c0e8c2 100644 (file)
@@ -1 +1 @@
-d4d6443a0bb96d027ddc4b88c41e9a2a
\ No newline at end of file
+b99931093e6c8f66eab8d8d6bbcdf651
\ No newline at end of file
index f08b0db9ffe01cf37795839b2cd317fc2a426e32..e5a515e662233b33c50e47636ebab94ad8463ee0 100644 (file)
Binary files a/LayoutTests/fast/encoding/invalid-UTF-8-expected.png and b/LayoutTests/fast/encoding/invalid-UTF-8-expected.png differ
index d2fa5846a92305024986e1e537d28108079d41e7..7ef3d8e43b2f14be9a62921ff4a26b52b4d6667b 100644 (file)
@@ -4,13 +4,12 @@ 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 721x18
-          text run at (0,0) width 721: "This tests the rendering of invalid UTF-8 sequences. The way other browsers handle these is to omit them entirely."
-      RenderBlock {P} at (0,34) size 784x36
-        RenderText {#text} at (0,0) size 764x36
-          text run at (0,0) width 764: "The text before should show the word \"everywhere\" right next to the word \"including\" and the word \"cube\" right next to"
-          text run at (0,18) width 396: "the word \"showing\" without any visible characters in between."
-      RenderBlock {HR} at (0,86) size 784x2 [border: (1px inset #000000)]
-      RenderBlock {P} at (0,104) size 784x18
-        RenderText {#text} at (0,0) size 346x18
-          text run at (0,0) width 346: "everywhereincluding a 120-screen cubeshowing sports"
+        RenderText {#text} at (0,0) size 330x18
+          text run at (0,0) width 330: "This tests the rendering of invalid UTF-8 sequences."
+      RenderBlock {P} at (0,34) size 784x18
+        RenderText {#text} at (0,0) size 527x18
+          text run at (0,0) width 527: "The output should be: \"\x{442}??\x{442} ???\" (with black diamonds in place of question marks)."
+      RenderBlock {HR} at (0,68) size 784x2 [border: (1px inset #000000)]
+      RenderBlock {P} at (0,86) size 784x18
+        RenderText {#text} at (0,0) size 98x18
+          text run at (0,0) width 98: "\x{442}\x{FFFD}\x{FFFD}\x{442} \x{FFFD}\x{FFFD}\x{FFFD}"
index 00f032ab890454fc81d29efb2ea1008e9170b77f..68d97e3fa6eb3f64eb11a1211881be271daeb0a6 100644 (file)
@@ -3,10 +3,9 @@
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 </head>
 <body>
-<p>This tests the rendering of invalid UTF-8 sequences. The way other browsers handle these is to omit them entirely.</p>
-<p>The text before should show the word "everywhere" right next to the word "including" and the word "cube" right next to the
-word "showing" without any visible characters in between.</p>
+<p>This tests the rendering of invalid UTF-8 sequences.</p>
+<p>The output should be: "т??т ???" (with black diamonds in place of question marks).</p>
 <hr>
-<p>everywhere\97including a 120-screen cube\97showing sports</p>
+<p>Ñ\82µÑÑ\82 ð\90\80ð\80ð\90\90</p>
 </body>
 </html>
index 8eb98609fd796e2fd88014b5bff4b83ef4d48cd9..c59bea70dd04900c841b37ed8795cf9c0630750c 100644 (file)
@@ -1,3 +1,25 @@
+2006-06-19  Alexey Proskuryakov  <ap@nypop.com>
+
+        Reviewed by Darin.
+
+        - http://bugzilla.opendarwin.org/show_bug.cgi?id=8972
+        REGRESSION: invalid UTF-8 sequences are not displayed
+
+        Test: LayoutTests/fast/encoding/invalid-UTF-8.html
+
+        * dom/xml_tokenizer.cpp:
+        (WebCore::getXHTMLEntity): Properly null-terminate the result. This didn't matter
+        before, because the garbage at the end was guaranteed to be invalid UTF-8, and was 
+        omitted in appendOmittingUnwanted();
+
+        * platform/StreamingTextDecoder.cpp:
+        (WebCore::StreamingTextDecoder::appendOmittingBOM): Only omit BOM characters.
+        Renamed back from appendOmittingUnwanted();
+
+        (WebCore::StreamingTextDecoder::convertUsingICU):
+        * platform/StreamingTextDecoder.h:
+        Update for the above function renaming.
+
 2006-06-18  David Kilzer  <ddkilzer@kilzer.net>
 
         Reviewed by darin.
index 55720c9f62c8d6cba9e98c82ab601d08f8a91f75..d529a27dddba0c0369a64c7551d596cdc65f95c0 100644 (file)
@@ -717,7 +717,7 @@ static xmlEntityPtr getXHTMLEntity(const xmlChar* name)
     assert(value.length() < 5);
     sharedXHTMLEntity.length = value.length();
     sharedXHTMLEntity.name = name;
-    memcpy(sharedXHTMLEntityResult, value.data(), sharedXHTMLEntity.length);
+    memcpy(sharedXHTMLEntityResult, value.data(), sharedXHTMLEntity.length + 1);
 
     return &sharedXHTMLEntity;
 }
index 9ab9acc3c700e853753174a8349ea41eb264b231..094688712f963fc62d1acee5b60c71ebdd4f5e81 100644 (file)
@@ -42,7 +42,6 @@ StreamingTextDecoder::StreamingTextDecoder(const TextEncoding& encoding)
 {
 }
 
-static const UChar replacementCharacter = 0xFFFD;
 static const UChar BOM = 0xFEFF;
 static const size_t ConversionBufferSize = 16384;
     
@@ -179,22 +178,15 @@ void StreamingTextDecoder::createICUConverter()
     }
 }
 
-// We strip replacement characters because the ICU converter for UTF-8 converts
-// invalid sequences into replacement characters, but other browsers discard them.
 // We strip BOM characters because they can show up both at the start of content
 // and inside content, and we never want them to end up in the decoded text.
-static inline bool unwanted(UChar c)
-{
-    return c == replacementCharacter || c == BOM;
-}
-
-void StreamingTextDecoder::appendOmittingUnwanted(DeprecatedString& s, const UChar* characters, int byteCount)
+void StreamingTextDecoder::appendOmittingBOM(DeprecatedString& s, const UChar* characters, int byteCount)
 {
     ASSERT(byteCount % sizeof(UChar) == 0);
     int start = 0;
     int characterCount = byteCount / sizeof(UChar);
     for (int i = 0; i != characterCount; ++i) {
-        if (unwanted(characters[i])) {
+        if (BOM == characters[i]) {
             if (start != i)
                 s.append(reinterpret_cast<const QChar*>(&characters[start]), i - start);
             start = i + 1;
@@ -228,7 +220,7 @@ DeprecatedString StreamingTextDecoder::convertUsingICU(const unsigned char* chs,
         err = U_ZERO_ERROR;
         ucnv_toUnicode(m_converterICU, &target, targetLimit, &source, sourceLimit, offsets, flush, &err);
         int count = target - buffer;
-        appendOmittingUnwanted(result, reinterpret_cast<const UChar*>(buffer), count * sizeof(UChar));
+        appendOmittingBOM(result, reinterpret_cast<const UChar*>(buffer), count * sizeof(UChar));
     } while (err == U_BUFFER_OVERFLOW_ERROR);
 
     if (U_FAILURE(err)) {
index bf8b2cd709d344a8508fabf8f941370e2ca603f7..90f2e27806f291edfb05e52b2bb36f398c7ea5a4 100644 (file)
@@ -51,7 +51,7 @@ namespace WebCore {
 
         void createICUConverter();
 
-        static void appendOmittingUnwanted(DeprecatedString&, const UChar* characters, int byteCount);
+        static void appendOmittingBOM(DeprecatedString&, const UChar* characters, int byteCount);
 
         TextEncoding m_encoding;
         bool m_littleEndian;