Bug 782412 - Part 5: Remove a workaround from dom/encoding. r=hsivonen
authorMasatoshi Kimura <VYV03354@nifty.ne.jp>
Mon, 26 Nov 2012 20:38:20 -0500
changeset 119742 b960d3ce65bc656bc459ffb5cf028f4bc48c7671
parent 119741 6d5d486cc04452d8c6cf049e328e486c6a46e94c
child 119743 828a19e29014d1eb2915987728c48ee64aae0be6
push idunknown
push userunknown
push dateunknown
reviewershsivonen
bugs782412
milestone20.0a1
Bug 782412 - Part 5: Remove a workaround from dom/encoding. r=hsivonen
dom/encoding/TextDecoder.cpp
dom/encoding/TextDecoder.h
--- a/dom/encoding/TextDecoder.cpp
+++ b/dom/encoding/TextDecoder.cpp
@@ -23,19 +23,16 @@ TextDecoder::Init(const nsAString& aEnco
 
   // Let encoding be the result of getting an encoding from label.
   // If encoding is failure, throw a TypeError.
   if (!EncodingUtils::FindEncodingForLabel(label, mEncoding)) {
     aRv.ThrowTypeError(MSG_ENCODING_NOT_SUPPORTED, &label);
     return;
   }
 
-  mIsUTF16Family = mEncoding.EqualsLiteral("UTF-16LE") ||
-                   mEncoding.EqualsLiteral("UTF-16BE");
-
   // If the constructor is called with an options argument,
   // and the fatal property of the dictionary is set,
   // set the internal fatal flag of the decoder object.
   mFatal = aFatal.fatal;
 
   // Create a decoder object for mEncoding.
   nsCOMPtr<nsICharsetConverterManager> ccm =
     do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID);
@@ -51,23 +48,16 @@ TextDecoder::Init(const nsAString& aEnco
   }
 
   if (mFatal) {
     mDecoder->SetInputErrorBehavior(nsIUnicodeDecoder::kOnError_Signal);
   }
 }
 
 void
-TextDecoder::ResetDecoder()
-{
-  mDecoder->Reset();
-  mOffset = 0;
-}
-
-void
 TextDecoder::Decode(const ArrayBufferView* aView,
                     const TextDecodeOptions& aOptions,
                     nsAString& aOutDecodedString,
                     ErrorResult& aRv)
 {
   const char* data;
   uint32_t length;
   // If view is not specified, let view be a Uint8Array of length 0.
@@ -75,22 +65,16 @@ TextDecoder::Decode(const ArrayBufferVie
     data = EmptyCString().BeginReading();
     length = EmptyCString().Length();
   } else {
     data = reinterpret_cast<const char*>(aView->Data());
     length = aView->Length();
   }
 
   aOutDecodedString.Truncate();
-  if (mIsUTF16Family && mOffset < 2) {
-    HandleBOM(data, length, aOptions, aOutDecodedString, aRv);
-    if (aRv.Failed() || mOffset < 2) {
-      return;
-    }
-  }
 
   // Run or resume the decoder algorithm of the decoder object's encoder.
   int32_t outLen;
   nsresult rv = mDecoder->GetMaxLength(data, length, &outLen);
   if (NS_FAILED(rv)) {
     aRv.Throw(rv);
     return;
   }
@@ -112,28 +96,28 @@ TextDecoder::Decode(const ArrayBufferVie
     buf[dstLen] = 0;
     aOutDecodedString.Append(buf, dstLen);
     if (mFatal || rv != NS_ERROR_ILLEGAL_INPUT) {
       break;
     }
     // Emit a decode error manually because some decoders
     // do not support kOnError_Recover (bug 638379)
     if (srcLen == -1) {
-      ResetDecoder();
+      mDecoder->Reset();
     } else {
       data += srcLen + 1;
       length -= srcLen + 1;
       aOutDecodedString.Append(kReplacementChar);
     }
   }
 
   // If the internal streaming flag of the decoder object is not set,
   // then reset the encoding algorithm state to the default values
   if (!aOptions.stream) {
-    ResetDecoder();
+    mDecoder->Reset();
     if (rv == NS_OK_UDEC_MOREINPUT) {
       if (mFatal) {
         aRv.Throw(NS_ERROR_DOM_ENCODING_DECODE_ERR);
       } else {
         // Need to emit a decode error manually
         // to simulate the EOF handling of the Encoding spec.
         aOutDecodedString.Append(kReplacementChar);
       }
@@ -141,64 +125,16 @@ TextDecoder::Decode(const ArrayBufferVie
   }
 
   if (NS_FAILED(rv)) {
     aRv.Throw(NS_ERROR_DOM_ENCODING_DECODE_ERR);
   }
 }
 
 void
-TextDecoder::HandleBOM(const char*& aData, uint32_t& aLength,
-                       const TextDecodeOptions& aOptions,
-                       nsAString& aOutString, ErrorResult& aRv)
-{
-  if (aLength < 2u - mOffset) {
-    if (aOptions.stream) {
-      memcpy(mInitialBytes + mOffset, aData, aLength);
-      mOffset += aLength;
-    } else if (mFatal) {
-      aRv.Throw(NS_ERROR_DOM_ENCODING_DECODE_ERR);
-    } else {
-      aOutString.Append(kReplacementChar);
-    }
-    return;
-  }
-
-  memcpy(mInitialBytes + mOffset, aData, 2 - mOffset);
-  // copied data will be fed later.
-  aData += 2 - mOffset;
-  aLength -= 2 - mOffset;
-  mOffset = 2;
-
-  nsAutoCString encoding;
-  if (!EncodingUtils::IdentifyDataOffset(mInitialBytes, 2, encoding) ||
-      !encoding.Equals(mEncoding)) {
-    // If the stream doesn't start with BOM or the BOM doesn't match the
-    // encoding, feed a BOM to workaround decoder's bug (bug 634541).
-    FeedBytes(mEncoding.EqualsLiteral("UTF-16LE") ? "\xFF\xFE" : "\xFE\xFF");
-  }
-  FeedBytes(mInitialBytes, &aOutString);
-}
-
-void
-TextDecoder::FeedBytes(const char* aBytes, nsAString* aOutString)
-{
-  PRUnichar buf[3];
-  int32_t srcLen = mOffset;
-  int32_t dstLen = mozilla::ArrayLength(buf);
-  DebugOnly<nsresult> rv =
-    mDecoder->Convert(aBytes, &srcLen, buf, &dstLen);
-  MOZ_ASSERT(NS_SUCCEEDED(rv));
-  MOZ_ASSERT(srcLen == mOffset);
-  if (aOutString) {
-    aOutString->Assign(buf, dstLen);
-  }
-}
-
-void
 TextDecoder::GetEncoding(nsAString& aEncoding)
 {
   CopyASCIItoUTF16(mEncoding, aEncoding);
   nsContentUtils::ASCIIToLower(aEncoding);
 }
 
 NS_IMPL_CYCLE_COLLECTING_ADDREF(TextDecoder)
 NS_IMPL_CYCLE_COLLECTING_RELEASE(TextDecoder)
--- a/dom/encoding/TextDecoder.h
+++ b/dom/encoding/TextDecoder.h
@@ -36,17 +36,17 @@ public:
     txtDecoder->Init(aEncoding, aFatal, aRv);
     if (aRv.Failed()) {
       return nullptr;
     }
     return txtDecoder.forget();
   }
 
   TextDecoder(nsISupports* aGlobal)
-    : mGlobal(aGlobal), mFatal(false), mOffset(0), mIsUTF16Family(false)
+    : mGlobal(aGlobal), mFatal(false)
   {
     MOZ_ASSERT(aGlobal);
     SetIsDOMBinding();
   }
 
   virtual
   ~TextDecoder()
   {}
@@ -91,38 +91,28 @@ public:
               nsAString& aOutDecodedString,
               ErrorResult& aRv);
 
 private:
   nsCString mEncoding;
   nsCOMPtr<nsIUnicodeDecoder> mDecoder;
   nsCOMPtr<nsISupports> mGlobal;
   bool mFatal;
-  uint8_t mOffset;
-  char mInitialBytes[3];
-  bool mIsUTF16Family;
 
   /**
    * Validates provided encoding and throws an exception if invalid encoding.
    * If no encoding is provided then mEncoding is default initialised to "utf-8".
    *
    * @param aEncoding    Optional encoding (case insensitive) provided.
    *                     Default value is "utf-8" if no encoding is provided.
    * @param aFatal       aFatal, indicates whether to throw an 'EncodingError'
    *                     exception or not.
    * @return aRv         EncodingError exception else null.
    */
   void Init(const nsAString& aEncoding,
             const TextDecoderOptions& aFatal,
             ErrorResult& aRv);
-
-  // Internal helper functions.
-  void ResetDecoder();
-  void HandleBOM(const char*& aData, uint32_t& aLength,
-                 const TextDecodeOptions& aOptions,
-                 nsAString& aOutString, ErrorResult& aRv);
-  void FeedBytes(const char* aBytes, nsAString* aOutString = nullptr);
 };
 
 } // dom
 } // mozilla
 
 #endif // mozilla_dom_textdecoder_h_