Fri, 16 Jan 2015 18:13:44 +0100
Integrate suggestion from review to improve consistency with existing code.
1 /* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
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 file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef mozilla_dom_PromiseCallback_h
8 #define mozilla_dom_PromiseCallback_h
10 #include "mozilla/dom/Promise.h"
11 #include "nsCycleCollectionParticipant.h"
13 namespace mozilla {
14 namespace dom {
16 // This is the base class for any PromiseCallback.
17 // It's a logical step in the promise chain of callbacks.
18 class PromiseCallback : public nsISupports
19 {
20 public:
21 NS_DECL_CYCLE_COLLECTING_ISUPPORTS
22 NS_DECL_CYCLE_COLLECTION_CLASS(PromiseCallback)
24 PromiseCallback();
25 virtual ~PromiseCallback();
27 virtual void Call(JS::Handle<JS::Value> aValue) = 0;
29 enum Task {
30 Resolve,
31 Reject
32 };
34 // This factory returns a PromiseCallback object with refcount of 0.
35 static PromiseCallback*
36 Factory(Promise* aNextPromise, JS::Handle<JSObject*> aObject,
37 AnyCallback* aCallback, Task aTask);
38 };
40 // WrapperPromiseCallback execs a JS Callback with a value, and then the return
41 // value is sent to the aNextPromise->ResolveFunction() or to
42 // aNextPromise->RejectFunction() if the JS Callback throws.
43 class WrapperPromiseCallback MOZ_FINAL : public PromiseCallback
44 {
45 public:
46 NS_DECL_ISUPPORTS_INHERITED
47 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(WrapperPromiseCallback,
48 PromiseCallback)
50 void Call(JS::Handle<JS::Value> aValue) MOZ_OVERRIDE;
52 WrapperPromiseCallback(Promise* aNextPromise, JS::Handle<JSObject*> aGlobal,
53 AnyCallback* aCallback);
54 ~WrapperPromiseCallback();
56 private:
57 nsRefPtr<Promise> mNextPromise;
58 JS::Heap<JSObject*> mGlobal;
59 nsRefPtr<AnyCallback> mCallback;
60 };
62 // ResolvePromiseCallback calls aPromise->ResolveFunction() with the value
63 // received by Call().
64 class ResolvePromiseCallback MOZ_FINAL : public PromiseCallback
65 {
66 public:
67 NS_DECL_ISUPPORTS_INHERITED
68 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(ResolvePromiseCallback,
69 PromiseCallback)
71 void Call(JS::Handle<JS::Value> aValue) MOZ_OVERRIDE;
73 ResolvePromiseCallback(Promise* aPromise, JS::Handle<JSObject*> aGlobal);
74 ~ResolvePromiseCallback();
76 private:
77 nsRefPtr<Promise> mPromise;
78 JS::Heap<JSObject*> mGlobal;
79 };
81 // RejectPromiseCallback calls aPromise->RejectFunction() with the value
82 // received by Call().
83 class RejectPromiseCallback MOZ_FINAL : public PromiseCallback
84 {
85 public:
86 NS_DECL_ISUPPORTS_INHERITED
87 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(RejectPromiseCallback,
88 PromiseCallback)
90 void Call(JS::Handle<JS::Value> aValue) MOZ_OVERRIDE;
92 RejectPromiseCallback(Promise* aPromise, JS::Handle<JSObject*> aGlobal);
93 ~RejectPromiseCallback();
95 private:
96 nsRefPtr<Promise> mPromise;
97 JS::Heap<JSObject*> mGlobal;
98 };
100 // NativePromiseCallback wraps a NativePromiseHandler.
101 class NativePromiseCallback MOZ_FINAL : public PromiseCallback
102 {
103 public:
104 NS_DECL_ISUPPORTS_INHERITED
105 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(NativePromiseCallback,
106 PromiseCallback)
108 void Call(JS::Handle<JS::Value> aValue) MOZ_OVERRIDE;
110 NativePromiseCallback(PromiseNativeHandler* aHandler,
111 Promise::PromiseState aState);
112 ~NativePromiseCallback();
114 private:
115 nsRefPtr<PromiseNativeHandler> mHandler;
116 Promise::PromiseState mState;
117 };
119 } // namespace dom
120 } // namespace mozilla
122 #endif // mozilla_dom_PromiseCallback_h