Files
tubestation/dom/fs/api/FileSystemWritableFileStream.cpp
Butkovits Atila 551331d5f1 Backed out 30 changesets (bug 1777361, bug 1798459, bug 1769057) for causing failures at fs/FileSystemBaseHandle-IndexedDB. CLOSED TREE
Backed out changeset 89c3a814819c (bug 1798459)
Backed out changeset 83b1e1b3c168 (bug 1798459)
Backed out changeset 179d6204b3bb (bug 1798459)
Backed out changeset b371599177b6 (bug 1798459)
Backed out changeset b68c63983ae7 (bug 1798459)
Backed out changeset 3b1eaafa31d2 (bug 1798459)
Backed out changeset d9b3c17a5549 (bug 1798459)
Backed out changeset 243631cf4913 (bug 1798459)
Backed out changeset 7d2ffb13d1cc (bug 1798459)
Backed out changeset 1a86d4746c65 (bug 1798459)
Backed out changeset 0f197d402d63 (bug 1798459)
Backed out changeset 5e9ca1b1c95c (bug 1798459)
Backed out changeset 4f07a77a4abd (bug 1798459)
Backed out changeset 985f88adbc8e (bug 1798459)
Backed out changeset 326b8b13aca3 (bug 1798459)
Backed out changeset 9f4f237f33bb (bug 1798459)
Backed out changeset cc31ee7652a8 (bug 1798459)
Backed out changeset 3ed207332879 (bug 1798459)
Backed out changeset 7e8b4f40c31d (bug 1798459)
Backed out changeset e3740924348f (bug 1798459)
Backed out changeset 8c6510e97a9c (bug 1798459)
Backed out changeset 5bfb07498c30 (bug 1798459)
Backed out changeset db0c3d15084b (bug 1798459)
Backed out changeset f92f19dc1a9f (bug 1798459)
Backed out changeset cc82403152c1 (bug 1777361)
Backed out changeset 21d087d3ca5d (bug 1798459)
Backed out changeset da1781f32050 (bug 1798459)
Backed out changeset f768630d046c (bug 1798459)
Backed out changeset 5ad098d5b4b9 (bug 1769057)
Backed out changeset e450859e6f0a (bug 1769057)
2022-11-09 04:16:33 +02:00

149 lines
5.0 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "FileSystemWritableFileStream.h"
#include "mozilla/ErrorResult.h"
#include "mozilla/dom/FileSystemWritableFileStreamBinding.h"
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/WritableStreamDefaultController.h"
namespace mozilla::dom {
NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED_0(FileSystemWritableFileStream,
WritableStream)
NS_IMPL_CYCLE_COLLECTION_INHERITED(FileSystemWritableFileStream, WritableStream)
NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED_0(
FileSystemWritableFileStream::StreamAlgorithms,
UnderlyingSinkAlgorithmsBase)
NS_IMPL_CYCLE_COLLECTION_INHERITED(
FileSystemWritableFileStream::StreamAlgorithms,
UnderlyingSinkAlgorithmsBase, mStream)
already_AddRefed<Promise>
FileSystemWritableFileStream::StreamAlgorithms::WriteCallback(
JSContext* aCx, JS::Handle<JS::Value> aChunk,
WritableStreamDefaultController& aController, ErrorResult& aRv) {
// https://fs.spec.whatwg.org/#create-a-new-filesystemwritablefilestream
// Step 3. Let writeAlgorithm be an algorithm which takes a chunk argument ...
ArrayBufferViewOrArrayBufferOrBlobOrUSVStringOrWriteParams chunkUnion;
if (!chunkUnion.Init(aCx, aChunk)) {
aRv.MightThrowJSException();
aRv.StealExceptionFromJSContext(aCx);
return nullptr;
}
// Step 3. ... and returns the result of running the write a chunk algorithm
// with stream and chunk.
return mStream->Write(chunkUnion, aRv);
}
// https://streams.spec.whatwg.org/#writablestream-set-up
// * This is fallible because of OOM handling of JSAPI. See bug 1762233.
// * Consider extracting this as UnderlyingSinkAlgorithmsWrapper if more classes
// start subclassing WritableStream.
// For now this skips step 2 - 4 as they are not required here.
// XXX(krosylight): _BOUNDARY because SetUpWritableStreamDefaultController here
// can't run script because StartCallback here is no-op. Can we let the static
// check automatically detect this situation?
/* static */
MOZ_CAN_RUN_SCRIPT_BOUNDARY already_AddRefed<FileSystemWritableFileStream>
FileSystemWritableFileStream::MaybeCreate(nsIGlobalObject* aGlobal) {
AutoJSAPI jsapi;
if (!jsapi.Init(aGlobal)) {
return nullptr;
}
JSContext* cx = jsapi.cx();
// Step 5. Perform ! InitializeWritableStream(stream).
// (Done by the constructor)
RefPtr<FileSystemWritableFileStream> stream =
new FileSystemWritableFileStream(aGlobal);
// Step 1 - 3
auto algorithms = MakeRefPtr<StreamAlgorithms>(*stream);
// Step 6. Let controller be a new WritableStreamDefaultController.
auto controller =
MakeRefPtr<WritableStreamDefaultController>(aGlobal, *stream);
// Step 7. Perform ! SetUpWritableStreamDefaultController(stream, controller,
// startAlgorithm, writeAlgorithm, closeAlgorithmWrapper,
// abortAlgorithmWrapper, highWaterMark, sizeAlgorithm).
IgnoredErrorResult rv;
SetUpWritableStreamDefaultController(
cx, stream, controller, algorithms,
// default highWaterMark
1,
// default sizeAlgorithm
// (nullptr returns 1, See WritableStream::Constructor for details)
nullptr, rv);
if (rv.Failed()) {
return nullptr;
}
return stream.forget();
}
// WebIDL Boilerplate
JSObject* FileSystemWritableFileStream::WrapObject(
JSContext* aCx, JS::Handle<JSObject*> aGivenProto) {
return FileSystemWritableFileStream_Binding::Wrap(aCx, this, aGivenProto);
}
// WebIDL Interface
already_AddRefed<Promise> FileSystemWritableFileStream::Write(
const ArrayBufferViewOrArrayBufferOrBlobOrUSVStringOrWriteParams& aData,
ErrorResult& aError) {
RefPtr<Promise> promise = Promise::Create(GetParentObject(), aError);
if (aError.Failed()) {
return nullptr;
}
promise->MaybeReject(NS_ERROR_NOT_IMPLEMENTED);
return promise.forget();
}
already_AddRefed<Promise> FileSystemWritableFileStream::Seek(
uint64_t aPosition, ErrorResult& aError) {
RefPtr<Promise> promise = Promise::Create(GetParentObject(), aError);
if (aError.Failed()) {
return nullptr;
}
promise->MaybeReject(NS_ERROR_NOT_IMPLEMENTED);
return promise.forget();
}
already_AddRefed<Promise> FileSystemWritableFileStream::Truncate(
uint64_t aSize, ErrorResult& aError) {
RefPtr<Promise> promise = Promise::Create(GetParentObject(), aError);
if (aError.Failed()) {
return nullptr;
}
promise->MaybeReject(NS_ERROR_NOT_IMPLEMENTED);
return promise.forget();
}
already_AddRefed<Promise> FileSystemWritableFileStream::Close(
ErrorResult& aRv) {
RefPtr<Promise> promise = Promise::Create(GetParentObject(), aRv);
if (aRv.Failed()) {
return nullptr;
}
promise->MaybeReject(NS_ERROR_NOT_IMPLEMENTED);
return promise.forget();
}
} // namespace mozilla::dom