TransformStream.h (4420B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim:set ts=2 sw=2 sts=2 et cindent: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef DOM_STREAMS_TRANSFORMSTREAM_H_ 8 #define DOM_STREAMS_TRANSFORMSTREAM_H_ 9 10 #include "TransformStreamDefaultController.h" 11 #include "mozilla/dom/BindingDeclarations.h" 12 #include "mozilla/dom/QueuingStrategyBinding.h" 13 #include "mozilla/dom/TransformerBinding.h" 14 #include "nsCycleCollectionParticipant.h" 15 #include "nsWrapperCache.h" 16 17 namespace mozilla::dom { 18 19 class WritableStream; 20 class ReadableStream; 21 class UniqueMessagePortId; 22 class MessagePort; 23 class TransformerAlgorithmsWrapper; 24 25 class TransformStream final : public nsISupports, public nsWrapperCache { 26 public: 27 NS_DECL_CYCLE_COLLECTING_ISUPPORTS 28 NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(TransformStream) 29 30 // https://streams.spec.whatwg.org/#transformstream-set-up 31 // Intended to be used by interfaces using GenericTransformStream mixin. 32 MOZ_CAN_RUN_SCRIPT static already_AddRefed<TransformStream> CreateGeneric( 33 const GlobalObject& aGlobal, TransformerAlgorithmsWrapper& aAlgorithms, 34 ErrorResult& aRv); 35 36 // Internal slot accessors 37 bool Backpressure() const { return mBackpressure; } 38 Promise* BackpressureChangePromise() { return mBackpressureChangePromise; } 39 void SetBackpressure(bool aBackpressure); 40 MOZ_KNOWN_LIVE TransformStreamDefaultController* Controller() { 41 return mController; 42 } 43 void SetController(TransformStreamDefaultController& aController) { 44 MOZ_ASSERT(!mController); 45 mController = &aController; 46 } 47 48 // [Transferable] 49 // https://html.spec.whatwg.org/multipage/structured-data.html#transfer-steps 50 MOZ_CAN_RUN_SCRIPT bool Transfer(JSContext* aCx, 51 UniqueMessagePortId& aPortId1, 52 UniqueMessagePortId& aPortId2); 53 // https://html.spec.whatwg.org/multipage/structured-data.html#transfer-receiving-steps 54 static MOZ_CAN_RUN_SCRIPT bool ReceiveTransfer( 55 JSContext* aCx, nsIGlobalObject* aGlobal, MessagePort& aPort1, 56 MessagePort& aPort2, JS::MutableHandle<JSObject*> aReturnObject); 57 58 protected: 59 TransformStream(nsIGlobalObject* aGlobal, ReadableStream* aReadable, 60 WritableStream* aWritable); 61 explicit TransformStream(nsIGlobalObject* aGlobal); 62 63 ~TransformStream(); 64 65 MOZ_CAN_RUN_SCRIPT void Initialize( 66 JSContext* aCx, Promise* aStartPromise, double aWritableHighWaterMark, 67 QueuingStrategySize* aWritableSizeAlgorithm, 68 double aReadableHighWaterMark, 69 QueuingStrategySize* aReadableSizeAlgorithm, ErrorResult& aRv); 70 71 public: 72 nsIGlobalObject* GetParentObject() const { return mGlobal; } 73 JSObject* WrapObject(JSContext* aCx, 74 JS::Handle<JSObject*> aGivenProto) override; 75 76 // WebIDL methods 77 // TODO: Mark as MOZ_CAN_RUN_SCRIPT when IDL constructors can be (bug 1749042) 78 MOZ_CAN_RUN_SCRIPT_BOUNDARY static already_AddRefed<TransformStream> 79 Constructor(const GlobalObject& aGlobal, 80 const Optional<JS::Handle<JSObject*>>& aTransformer, 81 const QueuingStrategy& aWritableStrategy, 82 const QueuingStrategy& aReadableStrategy, ErrorResult& aRv); 83 84 ReadableStream* Readable() const { return mReadable; } 85 WritableStream* Writable() const { return mWritable; } 86 87 private: 88 nsCOMPtr<nsIGlobalObject> mGlobal; 89 90 // Internal slots 91 // MOZ_KNOWN_LIVE for slots that will never be reassigned 92 bool mBackpressure = false; 93 RefPtr<Promise> mBackpressureChangePromise; 94 RefPtr<TransformStreamDefaultController> mController; 95 RefPtr<ReadableStream> mReadable; 96 RefPtr<WritableStream> mWritable; 97 }; 98 99 namespace streams_abstract { 100 101 MOZ_CAN_RUN_SCRIPT void TransformStreamErrorWritableAndUnblockWrite( 102 JSContext* aCx, TransformStream* aStream, JS::Handle<JS::Value> aError, 103 ErrorResult& aRv); 104 105 MOZ_CAN_RUN_SCRIPT void TransformStreamError(JSContext* aCx, 106 TransformStream* aStream, 107 JS::Handle<JS::Value> aError, 108 ErrorResult& aRv); 109 110 } // namespace streams_abstract 111 112 } // namespace mozilla::dom 113 114 #endif // DOM_STREAMS_TRANSFORMSTREAM_H_