blob: 745ab2400bb2536959fda6c905a9a3fac0efad37 [file] [log] [blame]
// Copyright 2015 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 FetchDataLoader_h
#define FetchDataLoader_h
#include "core/dom/DOMArrayBuffer.h"
#include "core/streams/Stream.h"
#include "modules/ModulesExport.h"
#include "modules/fetch/FetchDataConsumerHandle.h"
#include "platform/blob/BlobData.h"
#include "platform/heap/Handle.h"
#include "wtf/Forward.h"
namespace blink {
// FetchDataLoader subclasses
// 1. take a reader of FetchDataConsumerHandle |handle|,
// 2. read all data, and
// 3. call either didFetchDataLoaded...() on success or
// difFetchDataLoadFailed() otherwise
// on the thread where FetchDataLoader is created.
//
// - Client's methods can be called synchronously in start().
// - If FetchDataLoader::cancel() is called (or FetchDataLoader is garbage
// collected), Client's methods are not called anymore.
// - FetchDataLoader takes the ownership of |handle|'s reader but not |handle|.
class MODULES_EXPORT FetchDataLoader : public GarbageCollectedFinalized<FetchDataLoader> {
public:
class MODULES_EXPORT Client : public GarbageCollectedMixin {
public:
virtual ~Client() { }
// The method corresponding to createLoaderAs... is called on success.
virtual void didFetchDataLoadedBlobHandle(PassRefPtr<BlobDataHandle>)
{
ASSERT_NOT_REACHED();
}
virtual void didFetchDataLoadedArrayBuffer(DOMArrayBuffer*)
{
ASSERT_NOT_REACHED();
}
virtual void didFetchDataLoadedString(const String&)
{
ASSERT_NOT_REACHED();
}
// This is called after all data are read from |handle| and written
// to |outStream|, and |outStream| is closed or aborted.
virtual void didFetchDataLoadedStream()
{
ASSERT_NOT_REACHED();
}
virtual void didFetchDataLoadFailed() = 0;
DEFINE_INLINE_VIRTUAL_TRACE() { }
};
static FetchDataLoader* createLoaderAsBlobHandle(const String& mimeType);
static FetchDataLoader* createLoaderAsArrayBuffer();
static FetchDataLoader* createLoaderAsString();
static FetchDataLoader* createLoaderAsStream(Stream* outStream);
virtual ~FetchDataLoader() { }
// start() should be called only once on the created thread.
// start() do not take the ownership of |handle|.
// |handle| must not be locked when called.
virtual void start(FetchDataConsumerHandle* /* handle */, Client*) = 0;
virtual void cancel() = 0;
DEFINE_INLINE_VIRTUAL_TRACE() { }
};
} // namespace blink
#endif // FetchDataLoader_h