Title: [126521] trunk/Source/WebCore
- Revision
- 126521
- Author
- [email protected]
- Date
- 2012-08-23 18:02:28 -0700 (Thu, 23 Aug 2012)
Log Message
[V8] V8AbstractEventListener re-implements ScopedPersistent by hand
https://bugs.webkit.org/show_bug.cgi?id=94873
Reviewed by Eric Seidel.
Rather than calling New/Dispose manually, this patch changes
V8AbstractEventListener to use ScopedPersistent.
* bindings/v8/V8AbstractEventListener.cpp:
(WebCore::V8AbstractEventListener::weakEventListenerCallback):
(WebCore::V8AbstractEventListener::~V8AbstractEventListener):
(WebCore::V8AbstractEventListener::setListenerObject):
(WebCore::V8AbstractEventListener::getReceiverObject):
* bindings/v8/V8AbstractEventListener.h:
(WebCore::V8AbstractEventListener::getListenerObject):
(WebCore::V8AbstractEventListener::getExistingListenerObject):
(WebCore::V8AbstractEventListener::existingListenerObjectPersistentHandle):
(WebCore::V8AbstractEventListener::hasExistingListenerObject):
(V8AbstractEventListener):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (126520 => 126521)
--- trunk/Source/WebCore/ChangeLog 2012-08-24 00:52:53 UTC (rev 126520)
+++ trunk/Source/WebCore/ChangeLog 2012-08-24 01:02:28 UTC (rev 126521)
@@ -1,3 +1,25 @@
+2012-08-23 Adam Barth <[email protected]>
+
+ [V8] V8AbstractEventListener re-implements ScopedPersistent by hand
+ https://bugs.webkit.org/show_bug.cgi?id=94873
+
+ Reviewed by Eric Seidel.
+
+ Rather than calling New/Dispose manually, this patch changes
+ V8AbstractEventListener to use ScopedPersistent.
+
+ * bindings/v8/V8AbstractEventListener.cpp:
+ (WebCore::V8AbstractEventListener::weakEventListenerCallback):
+ (WebCore::V8AbstractEventListener::~V8AbstractEventListener):
+ (WebCore::V8AbstractEventListener::setListenerObject):
+ (WebCore::V8AbstractEventListener::getReceiverObject):
+ * bindings/v8/V8AbstractEventListener.h:
+ (WebCore::V8AbstractEventListener::getListenerObject):
+ (WebCore::V8AbstractEventListener::getExistingListenerObject):
+ (WebCore::V8AbstractEventListener::existingListenerObjectPersistentHandle):
+ (WebCore::V8AbstractEventListener::hasExistingListenerObject):
+ (V8AbstractEventListener):
+
2012-08-23 Simon Fraser <[email protected]>
Prep work for: Implement sticky positioning
Modified: trunk/Source/WebCore/bindings/v8/V8AbstractEventListener.cpp (126520 => 126521)
--- trunk/Source/WebCore/bindings/v8/V8AbstractEventListener.cpp 2012-08-24 00:52:53 UTC (rev 126520)
+++ trunk/Source/WebCore/bindings/v8/V8AbstractEventListener.cpp 2012-08-24 01:02:28 UTC (rev 126521)
@@ -47,10 +47,10 @@
namespace WebCore {
-static void weakEventListenerCallback(v8::Persistent<v8::Value>, void* parameter)
+void V8AbstractEventListener::weakEventListenerCallback(v8::Persistent<v8::Value>, void* parameter)
{
V8AbstractEventListener* listener = static_cast<V8AbstractEventListener*>(parameter);
- listener->disposeListenerObject();
+ listener->m_listener.clear();
}
V8AbstractEventListener::V8AbstractEventListener(bool isAttribute, const WorldContextHandle& worldContext)
@@ -65,12 +65,10 @@
V8AbstractEventListener::~V8AbstractEventListener()
{
- if (!m_listener.IsEmpty()) {
+ if (!m_listener.get().IsEmpty()) {
v8::HandleScope scope;
- v8::Local<v8::Object> listener = v8::Local<v8::Object>::New(m_listener);
- V8EventListenerList::clearWrapper(listener, m_isAttribute);
+ V8EventListenerList::clearWrapper(v8::Local<v8::Object>::New(m_listener.get()), m_isAttribute);
}
- disposeListenerObject();
#if ENABLE(INSPECTOR)
ThreadLocalInspectorCounters::current().decrementCounter(ThreadLocalInspectorCounters::JSEventListenerCounter);
#endif
@@ -104,25 +102,10 @@
invokeEventHandler(context, event, jsEvent);
}
-void V8AbstractEventListener::disposeListenerObject()
-{
- if (!m_listener.IsEmpty()) {
-#ifndef NDEBUG
- V8GCController::unregisterGlobalHandle(this, m_listener);
-#endif
- m_listener.Dispose();
- m_listener.Clear();
- }
-}
-
void V8AbstractEventListener::setListenerObject(v8::Handle<v8::Object> listener)
{
- disposeListenerObject();
- m_listener = v8::Persistent<v8::Object>::New(listener);
-#ifndef NDEBUG
- V8GCController::registerGlobalHandle(EVENT_LISTENER, this, m_listener);
-#endif
- m_listener.MakeWeak(this, &weakEventListenerCallback);
+ m_listener.set(listener);
+ m_listener.get().MakeWeak(this, &V8AbstractEventListener::weakEventListenerCallback);
}
void V8AbstractEventListener::invokeEventHandler(ScriptExecutionContext* context, Event* event, v8::Handle<v8::Value> jsEvent)
@@ -201,8 +184,8 @@
v8::Local<v8::Object> V8AbstractEventListener::getReceiverObject(Event* event)
{
- if (!m_listener.IsEmpty() && !m_listener->IsFunction())
- return v8::Local<v8::Object>::New(m_listener);
+ if (!m_listener.get().IsEmpty() && !m_listener.get()->IsFunction())
+ return v8::Local<v8::Object>::New(m_listener.get());
EventTarget* target = event->currentTarget();
v8::Handle<v8::Value> value = V8DOMWrapper::convertEventTargetToV8Object(target);
Modified: trunk/Source/WebCore/bindings/v8/V8AbstractEventListener.h (126520 => 126521)
--- trunk/Source/WebCore/bindings/v8/V8AbstractEventListener.h 2012-08-24 00:52:53 UTC (rev 126520)
+++ trunk/Source/WebCore/bindings/v8/V8AbstractEventListener.h 2012-08-24 01:02:28 UTC (rev 126521)
@@ -32,8 +32,8 @@
#define V8AbstractEventListener_h
#include "EventListener.h"
+#include "ScopedPersistent.h"
#include "WorldContextHandle.h"
-
#include <v8.h>
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
@@ -78,29 +78,26 @@
v8::Local<v8::Object> getListenerObject(ScriptExecutionContext* context)
{
prepareListenerObject(context);
- return v8::Local<v8::Object>::New(m_listener);
+ return v8::Local<v8::Object>::New(m_listener.get());
}
v8::Local<v8::Object> getExistingListenerObject()
{
- return v8::Local<v8::Object>::New(m_listener);
+ return v8::Local<v8::Object>::New(m_listener.get());
}
// Provides access to the underlying handle for GC. Returned
// value is a weak handle and so not guaranteed to stay alive.
v8::Persistent<v8::Object> existingListenerObjectPersistentHandle()
{
- return m_listener;
+ return m_listener.get();
}
bool hasExistingListenerObject()
{
- return !m_listener.IsEmpty();
+ return !m_listener.get().IsEmpty();
}
- // Dispose listener object and clear the handle.
- void disposeListenerObject();
-
const WorldContextHandle& worldContext() const { return m_worldContext; }
protected:
@@ -116,6 +113,8 @@
v8::Local<v8::Object> getReceiverObject(Event*);
private:
+ static void weakEventListenerCallback(v8::Persistent<v8::Value>, void* parameter);
+
// Implementation of EventListener function.
virtual bool virtualisAttribute() const { return m_isAttribute; }
@@ -123,7 +122,7 @@
virtual bool shouldPreventDefault(v8::Local<v8::Value> returnValue);
- v8::Persistent<v8::Object> m_listener;
+ ScopedPersistent<v8::Object> m_listener;
// Indicates if this is an HTML type listener.
bool m_isAttribute;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes