diff options
Diffstat (limited to 'WebCore/fileapi/FileReaderSync.cpp')
-rw-r--r-- | WebCore/fileapi/FileReaderSync.cpp | 49 |
1 files changed, 23 insertions, 26 deletions
diff --git a/WebCore/fileapi/FileReaderSync.cpp b/WebCore/fileapi/FileReaderSync.cpp index 6c76714..6425bcf 100644 --- a/WebCore/fileapi/FileReaderSync.cpp +++ b/WebCore/fileapi/FileReaderSync.cpp @@ -39,6 +39,7 @@ #include "BlobURL.h" #include "FileReader.h" #include "ResourceRequest.h" +#include "ResourceResponse.h" #include "ScriptExecutionContext.h" #include "TextEncoding.h" #include "TextResourceDecoder.h" @@ -50,7 +51,7 @@ namespace WebCore { class FileReaderSyncLoader : public ThreadableLoaderClient { public: // If the output result is provided, use it. Otherwise, save it as the raw data. - FileReaderSyncLoader(ScriptString* result); + FileReaderSyncLoader(StringBuilder*); // Returns the http status code. void start(ScriptExecutionContext*, const ResourceRequest&, ExceptionCode&); @@ -65,7 +66,7 @@ public: private: // The output result. The caller provides this in order to load the binary data directly. - ScriptString* m_result; + StringBuilder* m_builder; // The raw data. The caller does not provide the above output result and we need to save it here. Vector<char> m_rawData; @@ -73,8 +74,8 @@ private: int m_httpStatusCode; }; -FileReaderSyncLoader::FileReaderSyncLoader(ScriptString* result) - : m_result(result) +FileReaderSyncLoader::FileReaderSyncLoader(StringBuilder* builder) + : m_builder(builder) , m_httpStatusCode(0) { } @@ -100,8 +101,8 @@ void FileReaderSyncLoader::didReceiveResponse(const ResourceResponse& response) void FileReaderSyncLoader::didReceiveData(const char* data, int lengthReceived) { - if (m_result) - *m_result += String(data, static_cast<unsigned>(lengthReceived)); + if (m_builder) + m_builder->append(data, static_cast<unsigned>(lengthReceived)); else m_rawData.append(data, static_cast<unsigned>(lengthReceived)); } @@ -116,37 +117,32 @@ void FileReaderSyncLoader::didFail(const ResourceError&) m_httpStatusCode = 500; } -FileReaderSync::FileReaderSync() - : m_result("") -{ -} - -const ScriptString& FileReaderSync::readAsBinaryString(ScriptExecutionContext* scriptExecutionContext, Blob* blob, ExceptionCode& ec) +String FileReaderSync::readAsBinaryString(ScriptExecutionContext* scriptExecutionContext, Blob* blob, ExceptionCode& ec) { if (!blob) - return m_result; + return m_builder.toString(); read(scriptExecutionContext, blob, ReadAsBinaryString, ec); - return m_result; + return m_builder.toString(); } -const ScriptString& FileReaderSync::readAsText(ScriptExecutionContext* scriptExecutionContext, Blob* blob, const String& encoding, ExceptionCode& ec) +String FileReaderSync::readAsText(ScriptExecutionContext* scriptExecutionContext, Blob* blob, const String& encoding, ExceptionCode& ec) { if (!blob) - return m_result; + return m_builder.toString(); m_encoding = encoding; read(scriptExecutionContext, blob, ReadAsText, ec); - return m_result; + return m_builder.toString(); } -const ScriptString& FileReaderSync::readAsDataURL(ScriptExecutionContext* scriptExecutionContext, Blob* blob, ExceptionCode& ec) +String FileReaderSync::readAsDataURL(ScriptExecutionContext* scriptExecutionContext, Blob* blob, ExceptionCode& ec) { if (!blob) - return m_result; + return m_builder.toString(); read(scriptExecutionContext, blob, ReadAsDataURL, ec); - return m_result; + return m_builder.toString(); } void FileReaderSync::read(ScriptExecutionContext* scriptExecutionContext, Blob* blob, ReadType readType, ExceptionCode& ec) @@ -158,7 +154,7 @@ void FileReaderSync::read(ScriptExecutionContext* scriptExecutionContext, Blob* ResourceRequest request(urlForReading); request.setHTTPMethod("GET"); - FileReaderSyncLoader loader((readType == ReadAsBinaryString) ? &m_result : 0); + FileReaderSyncLoader loader((readType == ReadAsBinaryString) ? &m_builder : 0); loader.start(scriptExecutionContext, request, ec); ThreadableBlobRegistry::unregisterBlobURL(urlForReading); if (ec) @@ -169,17 +165,17 @@ void FileReaderSync::read(ScriptExecutionContext* scriptExecutionContext, Blob* // Nothing to do since we need no conversion. return; case ReadAsText: - convertToText(loader.rawData().data(), loader.rawData().size(), m_result); + convertToText(loader.rawData().data(), loader.rawData().size(), m_builder); return; case ReadAsDataURL: - FileReader::convertToDataURL(loader.rawData(), blob->type(), m_result); + FileReader::convertToDataURL(loader.rawData(), blob->type(), m_builder); return; } ASSERT_NOT_REACHED(); } -void FileReaderSync::convertToText(const char* data, int size, ScriptString& result) +void FileReaderSync::convertToText(const char* data, int size, StringBuilder& builder) { if (!size) return; @@ -190,8 +186,9 @@ void FileReaderSync::convertToText(const char* data, int size, ScriptString& res // provided encoding. // FIXME: consider supporting incremental decoding to improve the perf. RefPtr<TextResourceDecoder> decoder = TextResourceDecoder::create("text/plain", m_encoding.isEmpty() ? UTF8Encoding() : TextEncoding(m_encoding)); - result = decoder->decode(data, size); - result += decoder->flush(); + builder.clear(); + builder.append(decoder->decode(data, size)); + builder.append(decoder->flush()); } } // namespace WebCore |