summaryrefslogtreecommitdiff
path: root/src/events/event_target.c
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2011-12-21 22:18:10 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2011-12-21 22:18:10 +0000
commit83f3338663c4969eebefd8c2c43bd3fc43587fdd (patch)
treee48ba69628c5ba793533094e308c1fce9acb21aa /src/events/event_target.c
parent4ade8ad1c7b23e6eeeee6681acbdb43fb10cab43 (diff)
downloadlibdom-83f3338663c4969eebefd8c2c43bd3fc43587fdd.tar.gz
libdom-83f3338663c4969eebefd8c2c43bd3fc43587fdd.tar.bz2
Merge branches/jmb/dom-alloc-purge back to trunk
svn path=/trunk/libdom/; revision=13316
Diffstat (limited to 'src/events/event_target.c')
-rw-r--r--src/events/event_target.c710
1 files changed, 76 insertions, 634 deletions
diff --git a/src/events/event_target.c b/src/events/event_target.c
index 6bf5458..c4a2f90 100644
--- a/src/events/event_target.c
+++ b/src/events/event_target.c
@@ -6,8 +6,7 @@
*/
#include <assert.h>
-
-#include <libwapcaplet/libwapcaplet.h>
+#include <stdlib.h>
#include "events/event.h"
#include "events/event_listener.h"
@@ -23,36 +22,74 @@
/* The number of chains in the hash table used for hash event types */
#define CHAINS 11
-/* Entry for a EventTarget, used to record the bubbling list */
-typedef struct dom_event_target_entry {
- struct list_entry entry; /**< The list entry */
- dom_event_target *et; /**< The node */
-} dom_event_target_entry;
+static uint32_t event_target_hash(void *key, void *pw)
+{
+ UNUSED(pw);
+
+ return dom_string_hash(key);
+}
+
+static void event_target_destroy_key(void *key, void *pw)
+{
+ UNUSED(pw);
+
+ dom_string_unref(key);
+}
+
+static void event_target_destroy_value(void *value, void *pw)
+{
+ struct listener_entry *le = NULL;
+ struct list_entry *i = (struct list_entry *) value;
+
+ UNUSED(pw);
+
+ while (i != i->next) {
+ le = (struct listener_entry *) i->next;
+ list_del(i->next);
+ dom_event_listener_unref(le->listener);
+ free(le);
+ }
+
+ le = (struct listener_entry *) i;
+ list_del(i);
+ dom_event_listener_unref(le->listener);
+ free(le);
+}
+
+static bool event_target_key_isequal(void *key1, void *key2, void *pw)
+{
+ UNUSED(pw);
-/* Hash key/value functions */
-static void *_key(void *key, void *key_pw, dom_alloc alloc, void *pw,
- bool clone);
-static void *_value(void *value, void *value_pw, dom_alloc alloc,
- void *pw, bool clone);
+ return dom_string_isequal(key1, key2);
+}
+static const dom_hash_vtable event_target_vtable = {
+ event_target_hash,
+ NULL,
+ event_target_destroy_key,
+ NULL,
+ event_target_destroy_value,
+ event_target_key_isequal
+};
/* Initialise this EventTarget */
-dom_exception _dom_event_target_internal_initialise(struct dom_document *doc,
+dom_exception _dom_event_target_internal_initialise(
dom_event_target_internal *eti)
{
- UNUSED(doc);
- eti->listeners = NULL;
+ eti->listeners = _dom_hash_create(CHAINS, &event_target_vtable, NULL);
+ if (eti->listeners == NULL)
+ return DOM_NO_MEM_ERR;
+
eti->ns_listeners = NULL;
return DOM_NO_ERR;
}
/* Finalise this EventTarget */
-void _dom_event_target_internal_finalise(struct dom_document *doc,
- dom_event_target_internal *eti)
+void _dom_event_target_internal_finalise(dom_event_target_internal *eti)
{
- if (eti->listeners != NULL)
- _dom_hash_destroy(eti->listeners, _key, NULL, _value, doc);
+ _dom_hash_destroy(eti->listeners);
+
/* TODO: Now, we did not support the EventListener with namespace,
* when we support it, we should deal with the ns_listeners hash
* table, too.
@@ -71,42 +108,15 @@ void _dom_event_target_internal_finalise(struct dom_document *doc,
* \param capture Whether add this listener in the capturing phase
* \return DOM_NO_ERR on success, appropriate dom_exception on failure.
*/
-dom_exception _dom_event_target_add_event_listener(dom_event_target *et,
+dom_exception _dom_event_target_add_event_listener(
+ dom_event_target_internal *eti,
dom_string *type, struct dom_event_listener *listener,
bool capture)
{
struct listener_entry *le = NULL;
- struct dom_document *doc = dom_node_get_owner(et);
- assert(doc != NULL);
-
- struct dom_event_target_internal *eti = &et->eti;
- lwc_string *t = NULL;
- dom_exception err;
-
- /* If there is no hash table, we should create one firstly */
- if (eti->listeners == NULL) {
- err = _dom_document_create_hashtable(doc, CHAINS,
- _dom_hash_hash_lwcstring, &eti->listeners);
- if (err != DOM_NO_ERR)
- return err;
- }
-
- err = dom_string_get_intern(type, &t);
- if (err != DOM_NO_ERR)
- return err;
-
- if (t == NULL) {
- err = _dom_string_intern(type, &t);
- if (err != DOM_NO_ERR)
- return err;
- } else {
- lwc_string_ref(t);
- }
-
- assert(t != NULL);
+ dom_string *t = NULL;
- le = (struct listener_entry *) _dom_document_alloc(doc, NULL,
- sizeof(struct listener_entry));
+ le = malloc(sizeof(struct listener_entry));
if (le == NULL)
return DOM_NO_MEM_ERR;
@@ -116,6 +126,8 @@ dom_exception _dom_event_target_add_event_listener(dom_event_target *et,
dom_event_listener_ref(listener);
le->capture = capture;
+ t = dom_string_ref(type);
+
/* Find the type of this event */
struct list_entry *item = (struct list_entry *) _dom_hash_get(
eti->listeners, t);
@@ -140,42 +152,18 @@ dom_exception _dom_event_target_add_event_listener(dom_event_target *et,
* \param capture Whether the listener is registered at the capturing phase
* \return DOM_NO_ERR on success, appropriate dom_exception on failure.
*/
-dom_exception _dom_event_target_remove_event_listener(dom_event_target *et,
+dom_exception _dom_event_target_remove_event_listener(
+ dom_event_target_internal *eti,
dom_string *type, struct dom_event_listener *listener,
bool capture)
{
struct listener_entry *le = NULL;
- struct dom_document *doc = dom_node_get_owner(et);
- if (doc == NULL) {
- /* TODO: In the progress of parsing, many Nodes in the DTD
- * has no document at all, do nothing for this kind of node */
- return DOM_NO_ERR;
- }
-
- struct dom_event_target_internal *eti = &et->eti;
- lwc_string *t = NULL;
- dom_exception err;
-
- err = dom_string_get_intern(type, &t);
- if (err != DOM_NO_ERR)
- return err;
-
- if (t == NULL) {
- err = _dom_string_intern(type, &t);
- if (err != DOM_NO_ERR)
- return err;
- } else {
- lwc_string_ref(t);
- }
-
- assert(t != NULL);
/* Find the type of this event */
struct list_entry *item = (struct list_entry *) _dom_hash_get(
- eti->listeners, t);
+ eti->listeners, type);
if (item == NULL) {
/* There is no such event listener */
- lwc_string_unref(t);
return DOM_NO_ERR;
} else {
struct list_entry *i = item;
@@ -186,8 +174,7 @@ dom_exception _dom_event_target_remove_event_listener(dom_event_target *et,
/* We found the listener */
list_del(i);
dom_event_listener_unref(le->listener);
- _dom_document_alloc(doc, le,
- sizeof(struct listener_entry));
+ free(le);
break;
}
i = i->next;
@@ -198,185 +185,6 @@ dom_exception _dom_event_target_remove_event_listener(dom_event_target *et,
}
/**
- * Dispatch an event into the implementation's event model
- *
- * \param et The EventTarget object
- * \param evt The event object
- * \param success Indicates whether any of the listeners which handled the
- * event called Event.preventDefault(). If
- * Event.preventDefault() was called the returned value is
- * false, else it is true.
- * \return DOM_NO_ERR on success
- * DOM_DISPATCH_REQUEST_ERR If the event is already in dispatch
- * DOM_UNSPECIFIED_EVENT_TYPE_ERR If the type of the event is Null or
- * empty string.
- * DOM_NOT_SUPPORTED_ERR If the event is not created by
- * Document.createEvent
- * DOM_INVALID_CHARACTER_ERR If the type of this event is not a
- * valid NCName.
- */
-dom_exception _dom_event_target_dispatch_event(dom_event_target *et,
- struct dom_event *evt, bool *success)
-{
- assert(et != NULL);
- assert(evt != NULL);
-
- dom_exception err, ret = DOM_NO_ERR;
-
- /* To test whether this event is in dispatch */
- if (evt->in_dispatch == true) {
- return DOM_DISPATCH_REQUEST_ERR;
- } else {
- evt->in_dispatch = true;
- }
-
- if (evt->type == NULL || lwc_string_length(evt->type) == 0) {
- return DOM_UNSPECIFIED_EVENT_TYPE_ERR;
- }
-
- if (evt->doc == NULL)
- return DOM_NOT_SUPPORTED_ERR;
-
- struct dom_document *doc = dom_node_get_owner(et);
- if (doc == NULL) {
- /* TODO: In the progress of parsing, many Nodes in the DTD has
- * no document at all, do nothing for this kind of node */
- return DOM_NO_ERR;
- }
-
- dom_string *type = NULL;
- err = _dom_document_create_string_from_lwcstring(doc, evt->type, &type);
- if (err != DOM_NO_ERR)
- return err;
-
- if (_dom_validate_ncname(type) == false) {
- dom_string_unref(type);
- return DOM_INVALID_CHARACTER_ERR;
- }
- dom_string_unref(type);
-
- dom_event_target_entry list;
- dom_event_target *target = et;
-
- *success = true;
-
- /* Compose the event target list */
- list_init(&list.entry);
- list.et = et;
- dom_node_ref(et);
- target = target->parent;
-
- while (target != NULL) {
- dom_event_target_entry *l = (dom_event_target_entry *)
- _dom_document_alloc(doc, NULL,
- sizeof(dom_event_target_entry));
- if (l == NULL) {
- ret = DOM_NO_MEM_ERR;
- goto cleanup;
- }
- list_append(&list.entry, &l->entry);
- l->et = target;
- dom_node_ref(target);
- target = target->parent;
- }
-
- /* Fill the target of the event */
- evt->target = et;
- evt->phase = DOM_CAPTURING_PHASE;
-
- /* The started callback of default action */
- struct dom_document_event_internal *dei = &doc->dei;
- void *pw = NULL;
- if (dei->actions != NULL) {
- dom_default_action_callback cb = dei->actions(evt->type,
- DOM_DEFAULT_ACTION_STARTED, &pw);
- if (cb != NULL) {
- cb(evt, pw);
- }
- }
-
- /* The capture phase */
- struct list_entry *e = list.entry.prev;
- for (; e != &list.entry; e = e->prev) {
- dom_event_target_entry *l = (dom_event_target_entry *) e;
- err = _dom_event_target_dispatch(l->et, evt,
- DOM_CAPTURING_PHASE, success);
- if (err != DOM_NO_ERR) {
- ret = err;
- goto cleanup;
- }
- /* If the stopImmediatePropagation or stopPropagation is
- * called, we should break */
- if (evt->stop_now == true || evt->stop == true)
- goto cleanup;
- }
-
- /* Target phase */
- evt->phase = DOM_AT_TARGET;
- evt->current = et;
- err = _dom_event_target_dispatch(et, evt, DOM_AT_TARGET,
- success);
- if (evt->stop_now == true || evt->stop == true)
- goto cleanup;
-
- /* Bubbling phase */
- evt->phase = DOM_BUBBLING_PHASE;
-
- e = list.entry.next;
- for (; e != &list.entry; e = e->next) {
- dom_event_target_entry *l = (dom_event_target_entry *) e;
- err = _dom_event_target_dispatch(l->et, evt,
- DOM_BUBBLING_PHASE, success);
- if (err != DOM_NO_ERR) {
- ret = err;
- goto cleanup;
- }
- /* If the stopImmediatePropagation or stopPropagation is
- * called, we should break */
- if (evt->stop_now == true || evt->stop == true)
- goto cleanup;
- }
-
- if (dei->actions == NULL)
- goto cleanup;
-
- /* The end callback of default action */
- if (evt->prevent_default != true) {
- dom_default_action_callback cb = dei->actions(evt->type,
- DOM_DEFAULT_ACTION_END, &pw);
- if (cb != NULL) {
- cb(evt, pw);
- }
- }
-
- /* The prevented callback of default action */
- if (evt->prevent_default != true) {
- dom_default_action_callback cb = dei->actions(evt->type,
- DOM_DEFAULT_ACTION_PREVENTED, &pw);
- if (cb != NULL) {
- cb(evt, pw);
- }
- }
-
-cleanup:
- if (evt->prevent_default == true) {
- *success = false;
- }
-
- while (list.entry.next != &list.entry) {
- dom_event_target_entry *e = (dom_event_target_entry *)
- list.entry.next;
- dom_node_unref(e->et);
- list_del(list.entry.next);
- _dom_document_alloc(doc, e, 0);
- }
-
- dom_node_unref(et);
-
- return ret;
-}
-
-/**
* Add an EventListener
*
* \param et The EventTarget object
@@ -388,11 +196,12 @@ cleanup:
*
* We don't support this API now, so it always return DOM_NOT_SUPPORTED_ERR.
*/
-dom_exception _dom_event_target_add_event_listener_ns(dom_event_target *et,
+dom_exception _dom_event_target_add_event_listener_ns(
+ dom_event_target_internal *eti,
dom_string *namespace, dom_string *type,
struct dom_event_listener *listener, bool capture)
{
- UNUSED(et);
+ UNUSED(eti);
UNUSED(namespace);
UNUSED(type);
UNUSED(listener);
@@ -413,11 +222,12 @@ dom_exception _dom_event_target_add_event_listener_ns(dom_event_target *et,
*
* We don't support this API now, so it always return DOM_NOT_SUPPORTED_ERR.
*/
-dom_exception _dom_event_target_remove_event_listener_ns(dom_event_target *et,
+dom_exception _dom_event_target_remove_event_listener_ns(
+ dom_event_target_internal *eti,
dom_string *namespace, dom_string *type,
struct dom_event_listener *listener, bool capture)
{
- UNUSED(et);
+ UNUSED(eti);
UNUSED(namespace);
UNUSED(type);
UNUSED(listener);
@@ -428,61 +238,11 @@ dom_exception _dom_event_target_remove_event_listener_ns(dom_event_target *et,
/*-------------------------------------------------------------------------*/
-/* The key process function of the hash table, see utils/hash_table.h for
- * detail */
-static void *_key(void *key, void *key_pw, dom_alloc alloc, void *pw,
- bool clone)
-{
- UNUSED(key_pw);
- UNUSED(alloc);
- UNUSED(pw);
- /* There should never be the requirement of clone the event listener
- * list */
- assert(clone == false);
- UNUSED(clone);
-
- lwc_string_unref((lwc_string *) key);
-
- return NULL;
-}
-
-/* The value process function of the hash table, see utils/hash_table.h for
- * detail */
-static void *_value(void *value, void *value_pw, dom_alloc alloc,
- void *pw, bool clone)
-{
- UNUSED(alloc);
- UNUSED(pw);
- /* There should never be the requirement of clone the event listener
- * list */
- assert(clone == false);
- UNUSED(clone);
-
- struct listener_entry *le = NULL;
- struct dom_document *doc = (struct dom_document *) value_pw;
- struct list_entry *i = (struct list_entry *) value;
-
- while(i != i->next) {
- le = (struct listener_entry *) i->next;
- list_del(i->next);
- dom_event_listener_unref(le->listener);
- _dom_document_alloc(doc, le, sizeof(struct listener_entry));
- }
-
- le = (struct listener_entry *) i;
- list_del(i);
- dom_event_listener_unref(le->listener);
- _dom_document_alloc(doc, le, sizeof(struct listener_entry));
-
- return NULL;
-}
-
-/*-------------------------------------------------------------------------*/
-
/**
* Dispatch an event on certain EventTarget
*
* \param et The EventTarget object
+ * \param eti Internal EventTarget object
* \param evt The event object
* \param success Indicates whether any of the listeners which handled the
* event called Event.preventDefault(). If
@@ -490,12 +250,12 @@ static void *_value(void *value, void *value_pw, dom_alloc alloc,
* false, else it is true.
* \return DOM_NO_ERR on success, appropriate dom_exception on failure.
*/
-dom_exception _dom_event_target_dispatch(dom_event_target *et,
+dom_exception _dom_event_target_dispatch(dom_event_target *et,
+ dom_event_target_internal *eti,
struct dom_event *evt, dom_event_flow_phase phase,
bool *success)
{
- struct dom_event_target_internal *eti = &et->eti;
- lwc_string *t = evt->type;
+ dom_string *t = evt->type;
struct list_entry *item = (struct list_entry *) _dom_hash_get(
eti->listeners, t);
@@ -535,321 +295,3 @@ dom_exception _dom_event_target_dispatch(dom_event_target *et,
return DOM_NO_ERR;
}
-/**
- * Dispatch a DOMNodeInserted/DOMNodeRemoved event
- *
- * \param doc The document object
- * \param et The EventTarget object
- * \param type "DOMNodeInserted" or "DOMNodeRemoved"
- * \param related The parent of the removed/inserted node
- * \param success Whether this event's default action get called
- * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
- */
-dom_exception _dom_dispatch_node_change_event(struct dom_document *doc,
- dom_event_target *et, dom_event_target *related,
- dom_mutation_type change, bool *success)
-{
- struct dom_mutation_event *evt;
- dom_exception err;
-
- err = _dom_mutation_event_create(doc, &evt);
- if (err != DOM_NO_ERR)
- return err;
-
- lwc_string *type = NULL;
- if (change == DOM_MUTATION_ADDITION) {
- err = _dom_document_create_lwcstring(doc,
- (const uint8_t *) "DOMNodeInserted",
- SLEN("DOMNodeInserted"), &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
- } else if (change == DOM_MUTATION_REMOVAL) {
- err = _dom_document_create_lwcstring(doc,
- (const uint8_t *) "DOMNodeRemoval",
- SLEN("DOMNodeRemoved"), &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
- } else {
- assert("Should never be here" == NULL);
- }
-
- dom_string *t = NULL;
- err = _dom_document_create_string_from_lwcstring(doc, type, &t);
- _dom_document_unref_lwcstring(doc, type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- /* Initiliase the event with corresponding parameters */
- err = dom_mutation_event_init(evt, t, true, false, related, NULL, NULL,
- NULL, change);
- dom_string_unref(t);
- if (err != DOM_NO_ERR) {
- goto cleanup;
- }
-
- err = dom_event_target_dispatch_event(et, evt, success);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- /* Finalise the evt, and reuse it */
- _dom_mutation_event_finalise(doc, evt);
- /* Dispatch the DOMNodeInsertedIntoDocument/DOMNodeRemovedFromDocument
- * event */
- if (change == DOM_MUTATION_ADDITION) {
- err = _dom_document_create_lwcstring(doc,
- (const uint8_t *)
- "DOMNodeInsertedIntoDocument",
- SLEN("DOMNodeInsertedIntoDocument"), &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
- } else if (change == DOM_MUTATION_REMOVAL) {
- err = _dom_document_create_lwcstring(doc,
- (const uint8_t *) "DOMNodeRemovedFromDocument",
- SLEN("DOMNodeRemovedFromDocument"), &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
- } else {
- assert("Should never be here" == NULL);
- }
-
- err = _dom_document_create_string_from_lwcstring(doc, type, &t);
- _dom_document_unref_lwcstring(doc, type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- /* Dispatch the events for its children */
- dom_event_target *target = et->first_child;
- while (target != NULL) {
- err = dom_mutation_event_init(evt, t, true, false, NULL,
- NULL, NULL, NULL, change);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- err = dom_event_target_dispatch_event(target, evt, success);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- dom_event_target *p = dom_node_get_parent(target);
- if (target->first_child != NULL) {
- target = target->first_child;
- } else if (target->next != NULL) {
- target = target->next;
- } else {
- while (p != et && target == p->last_child) {
- target = p;
- p = dom_node_get_parent(p);
- }
-
- target = target->next;
- }
- /* Finalise the event for reuse in next iteration */
- _dom_mutation_event_finalise(doc, evt);
- }
-
-cleanup:
- _dom_mutation_event_destroy(doc, evt);
-
- return err;
-}
-
-/**
- * Dispatch a DOMAttrModified event
- *
- * \param doc The Document object
- * \param et The EventTarget
- * \param prev The previous value before change
- * \param new The new value after change
- * \param related The related EventTarget
- * \param attr_name The Attribute name
- * \param change How this attribute change
- * \param success Whether this event's default handler get called
- * \return DOM_NO_ERR on success, appropirate dom_exception on failure.
- */
-dom_exception _dom_dispatch_attr_modified_event(struct dom_document *doc,
- dom_event_target *et, dom_string *prev, dom_string *new,
- dom_event_target *related, dom_string *attr_name,
- dom_mutation_type change, bool *success)
-{
- struct dom_mutation_event *evt;
- dom_exception err;
-
- err = _dom_mutation_event_create(doc, &evt);
- if (err != DOM_NO_ERR)
- return err;
-
- lwc_string *type = NULL;
- err = _dom_document_create_lwcstring(doc,
- (const uint8_t *) "DOMAttrModified",
- SLEN("DOMAttrModified"), &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- dom_string *t = NULL;
- err = _dom_document_create_string_from_lwcstring(doc, type, &t);
- _dom_document_unref_lwcstring(doc, type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- /* Initiliase the event with corresponding parameters */
- err = dom_mutation_event_init(evt, t, true, false, related, prev, new,
- attr_name, change);
- dom_string_unref(t);
- if (err != DOM_NO_ERR) {
- goto cleanup;
- }
-
- err = dom_event_target_dispatch_event(et, evt, success);
-
-cleanup:
- _dom_mutation_event_destroy(doc, evt);
-
- return err;
-}
-
-/**
- * Dispatch a DOMCharacterDataModified event
- *
- * \param et The EventTarget object
- * \param prev The preValue of the DOMCharacterData
- * \param new The newValue of the DOMCharacterData
- * \param success Whether this event's default handler get called
- * \return DOM_NO_ERR on success, appropirate dom_exception on failure.
- *
- * TODO:
- * The character_data object may be a part of a Attr node, if so, another
- * DOMAttrModified event should be dispatched, too. But for now, we did not
- * support any XML feature, so just leave it as this.
- */
-dom_exception _dom_dispatch_characterdata_modified_event(
- struct dom_document *doc, dom_event_target *et,
- dom_string *prev, dom_string *new, bool *success)
-{
- struct dom_mutation_event *evt;
- dom_exception err;
-
- err = _dom_mutation_event_create(doc, &evt);
- if (err != DOM_NO_ERR)
- return err;
-
- lwc_string *type = NULL;
- err = _dom_document_create_lwcstring(doc,
- (const uint8_t *) "DOMCharacterDataModified",
- SLEN("DOMCharacterDataModified"), &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- dom_string *t = NULL;
- err = _dom_document_create_string_from_lwcstring(doc, type, &t);
- _dom_document_unref_lwcstring(doc, type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- err = dom_mutation_event_init(evt, t, true, false, et, prev, new, NULL,
- DOM_MUTATION_MODIFICATION);
- dom_string_unref(t);
- if (err != DOM_NO_ERR) {
- goto cleanup;
- }
-
- err = dom_event_target_dispatch_event(et, evt, success);
-
-cleanup:
- _dom_mutation_event_destroy(doc, evt);
-
- return err;
-}
-
-/**
- * Dispatch a DOMSubtreeModified event
- *
- * \param doc The Document
- * \param et The EventTarget object
- * \param success Whether this event's default handler get called
- * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
- */
-dom_exception _dom_dispatch_subtree_modified_event(struct dom_document *doc,
- dom_event_target *et, bool *success)
-{
- struct dom_mutation_event *evt;
- dom_exception err;
-
- err = _dom_mutation_event_create(doc, &evt);
- if (err != DOM_NO_ERR)
- return err;
-
- lwc_string *type = NULL;
- err = _dom_document_create_lwcstring(doc,
- (const uint8_t *) "DOMSubtreeModified",
- SLEN("DOMSubtreeModified"), &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- dom_string *t = NULL;
- err = _dom_document_create_string_from_lwcstring(doc, type, &t);
- _dom_document_unref_lwcstring(doc, type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- err = dom_mutation_event_init(evt, t, true, false, et, NULL, NULL, NULL,
- DOM_MUTATION_MODIFICATION);
- dom_string_unref(t);
- if (err != DOM_NO_ERR) {
- goto cleanup;
- }
-
- err = dom_event_target_dispatch_event(et, evt, success);
-
-cleanup:
- _dom_mutation_event_destroy(doc, evt);
-
- return err;
-}
-
-/**
- * Dispatch a generic event
- *
- * \param doc The Document
- * \param et The EventTarget object
- * \param name The name of the event
- * \param len The length of the name string
- * \param bubble Whether this event bubbles
- * \param cancelable Whether this event can be cancelable
- * \param success Whether this event's default handler get called
- * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
- */
-dom_exception _dom_dispatch_generic_event(struct dom_document *doc,
- dom_event_target *et, const uint8_t *name, size_t len,
- bool bubble, bool cancelable, bool *success)
-{
- struct dom_event *evt;
- dom_exception err;
-
- err = _dom_event_create(doc, &evt);
- if (err != DOM_NO_ERR)
- return err;
-
- lwc_string *type = NULL;
- err = _dom_document_create_lwcstring(doc, name, len, &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- dom_string *t = NULL;
- err = _dom_document_create_string_from_lwcstring(doc, type, &t);
- _dom_document_unref_lwcstring(doc, type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- err = dom_event_init(evt, t, bubble, cancelable);
- dom_string_unref(t);
- if (err != DOM_NO_ERR) {
- goto cleanup;
- }
-
- err = dom_event_target_dispatch_event(et, evt, success);
-
-cleanup:
- _dom_event_destroy(doc, evt);
-
- return err;
-}
-