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/. */
7 #ifndef DOM_STREAMS_TRANSFORMERCALLBACKHELPERS_H_
8 #define DOM_STREAMS_TRANSFORMERCALLBACKHELPERS_H_
10 #include "mozilla/HoldDropJSObjects.h"
11 #include "mozilla/dom/TransformerBinding.h"
12 #include "nsCycleCollectionParticipant.h"
14 namespace mozilla::dom
{
18 class TransformerAlgorithmsBase
: public nsISupports
{
20 NS_DECL_CYCLE_COLLECTING_ISUPPORTS
21 NS_DECL_CYCLE_COLLECTION_CLASS(TransformerAlgorithmsBase
)
23 MOZ_CAN_RUN_SCRIPT
virtual already_AddRefed
<Promise
> TransformCallback(
24 JSContext
* aCx
, JS::Handle
<JS::Value
> aChunk
,
25 TransformStreamDefaultController
& aController
, ErrorResult
& aRv
) = 0;
27 MOZ_CAN_RUN_SCRIPT
virtual already_AddRefed
<Promise
> FlushCallback(
28 JSContext
* aCx
, TransformStreamDefaultController
& aController
,
29 ErrorResult
& aRv
) = 0;
32 virtual ~TransformerAlgorithmsBase() = default;
35 // https://streams.spec.whatwg.org/#set-up-transform-stream-default-controller-from-transformer
36 class TransformerAlgorithms final
: public TransformerAlgorithmsBase
{
38 NS_DECL_ISUPPORTS_INHERITED
39 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(
40 TransformerAlgorithms
, TransformerAlgorithmsBase
)
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();
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();
58 mozilla::HoldJSObjects(this);
61 MOZ_CAN_RUN_SCRIPT already_AddRefed
<Promise
> TransformCallback(
62 JSContext
* aCx
, JS::Handle
<JS::Value
> aChunk
,
63 TransformStreamDefaultController
& aController
, ErrorResult
& aRv
) override
;
65 MOZ_CAN_RUN_SCRIPT already_AddRefed
<Promise
> FlushCallback(
66 JSContext
* aCx
, TransformStreamDefaultController
& aController
,
67 ErrorResult
& aRv
) override
;
70 ~TransformerAlgorithms() { mozilla::DropJSObjects(this); }
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
;
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
;
86 MOZ_CAN_RUN_SCRIPT already_AddRefed
<Promise
> FlushCallback(
87 JSContext
*, TransformStreamDefaultController
& aController
,
88 ErrorResult
& aRv
) final
;
90 MOZ_CAN_RUN_SCRIPT
virtual void TransformCallbackImpl(
91 JS::Handle
<JS::Value
> aChunk
,
92 TransformStreamDefaultController
& aController
, ErrorResult
& aRv
) = 0;
94 MOZ_CAN_RUN_SCRIPT
virtual void FlushCallbackImpl(
95 TransformStreamDefaultController
& aController
, ErrorResult
& aRv
) {
96 // flushAlgorithm is optional, do nothing by default
100 } // namespace mozilla::dom
102 #endif // DOM_STREAMS_TRANSFORMERCALLBACKHELPERS_H_