diff --git a/include/dom/events/event_target.h b/include/dom/events/event_target.h index 175e57f..c5dca7b 100644 --- a/include/dom/events/event_target.h +++ b/include/dom/events/event_target.h @@ -17,7 +17,14 @@ struct dom_event; struct listener_entry; -/* Event target is a mixin interface, thus has no concrete implementation. +/** + * Type of a DOM event_target + */ +typedef enum { + DOM_EVENT_TARGET_NODE = 1, +} dom_event_target_type; + +/* Event target is a mixin interface, thus has no concrete implementation. * Subclasses must provide implementations of the event target methods. */ typedef struct dom_event_target { void *vtable; @@ -51,6 +58,9 @@ typedef struct dom_event_target_vtable { struct listener_entry *cur, struct listener_entry **next, struct dom_event_listener **listener); + dom_exception (*dom_event_target_get_type)( + dom_event_target *et, + dom_event_target_type *result); } dom_event_target_vtable; static inline dom_exception dom_event_target_add_event_listener( @@ -132,5 +142,13 @@ static inline dom_exception dom_event_iter_event_listener( (struct listener_entry *) (c), (struct listener_entry **) (n),\ (struct dom_event_listener **) (l)) +static inline dom_exception dom_event_target_get_type(dom_event_target *et, + dom_event_target_type *result) +{ + return ((dom_event_target_vtable *) et->vtable) + ->dom_event_target_get_type(et, result); +} +#define dom_event_target_get_type(et, r) dom_event_target_get_type( \ + (dom_event_target *) (et), (dom_event_target_type *) (r)) #endif diff --git a/src/core/node.c b/src/core/node.c index 368aaf3..a9b8355 100644 --- a/src/core/node.c +++ b/src/core/node.c @@ -2645,3 +2645,11 @@ dom_exception _dom_node_iter_event_listener(dom_event_target *et, return _dom_event_target_iter_event_listener( node_internal->eti, type, capture, cur, next, listener); } + +dom_exception _dom_node_event_target_get_type(dom_event_target *et, + dom_event_target_type *result) +{ + assert(et != NULL); + dom_node_internal *node_internal = (dom_node_internal *)et; + return _dom_event_target_get_type(node_internal->eti, result); +} diff --git a/src/core/node.h b/src/core/node.h index ec1cb6d..a4961f3 100644 --- a/src/core/node.h +++ b/src/core/node.h @@ -108,6 +108,8 @@ dom_exception _dom_node_iter_event_listener(dom_event_target *et, dom_string *type, bool capture, struct listener_entry *cur, struct listener_entry **next, struct dom_event_listener **listener); +dom_exception _dom_node_event_target_get_type(dom_event_target *et, + dom_event_target_type *result); /* The DOM Node's vtable methods */ dom_exception _dom_node_get_node_name(dom_node_internal *node, @@ -195,7 +197,8 @@ dom_exception _dom_node_get_user_data(const dom_node_internal *node, _dom_node_dispatch_event, \ _dom_node_add_event_listener_ns, \ _dom_node_remove_event_listener_ns, \ - _dom_node_iter_event_listener + _dom_node_iter_event_listener, \ + _dom_node_event_target_get_type #define DOM_NODE_VTABLE \ _dom_node_try_destroy, \ diff --git a/src/events/event_target.c b/src/events/event_target.c index 67a4d13..bb8ea29 100644 --- a/src/events/event_target.c +++ b/src/events/event_target.c @@ -323,3 +323,20 @@ dom_exception _dom_event_target_iter_event_listener(dom_event_target_internal et } return DOM_NO_ERR; } + +/** + * Retrieve the type of an event_target + * + * \param node The eti to retrieve the type of + * \param result Pointer to location to receive node type + * \return DOM_NO_ERR. + */ +dom_exception _dom_event_target_get_type(dom_event_target_internal eti, + dom_event_target_type *result) +{ + UNUSED(eti); + + *result = DOM_EVENT_TARGET_NODE; + + return DOM_NO_ERR; +} diff --git a/src/events/event_target.h b/src/events/event_target.h index 57a70a1..d1dce78 100644 --- a/src/events/event_target.h +++ b/src/events/event_target.h @@ -89,4 +89,7 @@ dom_exception _dom_event_target_iter_event_listener(dom_event_target_internal et struct listener_entry *cur, struct listener_entry **next, dom_event_listener **listener); +dom_exception _dom_event_target_get_type(dom_event_target_internal eti, + dom_event_target_type *result); + #endif