#include "ActiveDOMObject.h"
#include "EventTarget.h"
#include "FileError.h"
-#include "KURL.h"
-#include "TextEncoding.h"
-#include "ThreadableLoaderClient.h"
-#include <wtf/PassRefPtr.h>
+#include "FileReaderLoader.h"
+#include "FileReaderLoaderClient.h"
+#include <wtf/Forward.h>
#include <wtf/RefCounted.h>
-#include <wtf/RefPtr.h>
-#include <wtf/Vector.h>
-#include <wtf/text/StringBuilder.h>
#include <wtf/text/WTFString.h>
namespace WebCore {
+class ArrayBuffer;
class Blob;
class ScriptExecutionContext;
-class TextResourceDecoder;
-class ThreadableLoader;
-class FileReader : public RefCounted<FileReader>, public ActiveDOMObject, public EventTarget, public ThreadableLoaderClient {
+class FileReader : public RefCounted<FileReader>, public ActiveDOMObject, public EventTarget, public FileReaderLoaderClient {
public:
static PassRefPtr<FileReader> create(ScriptExecutionContext* context)
{
DONE = 2
};
+ void readAsArrayBuffer(Blob*);
void readAsBinaryString(Blob*);
void readAsText(Blob*, const String& encoding = "");
void readAsDataURL(Blob*);
void abort();
void start();
+ void doAbort();
ReadyState readyState() const;
PassRefPtr<FileError> error() { return m_error; }
- String result();
-
- // Helper methods, also used by FileReaderSync.
- static ExceptionCode httpStatusCodeToExceptionCode(int httpStatusCode);
- static void convertToDataURL(const Vector<char>& rawData, const String& fileType, StringBuilder&);
+ FileReaderLoader::ReadType readType() const { return m_readType; }
+ PassRefPtr<ArrayBuffer> arrayBufferResult() const;
+ String stringResult();
// ActiveDOMObject
virtual bool canSuspend() const;
virtual FileReader* toFileReader() { return this; }
virtual ScriptExecutionContext* scriptExecutionContext() const { return ActiveDOMObject::scriptExecutionContext(); }
- // ThreadableLoaderClient
- virtual void didReceiveResponse(const ResourceResponse&);
- virtual void didReceiveData(const char*, int);
- virtual void didFinishLoading(unsigned long identifier);
- virtual void didFail(const ResourceError&);
+ // FileReaderLoaderClient
+ virtual void didStartLoading();
+ virtual void didReceiveData();
+ virtual void didFinishLoading();
+ virtual void didFail(int errorCode);
using RefCounted<FileReader>::ref;
using RefCounted<FileReader>::deref;
DEFINE_ATTRIBUTE_EVENT_LISTENER(loadend);
private:
- enum ReadType {
- ReadFileAsBinaryString,
- ReadFileAsText,
- ReadFileAsDataURL
- };
enum InternalState {
None,
Starting,
Opening,
Reading,
+ Aborting,
Completed
};
virtual EventTargetData* ensureEventTargetData() { return &m_eventTargetData; }
void terminate();
- void cleanup();
- void readInternal(Blob*, ReadType);
- void failed(int httpStatusCode);
+ void readInternal(Blob*, FileReaderLoader::ReadType);
void fireErrorEvent(int httpStatusCode);
void fireEvent(const AtomicString& type);
- void convertToText();
- void convertToDataURL();
InternalState m_state;
EventTargetData m_eventTargetData;
RefPtr<Blob> m_blob;
- KURL m_urlForReading;
- ReadType m_readType;
- TextEncoding m_encoding;
-
- StringBuilder m_builder;
-
- // The raw data. We have to keep track of all the raw data for it to be converted to text or data URL data.
- Vector<char> m_rawData;
- bool m_isRawDataConverted;
-
- // The decoder used to decode the text data.
- RefPtr<TextResourceDecoder> m_decoder;
-
- // Needed to create data URL.
- String m_fileType;
+ FileReaderLoader::ReadType m_readType;
+ String m_encoding;
- RefPtr<ThreadableLoader> m_loader;
+ OwnPtr<FileReaderLoader> m_loader;
RefPtr<FileError> m_error;
- long long m_bytesLoaded;
- long long m_totalBytes;
double m_lastProgressNotificationTimeMS;
};