Bug 1857155 - Move WriteImpl to FileSystemWritableFileStream; r=dom-storage-reviewers,aiunusov,jari

Differential Revision: https://phabricator.services.mozilla.com/D190163
This commit is contained in:
Jan Varga
2023-10-09 21:42:25 +00:00
parent 2d9df9a423
commit 32693b823d
2 changed files with 55 additions and 55 deletions

View File

@@ -27,6 +27,7 @@
#include "mozilla/dom/WorkerPrivate.h"
#include "mozilla/dom/WorkerRef.h"
#include "mozilla/dom/WritableStreamDefaultController.h"
#include "mozilla/dom/fs/TargetPtrHolder.h"
#include "mozilla/dom/quota/QuotaCommon.h"
#include "mozilla/dom/quota/ResultExtensions.h"
#include "mozilla/ipc/RandomAccessStreamUtils.h"
@@ -104,56 +105,6 @@ class WritableFileStreamUnderlyingSinkAlgorithms final
RefPtr<FileSystemWritableFileStream> mStream;
};
// TODO: Refactor this function, see Bug 1804614
RefPtr<Int64Promise> WriteImpl(
const RefPtr<nsISerialEventTarget>& aTaskQueue,
nsCOMPtr<nsIInputStream> aInputStream,
RefPtr<fs::FileSystemThreadSafeStreamOwner>& aOutStreamOwner,
const Maybe<uint64_t> aPosition) {
return InvokeAsync(
aTaskQueue, __func__,
[aTaskQueue, inputStream = std::move(aInputStream), aOutStreamOwner,
aPosition]() {
if (aPosition.isSome()) {
LOG(("%p: Seeking to %" PRIu64, aOutStreamOwner.get(),
aPosition.value()));
QM_TRY(MOZ_TO_RESULT(aOutStreamOwner->Seek(aPosition.value())),
CreateAndRejectInt64Promise);
}
nsCOMPtr<nsIOutputStream> streamSink = aOutStreamOwner->OutputStream();
auto written = std::make_shared<int64_t>(0);
auto writingProgress = [written](uint32_t aDelta) {
*written += static_cast<int64_t>(aDelta);
};
auto promiseHolder = MakeUnique<MozPromiseHolder<Int64Promise>>();
RefPtr<Int64Promise> promise = promiseHolder->Ensure(__func__);
auto writingCompletion =
[written,
promiseHolder = std::move(promiseHolder)](nsresult aStatus) {
if (NS_SUCCEEDED(aStatus)) {
promiseHolder->ResolveIfExists(*written, __func__);
return;
}
promiseHolder->RejectIfExists(aStatus, __func__);
};
QM_TRY(MOZ_TO_RESULT(fs::AsyncCopy(
inputStream, streamSink, aTaskQueue,
nsAsyncCopyMode::NS_ASYNCCOPY_VIA_READSEGMENTS,
/* aCloseSource */ true, /* aCloseSink */ false,
std::move(writingProgress), std::move(writingCompletion))),
CreateAndRejectInt64Promise);
return promise;
});
}
} // namespace
class FileSystemWritableFileStream::Command {
@@ -863,8 +814,7 @@ RefPtr<Int64Promise> FileSystemWritableFileStream::Write(
NS_ASSIGNMENT_ADOPT)),
CreateAndRejectInt64Promise);
return WriteImpl(mTaskQueue, std::move(inputStream), mStreamOwner,
aPosition);
return WriteImpl(std::move(inputStream), aPosition);
}
// Step 3.4.7 Otherwise, if data is a Blob ...
@@ -878,8 +828,7 @@ RefPtr<Int64Promise> FileSystemWritableFileStream::Write(
})),
CreateAndRejectInt64Promise);
return WriteImpl(mTaskQueue, std::move(inputStream), mStreamOwner,
aPosition);
return WriteImpl(std::move(inputStream), aPosition);
}
// Step 3.4.8 Otherwise ...
@@ -896,7 +845,55 @@ RefPtr<Int64Promise> FileSystemWritableFileStream::Write(
std::move(dataString))),
CreateAndRejectInt64Promise);
return WriteImpl(mTaskQueue, std::move(inputStream), mStreamOwner, aPosition);
return WriteImpl(std::move(inputStream), aPosition);
}
RefPtr<Int64Promise> FileSystemWritableFileStream::WriteImpl(
nsCOMPtr<nsIInputStream> aInputStream, const Maybe<uint64_t> aPosition) {
return InvokeAsync(
mTaskQueue, __func__,
[selfHolder = fs::TargetPtrHolder(this),
inputStream = std::move(aInputStream), aPosition]() {
if (aPosition.isSome()) {
LOG(("%p: Seeking to %" PRIu64, selfHolder->mStreamOwner.get(),
aPosition.value()));
QM_TRY(
MOZ_TO_RESULT(selfHolder->mStreamOwner->Seek(aPosition.value())),
CreateAndRejectInt64Promise);
}
nsCOMPtr<nsIOutputStream> streamSink =
selfHolder->mStreamOwner->OutputStream();
auto written = std::make_shared<int64_t>(0);
auto writingProgress = [written](uint32_t aDelta) {
*written += static_cast<int64_t>(aDelta);
};
auto promiseHolder = MakeUnique<MozPromiseHolder<Int64Promise>>();
RefPtr<Int64Promise> promise = promiseHolder->Ensure(__func__);
auto writingCompletion =
[written,
promiseHolder = std::move(promiseHolder)](nsresult aStatus) {
if (NS_SUCCEEDED(aStatus)) {
promiseHolder->ResolveIfExists(*written, __func__);
return;
}
promiseHolder->RejectIfExists(aStatus, __func__);
};
QM_TRY(MOZ_TO_RESULT(fs::AsyncCopy(
inputStream, streamSink, selfHolder->mTaskQueue,
nsAsyncCopyMode::NS_ASYNCCOPY_VIA_READSEGMENTS,
/* aCloseSource */ true, /* aCloseSink */ false,
std::move(writingProgress), std::move(writingCompletion))),
CreateAndRejectInt64Promise);
return promise;
});
}
RefPtr<BoolPromise> FileSystemWritableFileStream::Seek(uint64_t aPosition) {