Bug 1816075 - Add ReadableStream::SetUpByteNative r=smaug

Differential Revision: https://phabricator.services.mozilla.com/D169439
This commit is contained in:
Kagami Sascha Rosylight 2023-02-13 13:36:34 +00:00
parent 5f4356e527
commit 114b7eac32
8 changed files with 102 additions and 86 deletions

View file

@ -236,7 +236,6 @@ bool ReadableStream::Locked() const {
}
namespace streams_abstract {
// https://streams.spec.whatwg.org/#initialize-readable-stream
static void InitializeReadableStream(ReadableStream* aStream) {
// Step 1.
@ -249,10 +248,11 @@ static void InitializeReadableStream(ReadableStream* aStream) {
// Step 3.
aStream->SetDisturbed(false);
}
} // namespace streams_abstract
// https://streams.spec.whatwg.org/#create-readable-stream
MOZ_CAN_RUN_SCRIPT
already_AddRefed<ReadableStream> CreateReadableStream(
already_AddRefed<ReadableStream> ReadableStream::CreateAbstract(
JSContext* aCx, nsIGlobalObject* aGlobal,
UnderlyingSourceAlgorithmsBase* aAlgorithms,
mozilla::Maybe<double> aHighWaterMark, QueuingStrategySize* aSizeAlgorithm,
@ -282,6 +282,7 @@ already_AddRefed<ReadableStream> CreateReadableStream(
return stream.forget();
}
namespace streams_abstract {
// https://streams.spec.whatwg.org/#readable-stream-close
void ReadableStreamClose(JSContext* aCx, ReadableStream* aStream,
ErrorResult& aRv) {
@ -707,15 +708,15 @@ static void ReadableStreamDefaultTee(JSContext* aCx, ReadableStream* aStream,
// Step 17.
nsCOMPtr<nsIGlobalObject> global(
do_AddRef(teeState->GetStream()->GetParentObject()));
teeState->SetBranch1(CreateReadableStream(aCx, global, branch1Algorithms,
mozilla::Nothing(), nullptr, aRv));
teeState->SetBranch1(ReadableStream::CreateAbstract(
aCx, global, branch1Algorithms, mozilla::Nothing(), nullptr, aRv));
if (aRv.Failed()) {
return;
}
// Step 18.
teeState->SetBranch2(CreateReadableStream(aCx, global, branch2Algorithms,
mozilla::Nothing(), nullptr, aRv));
teeState->SetBranch2(ReadableStream::CreateAbstract(
aCx, global, branch2Algorithms, mozilla::Nothing(), nullptr, aRv));
if (aRv.Failed()) {
return;
}
@ -972,7 +973,6 @@ already_AddRefed<Promise> ReadableStream::IteratorReturn(
}
namespace streams_abstract {
// https://streams.spec.whatwg.org/#readable-stream-add-read-into-request
void ReadableStreamAddReadIntoRequest(ReadableStream* aStream,
ReadIntoRequest* aReadIntoRequest) {
@ -987,9 +987,10 @@ void ReadableStreamAddReadIntoRequest(ReadableStream* aStream,
aStream->GetReader()->AsBYOB()->ReadIntoRequests().insertBack(
aReadIntoRequest);
}
} // namespace streams_abstract
// https://streams.spec.whatwg.org/#abstract-opdef-createreadablebytestream
already_AddRefed<ReadableStream> CreateReadableByteStream(
already_AddRefed<ReadableStream> ReadableStream::CreateByteAbstract(
JSContext* aCx, nsIGlobalObject* aGlobal,
UnderlyingSourceAlgorithmsBase* aAlgorithms, ErrorResult& aRv) {
// Step 1. Let stream be a new ReadableStream.
@ -1014,8 +1015,6 @@ already_AddRefed<ReadableStream> CreateReadableByteStream(
return stream.forget();
}
} // namespace streams_abstract
// https://streams.spec.whatwg.org/#readablestream-set-up
// (except this instead creates a new ReadableStream rather than accepting an
// existing instance)
@ -1039,7 +1038,7 @@ already_AddRefed<ReadableStream> ReadableStream::CreateNative(
// ReadableStream::Constructor for details)
// Step 5: Perform ! InitializeReadableStream(stream).
auto stream = MakeRefPtr<ReadableStream>(aGlobal);
RefPtr<ReadableStream> stream = new ReadableStream(aGlobal);
// Step 6: Let controller be a new ReadableStreamDefaultController.
auto controller = MakeRefPtr<ReadableStreamDefaultController>(aGlobal);
@ -1056,14 +1055,13 @@ already_AddRefed<ReadableStream> ReadableStream::CreateNative(
}
// https://streams.spec.whatwg.org/#readablestream-set-up-with-byte-reading-support
// (except this instead creates a new ReadableStream rather than accepting an
// existing instance)
already_AddRefed<ReadableStream> ReadableStream::CreateByteNative(
JSContext* aCx, nsIGlobalObject* aGlobal,
UnderlyingSourceAlgorithmsWrapper& aAlgorithms,
void ReadableStream::SetUpByteNative(
JSContext* aCx, UnderlyingSourceAlgorithmsWrapper& aAlgorithms,
mozilla::Maybe<double> aHighWaterMark, ErrorResult& aRv) {
// an optional number highWaterMark (default 0)
double highWaterMark = aHighWaterMark.valueOr(0);
// and if given, highWaterMark must be a non-negative, non-NaN number.
MOZ_ASSERT(IsNonNegativeNumber(highWaterMark));
// Step 1: Let startAlgorithm be an algorithm that returns undefined.
// Step 2: Let pullAlgorithmWrapper be an algorithm that runs these steps:
@ -1071,16 +1069,24 @@ already_AddRefed<ReadableStream> ReadableStream::CreateByteNative(
// (Done by UnderlyingSourceAlgorithmsWrapper)
// Step 4: Perform ! InitializeReadableStream(stream).
auto stream = MakeRefPtr<ReadableStream>(aGlobal);
// (Covered by constructor)
// Step 5: Let controller be a new ReadableByteStreamController.
auto controller = MakeRefPtr<ReadableByteStreamController>(aGlobal);
auto controller = MakeRefPtr<ReadableByteStreamController>(GetParentObject());
// Step 6: Perform ! SetUpReadableByteStreamController(stream, controller,
// startAlgorithm, pullAlgorithmWrapper, cancelAlgorithmWrapper,
// highWaterMark, undefined).
SetUpReadableByteStreamController(aCx, stream, controller, &aAlgorithms,
SetUpReadableByteStreamController(aCx, this, controller, &aAlgorithms,
highWaterMark, Nothing(), aRv);
}
already_AddRefed<ReadableStream> ReadableStream::CreateByteNative(
JSContext* aCx, nsIGlobalObject* aGlobal,
UnderlyingSourceAlgorithmsWrapper& aAlgorithms,
mozilla::Maybe<double> aHighWaterMark, ErrorResult& aRv) {
RefPtr<ReadableStream> stream = new ReadableStream(aGlobal);
stream->SetUpByteNative(aCx, aAlgorithms, aHighWaterMark, aRv);
if (aRv.Failed()) {
return nullptr;
}

View file

@ -46,19 +46,28 @@ class ReadableStream : public nsISupports, public nsWrapperCache {
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(ReadableStream)
friend class WritableStream;
protected:
virtual ~ReadableStream();
nsCOMPtr<nsIGlobalObject> mGlobal;
public:
explicit ReadableStream(const GlobalObject& aGlobal);
explicit ReadableStream(nsIGlobalObject* aGlobal);
enum class ReaderState { Readable, Closed, Errored };
public:
// Abstract algorithms
MOZ_CAN_RUN_SCRIPT static already_AddRefed<ReadableStream> CreateAbstract(
JSContext* aCx, nsIGlobalObject* aGlobal,
UnderlyingSourceAlgorithmsBase* aAlgorithms,
mozilla::Maybe<double> aHighWaterMark,
QueuingStrategySize* aSizeAlgorithm, ErrorResult& aRv);
MOZ_CAN_RUN_SCRIPT static already_AddRefed<ReadableStream> CreateByteAbstract(
JSContext* aCx, nsIGlobalObject* aGlobal,
UnderlyingSourceAlgorithmsBase* aAlgorithms, ErrorResult& aRv);
// Slot Getter/Setters:
public:
MOZ_KNOWN_LIVE ReadableStreamController* Controller() { return mController; }
ReadableStreamDefaultController* DefaultController() {
MOZ_ASSERT(mController && mController->IsDefault());
@ -77,6 +86,8 @@ class ReadableStream : public nsISupports, public nsWrapperCache {
ReadableStreamDefaultReader* GetDefaultReader();
enum class ReaderState { Readable, Closed, Errored };
ReaderState State() const { return mState; }
void SetState(const ReaderState& aState) { mState = aState; }
@ -97,8 +108,11 @@ class ReadableStream : public nsISupports, public nsWrapperCache {
// https://html.spec.whatwg.org/multipage/structured-data.html#transfer-steps
MOZ_CAN_RUN_SCRIPT bool Transfer(JSContext* aCx,
UniqueMessagePortId& aPortId);
MOZ_CAN_RUN_SCRIPT static already_AddRefed<ReadableStream>
ReceiveTransferImpl(JSContext* aCx, nsIGlobalObject* aGlobal,
MessagePort& aPort);
// https://html.spec.whatwg.org/multipage/structured-data.html#transfer-receiving-steps
static MOZ_CAN_RUN_SCRIPT bool ReceiveTransfer(
MOZ_CAN_RUN_SCRIPT static bool ReceiveTransfer(
JSContext* aCx, nsIGlobalObject* aGlobal, MessagePort& aPort,
JS::MutableHandle<JSObject*> aReturnObject);
@ -113,6 +127,17 @@ class ReadableStream : public nsISupports, public nsWrapperCache {
QueuingStrategySize* aSizeAlgorithm, ErrorResult& aRv);
// https://streams.spec.whatwg.org/#readablestream-set-up-with-byte-reading-support
protected:
// Sets up the ReadableStream with byte reading support. Intended for
// subclasses.
MOZ_CAN_RUN_SCRIPT void SetUpByteNative(
JSContext* aCx, UnderlyingSourceAlgorithmsWrapper& aAlgorithms,
mozilla::Maybe<double> aHighWaterMark, ErrorResult& aRv);
public:
// Creates and sets up a ReadableStream with byte reading support. Use
// SetUpByteNative for this purpose in subclasses.
MOZ_CAN_RUN_SCRIPT static already_AddRefed<ReadableStream> CreateByteNative(
JSContext* aCx, nsIGlobalObject* aGlobal,
UnderlyingSourceAlgorithmsWrapper& aAlgorithms,
@ -235,19 +260,9 @@ MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> ReadableStreamCancel(
already_AddRefed<ReadableStreamDefaultReader>
AcquireReadableStreamDefaultReader(ReadableStream* aStream, ErrorResult& aRv);
MOZ_CAN_RUN_SCRIPT already_AddRefed<ReadableStream> CreateReadableStream(
JSContext* aCx, nsIGlobalObject* aGlobal,
UnderlyingSourceAlgorithmsBase* aAlgorithms,
mozilla::Maybe<double> aHighWaterMark, QueuingStrategySize* aSizeAlgorithm,
ErrorResult& aRv);
bool ReadableStreamHasBYOBReader(ReadableStream* aStream);
bool ReadableStreamHasDefaultReader(ReadableStream* aStream);
MOZ_CAN_RUN_SCRIPT already_AddRefed<ReadableStream> CreateReadableByteStream(
JSContext* aCx, nsIGlobalObject* aGlobal,
UnderlyingSourceAlgorithmsBase* aAlgorithms, ErrorResult& aRv);
} // namespace streams_abstract
} // namespace mozilla::dom

View file

@ -985,7 +985,7 @@ void ReadableByteStreamTee(JSContext* aCx, ReadableStream* aStream,
auto branch1Algorithms =
MakeRefPtr<ByteStreamTeeSourceAlgorithms>(teeState, TeeBranch::Branch1);
teeState->SetBranch1(
CreateReadableByteStream(aCx, global, branch1Algorithms, aRv));
ReadableStream::CreateByteAbstract(aCx, global, branch1Algorithms, aRv));
if (aRv.Failed()) {
return;
}
@ -994,7 +994,7 @@ void ReadableByteStreamTee(JSContext* aCx, ReadableStream* aStream,
auto branch2Algorithms =
MakeRefPtr<ByteStreamTeeSourceAlgorithms>(teeState, TeeBranch::Branch2);
teeState->SetBranch2(
CreateReadableByteStream(aCx, global, branch2Algorithms, aRv));
ReadableStream::CreateByteAbstract(aCx, global, branch2Algorithms, aRv));
if (aRv.Failed()) {
return;
}

View file

@ -854,10 +854,9 @@ bool ReadableStream::Transfer(JSContext* aCx, UniqueMessagePortId& aPortId) {
}
// https://streams.spec.whatwg.org/#ref-for-transfer-receiving-steps
MOZ_CAN_RUN_SCRIPT static already_AddRefed<ReadableStream>
ReadableStreamTransferReceivingStepsImpl(JSContext* aCx,
nsIGlobalObject* aGlobal,
MessagePort& aPort) {
MOZ_CAN_RUN_SCRIPT already_AddRefed<ReadableStream>
ReadableStream::ReceiveTransferImpl(JSContext* aCx, nsIGlobalObject* aGlobal,
MessagePort& aPort) {
// Step 1: Let deserializedRecord be
// ! StructuredDeserializeWithTransfer(dataHolder.[[port]], the current
// Realm).
@ -877,7 +876,7 @@ bool ReadableStream::ReceiveTransfer(
JSContext* aCx, nsIGlobalObject* aGlobal, MessagePort& aPort,
JS::MutableHandle<JSObject*> aReturnObject) {
RefPtr<ReadableStream> readable =
ReadableStreamTransferReceivingStepsImpl(aCx, aGlobal, aPort);
ReadableStream::ReceiveTransferImpl(aCx, aGlobal, aPort);
if (!readable) {
return false;
}
@ -911,7 +910,7 @@ bool WritableStream::Transfer(JSContext* aCx, UniqueMessagePortId& aPortId) {
}
// Step 5: Let readable be a new ReadableStream in the current Realm.
auto readable = MakeRefPtr<ReadableStream>(mGlobal);
RefPtr<ReadableStream> readable = new ReadableStream(mGlobal);
// Step 6: Perform ! SetUpCrossRealmTransformReadable(readable, port1).
// MOZ_KnownLive because Port1 never changes before CC
@ -940,16 +939,15 @@ bool WritableStream::Transfer(JSContext* aCx, UniqueMessagePortId& aPortId) {
}
// https://streams.spec.whatwg.org/#ref-for-transfer-receiving-steps①
MOZ_CAN_RUN_SCRIPT static already_AddRefed<WritableStream>
WritableStreamTransferReceivingStepsImpl(JSContext* aCx,
nsIGlobalObject* aGlobal,
MessagePort& aPort) {
MOZ_CAN_RUN_SCRIPT already_AddRefed<WritableStream>
WritableStream::ReceiveTransferImpl(JSContext* aCx, nsIGlobalObject* aGlobal,
MessagePort& aPort) {
// Step 1: Let deserializedRecord be !
// StructuredDeserializeWithTransfer(dataHolder.[[port]], the current Realm).
// Step 2: Let port be a deserializedRecord.[[Deserialized]].
// Step 3: Perform ! SetUpCrossRealmTransformWritable(value, port).
auto writable = MakeRefPtr<WritableStream>(
RefPtr<WritableStream> writable = new WritableStream(
aGlobal, WritableStream::HoldDropJSObjectsCaller::Implicit);
ErrorResult rv;
SetUpCrossRealmTransformWritable(writable, &aPort, rv);
@ -964,7 +962,7 @@ bool WritableStream::ReceiveTransfer(
JSContext* aCx, nsIGlobalObject* aGlobal, MessagePort& aPort,
JS::MutableHandle<JSObject*> aReturnObject) {
RefPtr<WritableStream> writable =
WritableStreamTransferReceivingStepsImpl(aCx, aGlobal, aPort);
WritableStream::ReceiveTransferImpl(aCx, aGlobal, aPort);
if (!writable) {
return false;
}
@ -1011,7 +1009,7 @@ bool TransformStream::ReceiveTransfer(
// StructuredDeserializeWithTransfer(dataHolder.[[readable]], the current
// Realm).
RefPtr<ReadableStream> readable =
ReadableStreamTransferReceivingStepsImpl(aCx, aGlobal, aPort1);
ReadableStream::ReceiveTransferImpl(aCx, aGlobal, aPort1);
if (!readable) {
return false;
}
@ -1020,7 +1018,7 @@ bool TransformStream::ReceiveTransfer(
// StructuredDeserializeWithTransfer(dataHolder.[[writable]], the current
// Realm).
RefPtr<WritableStream> writable =
WritableStreamTransferReceivingStepsImpl(aCx, aGlobal, aPort2);
WritableStream::ReceiveTransferImpl(aCx, aGlobal, aPort2);
if (!writable) {
return false;
}
@ -1029,7 +1027,8 @@ bool TransformStream::ReceiveTransfer(
// Step 4: Set value.[[writable]] to writableRecord.[[Deserialized]].
// Step 5: Set value.[[backpressure]], value.[[backpressureChangePromise]],
// and value.[[controller]] to undefined.
auto stream = MakeRefPtr<TransformStream>(aGlobal, readable, writable);
RefPtr<TransformStream> stream =
new TransformStream(aGlobal, readable, writable);
JS::Rooted<JS::Value> value(aCx);
if (!GetOrCreateDOMReflector(aCx, stream, &value)) {
JS_ClearPendingException(aCx);

View file

@ -80,7 +80,8 @@ already_AddRefed<TransformStream> TransformStream::CreateGeneric(
// Step 8. Perform ! InitializeTransformStream(stream, startPromise,
// writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark,
// readableSizeAlgorithm).
auto stream = MakeRefPtr<TransformStream>(global, nullptr, nullptr);
RefPtr<TransformStream> stream =
new TransformStream(global, nullptr, nullptr);
stream->Initialize(aGlobal.Context(), startPromise, writableHighWaterMark,
writableSizeAlgorithm, readableHighWaterMark,
readableSizeAlgorithm, aRv);
@ -544,9 +545,9 @@ void TransformStream::Initialize(JSContext* aCx, Promise* aStartPromise,
// Step 5. Set stream.[[writable]] to ! CreateWritableStream(startAlgorithm,
// writeAlgorithm, closeAlgorithm, abortAlgorithm, writableHighWaterMark,
// writableSizeAlgorithm).
mWritable =
CreateWritableStream(aCx, MOZ_KnownLive(mGlobal), sinkAlgorithms,
aWritableHighWaterMark, aWritableSizeAlgorithm, aRv);
mWritable = WritableStream::CreateAbstract(
aCx, MOZ_KnownLive(mGlobal), sinkAlgorithms, aWritableHighWaterMark,
aWritableSizeAlgorithm, aRv);
if (aRv.Failed()) {
return;
}
@ -558,7 +559,7 @@ void TransformStream::Initialize(JSContext* aCx, Promise* aStartPromise,
// Step 8. Set stream.[[readable]] to ! CreateReadableStream(startAlgorithm,
// pullAlgorithm, cancelAlgorithm, readableHighWaterMark,
// readableSizeAlgorithm).
mReadable = CreateReadableStream(
mReadable = ReadableStream::CreateAbstract(
aCx, MOZ_KnownLive(mGlobal), sourceAlgorithms,
Some(aReadableHighWaterMark), aReadableSizeAlgorithm, aRv);
if (aRv.Failed()) {

View file

@ -34,9 +34,6 @@ class TransformStream final : public nsISupports, public nsWrapperCache {
const GlobalObject& aGlobal, TransformerAlgorithmsWrapper& aAlgorithms,
ErrorResult& aRv);
TransformStream(nsIGlobalObject* aGlobal, ReadableStream* aReadable,
WritableStream* aWritable);
// Internal slot accessors
bool Backpressure() const { return mBackpressure; }
Promise* BackpressureChangePromise() { return mBackpressureChangePromise; }
@ -60,9 +57,12 @@ class TransformStream final : public nsISupports, public nsWrapperCache {
MessagePort& aPort2, JS::MutableHandle<JSObject*> aReturnObject);
protected:
~TransformStream();
TransformStream(nsIGlobalObject* aGlobal, ReadableStream* aReadable,
WritableStream* aWritable);
explicit TransformStream(nsIGlobalObject* aGlobal);
~TransformStream();
MOZ_CAN_RUN_SCRIPT void Initialize(
JSContext* aCx, Promise* aStartPromise, double aWritableHighWaterMark,
QueuingStrategySize* aWritableSizeAlgorithm,

View file

@ -674,7 +674,6 @@ already_AddRefed<Promise> WritableStream::Close(JSContext* aCx,
}
namespace streams_abstract {
// https://streams.spec.whatwg.org/#acquire-writable-stream-default-writer
already_AddRefed<WritableStreamDefaultWriter>
AcquireWritableStreamDefaultWriter(WritableStream* aStream, ErrorResult& aRv) {
@ -691,9 +690,10 @@ AcquireWritableStreamDefaultWriter(WritableStream* aStream, ErrorResult& aRv) {
// Step 3. Return writer.
return writer.forget();
}
} // namespace streams_abstract
// https://streams.spec.whatwg.org/#create-writable-stream
already_AddRefed<WritableStream> CreateWritableStream(
already_AddRefed<WritableStream> WritableStream::CreateAbstract(
JSContext* aCx, nsIGlobalObject* aGlobal,
UnderlyingSinkAlgorithmsBase* aAlgorithms, double aHighWaterMark,
QueuingStrategySize* aSizeAlgorithm, ErrorResult& aRv) {
@ -702,7 +702,7 @@ already_AddRefed<WritableStream> CreateWritableStream(
// Step 2: Let stream be a new WritableStream.
// Step 3: Perform ! InitializeWritableStream(stream).
auto stream = MakeRefPtr<WritableStream>(
RefPtr<WritableStream> stream = new WritableStream(
aGlobal, WritableStream::HoldDropJSObjectsCaller::Implicit);
// Step 4: Let controller be a new WritableStreamDefaultController.
@ -722,8 +722,6 @@ already_AddRefed<WritableStream> CreateWritableStream(
return stream.forget();
}
} // namespace streams_abstract
already_AddRefed<WritableStreamDefaultWriter> WritableStream::GetWriter(
ErrorResult& aRv) {
return AcquireWritableStreamDefaultWriter(this, aRv);
@ -789,9 +787,12 @@ already_AddRefed<WritableStream> WritableStream::CreateNative(
JSContext* aCx, nsIGlobalObject& aGlobal,
UnderlyingSinkAlgorithmsWrapper& aAlgorithms, Maybe<double> aHighWaterMark,
QueuingStrategySize* aSizeAlgorithm, ErrorResult& aRv) {
auto stream = MakeRefPtr<WritableStream>(
RefPtr<WritableStream> stream = new WritableStream(
&aGlobal, WritableStream::HoldDropJSObjectsCaller::Implicit);
stream->SetUpNative(aCx, aAlgorithms, aHighWaterMark, aSizeAlgorithm, aRv);
if (aRv.Failed()) {
return nullptr;
}
return stream.forget();
}

View file

@ -33,12 +33,13 @@ class WritableStream : public nsISupports, public nsWrapperCache {
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(WritableStream)
friend class ReadableStream;
protected:
virtual ~WritableStream();
virtual void LastRelease() {}
public:
// If one extends WritableStream with another cycle collectable class,
// calling HoldJSObjects and DropJSObjects should happen using 'this' of
// that extending class. And in that case Explicit should be passed to the
@ -46,23 +47,12 @@ class WritableStream : public nsISupports, public nsWrapperCache {
// See also https://bugzilla.mozilla.org/show_bug.cgi?id=1801214.
enum class HoldDropJSObjectsCaller { Implicit, Explicit };
// XXX: Do not call this constructor outside of dom/streams/ unless you are
// subclassing, instead use WritableStream::CreateNative, because currently
// the constructor is fallible. (See bug 1762233)
// Subclasses need to call SetUpNative method separately as a part of the
// construction.
explicit WritableStream(const GlobalObject& aGlobal,
HoldDropJSObjectsCaller aHoldDropCaller);
// XXX: Do not call this constructor outside of dom/streams/ unless you are
// subclassing, instead use WritableStream::CreateNative, because currently
// the constructor is fallible. (See bug 1762233)
// Subclasses need to call SetUpNative method separately as a part of the
// construction.
explicit WritableStream(nsIGlobalObject* aGlobal,
HoldDropJSObjectsCaller aHoldDropCaller);
enum class WriterState { Writable, Closed, Erroring, Errored };
public:
// Slot Getter/Setters:
bool Backpressure() const { return mBackpressure; }
void SetBackpressure(bool aBackpressure) { mBackpressure = aBackpressure; }
@ -94,6 +84,8 @@ class WritableStream : public nsISupports, public nsWrapperCache {
WritableStreamDefaultWriter* GetWriter() const { return mWriter; }
void SetWriter(WritableStreamDefaultWriter* aWriter) { mWriter = aWriter; }
enum class WriterState { Writable, Closed, Erroring, Errored };
WriterState State() const { return mState; }
void SetState(const WriterState& aState) { mState = aState; }
@ -106,6 +98,12 @@ class WritableStream : public nsISupports, public nsWrapperCache {
mWriteRequests.AppendElement(aRequest);
}
// CreateWritableStream
MOZ_CAN_RUN_SCRIPT static already_AddRefed<WritableStream> CreateAbstract(
JSContext* aCx, nsIGlobalObject* aGlobal,
UnderlyingSinkAlgorithmsBase* aAlgorithms, double aHighWaterMark,
QueuingStrategySize* aSizeAlgorithm, ErrorResult& aRv);
// WritableStreamCloseQueuedOrInFlight
bool CloseQueuedOrInFlight() const {
return mCloseRequest || mInFlightCloseRequest;
@ -160,7 +158,10 @@ class WritableStream : public nsISupports, public nsWrapperCache {
MOZ_CAN_RUN_SCRIPT bool Transfer(JSContext* aCx,
UniqueMessagePortId& aPortId);
// https://html.spec.whatwg.org/multipage/structured-data.html#transfer-receiving-steps
static MOZ_CAN_RUN_SCRIPT bool ReceiveTransfer(
MOZ_CAN_RUN_SCRIPT static already_AddRefed<WritableStream>
ReceiveTransferImpl(JSContext* aCx, nsIGlobalObject* aGlobal,
MessagePort& aPort);
MOZ_CAN_RUN_SCRIPT static bool ReceiveTransfer(
JSContext* aCx, nsIGlobalObject* aGlobal, MessagePort& aPort,
JS::MutableHandle<JSObject*> aReturnObject);
@ -170,7 +171,6 @@ class WritableStream : public nsISupports, public nsWrapperCache {
// https://streams.spec.whatwg.org/#writablestream-set-up
protected:
// Sets up the WritableStream. Intended for subclasses.
// TODO: Do this in constructor if bug 1762233 makes this infallible.
MOZ_CAN_RUN_SCRIPT void SetUpNative(
JSContext* aCx, UnderlyingSinkAlgorithmsWrapper& aAlgorithms,
Maybe<double> aHighWaterMark, QueuingStrategySize* aSizeAlgorithm,
@ -179,7 +179,6 @@ class WritableStream : public nsISupports, public nsWrapperCache {
public:
// Creates and sets up a WritableStream. Use SetUpNative for this purpose in
// subclasses.
// TODO: Do this in constructor if bug 1762233 makes this infallible.
MOZ_CAN_RUN_SCRIPT static already_AddRefed<WritableStream> CreateNative(
JSContext* aCx, nsIGlobalObject& aGlobal,
UnderlyingSinkAlgorithmsWrapper& aAlgorithms,
@ -245,11 +244,6 @@ class WritableStream : public nsISupports, public nsWrapperCache {
namespace streams_abstract {
MOZ_CAN_RUN_SCRIPT already_AddRefed<WritableStream> CreateWritableStream(
JSContext* aCx, nsIGlobalObject* aGlobal,
UnderlyingSinkAlgorithmsBase* aAlgorithms, double aHighWaterMark,
QueuingStrategySize* aSizeAlgorithm, ErrorResult& aRv);
inline bool IsWritableStreamLocked(WritableStream* aStream) {
return aStream->Locked();
}