121939df44de1705786c545cd1bf519d47250322dBen Murdoch/*
221939df44de1705786c545cd1bf519d47250322dBen Murdoch * Copyright (C) 2010 Google Inc.  All rights reserved.
321939df44de1705786c545cd1bf519d47250322dBen Murdoch *
421939df44de1705786c545cd1bf519d47250322dBen Murdoch * Redistribution and use in source and binary forms, with or without
521939df44de1705786c545cd1bf519d47250322dBen Murdoch * modification, are permitted provided that the following conditions are
621939df44de1705786c545cd1bf519d47250322dBen Murdoch * met:
721939df44de1705786c545cd1bf519d47250322dBen Murdoch *
821939df44de1705786c545cd1bf519d47250322dBen Murdoch *     * Redistributions of source code must retain the above copyright
921939df44de1705786c545cd1bf519d47250322dBen Murdoch * notice, this list of conditions and the following disclaimer.
1021939df44de1705786c545cd1bf519d47250322dBen Murdoch *     * Redistributions in binary form must reproduce the above
1121939df44de1705786c545cd1bf519d47250322dBen Murdoch * copyright notice, this list of conditions and the following disclaimer
1221939df44de1705786c545cd1bf519d47250322dBen Murdoch * in the documentation and/or other materials provided with the
1321939df44de1705786c545cd1bf519d47250322dBen Murdoch * distribution.
1421939df44de1705786c545cd1bf519d47250322dBen Murdoch *     * Neither the name of Google Inc. nor the names of its
1521939df44de1705786c545cd1bf519d47250322dBen Murdoch * contributors may be used to endorse or promote products derived from
1621939df44de1705786c545cd1bf519d47250322dBen Murdoch * this software without specific prior written permission.
1721939df44de1705786c545cd1bf519d47250322dBen Murdoch *
1821939df44de1705786c545cd1bf519d47250322dBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1921939df44de1705786c545cd1bf519d47250322dBen Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2021939df44de1705786c545cd1bf519d47250322dBen Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2121939df44de1705786c545cd1bf519d47250322dBen Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2221939df44de1705786c545cd1bf519d47250322dBen Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2321939df44de1705786c545cd1bf519d47250322dBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2421939df44de1705786c545cd1bf519d47250322dBen Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2521939df44de1705786c545cd1bf519d47250322dBen Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2621939df44de1705786c545cd1bf519d47250322dBen Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2721939df44de1705786c545cd1bf519d47250322dBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2821939df44de1705786c545cd1bf519d47250322dBen Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2921939df44de1705786c545cd1bf519d47250322dBen Murdoch */
3021939df44de1705786c545cd1bf519d47250322dBen Murdoch
3121939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "config.h"
3221939df44de1705786c545cd1bf519d47250322dBen Murdoch
33dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(BLOB)
3421939df44de1705786c545cd1bf519d47250322dBen Murdoch
3521939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "FileReader.h"
3621939df44de1705786c545cd1bf519d47250322dBen Murdoch
37e14391e94c850b8bd03680c23b38978db68687a8John Reck#include "ArrayBuffer.h"
385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "CrossThreadTask.h"
3921939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "File.h"
4021939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "Logging.h"
4121939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "ProgressEvent.h"
4221939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "ScriptExecutionContext.h"
4321939df44de1705786c545cd1bf519d47250322dBen Murdoch#include <wtf/CurrentTime.h>
44cad810f21b803229eb11403f9209855525a25d57Steve Block#include <wtf/text/CString.h>
4521939df44de1705786c545cd1bf519d47250322dBen Murdoch
4621939df44de1705786c545cd1bf519d47250322dBen Murdochnamespace WebCore {
4721939df44de1705786c545cd1bf519d47250322dBen Murdoch
48f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic const double progressNotificationIntervalMS = 50;
4921939df44de1705786c545cd1bf519d47250322dBen Murdoch
5021939df44de1705786c545cd1bf519d47250322dBen MurdochFileReader::FileReader(ScriptExecutionContext* context)
5121939df44de1705786c545cd1bf519d47250322dBen Murdoch    : ActiveDOMObject(context, this)
52e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    , m_state(None)
53e14391e94c850b8bd03680c23b38978db68687a8John Reck    , m_readType(FileReaderLoader::ReadAsBinaryString)
5421939df44de1705786c545cd1bf519d47250322dBen Murdoch    , m_lastProgressNotificationTimeMS(0)
5521939df44de1705786c545cd1bf519d47250322dBen Murdoch{
5621939df44de1705786c545cd1bf519d47250322dBen Murdoch}
5721939df44de1705786c545cd1bf519d47250322dBen Murdoch
5821939df44de1705786c545cd1bf519d47250322dBen MurdochFileReader::~FileReader()
5921939df44de1705786c545cd1bf519d47250322dBen Murdoch{
6021939df44de1705786c545cd1bf519d47250322dBen Murdoch    terminate();
6121939df44de1705786c545cd1bf519d47250322dBen Murdoch}
6221939df44de1705786c545cd1bf519d47250322dBen Murdoch
6321939df44de1705786c545cd1bf519d47250322dBen Murdochbool FileReader::hasPendingActivity() const
6421939df44de1705786c545cd1bf519d47250322dBen Murdoch{
65e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    return (m_state != None && m_state != Completed) || ActiveDOMObject::hasPendingActivity();
6621939df44de1705786c545cd1bf519d47250322dBen Murdoch}
6721939df44de1705786c545cd1bf519d47250322dBen Murdoch
6821939df44de1705786c545cd1bf519d47250322dBen Murdochbool FileReader::canSuspend() const
6921939df44de1705786c545cd1bf519d47250322dBen Murdoch{
7021939df44de1705786c545cd1bf519d47250322dBen Murdoch    // FIXME: It is not currently possible to suspend a FileReader, so pages with FileReader can not go into page cache.
7121939df44de1705786c545cd1bf519d47250322dBen Murdoch    return false;
7221939df44de1705786c545cd1bf519d47250322dBen Murdoch}
7321939df44de1705786c545cd1bf519d47250322dBen Murdoch
7421939df44de1705786c545cd1bf519d47250322dBen Murdochvoid FileReader::stop()
7521939df44de1705786c545cd1bf519d47250322dBen Murdoch{
7621939df44de1705786c545cd1bf519d47250322dBen Murdoch    terminate();
7721939df44de1705786c545cd1bf519d47250322dBen Murdoch}
7821939df44de1705786c545cd1bf519d47250322dBen Murdoch
79e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid FileReader::readAsArrayBuffer(Blob* blob)
80e14391e94c850b8bd03680c23b38978db68687a8John Reck{
81e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!blob)
82e14391e94c850b8bd03680c23b38978db68687a8John Reck        return;
83e14391e94c850b8bd03680c23b38978db68687a8John Reck
84e14391e94c850b8bd03680c23b38978db68687a8John Reck    LOG(FileAPI, "FileReader: reading as array buffer: %s %s\n", blob->url().string().utf8().data(), blob->isFile() ? static_cast<File*>(blob)->path().utf8().data() : "");
85e14391e94c850b8bd03680c23b38978db68687a8John Reck
86e14391e94c850b8bd03680c23b38978db68687a8John Reck    readInternal(blob, FileReaderLoader::ReadAsArrayBuffer);
87e14391e94c850b8bd03680c23b38978db68687a8John Reck}
88e14391e94c850b8bd03680c23b38978db68687a8John Reck
895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid FileReader::readAsBinaryString(Blob* blob)
9021939df44de1705786c545cd1bf519d47250322dBen Murdoch{
915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!blob)
92e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return;
93e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    LOG(FileAPI, "FileReader: reading as binary: %s %s\n", blob->url().string().utf8().data(), blob->isFile() ? static_cast<File*>(blob)->path().utf8().data() : "");
9521939df44de1705786c545cd1bf519d47250322dBen Murdoch
96e14391e94c850b8bd03680c23b38978db68687a8John Reck    readInternal(blob, FileReaderLoader::ReadAsBinaryString);
9721939df44de1705786c545cd1bf519d47250322dBen Murdoch}
9821939df44de1705786c545cd1bf519d47250322dBen Murdoch
995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid FileReader::readAsText(Blob* blob, const String& encoding)
10021939df44de1705786c545cd1bf519d47250322dBen Murdoch{
1015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!blob)
102e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return;
103e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    LOG(FileAPI, "FileReader: reading as text: %s %s\n", blob->url().string().utf8().data(), blob->isFile() ? static_cast<File*>(blob)->path().utf8().data() : "");
10521939df44de1705786c545cd1bf519d47250322dBen Murdoch
106e14391e94c850b8bd03680c23b38978db68687a8John Reck    m_encoding = encoding;
107e14391e94c850b8bd03680c23b38978db68687a8John Reck    readInternal(blob, FileReaderLoader::ReadAsText);
10821939df44de1705786c545cd1bf519d47250322dBen Murdoch}
10921939df44de1705786c545cd1bf519d47250322dBen Murdoch
1105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid FileReader::readAsDataURL(Blob* blob)
11121939df44de1705786c545cd1bf519d47250322dBen Murdoch{
1125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!blob)
113e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return;
114e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    LOG(FileAPI, "FileReader: reading as data URL: %s %s\n", blob->url().string().utf8().data(), blob->isFile() ? static_cast<File*>(blob)->path().utf8().data() : "");
11621939df44de1705786c545cd1bf519d47250322dBen Murdoch
117e14391e94c850b8bd03680c23b38978db68687a8John Reck    readInternal(blob, FileReaderLoader::ReadAsDataURL);
11821939df44de1705786c545cd1bf519d47250322dBen Murdoch}
11921939df44de1705786c545cd1bf519d47250322dBen Murdoch
1205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenstatic void delayedStart(ScriptExecutionContext*, FileReader* reader)
1215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
1225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    reader->start();
1235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
1245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
125e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid FileReader::readInternal(Blob* blob, FileReaderLoader::ReadType type)
12621939df44de1705786c545cd1bf519d47250322dBen Murdoch{
12721939df44de1705786c545cd1bf519d47250322dBen Murdoch    // readAs*** methods() can be called multiple times. Only the last call before the actual reading happens is processed.
128e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (m_state != None && m_state != Starting)
12921939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
13021939df44de1705786c545cd1bf519d47250322dBen Murdoch
1315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (m_state == None)
1325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        scriptExecutionContext()->postTask(createCallbackTask(&delayedStart, this));
1335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_blob = blob;
13521939df44de1705786c545cd1bf519d47250322dBen Murdoch    m_readType = type;
136e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_state = Starting;
13721939df44de1705786c545cd1bf519d47250322dBen Murdoch}
13821939df44de1705786c545cd1bf519d47250322dBen Murdoch
139e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic void delayedAbort(ScriptExecutionContext*, FileReader* reader)
140e14391e94c850b8bd03680c23b38978db68687a8John Reck{
141e14391e94c850b8bd03680c23b38978db68687a8John Reck    reader->doAbort();
142e14391e94c850b8bd03680c23b38978db68687a8John Reck}
143e14391e94c850b8bd03680c23b38978db68687a8John Reck
14421939df44de1705786c545cd1bf519d47250322dBen Murdochvoid FileReader::abort()
14521939df44de1705786c545cd1bf519d47250322dBen Murdoch{
14621939df44de1705786c545cd1bf519d47250322dBen Murdoch    LOG(FileAPI, "FileReader: aborting\n");
14721939df44de1705786c545cd1bf519d47250322dBen Murdoch
148e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (m_state == Aborting)
149e14391e94c850b8bd03680c23b38978db68687a8John Reck        return;
150e14391e94c850b8bd03680c23b38978db68687a8John Reck    m_state = Aborting;
151e14391e94c850b8bd03680c23b38978db68687a8John Reck
152e14391e94c850b8bd03680c23b38978db68687a8John Reck    // Schedule to have the abort done later since abort() might be called from the event handler and we do not want the resource loading code to be in the stack.
153e14391e94c850b8bd03680c23b38978db68687a8John Reck    scriptExecutionContext()->postTask(createCallbackTask(&delayedAbort, this));
154e14391e94c850b8bd03680c23b38978db68687a8John Reck}
155e14391e94c850b8bd03680c23b38978db68687a8John Reck
156e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid FileReader::doAbort()
157e14391e94c850b8bd03680c23b38978db68687a8John Reck{
15821939df44de1705786c545cd1bf519d47250322dBen Murdoch    terminate();
15921939df44de1705786c545cd1bf519d47250322dBen Murdoch
160e14391e94c850b8bd03680c23b38978db68687a8John Reck    m_error = FileError::create(FileError::ABORT_ERR);
16121939df44de1705786c545cd1bf519d47250322dBen Murdoch
16221939df44de1705786c545cd1bf519d47250322dBen Murdoch    fireEvent(eventNames().errorEvent);
16321939df44de1705786c545cd1bf519d47250322dBen Murdoch    fireEvent(eventNames().abortEvent);
16421939df44de1705786c545cd1bf519d47250322dBen Murdoch    fireEvent(eventNames().loadendEvent);
16521939df44de1705786c545cd1bf519d47250322dBen Murdoch}
16621939df44de1705786c545cd1bf519d47250322dBen Murdoch
16721939df44de1705786c545cd1bf519d47250322dBen Murdochvoid FileReader::terminate()
16821939df44de1705786c545cd1bf519d47250322dBen Murdoch{
1695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (m_loader) {
1705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_loader->cancel();
171e14391e94c850b8bd03680c23b38978db68687a8John Reck        m_loader = 0;
17221939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
173e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_state = Completed;
17421939df44de1705786c545cd1bf519d47250322dBen Murdoch}
17521939df44de1705786c545cd1bf519d47250322dBen Murdoch
1765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid FileReader::start()
17721939df44de1705786c545cd1bf519d47250322dBen Murdoch{
178e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_state = Opening;
179f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
180e14391e94c850b8bd03680c23b38978db68687a8John Reck    m_loader = adoptPtr(new FileReaderLoader(m_readType, this));
181e14391e94c850b8bd03680c23b38978db68687a8John Reck    m_loader->setEncoding(m_encoding);
182e14391e94c850b8bd03680c23b38978db68687a8John Reck    m_loader->setDataType(m_blob->type());
183e14391e94c850b8bd03680c23b38978db68687a8John Reck    m_loader->start(scriptExecutionContext(), m_blob.get());
18421939df44de1705786c545cd1bf519d47250322dBen Murdoch}
18521939df44de1705786c545cd1bf519d47250322dBen Murdoch
186e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid FileReader::didStartLoading()
18721939df44de1705786c545cd1bf519d47250322dBen Murdoch{
188e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_state = Reading;
18921939df44de1705786c545cd1bf519d47250322dBen Murdoch    fireEvent(eventNames().loadstartEvent);
19021939df44de1705786c545cd1bf519d47250322dBen Murdoch}
19121939df44de1705786c545cd1bf519d47250322dBen Murdoch
192e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid FileReader::didReceiveData()
19321939df44de1705786c545cd1bf519d47250322dBen Murdoch{
19421939df44de1705786c545cd1bf519d47250322dBen Murdoch    // Fire the progress event at least every 50ms.
195f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    double now = currentTimeMS();
19621939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!m_lastProgressNotificationTimeMS)
19721939df44de1705786c545cd1bf519d47250322dBen Murdoch        m_lastProgressNotificationTimeMS = now;
19821939df44de1705786c545cd1bf519d47250322dBen Murdoch    else if (now - m_lastProgressNotificationTimeMS > progressNotificationIntervalMS) {
19921939df44de1705786c545cd1bf519d47250322dBen Murdoch        fireEvent(eventNames().progressEvent);
20021939df44de1705786c545cd1bf519d47250322dBen Murdoch        m_lastProgressNotificationTimeMS = now;
20121939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
20221939df44de1705786c545cd1bf519d47250322dBen Murdoch}
20321939df44de1705786c545cd1bf519d47250322dBen Murdoch
204e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid FileReader::didFinishLoading()
20521939df44de1705786c545cd1bf519d47250322dBen Murdoch{
206e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    m_state = Completed;
20721939df44de1705786c545cd1bf519d47250322dBen Murdoch
20821939df44de1705786c545cd1bf519d47250322dBen Murdoch    fireEvent(eventNames().loadEvent);
20921939df44de1705786c545cd1bf519d47250322dBen Murdoch    fireEvent(eventNames().loadendEvent);
21021939df44de1705786c545cd1bf519d47250322dBen Murdoch}
21121939df44de1705786c545cd1bf519d47250322dBen Murdoch
212e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid FileReader::didFail(int errorCode)
21321939df44de1705786c545cd1bf519d47250322dBen Murdoch{
214e14391e94c850b8bd03680c23b38978db68687a8John Reck    // If we're aborting, do not proceed with normal error handling since it is covered in aborting code.
215e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (m_state == Aborting)
216e14391e94c850b8bd03680c23b38978db68687a8John Reck        return;
21721939df44de1705786c545cd1bf519d47250322dBen Murdoch
2185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_state = Completed;
21921939df44de1705786c545cd1bf519d47250322dBen Murdoch
220e14391e94c850b8bd03680c23b38978db68687a8John Reck    m_error = FileError::create(static_cast<FileError::ErrorCode>(errorCode));
22121939df44de1705786c545cd1bf519d47250322dBen Murdoch    fireEvent(eventNames().errorEvent);
22221939df44de1705786c545cd1bf519d47250322dBen Murdoch    fireEvent(eventNames().loadendEvent);
22321939df44de1705786c545cd1bf519d47250322dBen Murdoch}
22421939df44de1705786c545cd1bf519d47250322dBen Murdoch
22521939df44de1705786c545cd1bf519d47250322dBen Murdochvoid FileReader::fireEvent(const AtomicString& type)
22621939df44de1705786c545cd1bf519d47250322dBen Murdoch{
227f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    dispatchEvent(ProgressEvent::create(type, true, m_loader ? m_loader->bytesLoaded() : 0, m_loader ? m_loader->totalBytes() : 0));
22821939df44de1705786c545cd1bf519d47250322dBen Murdoch}
22921939df44de1705786c545cd1bf519d47250322dBen Murdoch
230e78cbe89e6f337f2f1fe40315be88f742b547151Steve BlockFileReader::ReadyState FileReader::readyState() const
231e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
232e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    switch (m_state) {
233e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case None:
234e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case Starting:
235f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return EMPTY;
236e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case Opening:
237e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case Reading:
238e14391e94c850b8bd03680c23b38978db68687a8John Reck    case Aborting:
239f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return LOADING;
240e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case Completed:
241f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return DONE;
242e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
243e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    ASSERT_NOT_REACHED();
244f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return EMPTY;
245e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
246e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
247e14391e94c850b8bd03680c23b38978db68687a8John ReckPassRefPtr<ArrayBuffer> FileReader::arrayBufferResult() const
24821939df44de1705786c545cd1bf519d47250322dBen Murdoch{
249e14391e94c850b8bd03680c23b38978db68687a8John Reck    return m_loader ? m_loader->arrayBufferResult() : 0;
25021939df44de1705786c545cd1bf519d47250322dBen Murdoch}
25121939df44de1705786c545cd1bf519d47250322dBen Murdoch
252e14391e94c850b8bd03680c23b38978db68687a8John ReckString FileReader::stringResult()
25321939df44de1705786c545cd1bf519d47250322dBen Murdoch{
254e14391e94c850b8bd03680c23b38978db68687a8John Reck    return m_loader ? m_loader->stringResult() : "";
25521939df44de1705786c545cd1bf519d47250322dBen Murdoch}
25621939df44de1705786c545cd1bf519d47250322dBen Murdoch
25721939df44de1705786c545cd1bf519d47250322dBen Murdoch} // namespace WebCore
25821939df44de1705786c545cd1bf519d47250322dBen Murdoch
259dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#endif // ENABLE(BLOB)
260