Changeset 133810 in webkit
- Timestamp:
- Nov 7, 2012 3:11:23 PM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r133808 r133810 1 2012-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 1 19 2012-11-07 Tiancheng Jiang <tijiang@rim.com> 2 20 -
trunk/Source/WebCore/bindings/v8/DOMDataStore.cpp
r133805 r133810 73 73 void DOMDataStore::weakCallback(v8::Persistent<v8::Value> value, void* context) 74 74 { 75 Node* object = static_cast<Node*>(context);75 ScriptWrappable* key = static_cast<ScriptWrappable*>(context); 76 76 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); 78 82 79 object->clearWrapper();83 key->clearWrapper(); 80 84 value.Dispose(); 81 85 value.Clear(); 82 object->deref();86 info->derefObject(object); 83 87 } 84 88 -
trunk/Source/WebCore/bindings/v8/DOMDataStore.h
r133794 r133810 60 60 static DOMDataStore* current(v8::Isolate*); 61 61 62 inline v8::Handle<v8::Object> get(void* object) const { return m_domObjectMap->get(object); }63 inline v8::Handle<v8::Object> get( Node* object) const62 template<typename T> 63 inline v8::Handle<v8::Object> get(T* object) const 64 64 { 65 if ( m_type == MainWorld)66 return object->wrapper();65 if (wrapperIsStoredInObject(object)) 66 return getWrapperFromObject(object); 67 67 return m_domObjectMap->get(object); 68 68 } 69 69 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) 72 72 { 73 if (m_type == MainWorld) { 74 ASSERT(object->wrapper().IsEmpty()); 75 object->setWrapper(wrapper); 76 wrapper.MakeWeak(object, weakCallback); 73 if (setWrapperInObject(object, wrapper)) 77 74 return; 78 }79 75 m_domObjectMap->set(object, wrapper); 80 76 } … … 83 79 84 80 private: 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 85 108 static void weakCallback(v8::Persistent<v8::Value>, void* context); 86 109
Note: See TracChangeset
for help on using the changeset viewer.