void DOMDataStore::weakNodeCallback(v8::Persistent<v8::Value> value, void* domObject) { ASSERT(WTF::isMainThread()); Node* node = static_cast<Node*>(domObject); // Node wrappers must be JS objects. v8::Persistent<v8::Object> v8Object = v8::Persistent<v8::Object>::Cast(value); //SAMSUNG_WEB_WORKER_CHANGES >> //WTF::MutexLocker locker(DOMDataStore::allStoresMutex()); DOMDataList& list = DOMDataStore::allStores(); for (size_t i = 0; i < list.size(); ++i) { DOMDataStore* store = list[i]; DOMNodeMapping& nodeMap = store->domNodeMap(); if (nodeMap.removeIfPresent(node, v8Object)) { //if (store->domNodeMap().removeIfPresent(node, v8Object)) { //ASSERT(store->domData()->owningThread() == WTF::currentThread()); //SAMSUNG_WEB_WORKER_CHANGES << node->deref(); // Nobody overrides Node::deref so it's safe return; // There might be at most one wrapper for the node in world's maps } } // If not found, it means map for the wrapper has been already destroyed, just dispose the // handle and deref the object to fight memory leak. v8Object.Dispose(); node->deref(); // Nobody overrides Node::deref so it's safe }
void visitDOMObjects(DOMWrapperVisitor<void>* visitor) { v8::HandleScope scope; Vector<DOMDataStore*>& list = V8PerIsolateData::current()->allStores(); for (size_t i = 0; i < list.size(); ++i) { DOMDataStore* store = list[i]; store->domObjectMap().visit(store, visitor); } }
v8::Handle<v8::Object> V8DOMWrapper::getWrapperSlow(Node* node) { V8IsolatedContext* context = V8IsolatedContext::getEntered(); if (LIKELY(!context)) { v8::Persistent<v8::Object>* wrapper = node->wrapper(); if (!wrapper) return v8::Handle<v8::Object>(); return *wrapper; } DOMDataStore* store = context->world()->domDataStore(); DOMNodeMapping& domNodeMap = node->isActiveNode() ? store->activeDomNodeMap() : store->domNodeMap(); return domNodeMap.get(node); }
void visitDOMSVGElementInstancesInCurrentThread(DOMWrapperMap<SVGElementInstance>::Visitor* visitor) { v8::HandleScope scope; WTF::MutexLocker locker(DOMDataStore::allStoresMutex()); DOMDataList& list = DOMDataStore::allStores(); for (size_t i = 0; i < list.size(); ++i) { DOMDataStore* store = list[i]; if (!store->domData()->owningThread() == WTF::currentThread()) continue; store->domSvgElementInstanceMap().visit(store, visitor); } }
void visitActiveDOMObjectsInCurrentThread(DOMWrapperMap<void>::Visitor* visitor) { v8::HandleScope scope; WTF::MutexLocker locker(DOMDataStore::allStoresMutex()); DOMDataList& list = DOMDataStore::allStores(); for (size_t i = 0; i < list.size(); ++i) { DOMDataStore* store = list[i]; if (!store->domData()->owningThread() == WTF::currentThread()) continue; store->activeDomObjectMap().visit(store, visitor); } }
void DOMDataStore::weakNodeCallback(v8::Persistent<v8::Value> value, void* domObject) { ASSERT(isMainThread()); Node* node = static_cast<Node*>(domObject); // Node wrappers must be JS objects. v8::Persistent<v8::Object> v8Object = v8::Persistent<v8::Object>::Cast(value); DOMDataList& list = DOMDataStore::allStores(); for (size_t i = 0; i < list.size(); ++i) { DOMDataStore* store = list[i]; if (store->domNodeMap().removeIfPresent(node, v8Object)) { node->deref(); // Nobody overrides Node::deref so it's safe return; // There might be at most one wrapper for the node in world's maps } } // If not found, it means map for the wrapper has been already destroyed, just dispose the // handle and deref the object to fight memory leak. v8Object.Dispose(); node->deref(); // Nobody overrides Node::deref so it's safe }