- From: Michael B. Allen <mballen@erols.com>
- Date: Sat, 18 Aug 2001 23:51:25 -0400
- To: www-dom@w3.org
On Sat, Aug 18, 2001 at 08:03:26PM -0500, Curt Arnold wrote:
> > listener after it has been removed. I suspect I must collect the pointers
> > to the actull functions to be called for each listener and store that
> > in an array (i.e. pre-dereference the listener functions).
>
> Actually, you should already have to collect the listeners since event
> listeners added while processing a dispatch to the same target should not
> see the event.
And it is so. Not too bad actually.
int
DOM_EventTarget_dispatchEvent(DOM_EventTarget *target, DOM_Event *evt)
{
DOM_EventTarget **targets, *t;
ListenerEntry *e;
unsigned int tcount, i, j, lcount;
if (target == NULL || evt == NULL) {
DOM_Exception = DOM_NULL_POINTER_ERR;
return 1;
}
if (evt->type == NULL || *evt->type == '\0') {
DOM_EventException = DOM_UNSPECIFIED_EVENT_TYPE_ERR;
return 1;
}
evt->target = target; /* post-initialization */
evt->timeStamp = time(NULL);
if (evt->timeStamp == (time_t)-1) {
DOM_Exception = DOM_SYSTEM_ERR;
return 1;
}
evt->sp = 0;
evt->pd = 0;
tcount = 0; /* count targets/ancestors */
for (t = target->parentNode; t; t = t->parentNode) {
tcount++;
}
if (tcount) {
targets = malloc(sizeof *targets * tcount);
if (targets == NULL) {
DOM_Exception = DOM_NO_MEMORY_ERR;
return 1;
}
}
i = tcount; /* save state of tree in targets array */
for (t = target->parentNode; t; t = t->parentNode) {
targets[--i] = t;
}
/* Trigger capturers
*/
evt->eventPhase = DOM_EVENT_CAPTURING_PHASE;
for (i = 0; i < tcount && evt->sp == 0; i++) {
DOM_EventListener listeners[targets[i]->num_listeners];
/* use stack ok? */
t = targets[i];
lcount = 0; /* copy relevant listener functions */
for (j = 0; j < t->num_listeners; j++) {
e = t->listeners[j];
if (e->useCapture &&
DOM_String_cmp(e->type, evt->type) == 0) {
listeners[lcount++] = e->listener;
}
}
evt->currentTarget = t;
while (lcount) {
listeners[--lcount](evt);
}
}
/* Trigger regular listeners
*/
evt->eventPhase = DOM_EVENT_AT_TARGET;
if (target->num_listeners && evt->sp == 0) {
DOM_EventListener listeners[target->num_listeners];
lcount = 0;
for (j = 0; j < target->num_listeners; j++) {
e = target->listeners[j];
if (e->useCapture == 0 &&
DOM_String_cmp(e->type, evt->type) == 0) {
listeners[lcount++] = e->listener;
}
}
evt->currentTarget = target;
while (lcount) {
listeners[--lcount](evt);
}
}
/* Trigger bubblers
*/
evt->eventPhase = DOM_EVENT_BUBBLING_PHASE;
i = tcount;
while (i-- && evt->sp == 0) {
DOM_EventListener listeners[targets[i]->num_listeners];
t = targets[i];
lcount = 0;
for (j = 0; j < t->num_listeners; j++) {
e = t->listeners[j];
if (e->useCapture == 0 &&
DOM_String_cmp(e->type, evt->type) == 0) {
listeners[lcount++] = e->listener;
}
}
evt->currentTarget = t;
while (lcount) {
listeners[--lcount](evt);
}
}
free(targets);
return evt->pd;
}
--
Wow a memory-mapped fork bomb! Now what on earth did you expect? - lkml
Received on Saturday, 18 August 2001 23:45:04 UTC