mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-02 09:18:36 +02:00
Bug 1816075 - Add ReadableStream::SetUpByteNative r=smaug
Differential Revision: https://phabricator.services.mozilla.com/D169439
This commit is contained in:
parent
5f4356e527
commit
114b7eac32
8 changed files with 102 additions and 86 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue