| Index: third_party/WebKit/Source/core/fileapi/FileReader.cpp
|
| diff --git a/third_party/WebKit/Source/core/fileapi/FileReader.cpp b/third_party/WebKit/Source/core/fileapi/FileReader.cpp
|
| index 036e3606fe2fce495f2937c28e2133521bf91c55..1ec15f70a957deb7afe7e1f0b7e75de4cfcd30b1 100644
|
| --- a/third_party/WebKit/Source/core/fileapi/FileReader.cpp
|
| +++ b/third_party/WebKit/Source/core/fileapi/FileReader.cpp
|
| @@ -322,10 +322,6 @@ void FileReader::executePendingRead() {
|
| m_blobDataHandle = nullptr;
|
| }
|
|
|
| -static void delayedAbort(FileReader* reader) {
|
| - reader->doAbort();
|
| -}
|
| -
|
| void FileReader::abort() {
|
| DVLOG(1) << "aborting";
|
|
|
| @@ -335,20 +331,12 @@ void FileReader::abort() {
|
| }
|
| m_loadingState = LoadingStateAborted;
|
|
|
| - // 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.
|
| - getExecutionContext()->postTask(
|
| - BLINK_FROM_HERE,
|
| - createSameThreadTask(&delayedAbort, wrapPersistent(this)));
|
| -}
|
| -
|
| -void FileReader::doAbort() {
|
| DCHECK_NE(kDone, m_state);
|
| - AutoReset<bool> firingEvents(&m_stillFiringEvents, true);
|
| + m_state = kDone;
|
|
|
| - terminate();
|
| + AutoReset<bool> firingEvents(&m_stillFiringEvents, true);
|
|
|
| + // Setting error implicitly makes |result| return null.
|
| m_error = FileError::createDOMException(FileError::kAbortErr);
|
|
|
| // Unregister the reader.
|
| @@ -361,10 +349,18 @@ void FileReader::doAbort() {
|
|
|
| // All possible events have fired and we're done, no more pending activity.
|
| ThrottlingController::finishReader(getExecutionContext(), this, finalStep);
|
| +
|
| + // ..but perform the loader cancellation asynchronously as abort() could be
|
| + // called from the event handler and we do not want the resource loading code
|
| + // to be on the stack when doing so. The persistent reference keeps the
|
| + // reader alive until the task has completed.
|
| + getExecutionContext()->postTask(
|
| + BLINK_FROM_HERE,
|
| + createSameThreadTask(&FileReader::terminate, wrapPersistent(this)));
|
| }
|
|
|
| void FileReader::result(StringOrArrayBuffer& resultAttribute) const {
|
| - if (!m_loader || m_error)
|
| + if (m_error || !m_loader)
|
| return;
|
|
|
| if (m_readType == FileReaderLoader::ReadAsArrayBuffer)
|
| @@ -445,8 +441,7 @@ void FileReader::didFail(FileError::ErrorCode errorCode) {
|
| DCHECK_NE(kDone, m_state);
|
| m_state = kDone;
|
|
|
| - m_error = FileError::createDOMException(
|
| - static_cast<FileError::ErrorCode>(errorCode));
|
| + m_error = FileError::createDOMException(errorCode);
|
|
|
| // Unregister the reader.
|
| ThrottlingController::FinishReaderType finalStep =
|
|
|