Changeset 46091 in webkit
- Timestamp:
- Jul 18, 2009 8:02:30 AM (15 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r46089 r46091 1 2009-07-18 Adam Barth <abarth@webkit.org> 2 3 Reviewed by Darin Fisher. 4 5 [V8] Move event listener methods from V8Proxy to V8EventListenerList 6 https://bugs.webkit.org/show_bug.cgi?id=27408 7 8 Move some event listener code out of V8Proxy and into the event 9 listener list. 10 11 I'd like to remove these methods from V8Proxy entirely and just expose 12 getters for the lists themselves, but I'll do that in a follow up 13 patch. 14 15 * bindings/v8/V8EventListenerList.cpp: 16 (WebCore::V8EventListenerList::findWrapper): 17 * bindings/v8/V8EventListenerList.h: 18 (WebCore::V8EventListenerList::findOrCreateWrapper): 19 * bindings/v8/V8ObjectEventListener.cpp: 20 * bindings/v8/V8Proxy.cpp: 21 (WebCore::V8Proxy::findV8EventListener): 22 (WebCore::V8Proxy::findOrCreateV8EventListener): 23 (WebCore::V8Proxy::removeV8EventListener): 24 (WebCore::V8Proxy::findObjectEventListener): 25 (WebCore::V8Proxy::findOrCreateObjectEventListener): 26 (WebCore::V8Proxy::removeObjectEventListener): 27 * bindings/v8/V8Proxy.h: 28 1 29 2009-07-18 Jeremy Orlow <jorlow@chromium.org> 2 30 -
trunk/WebCore/bindings/v8/V8EventListenerList.cpp
r43348 r46091 183 183 } 184 184 185 PassRefPtr<V8EventListener> V8EventListenerList::findWrapper(v8::Local<v8::Value> object, bool isAttribute) 186 { 187 ASSERT(v8::Context::InContext()); 188 if (!object->IsObject()) 189 return 0; 190 191 // FIXME: Should this be v8::Local<v8::Object>::Cast instead? 192 return find(object->ToObject(), isAttribute); 193 } 194 185 195 } // namespace WebCore -
trunk/WebCore/bindings/v8/V8EventListenerList.h
r43277 r46091 36 36 #include <wtf/HashMap.h> 37 37 38 #include "PassRefPtr.h" 39 38 40 namespace WebCore { 41 class Frame; 39 42 class V8EventListener; 40 43 class V8EventListenerListIterator; … … 68 71 size_t size() { return m_table.size(); } 69 72 73 PassRefPtr<V8EventListener> findWrapper(v8::Local<v8::Value>, bool isAttribute); 74 template<typename WrapperType> 75 PassRefPtr<V8EventListener> findOrCreateWrapper(Frame*, v8::Local<v8::Value>, bool isAttribute); 76 70 77 private: 71 78 ListenerMultiMap m_table; … … 94 101 }; 95 102 103 template<typename WrapperType> 104 PassRefPtr<V8EventListener> V8EventListenerList::findOrCreateWrapper(Frame* frame, v8::Local<v8::Value> object, bool isAttribute) 105 { 106 ASSERT(v8::Context::InContext()); 107 if (!object->IsObject()) 108 return 0; 109 110 // FIXME: Should this be v8::Local<v8::Object>::Cast instead? 111 V8EventListener* wrapper = find(object->ToObject(), isAttribute); 112 if (wrapper) 113 return wrapper; 114 115 // Create a new one, and add to cache. 116 RefPtr<WrapperType> newListener = WrapperType::create(frame, v8::Local<v8::Object>::Cast(object), isAttribute); 117 add(newListener.get()); 118 119 return newListener; 120 }; 121 96 122 } // namespace WebCore 97 123 -
trunk/WebCore/bindings/v8/V8ObjectEventListener.cpp
r45288 r46091 55 55 } 56 56 57 // Object event listeners (such as XmlHttpRequest and MessagePort) are 58 // different from listeners on DOM nodes. An object event listener wrapper 59 // only holds a weak reference to the JS function. A strong reference can 60 // create a cycle. 61 // 62 // The lifetime of these objects is bounded by the life time of its JS 63 // wrapper. So we can create a hidden reference from the JS wrapper to 64 // to its JS function. 65 // 66 // (map) 67 // XHR <---------- JS_wrapper 68 // | (hidden) : ^ 69 // V V : (may reachable by closure) 70 // V8_listener --------> JS_function 71 // (weak) <-- may create a cycle if it is strong 72 // 73 // The persistent reference is made weak in the constructor 74 // of V8ObjectEventListener. 75 57 76 V8ObjectEventListener::V8ObjectEventListener(Frame* frame, v8::Local<v8::Object> listener, bool isInline) 58 77 : V8EventListener(frame, listener, isInline) -
trunk/WebCore/bindings/v8/V8Proxy.cpp
r46073 r46091 362 362 } 363 363 364 365 // Event listeners 366 367 static V8EventListener* findEventListenerInList(V8EventListenerList& list, v8::Local<v8::Value> listener, bool isInline) 368 { 369 ASSERT(v8::Context::InContext()); 370 371 if (!listener->IsObject()) 372 return 0; 373 374 return list.find(listener->ToObject(), isInline); 375 } 376 377 // Find an existing wrapper for a JS event listener in the map. 378 PassRefPtr<V8EventListener> V8Proxy::findV8EventListener(v8::Local<v8::Value> listener, bool isInline) 379 { 380 return findEventListenerInList(m_eventListeners, listener, isInline); 381 } 382 383 PassRefPtr<V8EventListener> V8Proxy::findOrCreateV8EventListener(v8::Local<v8::Value> object, bool isInline) 384 { 385 ASSERT(v8::Context::InContext()); 386 387 if (!object->IsObject()) 388 return 0; 389 390 V8EventListener* wrapper = findEventListenerInList(m_eventListeners, object, isInline); 391 if (wrapper) 392 return wrapper; 393 394 // Create a new one, and add to cache. 395 RefPtr<V8EventListener> newListener = V8EventListener::create(m_frame, v8::Local<v8::Object>::Cast(object), isInline); 396 m_eventListeners.add(newListener.get()); 397 398 return newListener; 399 } 400 401 // Object event listeners (such as XmlHttpRequest and MessagePort) are 402 // different from listeners on DOM nodes. An object event listener wrapper 403 // only holds a weak reference to the JS function. A strong reference can 404 // create a cycle. 405 // 406 // The lifetime of these objects is bounded by the life time of its JS 407 // wrapper. So we can create a hidden reference from the JS wrapper to 408 // to its JS function. 409 // 410 // (map) 411 // XHR <---------- JS_wrapper 412 // | (hidden) : ^ 413 // V V : (may reachable by closure) 414 // V8_listener --------> JS_function 415 // (weak) <-- may create a cycle if it is strong 416 // 417 // The persistent reference is made weak in the constructor 418 // of V8ObjectEventListener. 419 420 PassRefPtr<V8EventListener> V8Proxy::findObjectEventListener( v8::Local<v8::Value> listener, bool isInline) 421 { 422 return findEventListenerInList(m_xhrListeners, listener, isInline); 423 } 424 425 PassRefPtr<V8EventListener> V8Proxy::findOrCreateObjectEventListener(v8::Local<v8::Value> object, bool isInline) 426 { 427 ASSERT(v8::Context::InContext()); 428 429 if (!object->IsObject()) 430 return 0; 431 432 V8EventListener* wrapper = findEventListenerInList(m_xhrListeners, object, isInline); 433 if (wrapper) 434 return wrapper; 435 436 // Create a new one, and add to cache. 437 RefPtr<V8EventListener> newListener = V8ObjectEventListener::create(m_frame, v8::Local<v8::Object>::Cast(object), isInline); 438 m_xhrListeners.add(newListener.get()); 439 440 return newListener.release(); 441 } 442 443 444 static void removeEventListenerFromList(V8EventListenerList& list, V8EventListener* listener) 445 { 446 list.remove(listener); 364 PassRefPtr<V8EventListener> V8Proxy::findV8EventListener(v8::Local<v8::Value> object, bool isAttribute) 365 { 366 return m_eventListeners.findWrapper(object, isAttribute); 367 } 368 369 PassRefPtr<V8EventListener> V8Proxy::findOrCreateV8EventListener(v8::Local<v8::Value> object, bool isAttribute) 370 { 371 return m_eventListeners.findOrCreateWrapper<V8EventListener>(m_frame, object, isAttribute); 447 372 } 448 373 449 374 void V8Proxy::removeV8EventListener(V8EventListener* listener) 450 375 { 451 removeEventListenerFromList(m_eventListeners, listener); 452 } 453 376 m_eventListeners.remove(listener); 377 } 378 379 PassRefPtr<V8EventListener> V8Proxy::findObjectEventListener( v8::Local<v8::Value> object, bool isAttribute) 380 { 381 return m_xhrListeners.findWrapper(object, isAttribute); 382 } 383 384 PassRefPtr<V8EventListener> V8Proxy::findOrCreateObjectEventListener(v8::Local<v8::Value> object, bool isAttribute) 385 { 386 return m_xhrListeners.findOrCreateWrapper<V8ObjectEventListener>(m_frame, object, isAttribute); 387 } 454 388 455 389 void V8Proxy::removeObjectEventListener(V8ObjectEventListener* listener) 456 390 { 457 removeEventListenerFromList(m_xhrListeners,listener);391 m_xhrListeners.remove(listener); 458 392 } 459 393 … … 468 402 } 469 403 470 471 404 void V8Proxy::disconnectEventListeners() 472 405 { … … 474 407 disconnectEventListenersInList(m_xhrListeners); 475 408 } 476 477 409 478 410 v8::Handle<v8::Script> V8Proxy::compileScript(v8::Handle<v8::String> code, const String& fileName, int baseLine) -
trunk/WebCore/bindings/v8/V8Proxy.h
r45928 r46091 197 197 bool isEnabled(); 198 198 199 // F ind/Create/Remove event listener wrappers.199 // FIXME: Replace these APIs with a getter for m_eventListeners 200 200 PassRefPtr<V8EventListener> findV8EventListener(v8::Local<v8::Value> listener, bool isHtml); 201 201 PassRefPtr<V8EventListener> findOrCreateV8EventListener(v8::Local<v8::Value> listener, bool isHtml); 202 202 void removeV8EventListener(V8EventListener*); 203 204 // FIXME: Replace these APIs with a getter for m_xhrListeners 203 205 PassRefPtr<V8EventListener> findObjectEventListener(v8::Local<v8::Value> listener, bool isHtml); 204 206 PassRefPtr<V8EventListener> findOrCreateObjectEventListener(v8::Local<v8::Value> listener, bool isHtml); 205 206 void removeV8EventListener(V8EventListener*);207 207 void removeObjectEventListener(V8ObjectEventListener*); 208 208
Note: See TracChangeset
for help on using the changeset viewer.