Changeset 133810 in webkit


Ignore:
Timestamp:
Nov 7, 2012 3:11:23 PM (12 years ago)
Author:
abarth@webkit.org
Message:

[V8] IntrusiveDOMWrapperMap should be usable for more than just Nodes
https://bugs.webkit.org/show_bug.cgi?id=101110

Reviewed by Kentaro Hara.

This patch generalizes our support for storing wrappers in DOM objects
to be usable for more than just nodes. After this patch, any object
with a ScriptWrappable base class will have its wrapper stored inline
in the object in the main world.

  • bindings/v8/DOMDataStore.cpp:

(WebCore::DOMDataStore::weakCallback):

  • bindings/v8/DOMDataStore.h:

(WebCore::DOMDataStore::get):
(WebCore::DOMDataStore::set):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r133808 r133810  
     12012-11-07  Adam Barth  <abarth@webkit.org>
     2
     3        [V8] IntrusiveDOMWrapperMap should be usable for more than just Nodes
     4        https://bugs.webkit.org/show_bug.cgi?id=101110
     5
     6        Reviewed by Kentaro Hara.
     7
     8        This patch generalizes our support for storing wrappers in DOM objects
     9        to be usable for more than just nodes. After this patch, any object
     10        with a ScriptWrappable base class will have its wrapper stored inline
     11        in the object in the main world.
     12
     13        * bindings/v8/DOMDataStore.cpp:
     14        (WebCore::DOMDataStore::weakCallback):
     15        * bindings/v8/DOMDataStore.h:
     16        (WebCore::DOMDataStore::get):
     17        (WebCore::DOMDataStore::set):
     18
    1192012-11-07  Tiancheng Jiang  <tijiang@rim.com>
    220
  • trunk/Source/WebCore/bindings/v8/DOMDataStore.cpp

    r133805 r133810  
    7373void DOMDataStore::weakCallback(v8::Persistent<v8::Value> value, void* context)
    7474{
    75     Node* object = static_cast<Node*>(context);
     75    ScriptWrappable* key = static_cast<ScriptWrappable*>(context);
    7676    ASSERT(value->IsObject());
    77     ASSERT(object->wrapper() == v8::Persistent<v8::Object>::Cast(value));
     77    v8::Persistent<v8::Object> wrapper = v8::Persistent<v8::Object>::Cast(value);
     78    ASSERT(key->wrapper() == wrapper);
     79    // Note: |object| might not be equal to |key|, e.g., if ScriptWrappable isn't a left-most base class.
     80    void* object = toNative(wrapper);
     81    WrapperTypeInfo* info = toWrapperTypeInfo(wrapper);
    7882
    79     object->clearWrapper();
     83    key->clearWrapper();
    8084    value.Dispose();
    8185    value.Clear();
    82     object->deref();
     86    info->derefObject(object);
    8387}
    8488
  • trunk/Source/WebCore/bindings/v8/DOMDataStore.h

    r133794 r133810  
    6060    static DOMDataStore* current(v8::Isolate*);
    6161
    62     inline v8::Handle<v8::Object> get(void* object) const { return m_domObjectMap->get(object); }
    63     inline v8::Handle<v8::Object> get(Node* object) const
     62    template<typename T>
     63    inline v8::Handle<v8::Object> get(T* object) const
    6464    {
    65         if (m_type == MainWorld)
    66             return object->wrapper();
     65        if (wrapperIsStoredInObject(object))
     66            return getWrapperFromObject(object);
    6767        return m_domObjectMap->get(object);
    6868    }
    6969
    70     inline void set(void* object, v8::Persistent<v8::Object> wrapper) { m_domObjectMap->set(object, wrapper); }
    71     inline void set(Node* object, v8::Persistent<v8::Object> wrapper)
     70    template<typename T>
     71    inline void set(T* object, v8::Persistent<v8::Object> wrapper)
    7272    {
    73         if (m_type == MainWorld) {
    74             ASSERT(object->wrapper().IsEmpty());
    75             object->setWrapper(wrapper);
    76             wrapper.MakeWeak(object, weakCallback);
     73        if (setWrapperInObject(object, wrapper))
    7774            return;
    78         }
    7975        m_domObjectMap->set(object, wrapper);
    8076    }
     
    8379
    8480private:
     81    bool wrapperIsStoredInObject(void*) const { return false; }
     82    bool wrapperIsStoredInObject(ScriptWrappable*) const { return m_type == MainWorld; }
     83
     84    v8::Handle<v8::Object> getWrapperFromObject(void*) const
     85    {
     86        ASSERT_NOT_REACHED();
     87        return v8::Handle<v8::Object>();
     88    }
     89
     90    v8::Handle<v8::Object> getWrapperFromObject(ScriptWrappable* object) const
     91    {
     92        ASSERT(m_type == MainWorld);
     93        return object->wrapper();
     94    }
     95
     96    bool setWrapperInObject(void*, v8::Persistent<v8::Object>) { return false; }
     97    bool setWrapperInObject(ScriptWrappable* object, v8::Persistent<v8::Object> wrapper)
     98    {
     99        if (m_type != MainWorld)
     100            return false;
     101        ASSERT(object->wrapper().IsEmpty());
     102        ASSERT(m_domObjectMap->get(toNative(wrapper)).IsEmpty());
     103        object->setWrapper(wrapper);
     104        wrapper.MakeWeak(object, weakCallback);
     105        return true;
     106    }
     107
    85108    static void weakCallback(v8::Persistent<v8::Value>, void* context);
    86109
Note: See TracChangeset for help on using the changeset viewer.