Added missing override and final specifiers
[WebKit-https.git] / Source / WebCore / bindings / js / JSCallbackData.h
1 /*
2  * Copyright (C) 2007-2009, 2015 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #pragma once
30
31 #include "JSDOMBinding.h"
32 #include "JSDOMGlobalObject.h"
33 #include "ScriptExecutionContext.h"
34 #include <heap/Strong.h>
35 #include <heap/StrongInlines.h>
36 #include <runtime/JSObject.h>
37 #include <wtf/Threading.h>
38
39 namespace WebCore {
40
41 // We have to clean up this data on the context thread because unprotecting a
42 // JSObject on the wrong thread without synchronization would corrupt the heap
43 // (and synchronization would be slow).
44
45 class JSCallbackData {
46 public:
47     enum class CallbackType { Function, Object, FunctionOrObject };
48
49 protected:
50     JSCallbackData()
51 #ifndef NDEBUG
52         : m_thread(currentThread())
53 #endif
54     {
55     }
56     
57     ~JSCallbackData()
58     {
59 #if !PLATFORM(IOS)
60         ASSERT(m_thread == currentThread());
61 #endif
62     }
63     
64     static JSC::JSValue invokeCallback(JSC::JSObject* callback, JSC::MarkedArgumentBuffer&, CallbackType, JSC::PropertyName functionName, NakedPtr<JSC::Exception>& returnedException);
65
66 private:
67 #ifndef NDEBUG
68     ThreadIdentifier m_thread;
69 #endif
70 };
71
72 class JSCallbackDataStrong : public JSCallbackData {
73 public:
74     JSCallbackDataStrong(JSC::JSObject* callback, void*)
75         : m_callback(callback->globalObject()->vm(), callback)
76     {
77     }
78
79     JSC::JSObject* callback() { return m_callback.get(); }
80     JSDOMGlobalObject* globalObject() { return JSC::jsCast<JSDOMGlobalObject*>(m_callback->globalObject()); }
81
82     JSC::JSValue invokeCallback(JSC::MarkedArgumentBuffer& args, CallbackType callbackType, JSC::PropertyName functionName, NakedPtr<JSC::Exception>& returnedException)
83     {
84         return JSCallbackData::invokeCallback(callback(), args, callbackType, functionName, returnedException);
85     }
86
87 private:
88     JSC::Strong<JSC::JSObject> m_callback;
89 };
90
91 class JSCallbackDataWeak : public JSCallbackData {
92 public:
93     JSCallbackDataWeak(JSC::JSObject* callback, void* owner)
94         : m_callback(callback, &m_weakOwner, owner)
95     {
96     }
97
98     JSC::JSObject* callback() { return m_callback.get(); }
99     JSDOMGlobalObject* globalObject() { return JSC::jsCast<JSDOMGlobalObject*>(m_callback->globalObject()); }
100
101     JSC::JSValue invokeCallback(JSC::MarkedArgumentBuffer& args, CallbackType callbackType, JSC::PropertyName functionName, NakedPtr<JSC::Exception>& returnedException)
102     {
103         return JSCallbackData::invokeCallback(callback(), args, callbackType, functionName, returnedException);
104     }
105
106 private:
107     class WeakOwner : public JSC::WeakHandleOwner {
108         bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&) override;
109     };
110     WeakOwner m_weakOwner;
111     JSC::Weak<JSC::JSObject> m_callback;
112 };
113
114 class DeleteCallbackDataTask : public ScriptExecutionContext::Task {
115 public:
116     template <typename CallbackDataType>
117     explicit DeleteCallbackDataTask(CallbackDataType* data)
118         : ScriptExecutionContext::Task(ScriptExecutionContext::Task::CleanupTask, [data = std::unique_ptr<CallbackDataType>(data)] (ScriptExecutionContext&) {
119         })
120     {
121     }
122 };
123
124 } // namespace WebCore