Changeset 140615 in webkit
- Timestamp:
- Jan 23, 2013 4:43:14 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r140614 r140615 1 2013-01-23 Kentaro Hara <haraken@chromium.org> 2 3 [V8] Move V8DOMWrapper::getEventListener() to V8EventListerList 4 https://bugs.webkit.org/show_bug.cgi?id=107683 5 6 Reviewed by Adam Barth. 7 8 No tests. No change in behavior. 9 10 * bindings/scripts/CodeGeneratorV8.pm: 11 (GenerateNormalAttrSetter): 12 (GenerateEventListenerCallback): 13 * bindings/scripts/test/V8/V8TestEventTarget.cpp: 14 (WebCore::TestEventTargetV8Internal::addEventListenerCallback): 15 (WebCore::TestEventTargetV8Internal::removeEventListenerCallback): 16 * bindings/scripts/test/V8/V8TestObj.cpp: 17 (WebCore::TestObjV8Internal::addEventListenerCallback): 18 (WebCore::TestObjV8Internal::removeEventListenerCallback): 19 * bindings/v8/V8DOMWrapper.cpp: 20 * bindings/v8/V8DOMWrapper.h: 21 (V8DOMWrapper): 22 * bindings/v8/V8EventListenerList.cpp: 23 (WebCore::V8EventListenerList::getEventListener): 24 (WebCore): 25 * bindings/v8/V8EventListenerList.h: 26 (WebCore): 27 (V8EventListenerList): 28 (WebCore::V8EventListenerList::findWrapper): 29 (WebCore::V8EventListenerList::clearWrapper): 30 (WebCore::V8EventListenerList::doFindWrapper): 31 (WebCore::V8EventListenerList::getHiddenProperty): 32 (WebCore::V8EventListenerList::findOrCreateWrapper): 33 * bindings/v8/custom/V8DOMWindowCustom.cpp: 34 (WebCore::V8DOMWindow::addEventListenerCallback): 35 (WebCore::V8DOMWindow::removeEventListenerCallback): 36 1 37 2013-01-23 Dominic Mazzoni <dmazzoni@google.com> 2 38 -
trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm
r140514 r140615 1265 1265 push(@implContentDecls, " transferHiddenDependency(info.Holder(), imp->$attrName(), value, ${v8InterfaceName}::eventListenerCacheIndex);\n"); 1266 1266 } 1267 AddToImplIncludes("V8EventListenerList.h"); 1267 1268 if ($interfaceName eq "WorkerContext" and $attribute->signature->name eq "onerror") { 1268 AddToImplIncludes("V8EventListenerList.h");1269 1269 AddToImplIncludes("V8WorkerContextErrorHandler.h"); 1270 1270 push(@implContentDecls, " imp->set$implSetterFunctionName(V8EventListenerList::findOrCreateWrapper<V8WorkerContextErrorHandler>(value, true)"); 1271 1271 } elsif ($interfaceName eq "DOMWindow" and $attribute->signature->name eq "onerror") { 1272 AddToImplIncludes("V8EventListenerList.h");1273 1272 AddToImplIncludes("V8WindowErrorHandler.h"); 1274 1273 push(@implContentDecls, " imp->set$implSetterFunctionName(V8EventListenerList::findOrCreateWrapper<V8WindowErrorHandler>(value, true)"); 1275 1274 } else { 1276 push(@implContentDecls, " imp->set$implSetterFunctionName(V8 DOMWrapper::getEventListener(value, true, ListenerFindOrCreate)");1275 push(@implContentDecls, " imp->set$implSetterFunctionName(V8EventListenerList::getEventListener(value, true, ListenerFindOrCreate)"); 1277 1276 } 1278 1277 push(@implContentDecls, ", ec") if $useExceptions; … … 1354 1353 my $passRefPtrHandling = ($functionName eq "add") ? "" : ".get()"; 1355 1354 my $hiddenDependencyAction = ($functionName eq "add") ? "create" : "remove"; 1356 1355 1356 AddToImplIncludes("V8EventListenerList.h"); 1357 1357 push(@implContentDecls, <<END); 1358 1358 static v8::Handle<v8::Value> ${functionName}EventListenerCallback(const v8::Arguments& args) 1359 1359 { 1360 RefPtr<EventListener> listener = V8 DOMWrapper::getEventListener(args[1], false, ListenerFind${lookupType});1360 RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFind${lookupType}); 1361 1361 if (listener) { 1362 1362 V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]); -
trunk/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp
r138665 r140615 31 31 #include "V8DOMWrapper.h" 32 32 #include "V8Event.h" 33 #include "V8EventListenerList.h" 33 34 #include "V8Node.h" 34 35 #include <wtf/UnusedParam.h> … … 62 63 static v8::Handle<v8::Value> addEventListenerCallback(const v8::Arguments& args) 63 64 { 64 RefPtr<EventListener> listener = V8 DOMWrapper::getEventListener(args[1], false, ListenerFindOrCreate);65 RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOrCreate); 65 66 if (listener) { 66 67 V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]); … … 73 74 static v8::Handle<v8::Value> removeEventListenerCallback(const v8::Arguments& args) 74 75 { 75 RefPtr<EventListener> listener = V8 DOMWrapper::getEventListener(args[1], false, ListenerFindOnly);76 RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOnly); 76 77 if (listener) { 77 78 V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]); -
trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp
r140514 r140615 42 42 #include "V8DOMWrapper.h" 43 43 #include "V8Document.h" 44 #include "V8EventListenerList.h" 44 45 #include "V8Float32Array.h" 45 46 #include "V8Node.h" … … 1070 1071 static v8::Handle<v8::Value> addEventListenerCallback(const v8::Arguments& args) 1071 1072 { 1072 RefPtr<EventListener> listener = V8 DOMWrapper::getEventListener(args[1], false, ListenerFindOrCreate);1073 RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOrCreate); 1073 1074 if (listener) { 1074 1075 V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]); … … 1081 1082 static v8::Handle<v8::Value> removeEventListenerCallback(const v8::Arguments& args) 1082 1083 { 1083 RefPtr<EventListener> listener = V8 DOMWrapper::getEventListener(args[1], false, ListenerFindOnly);1084 RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOnly); 1084 1085 if (listener) { 1085 1086 V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<WithNullCheck>, stringResource, args[0]); -
trunk/Source/WebCore/bindings/v8/V8DOMWrapper.cpp
r138682 r140615 34 34 #include "V8Binding.h" 35 35 #include "V8DOMWindow.h" 36 #include "V8EventListenerList.h"37 36 #include "V8HTMLCollection.h" 38 37 #include "V8HTMLDocument.h" … … 40 39 #include "V8ObjectConstructor.h" 41 40 #include "V8PerContextData.h" 42 #include "V8WorkerContextEventListener.h"43 41 44 42 namespace WebCore { … … 131 129 } 132 130 133 PassRefPtr<EventListener> V8DOMWrapper::getEventListener(v8::Local<v8::Value> value, bool isAttribute, ListenerLookupType lookup)134 {135 v8::Handle<v8::Context> context = v8::Context::GetCurrent();136 if (context.IsEmpty())137 return 0;138 if (lookup == ListenerFindOnly)139 return V8EventListenerList::findWrapper(value, isAttribute);140 if (isWrapperOfType(toInnerGlobalObject(context), &V8DOMWindow::info))141 return V8EventListenerList::findOrCreateWrapper<V8EventListener>(value, isAttribute);142 #if ENABLE(WORKERS)143 return V8EventListenerList::findOrCreateWrapper<V8WorkerContextEventListener>(value, isAttribute);144 #else145 return 0;146 #endif147 }148 149 131 } // namespace WebCore -
trunk/Source/WebCore/bindings/v8/V8DOMWrapper.h
r140302 r140615 47 47 namespace WebCore { 48 48 49 enum ListenerLookupType {50 ListenerFindOnly,51 ListenerFindOrCreate,52 };53 54 49 class V8DOMWrapper { 55 50 public: … … 67 62 static inline void setWrapperClass(void*, v8::Persistent<v8::Object>); 68 63 static inline void setWrapperClass(Node*, v8::Persistent<v8::Object>); 69 70 // FIXME: This function should probably move to V8EventListenerList.h71 static PassRefPtr<EventListener> getEventListener(v8::Local<v8::Value>, bool isAttribute, ListenerLookupType);72 64 73 65 static bool isWrapperOfType(v8::Handle<v8::Value>, WrapperTypeInfo*); -
trunk/Source/WebCore/bindings/v8/V8EventListenerList.cpp
r95901 r140615 32 32 #include "V8EventListenerList.h" 33 33 34 #include "V8Binding.h" 35 #include "V8DOMWindow.h" 36 #include "V8WorkerContextEventListener.h" 37 34 38 namespace WebCore { 35 39 40 PassRefPtr<EventListener> V8EventListenerList::getEventListener(v8::Local<v8::Value> value, bool isAttribute, ListenerLookupType lookup) 41 { 42 v8::Handle<v8::Context> context = v8::Context::GetCurrent(); 43 if (context.IsEmpty()) 44 return 0; 45 if (lookup == ListenerFindOnly) 46 return V8EventListenerList::findWrapper(value, isAttribute); 47 if (V8DOMWrapper::isWrapperOfType(toInnerGlobalObject(context), &V8DOMWindow::info)) 48 return V8EventListenerList::findOrCreateWrapper<V8EventListener>(value, isAttribute); 49 #if ENABLE(WORKERS) 50 return V8EventListenerList::findOrCreateWrapper<V8WorkerContextEventListener>(value, isAttribute); 51 #else 52 return 0; 53 #endif 54 } 55 36 56 } // namespace WebCore -
trunk/Source/WebCore/bindings/v8/V8EventListenerList.h
r134811 r140615 39 39 40 40 namespace WebCore { 41 class Frame;42 41 43 // This is a container for V8EventListener objects that uses hidden properties of v8::Object to speed up lookups. 44 class V8EventListenerList { 45 public: 46 static PassRefPtr<V8EventListener> findWrapper(v8::Local<v8::Value> value, bool isAttribute) 47 { 48 ASSERT(v8::Context::InContext()); 49 if (!value->IsObject()) 50 return 0; 42 class Frame; 51 43 52 v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute); 53 return doFindWrapper(v8::Local<v8::Object>::Cast(value), wrapperProperty); 54 } 44 enum ListenerLookupType { 45 ListenerFindOnly, 46 ListenerFindOrCreate, 47 }; 55 48 56 template<typename WrapperType> 57 static PassRefPtr<V8EventListener> findOrCreateWrapper(v8::Local<v8::Value>, bool isAttribute); 58 59 static void clearWrapper(v8::Handle<v8::Object> listenerObject, bool isAttribute) 60 { 61 v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute); 62 listenerObject->DeleteHiddenValue(wrapperProperty); 63 } 64 65 private: 66 static V8EventListener* doFindWrapper(v8::Local<v8::Object> object, v8::Handle<v8::String> wrapperProperty) 67 { 68 ASSERT(v8::Context::InContext()); 69 v8::HandleScope scope; 70 v8::Local<v8::Value> listener = object->GetHiddenValue(wrapperProperty); 71 if (listener.IsEmpty()) 72 return 0; 73 return static_cast<V8EventListener*>(v8::External::Cast(*listener)->Value()); 74 } 75 76 static inline v8::Handle<v8::String> getHiddenProperty(bool isAttribute) 77 { 78 return isAttribute ? V8HiddenPropertyName::attributeListener() : V8HiddenPropertyName::listener(); 79 } 80 }; 81 82 template<typename WrapperType> 83 PassRefPtr<V8EventListener> V8EventListenerList::findOrCreateWrapper(v8::Local<v8::Value> value, bool isAttribute) 49 // This is a container for V8EventListener objects that uses hidden properties of v8::Object to speed up lookups. 50 class V8EventListenerList { 51 public: 52 static PassRefPtr<V8EventListener> findWrapper(v8::Local<v8::Value> value, bool isAttribute) 84 53 { 85 54 ASSERT(v8::Context::InContext()); … … 87 56 return 0; 88 57 89 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value);90 58 v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute); 59 return doFindWrapper(v8::Local<v8::Object>::Cast(value), wrapperProperty); 60 } 91 61 92 V8EventListener* wrapper = doFindWrapper(object, wrapperProperty); 93 if (wrapper) 94 return wrapper; 62 template<typename WrapperType> 63 static PassRefPtr<V8EventListener> findOrCreateWrapper(v8::Local<v8::Value>, bool isAttribute); 95 64 96 PassRefPtr<V8EventListener> wrapperPtr = WrapperType::create(object, isAttribute, WorldContextHandle(UseCurrentWorld)); 97 if (wrapperPtr) 98 object->SetHiddenValue(wrapperProperty, v8::External::New(wrapperPtr.get())); 65 static void clearWrapper(v8::Handle<v8::Object> listenerObject, bool isAttribute) 66 { 67 v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute); 68 listenerObject->DeleteHiddenValue(wrapperProperty); 69 } 99 70 100 return wrapperPtr; 71 static PassRefPtr<EventListener> getEventListener(v8::Local<v8::Value>, bool isAttribute, ListenerLookupType); 72 73 private: 74 static V8EventListener* doFindWrapper(v8::Local<v8::Object> object, v8::Handle<v8::String> wrapperProperty) 75 { 76 ASSERT(v8::Context::InContext()); 77 v8::HandleScope scope; 78 v8::Local<v8::Value> listener = object->GetHiddenValue(wrapperProperty); 79 if (listener.IsEmpty()) 80 return 0; 81 return static_cast<V8EventListener*>(v8::External::Cast(*listener)->Value()); 101 82 } 83 84 static inline v8::Handle<v8::String> getHiddenProperty(bool isAttribute) 85 { 86 return isAttribute ? V8HiddenPropertyName::attributeListener() : V8HiddenPropertyName::listener(); 87 } 88 }; 89 90 template<typename WrapperType> 91 PassRefPtr<V8EventListener> V8EventListenerList::findOrCreateWrapper(v8::Local<v8::Value> value, bool isAttribute) 92 { 93 ASSERT(v8::Context::InContext()); 94 if (!value->IsObject()) 95 return 0; 96 97 v8::Local<v8::Object> object = v8::Local<v8::Object>::Cast(value); 98 v8::Handle<v8::String> wrapperProperty = getHiddenProperty(isAttribute); 99 100 V8EventListener* wrapper = doFindWrapper(object, wrapperProperty); 101 if (wrapper) 102 return wrapper; 103 104 RefPtr<V8EventListener> wrapperPtr = WrapperType::create(object, isAttribute, WorldContextHandle(UseCurrentWorld)); 105 if (wrapperPtr) 106 object->SetHiddenValue(wrapperProperty, v8::External::New(wrapperPtr.get())); 107 108 return wrapperPtr; 109 } 102 110 103 111 } // namespace WebCore -
trunk/Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp
r138677 r140615 57 57 #include "V8Binding.h" 58 58 #include "V8EventListener.h" 59 #include "V8EventListenerList.h" 59 60 #include "V8GCForContextDispose.h" 60 61 #include "V8HiddenPropertyName.h" … … 245 246 return v8::Undefined(); 246 247 247 RefPtr<EventListener> listener = V8 DOMWrapper::getEventListener(args[1], false, ListenerFindOrCreate);248 RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOrCreate); 248 249 249 250 if (listener) { … … 274 275 return v8::Undefined(); 275 276 276 RefPtr<EventListener> listener = V8 DOMWrapper::getEventListener(args[1], false, ListenerFindOnly);277 RefPtr<EventListener> listener = V8EventListenerList::getEventListener(args[1], false, ListenerFindOnly); 277 278 278 279 if (listener) {
Note: See TracChangeset
for help on using the changeset viewer.