diff options
author | Vincent Sanders <vince@netsurf-browser.org> | 2012-12-03 17:09:44 +0000 |
---|---|---|
committer | Vincent Sanders <vince@netsurf-browser.org> | 2012-12-03 17:09:44 +0000 |
commit | 30528647735b5bcb689427b3a865f78c57a6070c (patch) | |
tree | 0af49c5ae803c2f06fee16852b377443f8f5cc6f /javascript | |
parent | 22fbe5abfc2797ebba6f330a48b3b6d2ec2058a3 (diff) | |
download | netsurf-30528647735b5bcb689427b3a865f78c57a6070c.tar.gz netsurf-30528647735b5bcb689427b3a865f78c57a6070c.tar.bz2 |
issue click events at dom
Diffstat (limited to 'javascript')
-rw-r--r-- | javascript/js.h | 5 | ||||
-rw-r--r-- | javascript/jsapi.c | 46 |
2 files changed, 42 insertions, 9 deletions
diff --git a/javascript/js.h b/javascript/js.h index 4dd8f15d3..d7943b1b7 100644 --- a/javascript/js.h +++ b/javascript/js.h @@ -51,7 +51,10 @@ jsobject *js_newcompartment(jscontext *ctx, void *win_priv, void *doc_priv); /* execute some javascript in a context */ bool js_exec(jscontext *ctx, const char *txt, size_t txtlen); +typedef struct dom_document dom_document; +typedef struct dom_node dom_node; + /* fire an event at a dom node */ -bool js_fire_event(jscontext *ctx, const char *type, void *target); +bool js_fire_event(jscontext *ctx, const char *type, dom_document *doc, dom_node *target); #endif /* _NETSURF_JAVASCRIPT_JS_H_ */ diff --git a/javascript/jsapi.c b/javascript/jsapi.c index bec565316..e5b4ddf6e 100644 --- a/javascript/jsapi.c +++ b/javascript/jsapi.c @@ -153,7 +153,7 @@ bool js_exec(jscontext *ctx, const char *txt, size_t txtlen) dom_exception _dom_event_create(dom_document *doc, dom_event **evt); #define dom_event_create(d, e) _dom_event_create((dom_document *)(d), (dom_event **) (e)) -bool js_fire_event(jscontext *ctx, const char *type, void *target) +bool js_fire_event(jscontext *ctx, const char *type, dom_document *doc, dom_node *target) { JSContext *cx = (JSContext *)ctx; dom_node *node = target; @@ -165,18 +165,23 @@ bool js_fire_event(jscontext *ctx, const char *type, void *target) dom_event *event; dom_string *type_dom; + if (cx == NULL) { + return false; + } + if (node == NULL) { - /* deliver to window */ - if (cx == NULL) { - return false; - } + /* deliver manufactured event to window */ + JSLOG("Dispatching event %s at window", type); - exc = dom_string_create((unsigned char*)type, strlen(type), &type_dom); + /* create and initialise and event object */ + exc = dom_string_create((unsigned char*)type, + strlen(type), + &type_dom); if (exc != DOM_NO_ERR) { return false; } - exc = dom_event_create(-1, &event); + exc = dom_event_create(doc, &event); if (exc != DOM_NO_ERR) { return false; } @@ -192,6 +197,7 @@ bool js_fire_event(jscontext *ctx, const char *type, void *target) return false; } + /* dispatch event at the window object */ argv[0] = OBJECT_TO_JSVAL(jsevent); ret = JS_CallFunctionName(cx, @@ -200,7 +206,31 @@ bool js_fire_event(jscontext *ctx, const char *type, void *target) 1, argv, &rval); - } + } else { + JSLOG("Dispatching event %s at %p", type, node); + + /* create and initialise and event object */ + exc = dom_string_create((unsigned char*)type, + strlen(type), + &type_dom); + if (exc != DOM_NO_ERR) { + return false; + } + + exc = dom_event_create(doc, &event); + if (exc != DOM_NO_ERR) { + return false; + } + + exc = dom_event_init(event, type_dom, true, true); + dom_string_unref(type_dom); + if (exc != DOM_NO_ERR) { + return false; + } + + dom_event_target_dispatch_event(node, event, &ret); + + } if (ret == JS_TRUE) { return true; |