Bug 1486949 - Part 3: Refactor TransformerAlgorithms to allow subclassing r=smaug

Differential Revision: https://phabricator.services.mozilla.com/D153974
This commit is contained in:
Kagami Sascha Rosylight 2022-08-11 21:16:17 +00:00
Родитель f8a781d3fd
Коммит 9f255d1c04
9 изменённых файлов: 49 добавлений и 27 удалений

Просмотреть файл

@ -107,7 +107,7 @@ TransformStreamDefaultControllerPerformTransform(
JS::Handle<JS::Value> aChunk, ErrorResult& aRv) {
// Step 1: Let transformPromise be the result of performing
// controller.[[transformAlgorithm]], passing chunk.
RefPtr<TransformerAlgorithms> algorithms = aController->Algorithms();
RefPtr<TransformerAlgorithmsBase> algorithms = aController->Algorithms();
RefPtr<Promise> transformPromise =
algorithms->TransformCallback(aCx, aChunk, *aController, aRv);
if (aRv.Failed()) {
@ -280,7 +280,7 @@ class TransformStreamUnderlyingSinkAlgorithms final
// Step 3: Let flushPromise be the result of performing
// controller.[[flushAlgorithm]].
RefPtr<TransformerAlgorithms> algorithms = controller->Algorithms();
RefPtr<TransformerAlgorithmsBase> algorithms = controller->Algorithms();
RefPtr<Promise> flushPromise =
algorithms->FlushCallback(aCx, *controller, aRv);
if (aRv.Failed()) {

Просмотреть файл

@ -33,12 +33,12 @@ void TransformStreamDefaultController::SetStream(TransformStream& aStream) {
mStream = &aStream;
}
TransformerAlgorithms* TransformStreamDefaultController::Algorithms() {
TransformerAlgorithmsBase* TransformStreamDefaultController::Algorithms() {
return mTransformerAlgorithms;
}
void TransformStreamDefaultController::SetAlgorithms(
TransformerAlgorithms* aTransformerAlgorithms) {
TransformerAlgorithmsBase* aTransformerAlgorithms) {
mTransformerAlgorithms = aTransformerAlgorithms;
}
@ -196,7 +196,7 @@ void TransformStreamDefaultController::Terminate(JSContext* aCx,
void SetUpTransformStreamDefaultController(
JSContext* aCx, TransformStream& aStream,
TransformStreamDefaultController& aController,
TransformerAlgorithms& aTransformerAlgorithms) {
TransformerAlgorithmsBase& aTransformerAlgorithms) {
// Step 1. Assert: stream implements TransformStream.
// Step 2. Assert: stream.[[controller]] is undefined.
MOZ_ASSERT(!aStream.Controller());

Просмотреть файл

@ -19,7 +19,7 @@
namespace mozilla::dom {
class TransformStream;
class TransformerAlgorithms;
class TransformerAlgorithmsBase;
class TransformStreamDefaultController final : public nsISupports,
public nsWrapperCache {
@ -29,8 +29,8 @@ class TransformStreamDefaultController final : public nsISupports,
MOZ_KNOWN_LIVE TransformStream* Stream();
void SetStream(TransformStream& aStream);
TransformerAlgorithms* Algorithms();
void SetAlgorithms(TransformerAlgorithms* aTransformerAlgorithms);
TransformerAlgorithmsBase* Algorithms();
void SetAlgorithms(TransformerAlgorithmsBase* aTransformerAlgorithms);
explicit TransformStreamDefaultController(nsIGlobalObject* aGlobal);
@ -55,7 +55,7 @@ class TransformStreamDefaultController final : public nsISupports,
// Internal slots
RefPtr<TransformStream> mStream;
RefPtr<TransformerAlgorithms> mTransformerAlgorithms;
RefPtr<TransformerAlgorithmsBase> mTransformerAlgorithms;
};
void SetUpTransformStreamDefaultControllerFromTransformer(

Просмотреть файл

@ -11,12 +11,20 @@
using namespace mozilla::dom;
NS_IMPL_CYCLE_COLLECTION_WITH_JS_MEMBERS(TransformerAlgorithms,
(mGlobal, mTransformCallback,
mFlushCallback),
(mTransformer))
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(TransformerAlgorithms, AddRef)
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(TransformerAlgorithms, Release)
NS_IMPL_CYCLE_COLLECTION(TransformerAlgorithmsBase)
NS_IMPL_CYCLE_COLLECTING_ADDREF(TransformerAlgorithmsBase)
NS_IMPL_CYCLE_COLLECTING_RELEASE(TransformerAlgorithmsBase)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TransformerAlgorithmsBase)
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTION_INHERITED_WITH_JS_MEMBERS(
TransformerAlgorithms, TransformerAlgorithmsBase,
(mGlobal, mTransformCallback, mFlushCallback), (mTransformer))
NS_IMPL_ADDREF_INHERITED(TransformerAlgorithms, TransformerAlgorithmsBase)
NS_IMPL_RELEASE_INHERITED(TransformerAlgorithms, TransformerAlgorithmsBase)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TransformerAlgorithms)
NS_INTERFACE_MAP_END_INHERITING(TransformerAlgorithmsBase)
// https://streams.spec.whatwg.org/#set-up-transform-stream-default-controller-from-transformer
already_AddRefed<Promise> TransformerAlgorithms::TransformCallback(

Просмотреть файл

@ -15,11 +15,29 @@ namespace mozilla::dom {
class Promise;
// https://streams.spec.whatwg.org/#set-up-transform-stream-default-controller-from-transformer
class TransformerAlgorithms final {
class TransformerAlgorithmsBase : public nsISupports {
public:
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(TransformerAlgorithms)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(TransformerAlgorithms)
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_CLASS(TransformerAlgorithmsBase)
MOZ_CAN_RUN_SCRIPT virtual already_AddRefed<Promise> TransformCallback(
JSContext* aCx, JS::Handle<JS::Value> aChunk,
TransformStreamDefaultController& aController, ErrorResult& aRv) = 0;
MOZ_CAN_RUN_SCRIPT virtual already_AddRefed<Promise> FlushCallback(
JSContext* aCx, TransformStreamDefaultController& aController,
ErrorResult& aRv) = 0;
protected:
virtual ~TransformerAlgorithmsBase() = default;
};
// https://streams.spec.whatwg.org/#set-up-transform-stream-default-controller-from-transformer
class TransformerAlgorithms final : public TransformerAlgorithmsBase {
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(
TransformerAlgorithms, TransformerAlgorithmsBase)
TransformerAlgorithms(nsIGlobalObject* aGlobal,
JS::Handle<JSObject*> aTransformer,
@ -42,11 +60,11 @@ class TransformerAlgorithms final {
MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> TransformCallback(
JSContext* aCx, JS::Handle<JS::Value> aChunk,
TransformStreamDefaultController& aController, ErrorResult& aRv);
TransformStreamDefaultController& aController, ErrorResult& aRv) override;
MOZ_CAN_RUN_SCRIPT already_AddRefed<Promise> FlushCallback(
JSContext* aCx, TransformStreamDefaultController& aController,
ErrorResult& aRv);
ErrorResult& aRv) override;
protected:
~TransformerAlgorithms() { mozilla::DropJSObjects(this); }

Просмотреть файл

@ -14,8 +14,6 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(UnderlyingSinkAlgorithmsBase)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(UnderlyingSinkAlgorithmsBase)
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(UnderlyingSinkAlgorithmsBase)
NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_IMPL_CYCLE_COLLECTION_INHERITED_WITH_JS_MEMBERS(
UnderlyingSinkAlgorithms, UnderlyingSinkAlgorithmsBase,

Просмотреть файл

@ -26,7 +26,7 @@ class WritableStreamDefaultController;
class UnderlyingSinkAlgorithmsBase : public nsISupports {
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(UnderlyingSinkAlgorithmsBase)
NS_DECL_CYCLE_COLLECTION_CLASS(UnderlyingSinkAlgorithmsBase)
MOZ_CAN_RUN_SCRIPT virtual void StartCallback(
JSContext* aCx, WritableStreamDefaultController& aController,

Просмотреть файл

@ -17,8 +17,6 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(UnderlyingSourceAlgorithmsBase)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(UnderlyingSourceAlgorithmsBase)
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(UnderlyingSourceAlgorithmsBase)
NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_IMPL_CYCLE_COLLECTION_INHERITED_WITH_JS_MEMBERS(
UnderlyingSourceAlgorithms, UnderlyingSourceAlgorithmsBase,

Просмотреть файл

@ -30,7 +30,7 @@ class ReadableStreamController;
class UnderlyingSourceAlgorithmsBase : public nsISupports {
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(UnderlyingSourceAlgorithmsBase)
NS_DECL_CYCLE_COLLECTION_CLASS(UnderlyingSourceAlgorithmsBase)
MOZ_CAN_RUN_SCRIPT virtual void StartCallback(
JSContext* aCx, ReadableStreamController& aController,