TransformerCallbackHelpers.h (3864B)
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_TRANSFORMERCALLBACKHELPERS_H_ 8 #define DOM_STREAMS_TRANSFORMERCALLBACKHELPERS_H_ 9 10 #include "mozilla/HoldDropJSObjects.h" 11 #include "mozilla/dom/TransformerBinding.h" 12 #include "nsCycleCollectionParticipant.h" 13 14 namespace mozilla::dom { 15 16 class Promise; 17 18 class TransformerAlgorithmsBase : public nsISupports { 19 public: 20 NS_DECL_CYCLE_COLLECTING_ISUPPORTS 21 NS_DECL_CYCLE_COLLECTION_CLASS(TransformerAlgorithmsBase) 22 23 MOZ_CAN_RUN_SCRIPT virtual already_AddRefed<Promise> TransformCallback( 24 JSContext* aCx, JS::Handle<JS::Value> aChunk, 25 TransformStreamDefaultController& aController, ErrorResult& aRv) = 0; 26 27 MOZ_CAN_RUN_SCRIPT virtual already_AddRefed<Promise> FlushCallback( 28 JSContext* aCx, TransformStreamDefaultController& aController, 29 ErrorResult& aRv) = 0; 30 31 protected: 32 virtual ~TransformerAlgorithmsBase() = default; 33 }; 34 35 // https://streams.spec.whatwg.org/#set-up-transform-stream-default-controller-from-transformer 36 class TransformerAlgorithms final : public TransformerAlgorithmsBase { 37 public: 38 NS_DECL_ISUPPORTS_INHERITED 39 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED( 40 TransformerAlgorithms, TransformerAlgorithmsBase) 41 42 TransformerAlgorithms(nsIGlobalObject* aGlobal, 43 JS::Handle<JSObject*> aTransformer, 44 Transformer& aTransformerDict) 45 : mGlobal(aGlobal), mTransformer(aTransformer) { 46 // Step 4. (Step 2 is implicitly done through the initialization of 47 // mTransformCallback to null) 48 if (aTransformerDict.mTransform.WasPassed()) { 49 mTransformCallback = aTransformerDict.mTransform.Value(); 50 } 51 52 // Step 5. (Step 3 is implicitly done through the initialization of 53 // mTransformCallback to null) 54 if (aTransformerDict.mFlush.WasPassed()) { 55 mFlushCallback = aTransformerDict.mFlush.Value(); 56 } 57 58 mozilla::HoldJSObjects(this); 59 }; 60 61 MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> TransformCallback( 62 JSContext* aCx, JS::Handle<JS::Value> aChunk, 63 TransformStreamDefaultController& aController, ErrorResult& aRv) override; 64 65 MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> FlushCallback( 66 JSContext* aCx, TransformStreamDefaultController& aController, 67 ErrorResult& aRv) override; 68 69 protected: 70 ~TransformerAlgorithms() { mozilla::DropJSObjects(this); } 71 72 private: 73 // Virtually const, but are cycle collected 74 nsCOMPtr<nsIGlobalObject> mGlobal; 75 JS::Heap<JSObject*> mTransformer; 76 MOZ_KNOWN_LIVE RefPtr<TransformerTransformCallback> mTransformCallback; 77 MOZ_KNOWN_LIVE RefPtr<TransformerFlushCallback> mFlushCallback; 78 }; 79 80 // https://streams.spec.whatwg.org/#transformstream-set-up 81 class TransformerAlgorithmsWrapper : public TransformerAlgorithmsBase { 82 MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> TransformCallback( 83 JSContext*, JS::Handle<JS::Value> aChunk, 84 TransformStreamDefaultController& aController, ErrorResult& aRv) final; 85 86 MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> FlushCallback( 87 JSContext*, TransformStreamDefaultController& aController, 88 ErrorResult& aRv) final; 89 90 MOZ_CAN_RUN_SCRIPT virtual void TransformCallbackImpl( 91 JS::Handle<JS::Value> aChunk, 92 TransformStreamDefaultController& aController, ErrorResult& aRv) = 0; 93 94 MOZ_CAN_RUN_SCRIPT virtual void FlushCallbackImpl( 95 TransformStreamDefaultController& aController, ErrorResult& aRv) { 96 // flushAlgorithm is optional, do nothing by default 97 } 98 }; 99 100 } // namespace mozilla::dom 101 102 #endif // DOM_STREAMS_TRANSFORMERCALLBACKHELPERS_H_