diff options
Diffstat (limited to 'WebCore/bindings/v8/DOMDataStore.cpp')
-rw-r--r-- | WebCore/bindings/v8/DOMDataStore.cpp | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/WebCore/bindings/v8/DOMDataStore.cpp b/WebCore/bindings/v8/DOMDataStore.cpp index a76ca53..e181ebc 100644 --- a/WebCore/bindings/v8/DOMDataStore.cpp +++ b/WebCore/bindings/v8/DOMDataStore.cpp @@ -146,14 +146,14 @@ void DOMDataStore::weakDOMObjectCallback(v8::Persistent<v8::Value> v8Object, voi { v8::HandleScope scope; ASSERT(v8Object->IsObject()); - DOMData::handleWeakObject(DOMDataStore::DOMObjectMap, v8::Handle<v8::Object>::Cast(v8Object), domObject); + DOMData::handleWeakObject(DOMDataStore::DOMObjectMap, v8::Persistent<v8::Object>::Cast(v8Object), domObject); } void DOMDataStore::weakActiveDOMObjectCallback(v8::Persistent<v8::Value> v8Object, void* domObject) { v8::HandleScope scope; ASSERT(v8Object->IsObject()); - DOMData::handleWeakObject(DOMDataStore::ActiveDOMObjectMap, v8::Handle<v8::Object>::Cast(v8Object), domObject); + DOMData::handleWeakObject(DOMDataStore::ActiveDOMObjectMap, v8::Persistent<v8::Object>::Cast(v8Object), domObject); } void DOMDataStore::weakNodeCallback(v8::Persistent<v8::Value> v8Object, void* domObject) @@ -166,32 +166,42 @@ void DOMDataStore::weakNodeCallback(v8::Persistent<v8::Value> v8Object, void* do DOMDataList& list = DOMDataStore::allStores(); for (size_t i = 0; i < list.size(); ++i) { DOMDataStore* store = list[i]; - HashMap<Node*, v8::Object*>& domMapImpl = store->domNodeMap().impl(); - HashMap<Node*, v8::Object*>::iterator it = domMapImpl.find(node); - if (it == domMapImpl.end() || it->second != *v8Object) - continue; - ASSERT(store->domData()->owningThread() == WTF::currentThread()); - v8Object.Dispose(); - domMapImpl.remove(it); - node->deref(); // Nobody overrides Node::deref so it's safe - break; // There might be at most one wrapper for the node in world's maps + if (store->domNodeMap().removeIfPresent(node, v8Object)) { + ASSERT(store->domData()->owningThread() == WTF::currentThread()); + node->deref(); // Nobody overrides Node::deref so it's safe + break; // There might be at most one wrapper for the node in world's maps + } } } +bool DOMDataStore::IntrusiveDOMWrapperMap::removeIfPresent(Node* obj, v8::Persistent<v8::Data> value) +{ + ASSERT(obj); + v8::Persistent<v8::Object>* entry = obj->wrapper(); + if (!entry) + return false; + if (*entry != value) + return false; + obj->clearWrapper(); + m_table.remove(entry); + value.Dispose(); + return true; +} + #if ENABLE(SVG) void DOMDataStore::weakSVGElementInstanceCallback(v8::Persistent<v8::Value> v8Object, void* domObject) { v8::HandleScope scope; ASSERT(v8Object->IsObject()); - DOMData::handleWeakObject(DOMDataStore::DOMSVGElementInstanceMap, v8::Handle<v8::Object>::Cast(v8Object), static_cast<SVGElementInstance*>(domObject)); + DOMData::handleWeakObject(DOMDataStore::DOMSVGElementInstanceMap, v8::Persistent<v8::Object>::Cast(v8Object), static_cast<SVGElementInstance*>(domObject)); } void DOMDataStore::weakSVGObjectWithContextCallback(v8::Persistent<v8::Value> v8Object, void* domObject) { v8::HandleScope scope; ASSERT(v8Object->IsObject()); - DOMData::handleWeakObject(DOMDataStore::DOMSVGObjectWithContextMap, v8::Handle<v8::Object>::Cast(v8Object), domObject); + DOMData::handleWeakObject(DOMDataStore::DOMSVGObjectWithContextMap, v8::Persistent<v8::Object>::Cast(v8Object), domObject); } #endif // ENABLE(SVG) |