From f0c720c19bd72c06ab476842e6ef329a13718e58 Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Fri, 29 Jun 2007 17:37:33 +0200 Subject: [PATCH] DOM ecmascript: Defined getElementById. --- .../dom/ecmascript/spidermonkey/Document.c | 18 +++++++++++++++- .../spidermonkey/html/HTMLElement.c | 21 ++++++++++++++++++- .../spidermonkey/html/HTMLElement.h | 2 ++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/document/dom/ecmascript/spidermonkey/Document.c b/src/document/dom/ecmascript/spidermonkey/Document.c index 4fb8bce35..3616f84b3 100644 --- a/src/document/dom/ecmascript/spidermonkey/Document.c +++ b/src/document/dom/ecmascript/spidermonkey/Document.c @@ -6,6 +6,9 @@ #include "document/dom/ecmascript/spidermonkey.h" #include "document/dom/ecmascript/spidermonkey/Document.h" #include "document/dom/ecmascript/spidermonkey/Node.h" +#include "document/dom/ecmascript/spidermonkey/html/HTMLElement.h" +#include "dom/node.h" +#include "util/hash.h" JSBool Document_getProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp) @@ -181,7 +184,20 @@ static JSBool Document_getElementById(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - /* Write me! */ + struct html_objects *o = JS_GetContextPrivate(ctx); + unsigned char *key; + struct hash_item *item; + + if (argc != 1) + return JS_FALSE; + key = jsval_to_string(ctx, &argv[0]); + item = get_hash_item(o->ids, key, strlen(key)); + if (item) { + struct dom_node *node = item->value; + + assert(node); + object_to_jsval(ctx, rval, node->ecmascript_obj); + } return JS_TRUE; } diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLElement.c b/src/document/dom/ecmascript/spidermonkey/html/HTMLElement.c index be8232b7e..3da1c385a 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLElement.c +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLElement.c @@ -9,6 +9,7 @@ #include "document/dom/ecmascript/spidermonkey/Node.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLElement.h" #include "dom/node.h" +#include "util/hash.h" JSBool HTMLElement_getProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp) @@ -55,6 +56,7 @@ HTMLElement_setProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp) { struct dom_node *node; struct HTMLElement_struct *html; + struct html_objects *o; if (!JSVAL_IS_INT(id)) return JS_TRUE; @@ -71,7 +73,16 @@ HTMLElement_setProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp) switch (JSVAL_TO_INT(id)) { case JSP_HTML_ELEMENT_ID: + o = JS_GetContextPrivate(ctx); + if (html->id) { + struct hash_item *item = get_hash_item(o->ids, html->id, strlen(html->id)); + + if (item) + del_hash_item(o->ids, item); + } mem_free_set(&html->id, stracpy(jsval_to_string(ctx, vp))); + if (html->id) + add_hash_item(o->ids, html->id, strlen(html->id), node); break; case JSP_HTML_ELEMENT_TITLE: mem_free_set(&html->title, stracpy(jsval_to_string(ctx, vp))); @@ -128,8 +139,16 @@ void done_HTMLElement(struct dom_node *node) { struct HTMLElement_struct *d = node->data.element.html_data; + JSContext *ctx = node->ecmascript_ctx; + struct html_objects *o = JS_GetContextPrivate(ctx); - mem_free_if(d->id); + if (d->id) { + struct hash_item *item = get_hash_item(o->ids, d->id, strlen(d->id)); + + if (item) + del_hash_item(o->ids, item); + mem_free(d->id); + } mem_free_if(d->title); mem_free_if(d->lang); mem_free_if(d->dir); diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLElement.h b/src/document/dom/ecmascript/spidermonkey/html/HTMLElement.h index d3365b96b..3977a5eae 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLElement.h +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLElement.h @@ -3,6 +3,7 @@ #include "ecmascript/spidermonkey/util.h" struct dom_node; +struct hash; extern const JSClass HTMLElement_class; extern const JSFunctionSpec HTMLElement_funcs[]; @@ -24,6 +25,7 @@ struct html_objects { /* FIXME: Better name for this type. */ JSObject *Node_object; JSObject *Element_object; JSObject *HTMLElement_object; + struct hash *ids; }; void make_HTMLElement(JSContext *ctx, struct dom_node *node);