GF_DOMHandler *gf_dom_listener_build_ex(GF_Node *node, u32 event_type, u32 event_parameter, GF_Node *handler, GF_Node **out_listener);
void gf_dom_event_dump_listeners(GF_Node *n, FILE *f);
-void gf_dom_event_remove_all_listeners(GF_DOMEventTarget *event_target);
+void gf_dom_event_remove_all_listeners(GF_DOMEventTarget *event_target, GF_SceneGraph *sg);
void gf_dom_event_target_del(GF_DOMEventTarget *target);
GF_Err gf_dom_event_remove_listener_from_parent(GF_DOMEventTarget *event_target, GF_Node *listener);
gf_mx_p(sg->dom_evt_mx);
/*remove listeners attached to the doc*/
- gf_dom_event_remove_all_listeners(sg->dom_evt);
+ gf_dom_event_remove_all_listeners(sg->dom_evt, sg);
/*flush any pending add_listener*/
gf_dom_listener_reset_deferred(sg);
gf_mx_v(sg->dom_evt_mx);
}
#ifndef GPAC_DISABLE_SVG
if (node->sgprivate->interact->dom_evt) {
- gf_dom_event_remove_all_listeners(node->sgprivate->interact->dom_evt);
+ gf_dom_event_remove_all_listeners(node->sgprivate->interact->dom_evt, node->sgprivate->scenegraph);
gf_dom_event_target_del(node->sgprivate->interact->dom_evt);
}
if (node->sgprivate->interact->animations) {
return GF_OK;
}
-void gf_dom_event_remove_all_listeners(GF_DOMEventTarget *event_target)
+void gf_dom_event_remove_all_listeners(GF_DOMEventTarget *event_target, GF_SceneGraph *sg)
{
while (gf_list_count(event_target->listeners)) {
GF_Node *n = (GF_Node *)gf_list_get(event_target->listeners, 0);
- gf_dom_listener_del(n, event_target);
+ if (gf_list_find(sg->exported_nodes, n)>=0) {
+ gf_list_rem(event_target->listeners, 0);
+ } else {
+ gf_dom_listener_del(n, event_target);
+ }
}
}