From d4222fab05f909226617587f85223e7551b5323e Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Sun, 19 Jul 2015 18:10:34 +0100 Subject: REWORK: ARGFHiufdsfds --- javascript/Makefile | 3 +- javascript/dukky.c | 79 +++++++++++++++++++------------ javascript/duktape/character_data.c | 2 +- javascript/duktape/comment.c | 2 +- javascript/duktape/document.c | 4 +- javascript/duktape/element.c | 2 +- javascript/duktape/html_element.c | 2 +- javascript/duktape/html_unknown_element.c | 2 +- javascript/duktape/node.c | 4 +- javascript/duktape/node_list.c | 4 +- javascript/duktape/private.h | 5 ++ javascript/duktape/prototypes.h | 1 + javascript/duktape/text.c | 2 +- javascript/duktape/window.c | 4 +- 14 files changed, 71 insertions(+), 45 deletions(-) diff --git a/javascript/Makefile b/javascript/Makefile index 7c7006dc2..3d3e2733f 100644 --- a/javascript/Makefile +++ b/javascript/Makefile @@ -63,7 +63,8 @@ ifeq ($(NETSURF_USE_DUKTAPE),YES) S_DUKKY := event_target.c window.c node.c document.c \ element.c html_element.c html_unknown_element.c \ - character_data.c text.c comment.c html_collection.c node_list.c + character_data.c text.c comment.c html_collection.c node_list.c \ + html_br_element.c S_JAVASCRIPT += dukky.c duktape.c content.c fetcher.c $(addprefix duktape/,$(S_DUKKY)) diff --git a/javascript/dukky.c b/javascript/dukky.c index e5836be6e..0e9e39a9a 100644 --- a/javascript/dukky.c +++ b/javascript/dukky.c @@ -22,11 +22,13 @@ */ #include "content/content.h" + #include "utils/nsoption.h" +#include "utils/log.h" +#include "utils/corestrings.h" #include "javascript/js.h" #include "javascript/content.h" -#include "utils/log.h" #include "duktape.h" #include "dukky.h" @@ -46,9 +48,9 @@ static duk_ret_t dukky_populate_object(duk_context *ctx) duk_get_prop(ctx, -2); /* ... obj args prototab {proto/undefined} */ if (duk_is_undefined(ctx, -1)) { - LOG("RuhRoh, couldn't find a prototype, getting htmlelement"); + LOG("RuhRoh, couldn't find a prototype, HTMLUnknownElement it is"); duk_pop(ctx); - duk_push_string(ctx, PROTO_NAME(html_unknown_element)); + duk_push_string(ctx, PROTO_NAME(HTMLUNKNOWNELEMENT)); duk_get_prop(ctx, -2); } /* ... obj args prototab proto */ @@ -185,39 +187,57 @@ dukky_push_node_klass(duk_context *ctx, struct dom_node *node) err = dom_node_get_node_type(node, &nodetype); if (err != DOM_NO_ERR) { /* Oh bum, just node then */ - duk_push_string(ctx, PROTO_NAME(node)); + duk_push_string(ctx, PROTO_NAME(NODE)); return; } switch(nodetype) { case DOM_ELEMENT_NODE: { - dom_string *namespace; + dom_string *namespace, *tag; err = dom_node_get_namespace(node, &namespace); if (err != DOM_NO_ERR) { /* Feck it, element */ - duk_push_string(ctx, PROTO_NAME(element)); + LOG("dom_node_get_namespace() failed"); + duk_push_string(ctx, PROTO_NAME(ELEMENT)); break; } if (namespace == NULL) { /* No namespace, -> element */ - duk_push_string(ctx, PROTO_NAME(element)); + LOG("no namespace"); + duk_push_string(ctx, PROTO_NAME(ELEMENT)); break; } - /* TODO: Work out how to decide between Element and HTML */ - duk_push_string(ctx, PROTO_NAME(html_unknown_element)); - + if (dom_string_isequal(namespace, corestring_dom_html_namespace) == false) { + /* definitely not an HTML element of some kind */ + duk_push_string(ctx, PROTO_NAME(ELEMENT)); + dom_string_unref(namespace); + break; + } dom_string_unref(namespace); + + err = dom_node_get_node_name(node, &tag); + if (err != DOM_NO_ERR) { + duk_push_string(ctx, PROTO_NAME(HTMLUNKNOWNELEMENT)); + break; + } + + 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); + break; } case DOM_TEXT_NODE: - duk_push_string(ctx, PROTO_NAME(text)); + duk_push_string(ctx, PROTO_NAME(TEXT)); break; case DOM_COMMENT_NODE: - duk_push_string(ctx, PROTO_NAME(comment)); + duk_push_string(ctx, PROTO_NAME(COMMENT)); break; case DOM_DOCUMENT_NODE: - duk_push_string(ctx, PROTO_NAME(document)); + duk_push_string(ctx, PROTO_NAME(DOCUMENT)); break; case DOM_ATTRIBUTE_NODE: case DOM_PROCESSING_INSTRUCTION_NODE: @@ -229,7 +249,7 @@ dukky_push_node_klass(duk_context *ctx, struct dom_node *node) case DOM_CDATA_SECTION_NODE: default: /* Oh bum, just node then */ - duk_push_string(ctx, PROTO_NAME(node)); + duk_push_string(ctx, PROTO_NAME(NODE)); } } @@ -315,8 +335,8 @@ void js_finalise(void) /* NADA for now */ } -#define DUKKY_NEW_PROTOTYPE(klass, klass_name) \ - dukky_create_prototype(ctx, dukky_##klass##___proto, PROTO_NAME(klass), klass_name) +#define DUKKY_NEW_PROTOTYPE(klass, uklass, klass_name) \ + dukky_create_prototype(ctx, dukky_##klass##___proto, PROTO_NAME(uklass), klass_name) jscontext *js_newcontext(int timeout, jscallback *cb, void *cbctx) { @@ -332,20 +352,21 @@ jscontext *js_newcontext(int timeout, jscallback *cb, void *cbctx) duk_put_prop_string(ctx, -2, "protos"); duk_put_global_string(ctx, PROTO_MAGIC); /* Create prototypes here? */ - DUKKY_NEW_PROTOTYPE(event_target, "EventTarget"); - DUKKY_NEW_PROTOTYPE(node, "Node"); - DUKKY_NEW_PROTOTYPE(character_data, "CharacterData"); - DUKKY_NEW_PROTOTYPE(text, "Text"); - DUKKY_NEW_PROTOTYPE(comment, "Comment"); - DUKKY_NEW_PROTOTYPE(document, "Document"); - DUKKY_NEW_PROTOTYPE(element, "Element"); - DUKKY_NEW_PROTOTYPE(html_element, "HTMLElement"); - DUKKY_NEW_PROTOTYPE(html_unknown_element, "HTMLUnknownElement"); - DUKKY_NEW_PROTOTYPE(html_collection, "HTMLCollection"); - DUKKY_NEW_PROTOTYPE(node_list, "NodeList"); + DUKKY_NEW_PROTOTYPE(event_target, EVENTTARGET, "EventTarget"); + DUKKY_NEW_PROTOTYPE(node, NODE, "Node"); + DUKKY_NEW_PROTOTYPE(character_data, CHARACTERDATA, "CharacterData"); + DUKKY_NEW_PROTOTYPE(text, TEXT, "Text"); + DUKKY_NEW_PROTOTYPE(comment, COMMENT, "Comment"); + DUKKY_NEW_PROTOTYPE(document, DOCUMENT, "Document"); + DUKKY_NEW_PROTOTYPE(element, ELEMENT, "Element"); + DUKKY_NEW_PROTOTYPE(html_element, HTMLELEMENT, "HTMLElement"); + DUKKY_NEW_PROTOTYPE(html_unknown_element, HTMLUNKNOWNELEMENT, "HTMLUnknownElement"); + DUKKY_NEW_PROTOTYPE(html_br_element, HTMLBRELEMENT, "HTMLBRElement"); + DUKKY_NEW_PROTOTYPE(html_collection, HTMLCOLLECTION, "HTMLCollection"); + DUKKY_NEW_PROTOTYPE(node_list, NODELIST, "NodeList"); /* Finally window's prototype */ - DUKKY_NEW_PROTOTYPE(window, "Window"); + DUKKY_NEW_PROTOTYPE(window, WINDOW, "Window"); return ret; } @@ -370,7 +391,7 @@ jsobject *js_newcompartment(jscontext *ctx, void *win_priv, void *doc_priv) /* win_priv is a browser_window, doc_priv is an html content struct */ duk_push_pointer(CTX, win_priv); duk_push_pointer(CTX, doc_priv); - dukky_create_object(CTX, PROTO_NAME(window), 2); + dukky_create_object(CTX, PROTO_NAME(WINDOW), 2); duk_push_global_object(CTX); duk_put_prop_string(CTX, -2, PROTO_MAGIC); duk_set_global_object(CTX); diff --git a/javascript/duktape/character_data.c b/javascript/duktape/character_data.c index a71de478f..608c6554d 100644 --- a/javascript/duktape/character_data.c +++ b/javascript/duktape/character_data.c @@ -41,7 +41,7 @@ DUKKY_FUNC(character_data, __proto) /* Populate character_data's prototypical functionality */ /* Set this prototype's prototype (left-parent)*/ - DUKKY_GET_PROTOTYPE(node); + DUKKY_GET_PROTOTYPE(NODE); duk_set_prototype(ctx, 0); /* And the initialiser/finalizer */ DUKKY_SET_DESTRUCTOR(0, character_data); diff --git a/javascript/duktape/comment.c b/javascript/duktape/comment.c index 877793af2..8fbf79f55 100644 --- a/javascript/duktape/comment.c +++ b/javascript/duktape/comment.c @@ -41,7 +41,7 @@ DUKKY_FUNC(comment, __proto) /* Populate comment's prototypical functionality */ /* Set this prototype's prototype (left-parent)*/ - DUKKY_GET_PROTOTYPE(character_data); + DUKKY_GET_PROTOTYPE(CHARACTERDATA); duk_set_prototype(ctx, 0); /* And the initialiser/finalizer */ DUKKY_SET_DESTRUCTOR(0, comment); diff --git a/javascript/duktape/document.c b/javascript/duktape/document.c index 76fec7501..f09629ac6 100644 --- a/javascript/duktape/document.c +++ b/javascript/duktape/document.c @@ -223,7 +223,7 @@ static DUKKY_FUNC(document, getElementsByTagName) if (nodes == NULL) return 0; /* coerced to undefined */ duk_push_pointer(ctx, nodes); - dukky_create_object(ctx, PROTO_NAME(node_list), 1); + dukky_create_object(ctx, PROTO_NAME(NODELIST), 1); dom_nodelist_unref(nodes); return 1; } @@ -239,7 +239,7 @@ DUKKY_FUNC(document, __proto) DUKKY_POPULATE_READONLY_PROPERTY(document, body); DUKKY_POPULATE_READONLY_PROPERTY(document, head); /* Set this prototype's prototype (left-parent)*/ - DUKKY_GET_PROTOTYPE(node); + DUKKY_GET_PROTOTYPE(NODE); duk_set_prototype(ctx, 0); /* And the initialiser/finalizer */ DUKKY_SET_DESTRUCTOR(0, document); diff --git a/javascript/duktape/element.c b/javascript/duktape/element.c index 23c76278a..b86e940f2 100644 --- a/javascript/duktape/element.c +++ b/javascript/duktape/element.c @@ -211,7 +211,7 @@ DUKKY_FUNC(element, __proto) DUKKY_POPULATE_READONLY_PROPERTY(element, previousElementSibling); DUKKY_POPULATE_READONLY_PROPERTY(element, childElementCount); /* Set this prototype's prototype (left-parent)*/ - DUKKY_GET_PROTOTYPE(node); + DUKKY_GET_PROTOTYPE(NODE); duk_set_prototype(ctx, 0); /* And the initialiser/finalizer */ DUKKY_SET_DESTRUCTOR(0, element); diff --git a/javascript/duktape/html_element.c b/javascript/duktape/html_element.c index c129866e4..1b22f6788 100644 --- a/javascript/duktape/html_element.c +++ b/javascript/duktape/html_element.c @@ -41,7 +41,7 @@ DUKKY_FUNC(html_element, __proto) /* Populate html_element's prototypical functionality */ /* Set this prototype's prototype (left-parent)*/ - DUKKY_GET_PROTOTYPE(element); + DUKKY_GET_PROTOTYPE(ELEMENT); duk_set_prototype(ctx, 0); /* And the initialiser/finalizer */ DUKKY_SET_DESTRUCTOR(0, html_element); diff --git a/javascript/duktape/html_unknown_element.c b/javascript/duktape/html_unknown_element.c index e728b4831..977450a02 100644 --- a/javascript/duktape/html_unknown_element.c +++ b/javascript/duktape/html_unknown_element.c @@ -41,7 +41,7 @@ DUKKY_FUNC(html_unknown_element, __proto) /* Populate html_unknown_element's prototypical functionality */ /* Set this prototype's prototype (left-parent)*/ - DUKKY_GET_PROTOTYPE(html_element); + DUKKY_GET_PROTOTYPE(HTMLELEMENT); duk_set_prototype(ctx, 0); /* And the initialiser/finalizer */ DUKKY_SET_DESTRUCTOR(0, html_unknown_element); diff --git a/javascript/duktape/node.c b/javascript/duktape/node.c index 2d7b1cf29..c81c1be10 100644 --- a/javascript/duktape/node.c +++ b/javascript/duktape/node.c @@ -42,7 +42,7 @@ static DUKKY_FUNC(node, appendChild) { DUKKY_GET_METHOD_PRIVATE(node); - if (!dukky_instanceof(ctx, PROTO_NAME(node))) return 0; + if (!dukky_instanceof(ctx, PROTO_NAME(NODE))) return 0; DUKKY_SAFE_GET_ANOTHER(other,node,0); @@ -82,7 +82,7 @@ DUKKY_FUNC(node, __proto) DUKKY_ADD_METHOD(node, appendChild, 1); DUKKY_POPULATE_READONLY_PROPERTY(node, textContent); /* Set this prototype's prototype (left-parent)*/ - DUKKY_GET_PROTOTYPE(event_target); + DUKKY_GET_PROTOTYPE(EVENTTARGET); duk_set_prototype(ctx, 0); /* And the initialiser/finalizer */ DUKKY_SET_DESTRUCTOR(0, node); diff --git a/javascript/duktape/node_list.c b/javascript/duktape/node_list.c index c127c2468..5ee9ec600 100644 --- a/javascript/duktape/node_list.c +++ b/javascript/duktape/node_list.c @@ -40,7 +40,7 @@ static DUKKY_GETTER(node_list, length) { DUKKY_GET_METHOD_PRIVATE(node_list); dom_exception err; - unsigned long len; + uint32_t len; err = dom_nodelist_get_length(priv->nodes, &len); @@ -57,8 +57,6 @@ static DUKKY_FUNC(node_list, item) dom_exception err; dom_node *node; - LOG("Looking up %u in %p", i, priv->nodes); - err = dom_nodelist_item(priv->nodes, i, &node); if (err != DOM_NO_ERR) return 0; /* coerced to undefied */ diff --git a/javascript/duktape/private.h b/javascript/duktape/private.h index 42c207987..da97031f3 100644 --- a/javascript/duktape/private.h +++ b/javascript/duktape/private.h @@ -12,6 +12,7 @@ struct dom_node_text; struct dom_node_list; struct dom_node_comment; struct dom_html_collection; +struct dom_html_br_element; typedef struct { } event_target_private_t; @@ -51,6 +52,10 @@ typedef struct { html_element_private_t parent; } html_unknown_element_private_t; +typedef struct { + html_element_private_t parent; +} html_br_element_private_t; + typedef struct { node_private_t parent; } document_private_t; diff --git a/javascript/duktape/prototypes.h b/javascript/duktape/prototypes.h index 1f25424ac..746f85cc5 100644 --- a/javascript/duktape/prototypes.h +++ b/javascript/duktape/prototypes.h @@ -11,6 +11,7 @@ DUKKY_DECLARE_INTERFACE(document, struct dom_document *); DUKKY_DECLARE_INTERFACE(element, struct dom_element *); DUKKY_DECLARE_INTERFACE(html_element, struct dom_html_element *); DUKKY_DECLARE_INTERFACE(html_unknown_element, struct dom_html_element *); +DUKKY_DECLARE_INTERFACE(html_br_element, struct dom_html_br_element *); DUKKY_DECLARE_INTERFACE(html_collection, struct dom_html_collection *); DUKKY_DECLARE_INTERFACE(node_list, struct dom_nodelist *); diff --git a/javascript/duktape/text.c b/javascript/duktape/text.c index 7669bae11..26457749d 100644 --- a/javascript/duktape/text.c +++ b/javascript/duktape/text.c @@ -41,7 +41,7 @@ DUKKY_FUNC(text, __proto) /* Populate text's prototypical functionality */ /* Set this prototype's prototype (left-parent)*/ - DUKKY_GET_PROTOTYPE(character_data); + DUKKY_GET_PROTOTYPE(CHARACTERDATA); duk_set_prototype(ctx, 0); /* And the initialiser/finalizer */ DUKKY_SET_DESTRUCTOR(0, text); diff --git a/javascript/duktape/window.c b/javascript/duktape/window.c index 3bad2ab9a..fd070aa2c 100644 --- a/javascript/duktape/window.c +++ b/javascript/duktape/window.c @@ -78,10 +78,10 @@ DUKKY_FUNC(window, __proto) /* Populate window's prototypical functionality */ DUKKY_POPULATE_FULL_PROPERTY(window, document); /* Exposed prototypes */ - DUKKY_GET_PROTOTYPE(node); + DUKKY_GET_PROTOTYPE(NODE); duk_put_prop_string(ctx, 0, "Node"); /* Set this prototype's prototype (left-parent)*/ - DUKKY_GET_PROTOTYPE(event_target); + DUKKY_GET_PROTOTYPE(EVENTTARGET); duk_set_prototype(ctx, 0); /* And the initialiser/finalizer */ DUKKY_SET_DESTRUCTOR(0, window); -- cgit v1.2.3