{
if (m_render)
detach();
+ if (m_regdListeners && !m_regdListeners->isEmpty() && getDocument() && !inDocument())
+ getDocument()->unregisterDisconnectedNodeWithEventListeners(this);
delete m_regdListeners;
delete m_nodeLists;
if (document)
void NodeImpl::addEventListener(int id, EventListener *listener, const bool useCapture)
{
+ if (getDocument() && !getDocument()->attached())
+ return;
+
switch (id) {
case EventImpl::DOMSUBTREEMODIFIED_EVENT:
getDocument()->addListenerType(DocumentImpl::DOMSUBTREEMODIFIED_LISTENER);
// spec says that "duplicate instances are discarded" in this case.
removeEventListener(id,listener,useCapture);
+ // adding the first one
+ if (m_regdListeners->isEmpty() && getDocument() && !inDocument())
+ getDocument()->registerDisconnectedNodeWithEventListeners(this);
+
m_regdListeners->append(rl);
listener->deref();
}
for (; it.current(); ++it)
if (*(it.current()) == rl) {
m_regdListeners->removeRef(it.current());
+ // removed last
+ if (m_regdListeners->isEmpty() && getDocument() && !inDocument())
+ getDocument()->unregisterDisconnectedNodeWithEventListeners(this);
return;
}
}
+void NodeImpl::removeAllEventListeners()
+{
+ delete m_regdListeners;
+ m_regdListeners = 0;
+}
+
void NodeImpl::removeHTMLEventListener(int id)
{
if (!m_regdListeners) // nothing to remove
if (it.current()->id == id &&
it.current()->listener->eventListenerType() == "_khtml_HTMLEventListener") {
m_regdListeners->removeRef(it.current());
+ // removed last
+ if (m_regdListeners->isEmpty() && getDocument() && !inDocument())
+ getDocument()->unregisterDisconnectedNodeWithEventListeners(this);
return;
}
}
void NodeImpl::insertedIntoDocument()
{
+ if (m_regdListeners && !m_regdListeners->isEmpty() && getDocument())
+ getDocument()->unregisterDisconnectedNodeWithEventListeners(this);
+
setInDocument(true);
}
void NodeImpl::removedFromDocument()
{
+ if (m_regdListeners && !m_regdListeners->isEmpty() && getDocument())
+ getDocument()->registerDisconnectedNodeWithEventListeners(this);
+
setInDocument(false);
}