#ifndef FetchBodyOwner_h
#define FetchBodyOwner_h
#if ENABLE(FETCH_API)
#include "ActiveDOMObject.h"
#include "FetchBody.h"
#include "FetchLoader.h"
#include "FetchLoaderClient.h"
#include "FetchResponseSource.h"
namespace WebCore {
class FetchBodyOwner : public RefCounted<FetchBodyOwner>, public ActiveDOMObject {
public:
FetchBodyOwner(ScriptExecutionContext&, FetchBody&&);
bool isDisturbed() const;
void arrayBuffer(DeferredWrapper&&);
void blob(DeferredWrapper&&);
void formData(DeferredWrapper&&);
void json(DeferredWrapper&&);
void text(DeferredWrapper&&);
void loadBlob(Blob&, FetchLoader::Type);
bool isActive() const { return !!m_blobLoader; }
protected:
const FetchBody& body() const { return m_body; }
FetchBody& body() { return m_body; }
void stop() override;
void setDisturbed() { m_isDisturbed = true; }
private:
void loadedBlobAsText(String&&);
void loadedBlobAsArrayBuffer(RefPtr<ArrayBuffer>&& buffer) { m_body.loadedAsArrayBuffer(WTFMove(buffer)); }
void blobChunk(const char*, size_t);
void blobLoadingSucceeded();
void blobLoadingFailed();
void finishBlobLoading();
struct BlobLoader final : FetchLoaderClient {
BlobLoader(FetchBodyOwner&);
void didFinishLoadingAsText(String&& text) final { owner.loadedBlobAsText(WTFMove(text)); }
void didFinishLoadingAsArrayBuffer(RefPtr<ArrayBuffer>&& buffer) final { owner.loadedBlobAsArrayBuffer(WTFMove(buffer)); }
void didReceiveResponse(const ResourceResponse&) final;
void didReceiveData(const char* data, size_t size) final { owner.blobChunk(data, size); }
void didFail() final;
void didSucceed() final { owner.blobLoadingSucceeded(); }
FetchBodyOwner& owner;
std::unique_ptr<FetchLoader> loader;
};
protected:
FetchBody m_body;
bool m_isDisturbed { false };
#if ENABLE(STREAMS_API)
RefPtr<FetchResponseSource> m_readableStreamSource;
#endif
private:
Optional<BlobLoader> m_blobLoader;
};
}
#endif // ENABLE(FETCH_API)
#endif // FetchBodyOwner_h