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