Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(958)

Unified Diff: Source/core/fileapi/FileReader.cpp

Issue 18635004: [Not ready for review] Add Streams API support to FileReader Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/fileapi/FileReader.h ('k') | Source/core/fileapi/FileReader.idl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/fileapi/FileReader.cpp
diff --git a/Source/core/fileapi/FileReader.cpp b/Source/core/fileapi/FileReader.cpp
index a6189a78464fac8f2df6f7dc085d7c8d226cf2d2..614039a7586d1cc4e03587e6bd8d11f17ff8f4e8 100644
--- a/Source/core/fileapi/FileReader.cpp
+++ b/Source/core/fileapi/FileReader.cpp
@@ -55,6 +55,11 @@ const CString utf8FilePath(Blob* blob)
return blob->isFile() ? toFile(blob)->path().utf8() : "";
}
+const CString utf8BlobURL(Stream* stream)
+{
+ return stream->url().string().utf8();
+}
+
} // namespace
static const double progressNotificationIntervalMS = 50;
@@ -102,9 +107,9 @@ void FileReader::readAsArrayBuffer(Blob* blob, ExceptionCode& ec)
if (!blob)
return;
- LOG(FileAPI, "FileReader: reading as array buffer: %s %s\n", utf8BlobURL(blob).data(), utf8FilePath(blob).data());
+ LOG(FileAPI, "FileReader: reading Blob as array buffer: %s %s\n", utf8BlobURL(blob).data(), utf8FilePath(blob).data());
- readInternal(blob, FileReaderLoader::ReadAsArrayBuffer, ec);
+ readInternal(blob, 0, FileReaderLoader::ReadAsArrayBuffer, ec);
}
void FileReader::readAsBinaryString(Blob* blob, ExceptionCode& ec)
@@ -112,9 +117,9 @@ void FileReader::readAsBinaryString(Blob* blob, ExceptionCode& ec)
if (!blob)
return;
- LOG(FileAPI, "FileReader: reading as binary: %s %s\n", utf8BlobURL(blob).data(), utf8FilePath(blob).data());
+ LOG(FileAPI, "FileReader: reading Blob as binary: %s %s\n", utf8BlobURL(blob).data(), utf8FilePath(blob).data());
- readInternal(blob, FileReaderLoader::ReadAsBinaryString, ec);
+ readInternal(blob, 0, FileReaderLoader::ReadAsBinaryString, ec);
}
void FileReader::readAsText(Blob* blob, const String& encoding, ExceptionCode& ec)
@@ -122,10 +127,10 @@ void FileReader::readAsText(Blob* blob, const String& encoding, ExceptionCode& e
if (!blob)
return;
- LOG(FileAPI, "FileReader: reading as text: %s %s\n", utf8BlobURL(blob).data(), utf8FilePath(blob).data());
+ LOG(FileAPI, "FileReader: reading Blob as text: %s %s\n", utf8BlobURL(blob).data(), utf8FilePath(blob).data());
m_encoding = encoding;
- readInternal(blob, FileReaderLoader::ReadAsText, ec);
+ readInternal(blob, 0, FileReaderLoader::ReadAsText, ec);
}
void FileReader::readAsText(Blob* blob, ExceptionCode& ec)
@@ -138,12 +143,22 @@ void FileReader::readAsDataURL(Blob* blob, ExceptionCode& ec)
if (!blob)
return;
- LOG(FileAPI, "FileReader: reading as data URL: %s %s\n", utf8BlobURL(blob).data(), utf8FilePath(blob).data());
+ LOG(FileAPI, "FileReader: reading Blob as data URL: %s %s\n", utf8BlobURL(blob).data(), utf8FilePath(blob).data());
+
+ readInternal(blob, 0, FileReaderLoader::ReadAsDataURL, ec);
+}
+
+void FileReader::readAsArrayBuffer(Stream* stream, ExceptionCode& ec)
+{
+ if (!stream)
+ return;
+
+ LOG(FileAPI, "FileReader: reading Stream as array buffer: %s\n", utf8BlobURL(stream).data());
- readInternal(blob, FileReaderLoader::ReadAsDataURL, ec);
+ readInternal(0, stream, FileReaderLoader::ReadAsArrayBuffer, ec);
}
-void FileReader::readInternal(Blob* blob, FileReaderLoader::ReadType type, ExceptionCode& ec)
+void FileReader::readInternal(Blob* blob, Stream* stream, FileReaderLoader::ReadType type, ExceptionCode& ec)
{
// If multiple concurrent read methods are called on the same FileReader, InvalidStateError should be thrown when the state is LOADING.
if (m_state == LOADING) {
@@ -154,14 +169,25 @@ void FileReader::readInternal(Blob* blob, FileReaderLoader::ReadType type, Excep
setPendingActivity(this);
m_blob = blob;
+ m_stream = stream;
m_readType = type;
m_state = LOADING;
m_error = 0;
m_loader = adoptPtr(new FileReaderLoader(m_readType, this));
m_loader->setEncoding(m_encoding);
- m_loader->setDataType(m_blob->type());
- m_loader->start(scriptExecutionContext(), *m_blob);
+ if (m_blob) {
+ m_loader->setDataType(m_blob->type());
+ m_loader->start(scriptExecutionContext(), m_blob.get());
+ } else if (m_stream) {
+ if (m_stream->isNeutered()) {
+ ec = InvalidStateError;
+ return;
+ }
+ stream->neuter();
+ m_loader->setDataType(m_stream->type());
+ m_loader->start(scriptExecutionContext(), m_stream.get());
+ }
}
static void delayedAbort(ScriptExecutionContext*, FileReader* reader)
@@ -217,6 +243,9 @@ void FileReader::didReceiveData()
{
// Fire the progress event at least every 50ms.
double now = currentTimeMS();
+
+ LOG(FileAPI, "FileReader::didReceiveData %f", now);
+
if (!m_lastProgressNotificationTimeMS)
m_lastProgressNotificationTimeMS = now;
else if (now - m_lastProgressNotificationTimeMS > progressNotificationIntervalMS) {
« no previous file with comments | « Source/core/fileapi/FileReader.h ('k') | Source/core/fileapi/FileReader.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698