michael@0: /* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ michael@0: /* vim: set ts=2 et sw=2 tw=80: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef mozilla_dom_PromiseCallback_h michael@0: #define mozilla_dom_PromiseCallback_h michael@0: michael@0: #include "mozilla/dom/Promise.h" michael@0: #include "nsCycleCollectionParticipant.h" michael@0: michael@0: namespace mozilla { michael@0: namespace dom { michael@0: michael@0: // This is the base class for any PromiseCallback. michael@0: // It's a logical step in the promise chain of callbacks. michael@0: class PromiseCallback : public nsISupports michael@0: { michael@0: public: michael@0: NS_DECL_CYCLE_COLLECTING_ISUPPORTS michael@0: NS_DECL_CYCLE_COLLECTION_CLASS(PromiseCallback) michael@0: michael@0: PromiseCallback(); michael@0: virtual ~PromiseCallback(); michael@0: michael@0: virtual void Call(JS::Handle aValue) = 0; michael@0: michael@0: enum Task { michael@0: Resolve, michael@0: Reject michael@0: }; michael@0: michael@0: // This factory returns a PromiseCallback object with refcount of 0. michael@0: static PromiseCallback* michael@0: Factory(Promise* aNextPromise, JS::Handle aObject, michael@0: AnyCallback* aCallback, Task aTask); michael@0: }; michael@0: michael@0: // WrapperPromiseCallback execs a JS Callback with a value, and then the return michael@0: // value is sent to the aNextPromise->ResolveFunction() or to michael@0: // aNextPromise->RejectFunction() if the JS Callback throws. michael@0: class WrapperPromiseCallback MOZ_FINAL : public PromiseCallback michael@0: { michael@0: public: michael@0: NS_DECL_ISUPPORTS_INHERITED michael@0: NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(WrapperPromiseCallback, michael@0: PromiseCallback) michael@0: michael@0: void Call(JS::Handle aValue) MOZ_OVERRIDE; michael@0: michael@0: WrapperPromiseCallback(Promise* aNextPromise, JS::Handle aGlobal, michael@0: AnyCallback* aCallback); michael@0: ~WrapperPromiseCallback(); michael@0: michael@0: private: michael@0: nsRefPtr mNextPromise; michael@0: JS::Heap mGlobal; michael@0: nsRefPtr mCallback; michael@0: }; michael@0: michael@0: // ResolvePromiseCallback calls aPromise->ResolveFunction() with the value michael@0: // received by Call(). michael@0: class ResolvePromiseCallback MOZ_FINAL : public PromiseCallback michael@0: { michael@0: public: michael@0: NS_DECL_ISUPPORTS_INHERITED michael@0: NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(ResolvePromiseCallback, michael@0: PromiseCallback) michael@0: michael@0: void Call(JS::Handle aValue) MOZ_OVERRIDE; michael@0: michael@0: ResolvePromiseCallback(Promise* aPromise, JS::Handle aGlobal); michael@0: ~ResolvePromiseCallback(); michael@0: michael@0: private: michael@0: nsRefPtr mPromise; michael@0: JS::Heap mGlobal; michael@0: }; michael@0: michael@0: // RejectPromiseCallback calls aPromise->RejectFunction() with the value michael@0: // received by Call(). michael@0: class RejectPromiseCallback MOZ_FINAL : public PromiseCallback michael@0: { michael@0: public: michael@0: NS_DECL_ISUPPORTS_INHERITED michael@0: NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(RejectPromiseCallback, michael@0: PromiseCallback) michael@0: michael@0: void Call(JS::Handle aValue) MOZ_OVERRIDE; michael@0: michael@0: RejectPromiseCallback(Promise* aPromise, JS::Handle aGlobal); michael@0: ~RejectPromiseCallback(); michael@0: michael@0: private: michael@0: nsRefPtr mPromise; michael@0: JS::Heap mGlobal; michael@0: }; michael@0: michael@0: // NativePromiseCallback wraps a NativePromiseHandler. michael@0: class NativePromiseCallback MOZ_FINAL : public PromiseCallback michael@0: { michael@0: public: michael@0: NS_DECL_ISUPPORTS_INHERITED michael@0: NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(NativePromiseCallback, michael@0: PromiseCallback) michael@0: michael@0: void Call(JS::Handle aValue) MOZ_OVERRIDE; michael@0: michael@0: NativePromiseCallback(PromiseNativeHandler* aHandler, michael@0: Promise::PromiseState aState); michael@0: ~NativePromiseCallback(); michael@0: michael@0: private: michael@0: nsRefPtr mHandler; michael@0: Promise::PromiseState mState; michael@0: }; michael@0: michael@0: } // namespace dom michael@0: } // namespace mozilla michael@0: michael@0: #endif // mozilla_dom_PromiseCallback_h