#ifndef ImageBitmapFactories_h
#define ImageBitmapFactories_h
#include "bindings/v8/ScriptPromise.h"
#include "bindings/v8/ScriptPromiseResolver.h"
#include "bindings/v8/ScriptState.h"
#include "core/fileapi/FileReaderLoader.h"
#include "core/fileapi/FileReaderLoaderClient.h"
#include "platform/Supplementable.h"
#include "platform/geometry/IntRect.h"
#include "wtf/Forward.h"
#include "wtf/HashSet.h"
namespace WebCore {
class Blob;
class CanvasRenderingContext2D;
class EventTarget;
class ExceptionState;
class HTMLCanvasElement;
class HTMLImageElement;
class HTMLVideoElement;
class ImageBitmap;
class ImageData;
class ExecutionContext;
class ImageBitmapFactories FINAL : public NoBaseWillBeGarbageCollectedFinalized<ImageBitmapFactories>, public WillBeHeapSupplement<DOMWindow>, public WillBeHeapSupplement<WorkerGlobalScope> {
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(ImageBitmapFactories);
public:
static ScriptPromise createImageBitmap(EventTarget&, HTMLImageElement*, ExceptionState&);
static ScriptPromise createImageBitmap(EventTarget&, HTMLImageElement*, int sx, int sy, int sw, int sh, ExceptionState&);
static ScriptPromise createImageBitmap(EventTarget&, HTMLVideoElement*, ExceptionState&);
static ScriptPromise createImageBitmap(EventTarget&, HTMLVideoElement*, int sx, int sy, int sw, int sh, ExceptionState&);
static ScriptPromise createImageBitmap(EventTarget&, CanvasRenderingContext2D*, ExceptionState&);
static ScriptPromise createImageBitmap(EventTarget&, CanvasRenderingContext2D*, int sx, int sy, int sw, int sh, ExceptionState&);
static ScriptPromise createImageBitmap(EventTarget&, HTMLCanvasElement*, ExceptionState&);
static ScriptPromise createImageBitmap(EventTarget&, HTMLCanvasElement*, int sx, int sy, int sw, int sh, ExceptionState&);
static ScriptPromise createImageBitmap(EventTarget&, Blob*, ExceptionState&);
static ScriptPromise createImageBitmap(EventTarget&, Blob*, int sx, int sy, int sw, int sh, ExceptionState&);
static ScriptPromise createImageBitmap(EventTarget&, ImageData*, ExceptionState&);
static ScriptPromise createImageBitmap(EventTarget&, ImageData*, int sx, int sy, int sw, int sh, ExceptionState&);
static ScriptPromise createImageBitmap(EventTarget&, ImageBitmap*, ExceptionState&);
static ScriptPromise createImageBitmap(EventTarget&, ImageBitmap*, int sx, int sy, int sw, int sh, ExceptionState&);
virtual ~ImageBitmapFactories() { }
void trace(Visitor*) { }
protected:
static const char* supplementName();
private:
class ImageBitmapLoader FINAL : public RefCounted<ImageBitmapLoader>, public FileReaderLoaderClient {
public:
static PassRefPtr<ImageBitmapLoader> create(ImageBitmapFactories& factory, PassRefPtr<ScriptPromiseResolver> resolver, const IntRect& cropRect)
{
return adoptRef(new ImageBitmapLoader(factory, resolver, cropRect));
}
void loadBlobAsync(ExecutionContext*, Blob*);
virtual ~ImageBitmapLoader() { }
private:
ImageBitmapLoader(ImageBitmapFactories&, PassRefPtr<ScriptPromiseResolver>, const IntRect&);
void rejectPromise();
virtual void didStartLoading() OVERRIDE { }
virtual void didReceiveData() OVERRIDE { }
virtual void didFinishLoading() OVERRIDE;
virtual void didFail(FileError::ErrorCode) OVERRIDE;
ScriptState* m_scriptState;
FileReaderLoader m_loader;
ImageBitmapFactories* m_factory;
RefPtr<ScriptPromiseResolver> m_resolver;
IntRect m_cropRect;
};
static ImageBitmapFactories& from(EventTarget&);
template<class GlobalObject>
static ImageBitmapFactories& fromInternal(GlobalObject&);
void addLoader(PassRefPtr<ImageBitmapLoader>);
void didFinishLoading(ImageBitmapLoader*);
HashSet<RefPtr<ImageBitmapLoader> > m_pendingLoaders;
};
}
#endif