[Streams API] ReadableStream constructor start function should be able to close the...
[WebKit-https.git] / Source / WebCore / bindings / js / JSDOMPromise.h
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef JSDOMPromise_h
27 #define JSDOMPromise_h
28
29 #if ENABLE(PROMISES)
30
31 #include "JSCryptoKey.h"
32 #include "JSCryptoKeyPair.h"
33 #include "JSDOMBinding.h"
34 #include <heap/StrongInlines.h>
35 #include <runtime/JSPromiseDeferred.h>
36
37 namespace WebCore {
38
39 class DeferredWrapper {
40 public:
41     DeferredWrapper(JSC::ExecState*, JSDOMGlobalObject*);
42     DeferredWrapper(JSC::ExecState*, JSDOMGlobalObject*, JSC::JSPromiseDeferred*);
43
44     template<class ResolveResultType>
45     void resolve(const ResolveResultType&);
46
47     template<class RejectResultType>
48     void reject(const RejectResultType&);
49
50     JSC::JSObject* promise() const;
51
52 private:
53     void resolve(JSC::ExecState*, JSC::JSValue);
54     void reject(JSC::ExecState*, JSC::JSValue);
55
56     JSC::Strong<JSDOMGlobalObject> m_globalObject;
57     JSC::Strong<JSC::JSPromiseDeferred> m_deferred;
58 };
59
60 template<class ResolveResultType>
61 inline void DeferredWrapper::resolve(const ResolveResultType& result)
62 {
63     JSC::ExecState* exec = m_globalObject->globalExec();
64     JSC::JSLockHolder locker(exec);
65     resolve(exec, toJS(exec, m_globalObject.get(), result));
66 }
67
68 template<class RejectResultType>
69 inline void DeferredWrapper::reject(const RejectResultType& result)
70 {
71     JSC::ExecState* exec = m_globalObject->globalExec();
72     JSC::JSLockHolder locker(exec);
73     reject(exec, toJS(exec, m_globalObject.get(), result));
74 }
75
76 template<>
77 inline void DeferredWrapper::reject(const std::nullptr_t&)
78 {
79     JSC::ExecState* exec = m_globalObject->globalExec();
80     JSC::JSLockHolder locker(exec);
81     reject(exec, JSC::jsNull());
82 }
83
84 template<>
85 inline void DeferredWrapper::resolve<String>(const String& result)
86 {
87     JSC::ExecState* exec = m_globalObject->globalExec();
88     JSC::JSLockHolder locker(exec);
89     resolve(exec, jsString(exec, result));
90 }
91
92 template<>
93 inline void DeferredWrapper::resolve<bool>(const bool& result)
94 {
95     JSC::ExecState* exec = m_globalObject->globalExec();
96     JSC::JSLockHolder locker(exec);
97     resolve(exec, JSC::jsBoolean(result));
98 }
99
100 template<>
101 inline void DeferredWrapper::resolve<JSC::JSValue>(const JSC::JSValue& value)
102 {
103     JSC::ExecState* exec = m_globalObject->globalExec();
104     JSC::JSLockHolder locker(exec);
105     resolve(exec, value);
106 }
107 template<>
108 inline void DeferredWrapper::resolve<Vector<unsigned char>>(const Vector<unsigned char>& result)
109 {
110     JSC::ExecState* exec = m_globalObject->globalExec();
111     JSC::JSLockHolder locker(exec);
112     RefPtr<ArrayBuffer> buffer = ArrayBuffer::create(result.data(), result.size());
113     resolve(exec, toJS(exec, m_globalObject.get(), buffer.get()));
114 }
115
116 template<>
117 inline void DeferredWrapper::resolve(const std::nullptr_t&)
118 {
119     JSC::ExecState* exec = m_globalObject->globalExec();
120     JSC::JSLockHolder locker(exec);
121     resolve(exec, JSC::jsNull());
122 }
123
124 template<>
125 inline void DeferredWrapper::reject<String>(const String& result)
126 {
127     JSC::ExecState* exec = m_globalObject->globalExec();
128     JSC::JSLockHolder locker(exec);
129     reject(exec, jsString(exec, result));
130 }
131
132 }
133
134 #endif // ENABLE(PROMISES)
135
136 #endif // JSDOMPromise_h