| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_STREAMS_WRITABLE_STREAM_DEFAULT_CONTROLLER_H_ |
| #define THIRD_PARTY_BLINK_RENDERER_CORE_STREAMS_WRITABLE_STREAM_DEFAULT_CONTROLLER_H_ |
| |
| #include "third_party/blink/renderer/core/core_export.h" |
| #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" |
| #include "third_party/blink/renderer/platform/heap/visitor.h" |
| #include "v8/include/v8.h" |
| |
| namespace blink { |
| |
| class ExceptionState; |
| class QueueWithSizes; |
| class ScriptState; |
| class ScriptValue; |
| class StrategySizeAlgorithm; |
| class StreamAlgorithm; |
| class StreamStartAlgorithm; |
| class WritableStreamDefaultWriter; |
| class WritableStream; |
| |
| class CORE_EXPORT WritableStreamDefaultController final |
| : public ScriptWrappable { |
| DEFINE_WRAPPERTYPEINFO(); |
| |
| public: |
| static WritableStreamDefaultController* From(ScriptValue); |
| |
| // The JavaScript-exposed constructor throws automatically as no constructor |
| // is specified in the IDL. This constructor is used internally during |
| // creation of a WritableStream object. |
| WritableStreamDefaultController(); |
| |
| // https://streams.spec.whatwg.org/#ws-default-controller-error |
| void error(ScriptState*); |
| void error(ScriptState*, ScriptValue e); |
| |
| // |
| // Methods used by WritableStream |
| // |
| |
| // https://streams.spec.whatwg.org/#ws-default-controller-private-abort |
| v8::Local<v8::Promise> AbortSteps(ScriptState*, v8::Local<v8::Value> reason); |
| |
| // https://streams.spec.whatwg.org/#ws-default-controller-private-error |
| void ErrorSteps(); |
| |
| // https://streams.spec.whatwg.org/#set-up-writable-stream-default-controller |
| static void SetUp(ScriptState*, |
| WritableStream*, |
| WritableStreamDefaultController*, |
| StreamStartAlgorithm* start_algorithm, |
| StreamAlgorithm* write_algorithm, |
| StreamAlgorithm* close_algorithm, |
| StreamAlgorithm* abort_algorithm, |
| double high_water_mark, |
| StrategySizeAlgorithm* size_algorithm, |
| ExceptionState&); |
| |
| // https://streams.spec.whatwg.org/#set-up-writable-stream-default-controller-from-underlying-sink |
| static void SetUpFromUnderlyingSink(ScriptState*, |
| WritableStream*, |
| v8::Local<v8::Object> underlying_sink, |
| double high_water_mark, |
| StrategySizeAlgorithm* size_algorithm, |
| ExceptionState&); |
| |
| // |
| // Methods used by WritableStreamDefaultWriter |
| // |
| |
| // https://streams.spec.whatwg.org/#writable-stream-default-controller-close |
| static void Close(ScriptState*, WritableStreamDefaultController*); |
| |
| // https://streams.spec.whatwg.org/#writable-stream-default-controller-get-chunk-size |
| // May error the stream as a side-effect. |
| static double GetChunkSize(ScriptState*, |
| WritableStreamDefaultController*, |
| v8::Local<v8::Value> chunk); |
| |
| // https://streams.spec.whatwg.org/#writable-stream-default-controller-get-desired-size |
| static double GetDesiredSize(const WritableStreamDefaultController*); |
| |
| // https://streams.spec.whatwg.org/#writable-stream-default-controller-write |
| static void Write(ScriptState*, |
| WritableStreamDefaultController*, |
| v8::Local<v8::Value> chunk, |
| double chunk_size); |
| |
| // https://streams.spec.whatwg.org/#writable-stream-default-controller-error |
| // TODO(ricea): Make this private. |
| static void Error(ScriptState*, |
| WritableStreamDefaultController*, |
| v8::Local<v8::Value> error); |
| |
| // Exposed to WritableStream. Not part of the standard. |
| bool Started() const { return started_; } |
| |
| // |
| // Used by TransformStream |
| // |
| // https://streams.spec.whatwg.org/#writable-stream-default-controller-error-if-needed |
| static void ErrorIfNeeded(ScriptState*, |
| WritableStreamDefaultController*, |
| v8::Local<v8::Value> error); |
| |
| void Trace(Visitor*) const override; |
| |
| private: |
| // https://streams.spec.whatwg.org/#writable-stream-default-controller-clear-algorithms |
| static void ClearAlgorithms(WritableStreamDefaultController*); |
| |
| // https://streams.spec.whatwg.org/#writable-stream-default-controller-advance-queue-if-needed |
| static void AdvanceQueueIfNeeded(ScriptState*, |
| WritableStreamDefaultController*); |
| |
| // https://streams.spec.whatwg.org/#writable-stream-default-controller-process-close |
| static void ProcessClose(ScriptState*, WritableStreamDefaultController*); |
| |
| // https://streams.spec.whatwg.org/#writable-stream-default-controller-process-write |
| static void ProcessWrite(ScriptState*, |
| WritableStreamDefaultController*, |
| v8::Local<v8::Value> chunk); |
| |
| // https://streams.spec.whatwg.org/#writable-stream-default-controller-get-backpressure |
| static bool GetBackpressure(const WritableStreamDefaultController*); |
| |
| // Most member variables correspond 1:1 with the internal slots in the |
| // standard. See |
| // https://streams.spec.whatwg.org/#ws-default-controller-internal-slots. |
| Member<StreamAlgorithm> abort_algorithm_; |
| Member<StreamAlgorithm> close_algorithm_; |
| Member<WritableStream> controlled_writable_stream_; |
| |
| // |queue_| covers both the [[queue]] and [[queueTotalSize]] internal slots. |
| // Instead of chunks in the queue being wrapped in an object, they are |
| // stored-as-is, and the `"close"` marker in the queue is represented by an |
| // empty queue together with the |close_queued_| flag being set. |
| Member<QueueWithSizes> queue_; |
| bool close_queued_ = false; |
| bool started_ = false; |
| double strategy_high_water_mark_ = 0.0; |
| Member<StrategySizeAlgorithm> strategy_size_algorithm_; |
| Member<StreamAlgorithm> write_algorithm_; |
| }; |
| |
| } // namespace blink |
| |
| #endif // THIRD_PARTY_BLINK_RENDERER_CORE_STREAMS_WRITABLE_STREAM_DEFAULT_CONTROLLER_H_ |