summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--javascript/duktape/dukky.c24
-rw-r--r--utils/corestrings.c22
-rw-r--r--utils/corestrings.h9
3 files changed, 55 insertions, 0 deletions
diff --git a/javascript/duktape/dukky.c b/javascript/duktape/dukky.c
index e56d517ea..d442c7a06 100644
--- a/javascript/duktape/dukky.c
+++ b/javascript/duktape/dukky.c
@@ -726,6 +726,16 @@ void js_handle_new_element(jscontext *ctx, struct dom_element *node)
dom_ulong siz;
dom_attr *attr = NULL;
dom_string *key = NULL;
+ dom_string *nodename;
+ duk_bool_t is_body = false;
+
+ exc = dom_node_get_node_name(node, &nodename);
+ if (exc != DOM_NO_ERR) return;
+
+ if (nodename == corestring_dom_BODY)
+ is_body = true;
+
+ dom_string_unref(nodename);
exc = dom_node_get_attributes(node, &map);
if (exc != DOM_NO_ERR) return;
@@ -739,6 +749,19 @@ void js_handle_new_element(jscontext *ctx, struct dom_element *node)
if (exc != DOM_NO_ERR) goto out;
exc = dom_attr_get_name(attr, &key);
if (exc != DOM_NO_ERR) goto out;
+ if (is_body && (
+ key == corestring_dom_onblur ||
+ key == corestring_dom_onerror ||
+ key == corestring_dom_onfocus ||
+ key == corestring_dom_onload ||
+ key == corestring_dom_onresize ||
+ key == corestring_dom_onscroll)) {
+ /* This is a forwarded event, it doesn't matter,
+ * we should skip registering for it and later
+ * we will register it for Window itself
+ */
+ goto skip_register;
+ }
if (dom_string_length(key) > 2) {
/* Can be on* */
const uint8_t *data = (const uint8_t *)dom_string_data(key);
@@ -754,6 +777,7 @@ void js_handle_new_element(jscontext *ctx, struct dom_element *node)
}
}
}
+ skip_register:
dom_string_unref(key); key = NULL;
dom_node_unref(attr); attr = NULL;
}
diff --git a/utils/corestrings.c b/utils/corestrings.c
index c263565b0..493dace81 100644
--- a/utils/corestrings.c
+++ b/utils/corestrings.c
@@ -269,6 +269,12 @@ dom_string *corestring_dom_radio;
dom_string *corestring_dom_checkbox;
dom_string *corestring_dom_file;
dom_string *corestring_dom_on;
+dom_string *corestring_dom_onblur;
+dom_string *corestring_dom_onerror;
+dom_string *corestring_dom_onfocus;
+dom_string *corestring_dom_onload;
+dom_string *corestring_dom_onresize;
+dom_string *corestring_dom_onscroll;
dom_string *corestring_dom___ns_key_box_node_data;
dom_string *corestring_dom___ns_key_libcss_node_data;
dom_string *corestring_dom___ns_key_file_name_node_data;
@@ -544,7 +550,15 @@ void corestrings_fini(void)
CSS_DOM_STRING_UNREF(radio);
CSS_DOM_STRING_UNREF(checkbox);
CSS_DOM_STRING_UNREF(file);
+ /* DOM event prefix */
CSS_DOM_STRING_UNREF(on);
+ /* DOM events forwarded from body to window */
+ CSS_DOM_STRING_UNREF(onblur);
+ CSS_DOM_STRING_UNREF(onerror);
+ CSS_DOM_STRING_UNREF(onfocus);
+ CSS_DOM_STRING_UNREF(onload);
+ CSS_DOM_STRING_UNREF(onresize);
+ CSS_DOM_STRING_UNREF(onscroll);
/* DOM userdata keys, not really CSS */
CSS_DOM_STRING_UNREF(__ns_key_box_node_data);
CSS_DOM_STRING_UNREF(__ns_key_libcss_node_data);
@@ -863,7 +877,15 @@ nserror corestrings_init(void)
CSS_DOM_STRING_INTERN(radio);
CSS_DOM_STRING_INTERN(checkbox);
CSS_DOM_STRING_INTERN(file);
+ /* DOM event prefix */
CSS_DOM_STRING_INTERN(on);
+ /* DOM events forwarded from body to window */
+ CSS_DOM_STRING_INTERN(onblur);
+ CSS_DOM_STRING_INTERN(onerror);
+ CSS_DOM_STRING_INTERN(onfocus);
+ CSS_DOM_STRING_INTERN(onload);
+ CSS_DOM_STRING_INTERN(onresize);
+ CSS_DOM_STRING_INTERN(onscroll);
/* DOM userdata keys, not really CSS */
CSS_DOM_STRING_INTERN(__ns_key_box_node_data);
CSS_DOM_STRING_INTERN(__ns_key_libcss_node_data);
diff --git a/utils/corestrings.h b/utils/corestrings.h
index c72e8b012..4913e73ae 100644
--- a/utils/corestrings.h
+++ b/utils/corestrings.h
@@ -284,7 +284,16 @@ extern struct dom_string *corestring_dom_image;
extern struct dom_string *corestring_dom_radio;
extern struct dom_string *corestring_dom_checkbox;
extern struct dom_string *corestring_dom_file;
+/* Event prefix */
extern struct dom_string *corestring_dom_on;
+/* These are the event attributes which forward from body to window */
+extern struct dom_string *corestring_dom_onblur;
+extern struct dom_string *corestring_dom_onerror;
+extern struct dom_string *corestring_dom_onfocus;
+extern struct dom_string *corestring_dom_onload;
+extern struct dom_string *corestring_dom_onresize;
+extern struct dom_string *corestring_dom_onscroll;
+
/* DOM userdata keys */
extern struct dom_string *corestring_dom___ns_key_box_node_data;
extern struct dom_string *corestring_dom___ns_key_libcss_node_data;