PassOwnPtr<FetchDataConsumerHandle> FetchBlobDataConsumerHandle::create(ExecutionContext* executionContext, PassRefPtr<BlobDataHandle> blobDataHandle, LoaderFactory* loaderFactory)
{
    if (!blobDataHandle)
        return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle());

    return adoptPtr(new FetchBlobDataConsumerHandle(executionContext, blobDataHandle, loaderFactory));
}
std::unique_ptr<FetchDataConsumerHandle> FetchBlobDataConsumerHandle::create(ExecutionContext* executionContext, PassRefPtr<BlobDataHandle> blobDataHandle)
{
    if (!blobDataHandle)
        return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle());

    return wrapUnique(new FetchBlobDataConsumerHandle(executionContext, blobDataHandle, new DefaultLoaderFactory));
}
FetchRequestData* FetchRequestData::pass(ExecutionContext* executionContext)
{
    FetchRequestData* request = FetchRequestData::cloneExceptBody();
    if (m_buffer) {
        request->m_buffer = m_buffer;
        m_buffer = new BodyStreamBuffer(createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle()));
        m_buffer->stream()->setIsDisturbed();
    }
    return request;
}
PassOwnPtr<FetchDataConsumerHandle> BodyStreamBuffer::lock(ExecutionContext* executionContext)
{
    ASSERT(!isLocked());
    ++m_lockLevel;
    m_reader = nullptr;
    OwnPtr<FetchDataConsumerHandle> handle = m_handle.release();
    if (ReadableStream::Closed == m_stream->stateInternal())
        return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle());
    if (ReadableStream::Errored == m_stream->stateInternal())
        return createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorDataConsumerHandle());

    TrackExceptionState exceptionState;
    m_streamReader = m_stream->getBytesReader(executionContext, exceptionState);
    return handle.release();
}
FetchRequestData* FetchRequestData::pass(ScriptState* scriptState)
{
    FetchRequestData* request = FetchRequestData::cloneExceptBody();
    if (m_buffer) {
        request->m_buffer = m_buffer;
        m_buffer = new BodyStreamBuffer(scriptState, createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle()));
        m_buffer->closeAndLockAndDisturb();
    }
    return request;
}