summaryrefslogtreecommitdiff
path: root/javascript/jsapi.c
diff options
context:
space:
mode:
authorVincent Sanders <vince@netsurf-browser.org>2012-12-03 17:09:44 +0000
committerVincent Sanders <vince@netsurf-browser.org>2012-12-03 17:09:44 +0000
commit30528647735b5bcb689427b3a865f78c57a6070c (patch)
tree0af49c5ae803c2f06fee16852b377443f8f5cc6f /javascript/jsapi.c
parent22fbe5abfc2797ebba6f330a48b3b6d2ec2058a3 (diff)
downloadnetsurf-30528647735b5bcb689427b3a865f78c57a6070c.tar.gz
netsurf-30528647735b5bcb689427b3a865f78c57a6070c.tar.bz2
issue click events at dom
Diffstat (limited to 'javascript/jsapi.c')
-rw-r--r--javascript/jsapi.c46
1 files changed, 38 insertions, 8 deletions
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;