Index: Source/bindings/v8/UnsafePersistent.h |
diff --git a/Source/modules/webmidi/MIDIErrorCallback.cpp b/Source/bindings/v8/UnsafePersistent.h |
similarity index 63% |
copy from Source/modules/webmidi/MIDIErrorCallback.cpp |
copy to Source/bindings/v8/UnsafePersistent.h |
index 0557f1d01c17606f418bf1f5fccdf495e6707cc0..711583fa2527b1c0e64bd8b41e33bd305fbd7f22 100644 |
--- a/Source/modules/webmidi/MIDIErrorCallback.cpp |
+++ b/Source/bindings/v8/UnsafePersistent.h |
@@ -28,44 +28,41 @@ |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
-#include "config.h" |
-#include "modules/webmidi/MIDIErrorCallback.h" |
+#ifndef UnsafePersistent_h |
+#define UnsafePersistent_h |
-#include "core/dom/DOMError.h" |
-#include "core/dom/ScriptExecutionContext.h" |
+#include <v8.h> |
namespace WebCore { |
-namespace { |
+// An unsafe way to pass Persistent handles around. Do not use unless you know |
+// what you're doing. UnsafePersistent is only safe to use when we know that the |
+// memory pointed by the it is not going away: 1) When GC cannot happen while |
+// the UnsafePersistent is alive or 2) when there is a strong Persistent keeping |
+// the memory alive while the UnsafePersistent is alive. |
-class DispatchCallbackTask : public ScriptExecutionContext::Task { |
+// FIXME: assert that GC doesn't happen during the lifetime of UnsafePersistent. |
+template<typename T> class UnsafePersistent { |
public: |
- static PassOwnPtr<DispatchCallbackTask> create(PassRefPtr<MIDIErrorCallback> callback, PassRefPtr<DOMError> error) |
- { |
- return adoptPtr(new DispatchCallbackTask(callback, error)); |
- } |
+ UnsafePersistent(T* value) : m_value(value) { } |
- virtual void performTask(ScriptExecutionContext*) |
+ // The end result is generally unsafe to use, see the class level comment |
+ // for when it's safe to use. |
+ void copyTo(v8::Persistent<T>* handle) const |
{ |
- m_callback->handleEvent(m_error.get()); |
+ T** rawValue = reinterpret_cast<T**>(handle); |
+ *rawValue = m_value; |
} |
-private: |
- DispatchCallbackTask(PassRefPtr<MIDIErrorCallback> callback, PassRefPtr<DOMError> error) |
- : m_callback(callback) |
- , m_error(error) |
+ T* value() const |
{ |
+ return m_value; |
} |
- RefPtr<MIDIErrorCallback> m_callback; |
- RefPtr<DOMError> m_error; |
+private: |
+ T* m_value; |
}; |
-} // namespace |
- |
-void MIDIErrorCallback::scheduleCallback(ScriptExecutionContext* context, PassRefPtr<DOMError> error) |
-{ |
- context->postTask(DispatchCallbackTask::create(this, error)); |
-} |
- |
} // namespace WebCore |
+ |
+#endif // UnsafePersistent_h |