Diff
Modified: trunk/Source/WebCore/ChangeLog (140614 => 140615)
--- trunk/Source/WebCore/ChangeLog 2013-01-24 00:34:42 UTC (rev 140614)
+++ trunk/Source/WebCore/ChangeLog 2013-01-24 00:43:14 UTC (rev 140615)
@@ -1,3 +1,39 @@
+2013-01-23 Kentaro Hara <[email protected]>
+
+ [V8] Move V8DOMWrapper::getEventListener() to V8EventListerList
+ https://bugs.webkit.org/show_bug.cgi?id=107683
+
+ Reviewed by Adam Barth.
+
+ No tests. No change in behavior.
+
+ * bindings/scripts/CodeGeneratorV8.pm:
+ (GenerateNormalAttrSetter):
+ (GenerateEventListenerCallback):
+ * bindings/scripts/test/V8/V8TestEventTarget.cpp:
+ (WebCore::TestEventTargetV8Internal::addEventListenerCallback):
+ (WebCore::TestEventTargetV8Internal::removeEventListenerCallback):
+ * bindings/scripts/test/V8/V8TestObj.cpp:
+ (WebCore::TestObjV8Internal::addEventListenerCallback):
+ (WebCore::TestObjV8Internal::removeEventListenerCallback):
+ * bindings/v8/V8DOMWrapper.cpp:
+ * bindings/v8/V8DOMWrapper.h:
+ (V8DOMWrapper):
+ * bindings/v8/V8EventListenerList.cpp:
+ (WebCore::V8EventListenerList::getEventListener):
+ (WebCore):
+ * bindings/v8/V8EventListenerList.h:
+ (WebCore):
+ (V8EventListenerList):
+ (WebCore::V8EventListenerList::findWrapper):
+ (WebCore::V8EventListenerList::clearWrapper):
+ (WebCore::V8EventListenerList::doFindWrapper):
+ (WebCore::V8EventListenerList::getHiddenProperty):
+ (WebCore::V8EventListenerList::findOrCreateWrapper):
+ * bindings/v8/custom/V8DOMWindowCustom.cpp:
+ (WebCore::V8DOMWindow::addEventListenerCallback):
+ (WebCore::V8DOMWindow::removeEventListenerCallback):
+
2013-01-23 Dominic Mazzoni <[email protected]>
AX: AXObjectCache should be initialized with topDocument
Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm (140614 => 140615)
--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm 2013-01-24 00:34:42 UTC (rev 140614)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm 2013-01-24 00:43:14 UTC (rev 140615)
@@ -1264,16 +1264,15 @@
if (!$codeGenerator->IsSubType($interface, "Node")) {
push(@implContentDecls, " transferHiddenDependency(info.Holder(), imp->$attrName(), value, ${v8InterfaceName}::eventListenerCacheIndex);\n");
}
+ AddToImplIncludes("V8EventListenerList.h");
if ($interfaceName eq "WorkerContext" and $attribute->signature->name eq "onerror") {
- AddToImplIncludes("V8EventListenerList.h");
AddToImplIncludes("V8WorkerContextErrorHandler.h");
push(@implContentDecls, " imp->set$implSetterFunctionName(V8EventListenerList::findOrCreateWrapper<V8WorkerContextErrorHandler>(value, true)");
} elsif ($interfaceName eq "DOMWindow" and $attribute->signature->name eq "onerror") {
- AddToImplIncludes("V8EventListenerList.h");
AddToImplIncludes("V8WindowErrorHandler.h");
push(@implContentDecls, " imp->set$implSetterFunctionName(V8EventListenerList::findOrCreateWrapper<V8WindowErrorHandler>(value, true)");
} else {
- push(@implContentDecls, " imp->set$implSetterFunctionName(V8DOMWrapper::getEventListener(value, true, ListenerFindOrCreate)");
+ push(@implContentDecls, " imp->set$implSetterFunctionName(V8EventListenerList::getEventListener(value, true, ListenerFindOrCreate)");
}
push(@implContentDecls, ", ec") if $useExceptions;
push(@implContentDecls, ");\n");
@@ -1353,11 +1352,12 @@
my $lookupType = ($functionName eq "add") ? "OrCreate" : "Only";
my $passRefPtrHandling = ($functionName eq "add") ? "" : ".get()";
my $hiddenDependencyAction = ($functionName eq "add") ? "create" : "remove";
-
+
+ AddToImplIncludes("V8EventListenerList.h");
push(@implContentDecls, <<END);
static v8::Handle<v8::Value> ${functionName}EventListenerCallback(const v8::Arguments& args)
{
- RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFind${lookupType});
+ RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFind${lookupType});
if (listener) {
V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]);
V8${interfaceName}::toNative(args.Holder())->${functionName}EventListener(stringResource, listener${passRefPtrHandling}, args[2]->BooleanValue());
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp (140614 => 140615)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp 2013-01-24 00:34:42 UTC (rev 140614)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp 2013-01-24 00:43:14 UTC (rev 140615)
@@ -30,6 +30,7 @@
#include "V8Collection.h"
#include "V8DOMWrapper.h"
#include "V8Event.h"
+#include "V8EventListenerList.h"
#include "V8Node.h"
#include <wtf/UnusedParam.h>
@@ -61,7 +62,7 @@
static v8::Handle<v8::Value> addEventListenerCallback(const v8::Arguments& args)
{
- RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFindOrCreate);
+ RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOrCreate);
if (listener) {
V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]);
V8TestEventTarget::toNative(args.Holder())->addEventListener(stringResource, listener, args[2]->BooleanValue());
@@ -72,7 +73,7 @@
static v8::Handle<v8::Value> removeEventListenerCallback(const v8::Arguments& args)
{
- RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFindOnly);
+ RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOnly);
if (listener) {
V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]);
V8TestEventTarget::toNative(args.Holder())->removeEventListener(stringResource, listener.get(), args[2]->BooleanValue());
Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp (140614 => 140615)
--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp 2013-01-24 00:34:42 UTC (rev 140614)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp 2013-01-24 00:43:14 UTC (rev 140615)
@@ -41,6 +41,7 @@
#include "V8DOMStringList.h"
#include "V8DOMWrapper.h"
#include "V8Document.h"
+#include "V8EventListenerList.h"
#include "V8Float32Array.h"
#include "V8Node.h"
#include "V8SVGDocument.h"
@@ -1069,7 +1070,7 @@
static v8::Handle<v8::Value> addEventListenerCallback(const v8::Arguments& args)
{
- RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFindOrCreate);
+ RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOrCreate);
if (listener) {
V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]);
V8TestObj::toNative(args.Holder())->addEventListener(stringResource, listener, args[2]->BooleanValue());
@@ -1080,7 +1081,7 @@
static v8::Handle<v8::Value> removeEventListenerCallback(const v8::Arguments& args)
{
- RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFindOnly);
+ RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOnly);
if (listener) {
V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]);
V8TestObj::toNative(args.Holder())->removeEventListener(stringResource, listener.get(), args[2]->BooleanValue());
Modified: trunk/Source/WebCore/bindings/v8/V8DOMWrapper.cpp (140614 => 140615)
--- trunk/Source/WebCore/bindings/v8/V8DOMWrapper.cpp 2013-01-24 00:34:42 UTC (rev 140614)
+++ trunk/Source/WebCore/bindings/v8/V8DOMWrapper.cpp 2013-01-24 00:43:14 UTC (rev 140615)
@@ -33,13 +33,11 @@
#include "V8Binding.h"
#include "V8DOMWindow.h"
-#include "V8EventListenerList.h"
#include "V8HTMLCollection.h"
#include "V8HTMLDocument.h"
#include "V8HiddenPropertyName.h"
#include "V8ObjectConstructor.h"
#include "V8PerContextData.h"
-#include "V8WorkerContextEventListener.h"
namespace WebCore {
@@ -130,20 +128,4 @@
return typeInfo == type;
}
-PassRefPtr<EventListener> V8DOMWrapper::getEventListener(v8::Local<v8::Value> value, bool isAttribute, ListenerLookupType lookup)
-{
- v8::Handle<v8::Context> context = v8::Context::GetCurrent();
- if (context.IsEmpty())
- return 0;
- if (lookup == ListenerFindOnly)
- return V8EventListenerList::findWrapper(value, isAttribute);
- if (isWrapperOfType(toInnerGlobalObject(context), &V8DOMWindow::info))
- return V8EventListenerList::findOrCreateWrapper<V8EventListener>(value, isAttribute);
-#if ENABLE(WORKERS)
- return V8EventListenerList::findOrCreateWrapper<V8WorkerContextEventListener>(value, isAttribute);
-#else
- return 0;
-#endif
-}
-
} // namespace WebCore
Modified: trunk/Source/WebCore/bindings/v8/V8DOMWrapper.h (140614 => 140615)
--- trunk/Source/WebCore/bindings/v8/V8DOMWrapper.h 2013-01-24 00:34:42 UTC (rev 140614)
+++ trunk/Source/WebCore/bindings/v8/V8DOMWrapper.h 2013-01-24 00:43:14 UTC (rev 140615)
@@ -46,11 +46,6 @@
namespace WebCore {
- enum ListenerLookupType {
- ListenerFindOnly,
- ListenerFindOrCreate,
- };
-
class V8DOMWrapper {
public:
#ifndef NDEBUG
@@ -67,9 +62,6 @@
static inline void setWrapperClass(void*, v8::Persistent<v8::Object>);
static inline void setWrapperClass(Node*, v8::Persistent<v8::Object>);
- // FIXME: This function should probably move to V8EventListenerList.h
- static PassRefPtr<EventListener> getEventListener(v8::Local<v8::Value>, bool isAttribute, ListenerLookupType);
-
static bool isWrapperOfType(v8::Handle<v8::Value>, WrapperTypeInfo*);
// FIXME: Why is this function in V8DOMWrapper?
Modified: trunk/Source/WebCore/bindings/v8/V8EventListenerList.cpp (140614 => 140615)
--- trunk/Source/WebCore/bindings/v8/V8EventListenerList.cpp 2013-01-24 00:34:42 UTC (rev 140614)
+++ trunk/Source/WebCore/bindings/v8/V8EventListenerList.cpp 2013-01-24 00:43:14 UTC (rev 140615)
@@ -31,6 +31,26 @@
#include "config.h"
#include "V8EventListenerList.h"
+#include "V8Binding.h"
+#include "V8DOMWindow.h"
+#include "V8WorkerContextEventListener.h"
+
namespace WebCore {
+PassRefPtr<EventListener> V8EventListenerList::getEventListener(v8::Local<v8::Value> value, bool isAttribute, ListenerLookupType lookup)
+{
+ v8::Handle<v8::Context> context = v8::Context::GetCurrent();
+ if (context.IsEmpty())
+ return 0;
+ if (lookup == ListenerFindOnly)
+ return V8EventListenerList::findWrapper(value, isAttribute);
+ if (V8DOMWrapper::isWrapperOfType(toInnerGlobalObject(context), &V8DOMWindow::info))
+ return V8EventListenerList::findOrCreateWrapper<V8EventListener>(value, isAttribute);
+#if ENABLE(WORKERS)
+ return V8EventListenerList::findOrCreateWrapper<V8WorkerContextEventListener>(value, isAttribute);
+#else
+ return 0;
+#endif
+}
+
} // namespace WebCore
Modified: trunk/Source/WebCore/bindings/v8/V8EventListenerList.h (140614 => 140615)
--- trunk/Source/WebCore/bindings/v8/V8EventListenerList.h 2013-01-24 00:34:42 UTC (rev 140614)
+++ trunk/Source/WebCore/bindings/v8/V8EventListenerList.h 2013-01-24 00:43:14 UTC (rev 140615)
@@ -38,68 +38,76 @@
#include <wtf/PassRefPtr.h>
namespace WebCore {
- class Frame;
- // This is a container for V8EventListener objects that uses hidden properties of v8::Object to speed up lookups.
- class V8EventListenerList {
- public:
- static PassRefPtr<V8EventListener> findWrapper(v8::Local<v8::Value> value, bool isAttribute)
- {
- ASSERT(v8::Context::InContext());
- if (!value->IsObject())
- return 0;
+class Frame;
- v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute);
- return doFindWrapper(v8::Local<v8::Object>::Cast(value), wrapperProperty);
- }
+enum ListenerLookupType {
+ ListenerFindOnly,
+ ListenerFindOrCreate,
+};
- template<typename WrapperType>
- static PassRefPtr<V8EventListener> findOrCreateWrapper(v8::Local<v8::Value>, bool isAttribute);
+// This is a container for V8EventListener objects that uses hidden properties of v8::Object to speed up lookups.
+class V8EventListenerList {
+public:
+ static PassRefPtr<V8EventListener> findWrapper(v8::Local<v8::Value> value, bool isAttribute)
+ {
+ ASSERT(v8::Context::InContext());
+ if (!value->IsObject())
+ return 0;
- static void clearWrapper(v8::Handle<v8::Object> listenerObject, bool isAttribute)
- {
- v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute);
- listenerObject->DeleteHiddenValue(wrapperProperty);
- }
+ v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute);
+ return doFindWrapper(v8::Local<v8::Object>::Cast(value), wrapperProperty);
+ }
- private:
- static V8EventListener* doFindWrapper(v8::Local<v8::Object> object, v8::Handle<v8::String> wrapperProperty)
- {
- ASSERT(v8::Context::InContext());
- v8::HandleScope scope;
- v8::Local<v8::Value> listener = object->GetHiddenValue(wrapperProperty);
- if (listener.IsEmpty())
- return 0;
- return static_cast<V8EventListener*>(v8::External::Cast(*listener)->Value());
- }
+ template<typename WrapperType>
+ static PassRefPtr<V8EventListener> findOrCreateWrapper(v8::Local<v8::Value>, bool isAttribute);
- static inline v8::Handle<v8::String> getHiddenProperty(bool isAttribute)
- {
- return isAttribute ? V8HiddenPropertyName::attributeListener() : V8HiddenPropertyName::listener();
- }
- };
+ static void clearWrapper(v8::Handle<v8::Object> listenerObject, bool isAttribute)
+ {
+ v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute);
+ listenerObject->DeleteHiddenValue(wrapperProperty);
+ }
- template<typename WrapperType>
- PassRefPtr<V8EventListener> V8EventListenerList::findOrCreateWrapper(v8::Local<v8::Value> value, bool isAttribute)
+ static PassRefPtr<EventListener> getEventListener(v8::Local<v8::Value>, bool isAttribute, ListenerLookupType);
+
+private:
+ static V8EventListener* doFindWrapper(v8::Local<v8::Object> object, v8::Handle<v8::String> wrapperProperty)
{
ASSERT(v8::Context::InContext());
- if (!value->IsObject())
+ v8::HandleScope scope;
+ v8::Local<v8::Value> listener = object->GetHiddenValue(wrapperProperty);
+ if (listener.IsEmpty())
return 0;
+ return static_cast<V8EventListener*>(v8::External::Cast(*listener)->Value());
+ }
- v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value);
- v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute);
+ static inline v8::Handle<v8::String> getHiddenProperty(bool isAttribute)
+ {
+ return isAttribute ? V8HiddenPropertyName::attributeListener() : V8HiddenPropertyName::listener();
+ }
+};
- V8EventListener* wrapper = doFindWrapper(object, wrapperProperty);
- if (wrapper)
- return wrapper;
+template<typename WrapperType>
+PassRefPtr<V8EventListener> V8EventListenerList::findOrCreateWrapper(v8::Local<v8::Value> value, bool isAttribute)
+{
+ ASSERT(v8::Context::InContext());
+ if (!value->IsObject())
+ return 0;
- PassRefPtr<V8EventListener> wrapperPtr = WrapperType::create(object, isAttribute, WorldContextHandle(UseCurrentWorld));
- if (wrapperPtr)
- object->SetHiddenValue(wrapperProperty, v8::External::New(wrapperPtr.get()));
+ v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value);
+ v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute);
- return wrapperPtr;
- }
+ V8EventListener* wrapper = doFindWrapper(object, wrapperProperty);
+ if (wrapper)
+ return wrapper;
+ RefPtr<V8EventListener> wrapperPtr = WrapperType::create(object, isAttribute, WorldContextHandle(UseCurrentWorld));
+ if (wrapperPtr)
+ object->SetHiddenValue(wrapperProperty, v8::External::New(wrapperPtr.get()));
+
+ return wrapperPtr;
+}
+
} // namespace WebCore
#endif // V8EventListenerList_h
Modified: trunk/Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp (140614 => 140615)
--- trunk/Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp 2013-01-24 00:34:42 UTC (rev 140614)
+++ trunk/Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp 2013-01-24 00:43:14 UTC (rev 140615)
@@ -56,6 +56,7 @@
#include "Storage.h"
#include "V8Binding.h"
#include "V8EventListener.h"
+#include "V8EventListenerList.h"
#include "V8GCForContextDispose.h"
#include "V8HiddenPropertyName.h"
#include "V8HTMLCollection.h"
@@ -244,7 +245,7 @@
if (!imp->frame())
return v8::Undefined();
- RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFindOrCreate);
+ RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOrCreate);
if (listener) {
imp->addEventListener(eventType, listener, useCapture);
@@ -273,7 +274,7 @@
if (!imp->frame())
return v8::Undefined();
- RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFindOnly);
+ RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOnly);
if (listener) {
imp->removeEventListener(eventType, listener.get(), useCapture);