Changeset 46091 in webkit


Ignore:
Timestamp:
Jul 18, 2009 8:02:30 AM (15 years ago)
Author:
abarth@webkit.org
Message:

2009-07-18 Adam Barth <abarth@webkit.org>

Reviewed by Darin Fisher.

[V8] Move event listener methods from V8Proxy to V8EventListenerList
https://bugs.webkit.org/show_bug.cgi?id=27408

Move some event listener code out of V8Proxy and into the event
listener list.

I'd like to remove these methods from V8Proxy entirely and just expose
getters for the lists themselves, but I'll do that in a follow up
patch.

  • bindings/v8/V8EventListenerList.cpp: (WebCore::V8EventListenerList::findWrapper):
  • bindings/v8/V8EventListenerList.h: (WebCore::V8EventListenerList::findOrCreateWrapper):
  • bindings/v8/V8ObjectEventListener.cpp:
  • bindings/v8/V8Proxy.cpp: (WebCore::V8Proxy::findV8EventListener): (WebCore::V8Proxy::findOrCreateV8EventListener): (WebCore::V8Proxy::removeV8EventListener): (WebCore::V8Proxy::findObjectEventListener): (WebCore::V8Proxy::findOrCreateObjectEventListener): (WebCore::V8Proxy::removeObjectEventListener):
  • bindings/v8/V8Proxy.h:
Location:
trunk/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r46089 r46091  
     12009-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
    1292009-07-18  Jeremy Orlow  <jorlow@chromium.org>
    230
  • trunk/WebCore/bindings/v8/V8EventListenerList.cpp

    r43348 r46091  
    183183}
    184184
     185PassRefPtr<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
    185195} // namespace WebCore
  • trunk/WebCore/bindings/v8/V8EventListenerList.h

    r43277 r46091  
    3636#include <wtf/HashMap.h>
    3737
     38#include "PassRefPtr.h"
     39
    3840namespace WebCore {
     41    class Frame;
    3942    class V8EventListener;
    4043    class V8EventListenerListIterator;
     
    6871        size_t size() { return m_table.size(); }
    6972
     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
    7077    private:
    7178        ListenerMultiMap m_table;
     
    94101    };
    95102
     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
    96122} // namespace WebCore
    97123
  • trunk/WebCore/bindings/v8/V8ObjectEventListener.cpp

    r45288 r46091  
    5555}
    5656
     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
    5776V8ObjectEventListener::V8ObjectEventListener(Frame* frame, v8::Local<v8::Object> listener, bool isInline)
    5877    : V8EventListener(frame, listener, isInline)
  • trunk/WebCore/bindings/v8/V8Proxy.cpp

    r46073 r46091  
    362362}
    363363
    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);
     364PassRefPtr<V8EventListener> V8Proxy::findV8EventListener(v8::Local<v8::Value> object, bool isAttribute)
     365{
     366    return m_eventListeners.findWrapper(object, isAttribute);
     367}
     368
     369PassRefPtr<V8EventListener> V8Proxy::findOrCreateV8EventListener(v8::Local<v8::Value> object, bool isAttribute)
     370{
     371    return m_eventListeners.findOrCreateWrapper<V8EventListener>(m_frame, object, isAttribute);
    447372}
    448373
    449374void V8Proxy::removeV8EventListener(V8EventListener* listener)
    450375{
    451     removeEventListenerFromList(m_eventListeners, listener);
    452 }
    453 
     376    m_eventListeners.remove(listener);
     377}
     378
     379PassRefPtr<V8EventListener> V8Proxy::findObjectEventListener( v8::Local<v8::Value> object, bool isAttribute)
     380{
     381    return m_xhrListeners.findWrapper(object, isAttribute);
     382}
     383
     384PassRefPtr<V8EventListener> V8Proxy::findOrCreateObjectEventListener(v8::Local<v8::Value> object, bool isAttribute)
     385{
     386    return m_xhrListeners.findOrCreateWrapper<V8ObjectEventListener>(m_frame, object, isAttribute);
     387}
    454388
    455389void V8Proxy::removeObjectEventListener(V8ObjectEventListener* listener)
    456390{
    457     removeEventListenerFromList(m_xhrListeners, listener);
     391    m_xhrListeners.remove(listener);
    458392}
    459393
     
    468402}
    469403
    470 
    471404void V8Proxy::disconnectEventListeners()
    472405{
     
    474407    disconnectEventListenersInList(m_xhrListeners);
    475408}
    476 
    477409
    478410v8::Handle<v8::Script> V8Proxy::compileScript(v8::Handle<v8::String> code, const String& fileName, int baseLine)
  • trunk/WebCore/bindings/v8/V8Proxy.h

    r45928 r46091  
    197197        bool isEnabled();
    198198
    199         // Find/Create/Remove event listener wrappers.
     199        // FIXME: Replace these APIs with a getter for m_eventListeners
    200200        PassRefPtr<V8EventListener> findV8EventListener(v8::Local<v8::Value> listener, bool isHtml);
    201201        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
    203205        PassRefPtr<V8EventListener> findObjectEventListener(v8::Local<v8::Value> listener, bool isHtml);
    204206        PassRefPtr<V8EventListener> findOrCreateObjectEventListener(v8::Local<v8::Value> listener, bool isHtml);
    205 
    206         void removeV8EventListener(V8EventListener*);
    207207        void removeObjectEventListener(V8ObjectEventListener*);
    208208
Note: See TracChangeset for help on using the changeset viewer.