diff options
Diffstat (limited to 'WebCore/bindings/v8/DOMData.h')
-rw-r--r-- | WebCore/bindings/v8/DOMData.h | 40 |
1 files changed, 19 insertions, 21 deletions
diff --git a/WebCore/bindings/v8/DOMData.h b/WebCore/bindings/v8/DOMData.h index 4947e82..7fa9e7d 100644 --- a/WebCore/bindings/v8/DOMData.h +++ b/WebCore/bindings/v8/DOMData.h @@ -51,7 +51,7 @@ namespace WebCore { virtual DOMDataStore& getStore() = 0; template<typename T> - static void handleWeakObject(DOMDataStore::DOMWrapperMapType, v8::Handle<v8::Object>, T* domObject); + static void handleWeakObject(DOMDataStore::DOMWrapperMapType, v8::Persistent<v8::Object>, T* domObject); void forgetDelayedObject(void* object) { m_delayedObjectMap.take(object); } @@ -62,7 +62,7 @@ namespace WebCore { void derefDelayedObjects(); template<typename T> - static void removeObjectsFromWrapperMap(DOMWrapperMap<T>& domMap); + static void removeObjectsFromWrapperMap(AbstractWeakReferenceMap<T, v8::Object>& domMap); ThreadIdentifier owningThread() const { return m_owningThread; } @@ -72,6 +72,17 @@ namespace WebCore { void ensureDeref(V8ClassIndex::V8WrapperType type, void* domObject); static void derefObject(V8ClassIndex::V8WrapperType type, void* domObject); + template<typename T> + class WrapperMapObjectRemover : public WeakReferenceMap<T, v8::Object>::Visitor { + public: + virtual void visitDOMWrapper(T* domObject, v8::Persistent<v8::Object> v8Object) + { + V8ClassIndex::V8WrapperType type = V8DOMWrapper::domWrapperType(v8Object); + derefObject(type, domObject); + v8Object.Dispose(); + } + }; + // Stores all the DOM objects that are delayed to be processed when the // owning thread gains control. DelayedObjectMap m_delayedObjectMap; @@ -85,7 +96,7 @@ namespace WebCore { }; template<typename T> - void DOMData::handleWeakObject(DOMDataStore::DOMWrapperMapType mapType, v8::Handle<v8::Object> v8Object, T* domObject) + void DOMData::handleWeakObject(DOMDataStore::DOMWrapperMapType mapType, v8::Persistent<v8::Object> v8Object, T* domObject) { ASSERT(WTF::isMainThread()); DOMDataList& list = DOMDataStore::allStores(); @@ -94,10 +105,7 @@ namespace WebCore { DOMDataStore::InternalDOMWrapperMap<T>* domMap = static_cast<DOMDataStore::InternalDOMWrapperMap<T>*>(store->getDOMWrapperMap(mapType)); - v8::Handle<v8::Object> wrapper = domMap->get(domObject); - if (*wrapper == *v8Object) { - // Clear the JS reference. - domMap->forgetOnly(domObject); + if (domMap->removeIfPresent(domObject, v8Object)) { ASSERT(store->domData()->owningThread() == WTF::currentThread()); store->domData()->derefObject(V8DOMWrapper::domWrapperType(v8Object), domObject); } @@ -105,21 +113,11 @@ namespace WebCore { } template<typename T> - void DOMData::removeObjectsFromWrapperMap(DOMWrapperMap<T>& domMap) + void DOMData::removeObjectsFromWrapperMap(AbstractWeakReferenceMap<T, v8::Object>& domMap) { - for (typename WTF::HashMap<T*, v8::Object*>::iterator iter(domMap.impl().begin()); iter != domMap.impl().end(); ++iter) { - T* domObject = static_cast<T*>(iter->first); - v8::Persistent<v8::Object> v8Object(iter->second); - - V8ClassIndex::V8WrapperType type = V8DOMWrapper::domWrapperType(v8::Handle<v8::Object>::Cast(v8Object)); - - // Deref the DOM object. - derefObject(type, domObject); - - // Clear the JS wrapper. - v8Object.Dispose(); - } - domMap.impl().clear(); + WrapperMapObjectRemover<T> remover; + domMap.visit(&remover); + domMap.clear(); } } // namespace WebCore |