summaryrefslogtreecommitdiffstats
path: root/dom/streams/WritableStreamDefaultController.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/streams/WritableStreamDefaultController.h')
-rw-r--r--dom/streams/WritableStreamDefaultController.h178
1 files changed, 178 insertions, 0 deletions
diff --git a/dom/streams/WritableStreamDefaultController.h b/dom/streams/WritableStreamDefaultController.h
new file mode 100644
index 0000000000..d41014594c
--- /dev/null
+++ b/dom/streams/WritableStreamDefaultController.h
@@ -0,0 +1,178 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* 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/. */
+
+#ifndef mozilla_dom_WritableStreamDefaultController_h
+#define mozilla_dom_WritableStreamDefaultController_h
+
+#include "js/TypeDecls.h"
+#include "mozilla/AlreadyAddRefed.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/ErrorResult.h"
+#include "mozilla/dom/BindingDeclarations.h"
+#include "mozilla/dom/QueuingStrategyBinding.h"
+#include "mozilla/dom/QueueWithSizes.h"
+#include "mozilla/dom/ReadRequest.h"
+#include "mozilla/dom/UnderlyingSinkCallbackHelpers.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsWrapperCache.h"
+#include "mozilla/dom/Nullable.h"
+#include "nsTArray.h"
+#include "nsISupports.h"
+
+namespace mozilla::dom {
+
+class AbortSignal;
+class WritableStream;
+struct UnderlyingSink;
+
+class WritableStreamDefaultController final : public nsISupports,
+ public nsWrapperCache {
+ public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(WritableStreamDefaultController)
+
+ explicit WritableStreamDefaultController(nsISupports* aGlobal,
+ WritableStream& aStream);
+
+ protected:
+ ~WritableStreamDefaultController();
+
+ public:
+ nsIGlobalObject* GetParentObject() const { return mGlobal; }
+
+ JSObject* WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override;
+
+ // WebIDL methods/properties
+
+ AbortSignal* Signal() { return mSignal; }
+
+ MOZ_CAN_RUN_SCRIPT void Error(JSContext* aCx, JS::Handle<JS::Value> aError,
+ ErrorResult& aRv);
+
+ // [[AbortSteps]]
+ MOZ_CAN_RUN_SCRIPT virtual already_AddRefed<Promise> AbortSteps(
+ JSContext* aCx, JS::Handle<JS::Value> aReason, ErrorResult& aRv);
+
+ // [[ErrorSteps]]
+ virtual void ErrorSteps();
+
+ // Internal Slot Accessors
+
+ QueueWithSizes& Queue() { return mQueue; }
+
+ double QueueTotalSize() const { return mQueueTotalSize; }
+ void SetQueueTotalSize(double aQueueTotalSize) {
+ mQueueTotalSize = aQueueTotalSize;
+ }
+
+ void SetSignal(AbortSignal* aSignal);
+
+ bool Started() const { return mStarted; }
+ void SetStarted(bool aStarted) { mStarted = aStarted; }
+
+ double StrategyHWM() const { return mStrategyHWM; }
+ void SetStrategyHWM(double aStrategyHWM) { mStrategyHWM = aStrategyHWM; }
+
+ QueuingStrategySize* StrategySizeAlgorithm() const {
+ return mStrategySizeAlgorithm;
+ }
+ void SetStrategySizeAlgorithm(QueuingStrategySize* aStrategySizeAlgorithm) {
+ mStrategySizeAlgorithm = aStrategySizeAlgorithm;
+ }
+
+ UnderlyingSinkAlgorithmsBase* GetAlgorithms() { return mAlgorithms; }
+ void SetAlgorithms(UnderlyingSinkAlgorithmsBase& aAlgorithms) {
+ mAlgorithms = &aAlgorithms;
+ }
+
+ WritableStream* Stream() { return mStream; }
+
+ // WritableStreamDefaultControllerGetBackpressure
+ // https://streams.spec.whatwg.org/#writable-stream-default-controller-get-backpressure
+ bool GetBackpressure() const {
+ // Step 1. Let desiredSize be !
+ // WritableStreamDefaultControllerGetDesiredSize(controller).
+ double desiredSize = GetDesiredSize();
+ // Step 2. Return true if desiredSize ≤ 0, or false otherwise.
+ return desiredSize <= 0;
+ }
+
+ // WritableStreamDefaultControllerGetDesiredSize
+ // https://streams.spec.whatwg.org/#writable-stream-default-controller-get-desired-size
+ double GetDesiredSize() const { return mStrategyHWM - mQueueTotalSize; }
+
+ // WritableStreamDefaultControllerClearAlgorithms
+ // https://streams.spec.whatwg.org/#writable-stream-default-controller-clear-algorithms
+ void ClearAlgorithms() {
+ // Step 1. Set controller.[[writeAlgorithm]] to undefined.
+ // Step 2. Set controller.[[closeAlgorithm]] to undefined.
+ // Step 3. Set controller.[[abortAlgorithm]] to undefined.
+ // (As written in the spec, this can happen multiple time. Try running
+ // wpt/streams/transform-streams/errors.any.js for example.)
+ if (RefPtr<UnderlyingSinkAlgorithmsBase> algorithms =
+ mAlgorithms.forget()) {
+ algorithms->ReleaseObjects();
+ }
+
+ // Step 4. Set controller.[[strategySizeAlgorithm]] to undefined.
+ mStrategySizeAlgorithm = nullptr;
+ }
+
+ private:
+ nsCOMPtr<nsIGlobalObject> mGlobal;
+
+ // Internal Slots
+ QueueWithSizes mQueue = {};
+ double mQueueTotalSize = 0.0;
+ RefPtr<AbortSignal> mSignal;
+ bool mStarted = false;
+ double mStrategyHWM = 0.0;
+
+ RefPtr<QueuingStrategySize> mStrategySizeAlgorithm;
+ RefPtr<UnderlyingSinkAlgorithmsBase> mAlgorithms;
+ RefPtr<WritableStream> mStream;
+};
+
+namespace streams_abstract {
+
+MOZ_CAN_RUN_SCRIPT void SetUpWritableStreamDefaultController(
+ JSContext* aCx, WritableStream* aStream,
+ WritableStreamDefaultController* aController,
+ UnderlyingSinkAlgorithmsBase* aAlgorithms, double aHighWaterMark,
+ QueuingStrategySize* aSizeAlgorithm, ErrorResult& aRv);
+
+MOZ_CAN_RUN_SCRIPT void SetUpWritableStreamDefaultControllerFromUnderlyingSink(
+ JSContext* aCx, WritableStream* aStream,
+ JS::Handle<JSObject*> aUnderlyingSink, UnderlyingSink& aUnderlyingSinkDict,
+ double aHighWaterMark, QueuingStrategySize* aSizeAlgorithm,
+ ErrorResult& aRv);
+
+MOZ_CAN_RUN_SCRIPT void WritableStreamDefaultControllerClose(
+ JSContext* aCx, WritableStreamDefaultController* aController,
+ ErrorResult& aRv);
+
+MOZ_CAN_RUN_SCRIPT void WritableStreamDefaultControllerWrite(
+ JSContext* aCx, WritableStreamDefaultController* aController,
+ JS::Handle<JS::Value> aChunk, double chunkSize, ErrorResult& aRv);
+
+MOZ_CAN_RUN_SCRIPT void WritableStreamDefaultControllerError(
+ JSContext* aCx, WritableStreamDefaultController* aController,
+ JS::Handle<JS::Value> aError, ErrorResult& aRv);
+
+MOZ_CAN_RUN_SCRIPT void WritableStreamDefaultControllerErrorIfNeeded(
+ JSContext* aCx, WritableStreamDefaultController* aController,
+ JS::Handle<JS::Value> aError, ErrorResult& aRv);
+
+MOZ_CAN_RUN_SCRIPT double WritableStreamDefaultControllerGetChunkSize(
+ JSContext* aCx, WritableStreamDefaultController* aController,
+ JS::Handle<JS::Value> aChunk, ErrorResult& aRv);
+
+} // namespace streams_abstract
+
+} // namespace mozilla::dom
+
+#endif // mozilla_dom_WritableStreamDefaultController_h