summaryrefslogtreecommitdiff
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
parent22fbe5abfc2797ebba6f330a48b3b6d2ec2058a3 (diff)
downloadnetsurf-30528647735b5bcb689427b3a865f78c57a6070c.tar.gz
netsurf-30528647735b5bcb689427b3a865f78c57a6070c.tar.bz2
issue click events at dom
-rw-r--r--javascript/js.h5
-rw-r--r--javascript/jsapi.c46
-rw-r--r--render/html.c2
-rw-r--r--render/html_interaction.c27
-rw-r--r--test/js/event-onload.html10
5 files changed, 69 insertions, 21 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;
diff --git a/render/html.c b/render/html.c
index f90d1ee18..812c6909b 100644
--- a/render/html.c
+++ b/render/html.c
@@ -336,7 +336,7 @@ void html_finish_conversion(html_content *c)
* object, but with its target set to the Document object (and
* the currentTarget set to the Window object)
*/
- js_fire_event(c->jscontext, "load", NULL);
+ js_fire_event(c->jscontext, "load", c->document, NULL);
/* convert dom tree to box tree */
LOG(("DOM to box (%p)", c));
diff --git a/render/html_interaction.c b/render/html_interaction.c
index 2b6bc9aa0..8dd613bdf 100644
--- a/render/html_interaction.c
+++ b/render/html_interaction.c
@@ -42,6 +42,7 @@
#include "render/html_internal.h"
#include "render/imagemap.h"
#include "render/textinput.h"
+#include "javascript/js.h"
#include "utils/messages.h"
#include "utils/utils.h"
@@ -323,6 +324,7 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
int padding_left, padding_right, padding_top, padding_bottom;
browser_drag_type drag_type = browser_window_get_drag_type(bw);
union content_msg_data msg_data;
+ struct dom_node *node = NULL;
if (drag_type != DRAGGING_NONE && !mouse &&
html->visible_select_menu != NULL) {
@@ -389,7 +391,8 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
browser_window_set_drag_type(bw, DRAGGING_NONE, NULL);
/* search the box tree for a link, imagemap, form control, or
- * box with scrollbars */
+ * box with scrollbars
+ */
box = html->layout;
@@ -397,14 +400,17 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
box_x = box->margin[LEFT];
box_y = box->margin[TOP];
- while ((next_box = box_at_point(box, x, y, &box_x, &box_y)) !=
- NULL) {
+ while ((next_box = box_at_point(box, x, y, &box_x, &box_y)) != NULL) {
box = next_box;
if (box->style && css_computed_visibility(box->style) ==
CSS_VISIBILITY_HIDDEN)
continue;
+ if (box->node != NULL) {
+ node = box->node;
+ }
+
if (box->object) {
if (content_get_type(box->object) == CONTENT_HTML) {
html_object_box = box;
@@ -447,11 +453,12 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
pointer = get_pointer_shape(box, false);
- if ((box->scroll_x != NULL || box->scroll_y != NULL) &&
- drag_candidate == NULL)
- drag_candidate = box;
-
if (box->scroll_y != NULL || box->scroll_x != NULL) {
+
+ if (drag_candidate == NULL) {
+ drag_candidate = box;
+ }
+
padding_left = box_x +
scrollbar_get_offset(box->scroll_x);
padding_right = padding_left + box->padding[LEFT] +
@@ -842,6 +849,12 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
content_broadcast(c, CONTENT_MSG_POINTER, msg_data);
}
+ /* fire dom click event */
+ if ((mouse & BROWSER_MOUSE_CLICK_1) ||
+ (mouse & BROWSER_MOUSE_CLICK_2)) {
+ js_fire_event(html->jscontext, "click", html->document, node);
+ }
+
/* deferred actions that can cause this browser_window to be destroyed
* and must therefore be done after set_status/pointer
*/
diff --git a/test/js/event-onload.html b/test/js/event-onload.html
index aede985a4..cd9e70543 100644
--- a/test/js/event-onload.html
+++ b/test/js/event-onload.html
@@ -6,9 +6,7 @@
function addTextNode()
{
-var newtext = document.createTextNode(" Some text added dynamically. ");
-var para = document.getElementById("p1");
-para.appendChild(newtext);
+para.appendChild(document.createTextNode(" Some text added dynamically. "));
}
</script>
@@ -19,10 +17,14 @@ para.appendChild(newtext);
<p id="p1">First line of paragraph.<br /></p>
</div><br />
-<button onclick="addTextNode();">add another textNode.</button>
+<button id="button1" >add another textNode.</button>
<script>
+var button = document.getElementById("button1");
+var para = document.getElementById("p1");
+
window.onload = addTextNode;
+button.onclick = addTextNode;
</script>
</body>