summaryrefslogtreecommitdiffstats
path: root/dom/promise/PromiseCallback.h
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /dom/promise/PromiseCallback.h
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloadUXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip
Add m-esr52 at 52.6.0
Diffstat (limited to 'dom/promise/PromiseCallback.h')
-rw-r--r--dom/promise/PromiseCallback.h203
1 files changed, 203 insertions, 0 deletions
diff --git a/dom/promise/PromiseCallback.h b/dom/promise/PromiseCallback.h
new file mode 100644
index 000000000..9f55e03d0
--- /dev/null
+++ b/dom/promise/PromiseCallback.h
@@ -0,0 +1,203 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_PromiseCallback_h
+#define mozilla_dom_PromiseCallback_h
+
+#include "mozilla/dom/Promise.h"
+#include "nsCycleCollectionParticipant.h"
+
+namespace mozilla {
+namespace dom {
+
+#ifndef SPIDERMONKEY_PROMISE
+// This is the base class for any PromiseCallback.
+// It's a logical step in the promise chain of callbacks.
+class PromiseCallback : public nsISupports
+{
+protected:
+ virtual ~PromiseCallback();
+
+public:
+ NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+ NS_DECL_CYCLE_COLLECTION_CLASS(PromiseCallback)
+
+ PromiseCallback();
+
+ virtual nsresult Call(JSContext* aCx,
+ JS::Handle<JS::Value> aValue) = 0;
+
+ // Return the Promise that this callback will end up resolving or
+ // rejecting, if any.
+ virtual Promise* GetDependentPromise() = 0;
+
+ enum Task {
+ Resolve,
+ Reject
+ };
+
+ // This factory returns a PromiseCallback object with refcount of 0.
+ static PromiseCallback*
+ Factory(Promise* aNextPromise, JS::Handle<JSObject*> aObject,
+ AnyCallback* aCallback, Task aTask);
+};
+
+// WrapperPromiseCallback execs a JS Callback with a value, and then the return
+// value is sent to either:
+// a) If aNextPromise is non-null, the aNextPromise->ResolveFunction() or to
+// aNextPromise->RejectFunction() if the JS Callback throws.
+// or
+// b) If aNextPromise is null, in which case aResolveFunc and aRejectFunc must
+// be non-null, then to aResolveFunc, unless aCallback threw, in which case
+// aRejectFunc.
+class WrapperPromiseCallback final : public PromiseCallback
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(WrapperPromiseCallback,
+ PromiseCallback)
+
+ nsresult Call(JSContext* aCx,
+ JS::Handle<JS::Value> aValue) override;
+
+ Promise* GetDependentPromise() override;
+
+ // Constructor for when we know we have a vanilla Promise.
+ WrapperPromiseCallback(Promise* aNextPromise, JS::Handle<JSObject*> aGlobal,
+ AnyCallback* aCallback);
+
+ // Constructor for when all we have to work with are resolve/reject functions.
+ WrapperPromiseCallback(JS::Handle<JSObject*> aGlobal,
+ AnyCallback* aCallback,
+ JS::Handle<JSObject*> mNextPromiseObj,
+ AnyCallback* aResolveFunc,
+ AnyCallback* aRejectFunc);
+
+private:
+ ~WrapperPromiseCallback();
+
+ // Either mNextPromise is non-null or all three of mNextPromiseObj,
+ // mResolveFund and mRejectFunc must are non-null.
+ RefPtr<Promise> mNextPromise;
+ // mNextPromiseObj is the reflector itself; it may not be in the
+ // same compartment as anything else we have.
+ JS::Heap<JSObject*> mNextPromiseObj;
+ RefPtr<AnyCallback> mResolveFunc;
+ RefPtr<AnyCallback> mRejectFunc;
+ JS::Heap<JSObject*> mGlobal;
+ RefPtr<AnyCallback> mCallback;
+};
+
+// ResolvePromiseCallback calls aPromise->ResolveFunction() with the value
+// received by Call().
+class ResolvePromiseCallback final : public PromiseCallback
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(ResolvePromiseCallback,
+ PromiseCallback)
+
+ nsresult Call(JSContext* aCx,
+ JS::Handle<JS::Value> aValue) override;
+
+ Promise* GetDependentPromise() override
+ {
+ return mPromise;
+ }
+
+ ResolvePromiseCallback(Promise* aPromise, JS::Handle<JSObject*> aGlobal);
+
+private:
+ ~ResolvePromiseCallback();
+
+ RefPtr<Promise> mPromise;
+ JS::Heap<JSObject*> mGlobal;
+};
+
+// RejectPromiseCallback calls aPromise->RejectFunction() with the value
+// received by Call().
+class RejectPromiseCallback final : public PromiseCallback
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(RejectPromiseCallback,
+ PromiseCallback)
+
+ nsresult Call(JSContext* aCx,
+ JS::Handle<JS::Value> aValue) override;
+
+ Promise* GetDependentPromise() override
+ {
+ return mPromise;
+ }
+
+ RejectPromiseCallback(Promise* aPromise, JS::Handle<JSObject*> aGlobal);
+
+private:
+ ~RejectPromiseCallback();
+
+ RefPtr<Promise> mPromise;
+ JS::Heap<JSObject*> mGlobal;
+};
+
+// InvokePromiseFuncCallback calls the given function with the value
+// received by Call().
+class InvokePromiseFuncCallback final : public PromiseCallback
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(InvokePromiseFuncCallback,
+ PromiseCallback)
+
+ nsresult Call(JSContext* aCx,
+ JS::Handle<JS::Value> aValue) override;
+
+ Promise* GetDependentPromise() override;
+
+ InvokePromiseFuncCallback(JS::Handle<JSObject*> aGlobal,
+ JS::Handle<JSObject*> aNextPromiseObj,
+ AnyCallback* aPromiseFunc);
+
+private:
+ ~InvokePromiseFuncCallback();
+
+ JS::Heap<JSObject*> mGlobal;
+ JS::Heap<JSObject*> mNextPromiseObj;
+ RefPtr<AnyCallback> mPromiseFunc;
+};
+
+// NativePromiseCallback wraps a PromiseNativeHandler.
+class NativePromiseCallback final : public PromiseCallback
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(NativePromiseCallback,
+ PromiseCallback)
+
+ nsresult Call(JSContext* aCx,
+ JS::Handle<JS::Value> aValue) override;
+
+ Promise* GetDependentPromise() override
+ {
+ return nullptr;
+ }
+
+ NativePromiseCallback(PromiseNativeHandler* aHandler,
+ Promise::PromiseState aState);
+
+private:
+ ~NativePromiseCallback();
+
+ RefPtr<PromiseNativeHandler> mHandler;
+ Promise::PromiseState mState;
+};
+
+#endif // SPIDERMONKEY_PROMISE
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_PromiseCallback_h