summaryrefslogtreecommitdiff
path: root/javascript
diff options
context:
space:
mode:
authorMichael Drake <michael.drake@codethink.co.uk>2016-02-01 15:17:39 +0000
committerMichael Drake <michael.drake@codethink.co.uk>2016-02-01 15:17:39 +0000
commit6904622d9f214259d2d897c753ed7e68c8ec6a8a (patch)
treeaefe09a3e6cd332249b3dc9f4a6bc19c033b5db6 /javascript
parentcd0bcc421a2ae5a4bf64f4e21c92a0004ef7ece8 (diff)
downloadnetsurf-6904622d9f214259d2d897c753ed7e68c8ec6a8a.tar.gz
netsurf-6904622d9f214259d2d897c753ed7e68c8ec6a8a.tar.bz2
JavaScript: Fix & optimise HTMLElement specialisation proto str generation.
We now map from tag name to appropriate specialisation of HTMLElement. We also build the prototype strings at build time, rather than using duktape to concatinate them together at run time.
Diffstat (limited to 'javascript')
-rw-r--r--javascript/duktape/dukky.c208
1 files changed, 199 insertions, 9 deletions
diff --git a/javascript/duktape/dukky.c b/javascript/duktape/dukky.c
index 2c929b8ce..1a09fe3ae 100644
--- a/javascript/duktape/dukky.c
+++ b/javascript/duktape/dukky.c
@@ -162,6 +162,196 @@ dukky_push_node_stacked(duk_context *ctx)
return true;
}
+#define SET_HTML_CLASS(CLASS) \
+ *html_class = PROTO_NAME(HTML##CLASS##ELEMENT); \
+ *html_class_len = \
+ SLEN(PROTO_NAME(HTML)) + \
+ SLEN(#CLASS) + \
+ SLEN("ELEMENT");
+
+static void dukky_html_element_class_from_tag_type(dom_html_element_type type,
+ const char **html_class, size_t *html_class_len)
+{
+ switch(type) {
+ case DOM_HTML_ELEMENT_TYPE__COUNT:
+ assert(type != DOM_HTML_ELEMENT_TYPE__COUNT);
+ break;
+ case DOM_HTML_ELEMENT_TYPE_HTML:
+ SET_HTML_CLASS(HTML)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_HEAD:
+ SET_HTML_CLASS(HEAD)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_META:
+ SET_HTML_CLASS(META)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_BASE:
+ SET_HTML_CLASS(BASE)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_TITLE:
+ SET_HTML_CLASS(TITLE)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_BODY:
+ SET_HTML_CLASS(BODY)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_DIV:
+ SET_HTML_CLASS(DIV)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_FORM:
+ SET_HTML_CLASS(FORM)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_LINK:
+ SET_HTML_CLASS(LINK)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_BUTTON:
+ SET_HTML_CLASS(BUTTOM)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_INPUT:
+ SET_HTML_CLASS(INPUT)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_TEXTAREA:
+ SET_HTML_CLASS(TEXTAREA)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_OPTGROUP:
+ SET_HTML_CLASS(OPTGROUP)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_OPTION:
+ SET_HTML_CLASS(OPTION)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_SELECT:
+ SET_HTML_CLASS(SELECT)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_HR:
+ SET_HTML_CLASS(HR)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_DL:
+ SET_HTML_CLASS(DLIST)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_DIR:
+ SET_HTML_CLASS(DIRECTORY)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_MENU:
+ SET_HTML_CLASS(MENU)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_FIELDSET:
+ SET_HTML_CLASS(FIELDSET)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_LEGEND:
+ SET_HTML_CLASS(LEGEND)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_P:
+ SET_HTML_CLASS(PARAGRAPH)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_H1:
+ case DOM_HTML_ELEMENT_TYPE_H2:
+ case DOM_HTML_ELEMENT_TYPE_H3:
+ case DOM_HTML_ELEMENT_TYPE_H4:
+ case DOM_HTML_ELEMENT_TYPE_H5:
+ case DOM_HTML_ELEMENT_TYPE_H6:
+ SET_HTML_CLASS(HEADING)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_BLOCKQUOTE:
+ case DOM_HTML_ELEMENT_TYPE_Q:
+ SET_HTML_CLASS(QUOTE)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_PRE:
+ SET_HTML_CLASS(PRE)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_BR:
+ SET_HTML_CLASS(BR)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_LABEL:
+ SET_HTML_CLASS(LABEL)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_UL:
+ SET_HTML_CLASS(ULIST)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_OL:
+ SET_HTML_CLASS(OLIST)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_LI:
+ SET_HTML_CLASS(LI)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_FONT:
+ SET_HTML_CLASS(FONT)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_DEL:
+ case DOM_HTML_ELEMENT_TYPE_INS:
+ SET_HTML_CLASS(MOD)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_A:
+ SET_HTML_CLASS(ANCHOR)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_BASEFONT:
+ SET_HTML_CLASS(BASEFONT)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_IMG:
+ SET_HTML_CLASS(IMAGE)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_OBJECT:
+ SET_HTML_CLASS(OBJECT)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_PARAM:
+ SET_HTML_CLASS(PARAM)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_APPLET:
+ SET_HTML_CLASS(APPLET)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_MAP:
+ SET_HTML_CLASS(MAP)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_AREA:
+ SET_HTML_CLASS(AREA)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_SCRIPT:
+ SET_HTML_CLASS(SCRIPT)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_CAPTION:
+ SET_HTML_CLASS(TABLECAPTION)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_TD:
+ case DOM_HTML_ELEMENT_TYPE_TH:
+ SET_HTML_CLASS(TABLECELL)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_COL:
+ case DOM_HTML_ELEMENT_TYPE_COLGROUP:
+ SET_HTML_CLASS(TABLECOL)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_THEAD:
+ case DOM_HTML_ELEMENT_TYPE_TBODY:
+ case DOM_HTML_ELEMENT_TYPE_TFOOT:
+ SET_HTML_CLASS(TABLESECTION)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_TABLE:
+ SET_HTML_CLASS(TABLE)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_TR:
+ SET_HTML_CLASS(TABLEROW)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_STYLE:
+ SET_HTML_CLASS(STYLE)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_FRAMESET:
+ SET_HTML_CLASS(FRAMESET)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_FRAME:
+ SET_HTML_CLASS(FRAME)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_IFRAME:
+ SET_HTML_CLASS(IFRAME)
+ break;
+ case DOM_HTML_ELEMENT_TYPE_ISINDEX:
+ SET_HTML_CLASS(ISINDEX)
+ break;
+ case DOM_HTML_ELEMENT_TYPE__UNKNOWN:
+ SET_HTML_CLASS(UNKNOWN)
+ break;
+ }
+ return;
+}
+
+#undef SET_HTML_CLASS
+
static void
dukky_push_node_klass(duk_context *ctx, struct dom_node *node)
{
@@ -177,7 +367,10 @@ dukky_push_node_klass(duk_context *ctx, struct dom_node *node)
switch(nodetype) {
case DOM_ELEMENT_NODE: {
- dom_string *namespace, *tag;
+ dom_string *namespace;
+ dom_html_element_type type;
+ const char *html_class;
+ size_t html_class_len;
err = dom_node_get_namespace(node, &namespace);
if (err != DOM_NO_ERR) {
/* Feck it, element */
@@ -200,18 +393,15 @@ dukky_push_node_klass(duk_context *ctx, struct dom_node *node)
}
dom_string_unref(namespace);
- err = dom_node_get_node_name(node, &tag);
+ err = dom_html_element_get_tag_type(node, &type);
if (err != DOM_NO_ERR) {
- duk_push_string(ctx, PROTO_NAME(HTMLUNKNOWNELEMENT));
- break;
+ type = DOM_HTML_ELEMENT_TYPE__UNKNOWN;
}
- duk_push_string(ctx, PROTO_NAME(HTML));
- duk_push_lstring(ctx, dom_string_data(tag), dom_string_length(tag));
- dom_string_unref(tag);
- duk_push_string(ctx, "ELEMENT");
- duk_concat(ctx, 3);
+ dukky_html_element_class_from_tag_type(type,
+ &html_class, &html_class_len);
+ duk_push_lstring(ctx, html_class, html_class_len);
break;
}
case DOM_TEXT_NODE: