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
}
Example #2
0
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);
    }
}
Example #3
0
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);
}
Example #4
0
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);
    }
}
Example #5
0
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);
    }
}
Example #6
0
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
}