void transferHiddenDependency(v8::Handle<v8::Object> object, EventListener* oldValue, v8::Local<v8::Value> newValue, int cacheIndex, v8::Isolate* isolate) { if (oldValue) { V8AbstractEventListener* oldListener = V8AbstractEventListener::cast(oldValue); if (oldListener) { v8::Local<v8::Object> oldListenerObject = oldListener->getExistingListenerObject(); if (!oldListenerObject.IsEmpty()) removeHiddenDependency(object, oldListenerObject, cacheIndex, isolate); } } // Non-callable input is treated as null and ignored if (newValue->IsFunction()) createHiddenDependency(object, newValue, cacheIndex, isolate); }
void moveEventListenerToNewWrapper(v8::Handle<v8::Object> object, EventListener* oldValue, v8::Local<v8::Value> newValue, int arrayIndex, v8::Isolate* isolate) { if (oldValue) { V8AbstractEventListener* oldListener = V8AbstractEventListener::cast(oldValue); if (oldListener) { v8::Local<v8::Object> oldListenerObject = oldListener->getExistingListenerObject(); if (!oldListenerObject.IsEmpty()) removeHiddenValueFromArray(object, oldListenerObject, arrayIndex, isolate); } } // Non-callable input is treated as null and ignored if (newValue->IsFunction()) addHiddenValueToArray(object, newValue, arrayIndex, isolate); }
void transferHiddenDependency(v8::Handle<v8::Object> object, EventListener* oldValue, v8::Local<v8::Value> newValue, int cacheIndex) { if (oldValue) { V8AbstractEventListener* oldListener = V8AbstractEventListener::cast(oldValue); if (oldListener) { v8::Local<v8::Object> oldListenerObject = oldListener->getExistingListenerObject(); if (!oldListenerObject.IsEmpty()) removeHiddenDependency(object, oldListenerObject, cacheIndex); } } if (!newValue->IsNull() && !newValue->IsUndefined()) createHiddenDependency(object, newValue, cacheIndex); }
void WorkerGlobalScope::dispose() { DCHECK(thread()->isCurrentThread()); // Event listeners would keep DOMWrapperWorld objects alive for too long. // Also, they have references to JS objects, which become dangling once Heap // is destroyed. for (auto it = m_eventListeners.begin(); it != m_eventListeners.end();) { V8AbstractEventListener* listener = *it; // clearListenerObject() will unregister the listener from // m_eventListeners, and invalidate the iterator, so we have to advance // it first. ++it; listener->clearListenerObject(); } removeAllEventListeners(); m_scriptController->dispose(); m_scriptController.clear(); m_eventQueue->close(); m_thread = nullptr; }
static void weakEventListenerCallback(v8::Persistent<v8::Value>, void* parameter) { V8AbstractEventListener* listener = static_cast<V8AbstractEventListener*>(parameter); listener->disposeListenerObject(); }