Coverage Report

Created: 2018-09-25 14:53

/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