[WebIDL] Add support for modern callback syntax
[WebKit.git] / Source / WebCore / bindings / scripts / test / JS / JSTestCallbackFunction.cpp
1 /*
2     This file is part of the WebKit open source project.
3     This file has been generated by generate-bindings.pl. DO NOT MODIFY!
4
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Library General Public
7     License as published by the Free Software Foundation; either
8     version 2 of the License, or (at your option) any later version.
9
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Library General Public License for more details.
14
15     You should have received a copy of the GNU Library General Public License
16     along with this library; see the file COPYING.LIB.  If not, write to
17     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18     Boston, MA 02110-1301, USA.
19 */
20
21 #include "config.h"
22
23 #if ENABLE(SPEECH_SYNTHESIS)
24
25 #include "JSTestCallbackFunction.h"
26
27 #include "JSDOMConvert.h"
28 #include "JSTestNode.h"
29 #include "ScriptExecutionContext.h"
30 #include "SerializedScriptValue.h"
31 #include <runtime/JSLock.h>
32
33 using namespace JSC;
34
35 namespace WebCore {
36
37 JSTestCallbackFunction::JSTestCallbackFunction(JSObject* callback, JSDOMGlobalObject* globalObject)
38     : TestCallbackFunction()
39     , ActiveDOMCallback(globalObject->scriptExecutionContext())
40     , m_data(new JSCallbackDataStrong(callback, this))
41 {
42 }
43
44 JSTestCallbackFunction::~JSTestCallbackFunction()
45 {
46     ScriptExecutionContext* context = scriptExecutionContext();
47     // When the context is destroyed, all tasks with a reference to a callback
48     // should be deleted. So if the context is 0, we are on the context thread.
49     if (!context || context->isContextThread())
50         delete m_data;
51     else
52         context->postTask(DeleteCallbackDataTask(m_data));
53 #ifndef NDEBUG
54     m_data = nullptr;
55 #endif
56 }
57
58 bool JSTestCallbackFunction::handleEvent(RefPtr<Float32Array> arrayParam, RefPtr<SerializedScriptValue>&& srzParam, const String& strArg, bool boolParam, int32_t longParam, TestNode* testNodeParam)
59 {
60     if (!canInvokeCallback())
61         return true;
62
63     Ref<JSTestCallbackFunction> protectedThis(*this);
64
65     JSLockHolder lock(m_data->globalObject()->vm());
66
67     ExecState* state = m_data->globalObject()->globalExec();
68     MarkedArgumentBuffer args;
69     args.append(toJS<IDLInterface<Float32Array>>(*state, *m_data->globalObject(), arrayParam));
70     args.append(srzParam ? srzParam->deserialize(*state, m_data->globalObject()) : jsNull());
71     args.append(toJS<IDLDOMString>(*state, strArg));
72     args.append(toJS<IDLBoolean>(boolParam));
73     args.append(toJS<IDLLong>(longParam));
74     args.append(toJS<IDLInterface<TestNode>>(*state, *m_data->globalObject(), testNodeParam));
75
76     NakedPtr<JSC::Exception> returnedException;
77     m_data->invokeCallback(args, JSCallbackData::CallbackType::Function, Identifier(), returnedException);
78     if (returnedException)
79         reportException(state, returnedException);
80     return !returnedException;
81 }
82
83 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, TestCallbackFunction& impl)
84 {
85     if (!static_cast<JSTestCallbackFunction&>(impl).callbackData())
86         return jsNull();
87
88     return static_cast<JSTestCallbackFunction&>(impl).callbackData()->callback();
89
90 }
91
92 } // namespace WebCore
93
94 #endif // ENABLE(SPEECH_SYNTHESIS)