/work/obj-fuzz/dist/include/mozilla/dom/DOMMozPromiseRequestHolder.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* vim: set ts=8 sts=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 |
5 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | | |
7 | | #ifndef mozilla_dom_DOMMozPromiseRequestHolder_h |
8 | | #define mozilla_dom_DOMMozPromiseRequestHolder_h |
9 | | |
10 | | #include "mozilla/DOMEventTargetHelper.h" |
11 | | #include "mozilla/MozPromise.h" |
12 | | |
13 | | namespace mozilla { |
14 | | namespace dom { |
15 | | |
16 | | /** |
17 | | * This is a helper class that can be used when MozPromises are |
18 | | * being consumed by binding layer code. It effectively creates |
19 | | * a MozPromiseRequestHolder that auto-disconnects when the binding's |
20 | | * global is disconnected. |
21 | | * |
22 | | * It can be used like this: |
23 | | * |
24 | | * RefPtr<Promise> |
25 | | * SomeAsyncAPI(Args& aArgs, ErrorResult& aRv) |
26 | | * { |
27 | | * nsIGlobalObject* global = GetParentObject(); |
28 | | * if (!global) { |
29 | | * aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); |
30 | | * return nullptr; |
31 | | * } |
32 | | * |
33 | | * RefPtr<Promise> outer = Promise::Create(global, aRv); |
34 | | * if (aRv.Failed()) { |
35 | | * return nullptr; |
36 | | * } |
37 | | * |
38 | | * RefPtr<DOMMozPromiseRequestHolder> holder = |
39 | | * new DOMMozPromiseRequestHolder(global); |
40 | | * |
41 | | * DoAsyncStuff()->Then( |
42 | | * global->EventTargetFor(TaskCategory::Other), __func__, |
43 | | * [holder, outer] (const Result& aResult) { |
44 | | * holder->Complete(); |
45 | | * |
46 | | * // Note, you can access the holder's bound global in |
47 | | * // your reaction handler. Its mostly likely set if |
48 | | * // the handler fires, but you still must check for |
49 | | * // its existence since something could disconnect |
50 | | * // the global between when the MozPromise reaction |
51 | | * // runnable is queued and when it actually runs. |
52 | | * nsIGlobalObject* global = holder->GetParentObject(); |
53 | | * NS_ENSURE_TRUE_VOID(global); |
54 | | * |
55 | | * outer->MaybeResolve(aResult); |
56 | | * }, [holder, outer] (nsresult aRv) { |
57 | | * holder->Complete(); |
58 | | * outer->MaybeReject(aRv); |
59 | | * })->Track(*holder); |
60 | | * |
61 | | * return outer.forget(); |
62 | | * } |
63 | | * |
64 | | * NOTE: Currently this helper class extends DETH. This is only |
65 | | * so that it can bind to the global and receive the |
66 | | * DisconnectFromOwner() method call. In this future the |
67 | | * binding code should be factored out so DETH is not |
68 | | * needed here. See bug 1456893. |
69 | | */ |
70 | | template<typename PromiseType> |
71 | | class DOMMozPromiseRequestHolder final : public DOMEventTargetHelper |
72 | | { |
73 | | MozPromiseRequestHolder<PromiseType> mHolder; |
74 | | |
75 | 0 | ~DOMMozPromiseRequestHolder() = default; Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ClientState, nsresult, false> >::~DOMMozPromiseRequestHolder() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ClientOpResult, nsresult, false> >::~DOMMozPromiseRequestHolder() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<bool, nsresult, false> >::~DOMMozPromiseRequestHolder() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<nsTArray<mozilla::dom::MediaCapabilitiesInfo>, mozilla::MediaResult, true> >::~DOMMozPromiseRequestHolder() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ServiceWorkerRegistrationDescriptor, mozilla::CopyableErrorResult, false> >::~DOMMozPromiseRequestHolder() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<nsTArray<mozilla::dom::ServiceWorkerRegistrationDescriptor>, mozilla::CopyableErrorResult, false> >::~DOMMozPromiseRequestHolder() |
76 | | |
77 | | void |
78 | | DisconnectFromOwner() override |
79 | 0 | { |
80 | 0 | mHolder.DisconnectIfExists(); |
81 | 0 | DOMEventTargetHelper::DisconnectFromOwner(); |
82 | 0 | } Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ClientState, nsresult, false> >::DisconnectFromOwner() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ClientOpResult, nsresult, false> >::DisconnectFromOwner() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<bool, nsresult, false> >::DisconnectFromOwner() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<nsTArray<mozilla::dom::MediaCapabilitiesInfo>, mozilla::MediaResult, true> >::DisconnectFromOwner() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ServiceWorkerRegistrationDescriptor, mozilla::CopyableErrorResult, false> >::DisconnectFromOwner() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<nsTArray<mozilla::dom::ServiceWorkerRegistrationDescriptor>, mozilla::CopyableErrorResult, false> >::DisconnectFromOwner() |
83 | | |
84 | | JSObject* |
85 | | WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override |
86 | 0 | { |
87 | 0 | // We are extending DETH to get notified when the global goes |
88 | 0 | // away, but this object should never actually be exposed to |
89 | 0 | // script. |
90 | 0 | MOZ_CRASH("illegal method"); |
91 | 0 | } Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ClientState, nsresult, false> >::WrapObject(JSContext*, JS::Handle<JSObject*>) Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ClientOpResult, nsresult, false> >::WrapObject(JSContext*, JS::Handle<JSObject*>) Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<bool, nsresult, false> >::WrapObject(JSContext*, JS::Handle<JSObject*>) Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<nsTArray<mozilla::dom::MediaCapabilitiesInfo>, mozilla::MediaResult, true> >::WrapObject(JSContext*, JS::Handle<JSObject*>) Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ServiceWorkerRegistrationDescriptor, mozilla::CopyableErrorResult, false> >::WrapObject(JSContext*, JS::Handle<JSObject*>) Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<nsTArray<mozilla::dom::ServiceWorkerRegistrationDescriptor>, mozilla::CopyableErrorResult, false> >::WrapObject(JSContext*, JS::Handle<JSObject*>) |
92 | | |
93 | | public: |
94 | | explicit DOMMozPromiseRequestHolder(nsIGlobalObject* aGlobal) |
95 | | : DOMEventTargetHelper(aGlobal) |
96 | 0 | { |
97 | 0 | MOZ_DIAGNOSTIC_ASSERT(aGlobal); |
98 | 0 | } Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ClientState, nsresult, false> >::DOMMozPromiseRequestHolder(nsIGlobalObject*) Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ClientOpResult, nsresult, false> >::DOMMozPromiseRequestHolder(nsIGlobalObject*) Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<bool, nsresult, false> >::DOMMozPromiseRequestHolder(nsIGlobalObject*) Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<nsTArray<mozilla::dom::MediaCapabilitiesInfo>, mozilla::MediaResult, true> >::DOMMozPromiseRequestHolder(nsIGlobalObject*) Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ServiceWorkerRegistrationDescriptor, mozilla::CopyableErrorResult, false> >::DOMMozPromiseRequestHolder(nsIGlobalObject*) Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<nsTArray<mozilla::dom::ServiceWorkerRegistrationDescriptor>, mozilla::CopyableErrorResult, false> >::DOMMozPromiseRequestHolder(nsIGlobalObject*) |
99 | | |
100 | | operator MozPromiseRequestHolder<PromiseType>& () |
101 | 0 | { |
102 | 0 | return mHolder; |
103 | 0 | } Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ClientState, nsresult, false> >::operator mozilla::MozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ClientState, nsresult, false> >&() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ClientOpResult, nsresult, false> >::operator mozilla::MozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ClientOpResult, nsresult, false> >&() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<bool, nsresult, false> >::operator mozilla::MozPromiseRequestHolder<mozilla::MozPromise<bool, nsresult, false> >&() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<nsTArray<mozilla::dom::MediaCapabilitiesInfo>, mozilla::MediaResult, true> >::operator mozilla::MozPromiseRequestHolder<mozilla::MozPromise<nsTArray<mozilla::dom::MediaCapabilitiesInfo>, mozilla::MediaResult, true> >&() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ServiceWorkerRegistrationDescriptor, mozilla::CopyableErrorResult, false> >::operator mozilla::MozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ServiceWorkerRegistrationDescriptor, mozilla::CopyableErrorResult, false> >&() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<nsTArray<mozilla::dom::ServiceWorkerRegistrationDescriptor>, mozilla::CopyableErrorResult, false> >::operator mozilla::MozPromiseRequestHolder<mozilla::MozPromise<nsTArray<mozilla::dom::ServiceWorkerRegistrationDescriptor>, mozilla::CopyableErrorResult, false> >&() |
104 | | |
105 | | operator const MozPromiseRequestHolder<PromiseType>& () const |
106 | | { |
107 | | return mHolder; |
108 | | } |
109 | | |
110 | | void |
111 | | Complete() |
112 | 0 | { |
113 | 0 | mHolder.Complete(); |
114 | 0 | } Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ClientState, nsresult, false> >::Complete() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ClientOpResult, nsresult, false> >::Complete() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<bool, nsresult, false> >::Complete() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<nsTArray<mozilla::dom::MediaCapabilitiesInfo>, mozilla::MediaResult, true> >::Complete() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<mozilla::dom::ServiceWorkerRegistrationDescriptor, mozilla::CopyableErrorResult, false> >::Complete() Unexecuted instantiation: mozilla::dom::DOMMozPromiseRequestHolder<mozilla::MozPromise<nsTArray<mozilla::dom::ServiceWorkerRegistrationDescriptor>, mozilla::CopyableErrorResult, false> >::Complete() |
115 | | |
116 | | void |
117 | | DisconnectIfExists() |
118 | 0 | { |
119 | 0 | mHolder.DisconnectIfExists(); |
120 | 0 | } |
121 | | |
122 | | bool |
123 | | Exists() const |
124 | | { |
125 | | return mHolder.Exists(); |
126 | | } |
127 | | |
128 | | NS_INLINE_DECL_REFCOUNTING_INHERITED(DOMMozPromiseRequestHolder, DOMEventTargetHelper) |
129 | | }; |
130 | | |
131 | | } // namespace dom |
132 | | } // namespace mozilla |
133 | | |
134 | | #endif // mozilla_dom_DOMMozPromiseRequestHolder_h |