1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "config.h"
6#include "wtf/text/TextCodecReplacement.h"
7
8#include "wtf/PassOwnPtr.h"
9#include "wtf/text/WTFString.h"
10#include "wtf/unicode/CharacterNames.h"
11
12namespace WTF {
13
14TextCodecReplacement::TextCodecReplacement()
15    : m_sentEOF(false)
16{
17}
18
19void TextCodecReplacement::registerEncodingNames(EncodingNameRegistrar registrar)
20{
21    // The 'replacement' label itself should not be referenceable by
22    // resources or script - it's a specification convenience - but much of
23    // the wtf/text API asserts that an encoding name is a label for itself.
24    // This is handled in TextEncoding by marking it as not valid.
25    registrar("replacement", "replacement");
26
27    registrar("csiso2022kr", "replacement");
28    registrar("hz-gb-2312", "replacement");
29    registrar("iso-2022-cn", "replacement");
30    registrar("iso-2022-cn-ext", "replacement");
31    registrar("iso-2022-kr", "replacement");
32}
33
34static PassOwnPtr<TextCodec> newStreamingTextDecoderReplacement(const TextEncoding&, const void*)
35{
36    return adoptPtr(new TextCodecReplacement);
37}
38
39void TextCodecReplacement::registerCodecs(TextCodecRegistrar registrar)
40{
41    registrar("replacement", newStreamingTextDecoderReplacement, 0);
42}
43
44String TextCodecReplacement::decode(const char*, size_t, FlushBehavior, bool, bool& sawError)
45{
46    sawError = true;
47    if (m_sentEOF)
48        return String();
49
50    m_sentEOF = true;
51    return String(&Unicode::replacementCharacter, 1);
52}
53
54} // namespace WTF
55