summaryrefslogtreecommitdiffstats
path: root/WebCore/bindings/v8/DOMData.h
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/bindings/v8/DOMData.h')
-rw-r--r--WebCore/bindings/v8/DOMData.h40
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