void DocumentWriter::end()
{
    ASSERT(m_document);

    // http://bugs.webkit.org/show_bug.cgi?id=10854
    // The frame's last ref may be removed and it can be deleted by checkCompleted(),
    // so we'll add a protective refcount
    RefPtr<LocalFrame> protector(m_document->frame());

    if (!m_parser)
        return;

    if (m_parser->needsDecoder()) {
        OwnPtr<TextResourceDecoder> decoder = m_decoderBuilder.buildFor(m_document);
        m_parser->setDecoder(decoder.release());
    }
    // flush() can result replacing DocumentLoader::m_writer.
    RefPtrWillBeRawPtr<DocumentWriter> protectingThis(this);
    m_parser->flush();

    if (!m_parser)
        return;

    m_parser->finish();
    m_parser = nullptr;
    m_document = nullptr;
}
void DocumentWriter::end()
{
    ASSERT(m_document);

    // http://bugs.webkit.org/show_bug.cgi?id=10854
    // The frame's last ref may be removed and it can be deleted by checkCompleted(),
    // so we'll add a protective refcount
    RefPtr<Frame> protector(m_document->frame());

    if (!m_parser)
        return;

    if (!m_decoder && m_parser->needsDecoder())
        m_decoder = m_decoderBuilder.buildFor(m_document);
    // flush() can result replacing DocumentLoader::m_writer.
    RefPtr<DocumentWriter> protectingThis(this);
    size_t consumedChars = m_parser->flush();
    if (consumedChars)
        reportDataReceived();
    if (!m_parser)
        return;

    m_parser->finish();
    m_parser = 0;
    m_document = 0;
}
void DocumentWriter::addData(const char* bytes, size_t length)
{
    ASSERT(m_parser);
    if (m_parser->needsDecoder() && 0 < length) {
        OwnPtr<TextResourceDecoder> decoder = m_decoderBuilder.buildFor(m_document);
        m_parser->setDecoder(decoder.release());
    }
    // appendBytes() can result replacing DocumentLoader::m_writer.
    RefPtrWillBeRawPtr<DocumentWriter> protectingThis(this);
    m_parser->appendBytes(bytes, length);
}
void DocumentWriter::addData(const char* bytes, size_t length)
{
    ASSERT(m_parser);
    if (!m_decoder && m_parser->needsDecoder() && 0 < length)
        m_decoder = m_decoderBuilder.buildFor(m_document);
    // appendBytes() can result replacing DocumentLoader::m_writer.
    RefPtr<DocumentWriter> protectingThis(this);
    size_t consumedChars = m_parser->appendBytes(bytes, length);
    if (consumedChars)
        reportDataReceived();
}