summaryrefslogtreecommitdiff
path: root/Source/WebCore/bindings/js/JSCallbackData.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/bindings/js/JSCallbackData.h')
-rw-r--r--Source/WebCore/bindings/js/JSCallbackData.h85
1 files changed, 60 insertions, 25 deletions
diff --git a/Source/WebCore/bindings/js/JSCallbackData.h b/Source/WebCore/bindings/js/JSCallbackData.h
index ff76a9e85..3ea990e56 100644
--- a/Source/WebCore/bindings/js/JSCallbackData.h
+++ b/Source/WebCore/bindings/js/JSCallbackData.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2007-2009, 2015 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -10,7 +10,7 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * 3. Neither the name of Apple Inc. ("Apple") nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
@@ -26,8 +26,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef JSCallbackData_h
-#define JSCallbackData_h
+#pragma once
#include "JSDOMBinding.h"
#include "JSDOMGlobalObject.h"
@@ -45,11 +44,13 @@ namespace WebCore {
class JSCallbackData {
public:
- static void deleteData(void*);
+ enum class CallbackType { Function, Object, FunctionOrObject };
- JSCallbackData(JSC::JSObject* callback, JSDOMGlobalObject* globalObject)
- : m_callback(globalObject->vm(), callback)
- , m_globalObject(globalObject->vm(), globalObject)
+ JSDOMGlobalObject* globalObject() { return m_globalObject.get(); }
+
+protected:
+ explicit JSCallbackData(JSDOMGlobalObject* globalObject)
+ : m_globalObject(globalObject)
#ifndef NDEBUG
, m_thread(currentThread())
#endif
@@ -62,40 +63,74 @@ public:
ASSERT(m_thread == currentThread());
#endif
}
-
- JSC::JSObject* callback() { return m_callback.get(); }
- JSDOMGlobalObject* globalObject() { return m_globalObject.get(); }
- JSC::JSValue invokeCallback(JSC::MarkedArgumentBuffer&, bool* raisedException = 0);
- JSC::JSValue invokeCallback(JSC::JSValue thisValue, JSC::MarkedArgumentBuffer&, bool* raisedException = 0);
+ static JSC::JSValue invokeCallback(JSDOMGlobalObject&, JSC::JSObject* callback, JSC::MarkedArgumentBuffer&, CallbackType, JSC::PropertyName functionName, NakedPtr<JSC::Exception>& returnedException);
private:
- JSC::Strong<JSC::JSObject> m_callback;
- JSC::Strong<JSDOMGlobalObject> m_globalObject;
+ JSC::Weak<JSDOMGlobalObject> m_globalObject;
#ifndef NDEBUG
ThreadIdentifier m_thread;
#endif
};
-class DeleteCallbackDataTask : public ScriptExecutionContext::Task {
+class JSCallbackDataStrong : public JSCallbackData {
public:
- static PassOwnPtr<DeleteCallbackDataTask> create(JSCallbackData* data)
+ JSCallbackDataStrong(JSC::JSObject* callback, JSDOMGlobalObject* globalObject, void*)
+ : JSCallbackData(globalObject)
+ , m_callback(globalObject->vm(), callback)
{
- return adoptPtr(new DeleteCallbackDataTask(data));
}
- virtual void performTask(ScriptExecutionContext*)
+ JSC::JSObject* callback() { return m_callback.get(); }
+
+ JSC::JSValue invokeCallback(JSC::MarkedArgumentBuffer& args, CallbackType callbackType, JSC::PropertyName functionName, NakedPtr<JSC::Exception>& returnedException)
{
- delete m_data;
+ auto* globalObject = this->globalObject();
+ if (!globalObject)
+ return { };
+
+ return JSCallbackData::invokeCallback(*globalObject, callback(), args, callbackType, functionName, returnedException);
}
- virtual bool isCleanupTask() const { return true; }
+
private:
+ JSC::Strong<JSC::JSObject> m_callback;
+};
+
+class JSCallbackDataWeak : public JSCallbackData {
+public:
+ JSCallbackDataWeak(JSC::JSObject* callback, JSDOMGlobalObject* globalObject, void* owner)
+ : JSCallbackData(globalObject)
+ , m_callback(callback, &m_weakOwner, owner)
+ {
+ }
+
+ JSC::JSObject* callback() { return m_callback.get(); }
- DeleteCallbackDataTask(JSCallbackData* data) : m_data(data) {}
+ JSC::JSValue invokeCallback(JSC::MarkedArgumentBuffer& args, CallbackType callbackType, JSC::PropertyName functionName, NakedPtr<JSC::Exception>& returnedException)
+ {
+ auto* globalObject = this->globalObject();
+ if (!globalObject)
+ return { };
+
+ return JSCallbackData::invokeCallback(*globalObject, callback(), args, callbackType, functionName, returnedException);
+ }
- JSCallbackData* m_data;
+private:
+ class WeakOwner : public JSC::WeakHandleOwner {
+ bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&) override;
+ };
+ WeakOwner m_weakOwner;
+ JSC::Weak<JSC::JSObject> m_callback;
};
-} // namespace WebCore
+class DeleteCallbackDataTask : public ScriptExecutionContext::Task {
+public:
+ template <typename CallbackDataType>
+ explicit DeleteCallbackDataTask(CallbackDataType* data)
+ : ScriptExecutionContext::Task(ScriptExecutionContext::Task::CleanupTask, [data = std::unique_ptr<CallbackDataType>(data)] (ScriptExecutionContext&) {
+ })
+ {
+ }
+};
-#endif // JSCallbackData_h
+} // namespace WebCore