Changeset 288463 in webkit
- Timestamp:
- Jan 24, 2022 1:12:37 PM (6 months ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
-
ChangeLog (modified) (1 diff)
-
fileapi/Blob.cpp (modified) (3 diffs)
-
fileapi/FileReaderLoader.cpp (modified) (2 diffs)
-
fileapi/FileReaderLoader.h (modified) (1 diff)
-
fileapi/FileReaderLoaderClient.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r288462 r288463 1 2022-01-24 Youenn Fablet <youenn@apple.com> 2 3 file.stream() is slow and CPU-bound 4 https://bugs.webkit.org/show_bug.cgi?id=235448 5 6 Reviewed by Alex Christensen. 7 8 We introduce a ReadAsBinaryChunks mode to prevent storing the whole file in memory. 9 Use this in Blob stream implementation. 10 The new implementation is much faster for big files given it does not need to keep in memory the whole file. 11 Covered by existing tests. 12 13 * fileapi/Blob.cpp: 14 * fileapi/FileReaderLoader.cpp: 15 * fileapi/FileReaderLoader.h: 16 * fileapi/FileReaderLoaderClient.h: 17 1 18 2022-01-24 Youenn Fablet <youenn@apple.com> 2 19 -
trunk/Source/WebCore/fileapi/Blob.cpp
r284971 r288463 242 242 public: 243 243 BlobStreamSource(ScriptExecutionContext& scriptExecutionContext, Blob& blob) 244 : m_loader(makeUniqueRef<FileReaderLoader>(FileReaderLoader::ReadType::ReadAs ArrayBuffer, this))244 : m_loader(makeUniqueRef<FileReaderLoader>(FileReaderLoader::ReadType::ReadAsBinaryChunks, this)) 245 245 { 246 246 m_loader->start(&scriptExecutionContext, blob); … … 266 266 // FileReaderLoaderClient 267 267 void didStartLoading() final { } 268 void didReceiveData() final 269 { 270 auto result = m_loader->arrayBufferResult(); 271 if (!result) 272 return; 273 274 if (m_loader->isCompleted() && !m_bytesRead) 275 controller().enqueue(WTFMove(result)); 276 else { 277 auto bytesLoaded = m_loader->bytesLoaded(); 278 controller().enqueue(result->slice(m_bytesRead, bytesLoaded)); 279 m_bytesRead = bytesLoaded; 280 } 268 void didReceiveData() final { } 269 void didReceiveBinaryChunk(const SharedBuffer& buffer) final 270 { 271 if (!controller().enqueue(buffer.tryCreateArrayBuffer())) 272 doCancel(); 281 273 } 282 274 void didFinishLoading() final … … 295 287 296 288 UniqueRef<FileReaderLoader> m_loader; 297 size_t m_bytesRead { 0 };298 289 bool m_isStarted { false }; 299 290 std::optional<Exception> m_exception; -
trunk/Source/WebCore/fileapi/FileReaderLoader.cpp
r288088 r288463 178 178 return; 179 179 180 if (m_readType == ReadType::ReadAsBinaryChunks) { 181 if (m_client) 182 m_client->didReceiveBinaryChunk(buffer); 183 return; 184 } 185 180 186 int length = buffer.size(); 181 187 unsigned remainingBufferSpace = m_totalBytes - m_bytesLoaded; … … 312 318 convertToDataURL(); 313 319 break; 314 default: 320 case ReadAsBlob: 321 case ReadAsBinaryChunks: 315 322 ASSERT_NOT_REACHED(); 316 323 } -
trunk/Source/WebCore/fileapi/FileReaderLoader.h
r288088 r288463 59 59 ReadAsBlob, 60 60 ReadAsText, 61 ReadAsDataURL 61 ReadAsDataURL, 62 ReadAsBinaryChunks 62 63 }; 63 64 -
trunk/Source/WebCore/fileapi/FileReaderLoaderClient.h
r268228 r288463 42 42 virtual void didStartLoading() = 0; 43 43 virtual void didReceiveData() = 0; 44 virtual void didReceiveBinaryChunk(const SharedBuffer&) { } 44 45 virtual void didFinishLoading() = 0; 45 46 virtual void didFail(ExceptionCode errorCode) = 0;
Note: See TracChangeset
for help on using the changeset viewer.