1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef Body_h
#define Body_h
#include "bindings/core/v8/ScriptPromise.h"
#include "bindings/core/v8/ScriptPromiseResolver.h"
#include "bindings/core/v8/ScriptWrappable.h"
#include "core/dom/ActiveDOMObject.h"
#include "core/fileapi/FileReaderLoader.h"
#include "core/fileapi/FileReaderLoaderClient.h"
#include "core/streams/ReadableStreamImpl.h"
#include "platform/blob/BlobData.h"
#include "platform/heap/Handle.h"
#include "wtf/RefPtr.h"
namespace blink {
class BodyStreamBuffer;
class ScriptState;
class Body
: public GarbageCollectedFinalized<Body>
, public ScriptWrappable
, public ActiveDOMObject
, public FileReaderLoaderClient {
DEFINE_WRAPPERTYPEINFO();
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(Body);
public:
explicit Body(ExecutionContext*);
virtual ~Body() { }
enum ResponseType {
ResponseUnknown,
ResponseAsArrayBuffer,
ResponseAsBlob,
ResponseAsFormData,
ResponseAsJSON,
ResponseAsText
};
ScriptPromise arrayBuffer(ScriptState*);
ScriptPromise blob(ScriptState*);
ScriptPromise formData(ScriptState*);
ScriptPromise json(ScriptState*);
ScriptPromise text(ScriptState*);
ReadableStream* body();
// Sets the bodyUsed flag to true. This signifies that the contents of the
// body have been consumed and cannot be accessed again.
void setBodyUsed();
bool bodyUsed() const;
bool streamAccessed() const;
// ActiveDOMObject override.
virtual void stop() override;
virtual bool hasPendingActivity() const override;
virtual void trace(Visitor*) override;
protected:
// Copy constructor for clone() implementations
explicit Body(const Body&);
private:
class ReadableStreamSource;
class BlobHandleReceiver;
void pullSource();
void readAllFromStream(ScriptState*);
ScriptPromise readAsync(ScriptState*, ResponseType);
void readAsyncFromBlob(PassRefPtr<BlobDataHandle>);
void resolveJSON(const String&);
// FileReaderLoaderClient functions.
virtual void didStartLoading() override;
virtual void didReceiveData() override;
virtual void didFinishLoading() override;
virtual void didFail(FileError::ErrorCode) override;
void didBlobHandleReceiveError(PassRefPtrWillBeRawPtr<DOMException>);
// We use BlobDataHandle or BodyStreamBuffer as data container of the Body.
// BodyStreamBuffer is used only when the Response object is created by
// fetch() API.
// FIXME: We should seek a cleaner way to handle the data.
virtual PassRefPtr<BlobDataHandle> blobDataHandle() const = 0;
virtual BodyStreamBuffer* buffer() const = 0;
virtual String contentTypeForBuffer() const = 0;
void didFinishLoadingViaStream(DOMArrayBuffer*);
OwnPtr<FileReaderLoader> m_loader;
bool m_bodyUsed;
bool m_streamAccessed;
ResponseType m_responseType;
RefPtrWillBeMember<ScriptPromiseResolver> m_resolver;
Member<ReadableStreamSource> m_streamSource;
Member<ReadableStreamImpl<ReadableStreamChunkTypeTraits<DOMArrayBuffer>>> m_stream;
};
} // namespace blink
#endif // Body_h
|