From 09db7aa8a0ede8ef53d50fc68e04ef139a3cfb7f Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Tue, 12 Jun 2007 13:01:54 +0200 Subject: [PATCH] DOM, ecmascript: Added some helper functions for handling forms. Defined the item function of HTMLCollection. --- .../spidermonkey/html/HTMLButtonElement.h | 2 +- .../spidermonkey/html/HTMLCollection.c | 76 ++++++++++++---- .../spidermonkey/html/HTMLFieldSetElement.h | 2 +- .../spidermonkey/html/HTMLFormElement.c | 89 ++++++++++++++++++- .../spidermonkey/html/HTMLFormElement.h | 6 +- .../spidermonkey/html/HTMLInputElement.h | 2 +- .../spidermonkey/html/HTMLIsIndexElement.h | 2 +- .../spidermonkey/html/HTMLLabelElement.h | 2 +- .../spidermonkey/html/HTMLLegendElement.h | 2 +- .../spidermonkey/html/HTMLObjectElement.h | 2 +- .../spidermonkey/html/HTMLSelectElement.h | 2 +- .../spidermonkey/html/HTMLTextAreaElement.h | 2 +- 12 files changed, 158 insertions(+), 31 deletions(-) diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLButtonElement.h b/src/document/dom/ecmascript/spidermonkey/html/HTMLButtonElement.h index fc87fac8..ef5f9c6c 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLButtonElement.h +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLButtonElement.h @@ -10,7 +10,7 @@ extern const JSPropertySpec HTMLButtonElement_props[]; struct BUTTON_struct { struct HTMLElement_struct html; - struct dom_node *form; + struct dom_node *form; /* Must be first! */ unsigned char *access_key; unsigned char *name; unsigned char *type; diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLCollection.c b/src/document/dom/ecmascript/spidermonkey/html/HTMLCollection.c index 964e6b48..a578c718 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLCollection.c +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLCollection.c @@ -6,28 +6,32 @@ #include "document/dom/ecmascript/spidermonkey.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLCollection.h" - -static JSBool -HTMLCollection_getProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp) -{ - if (!JSVAL_IS_INT(id)) - return JS_TRUE; - - switch (JSVAL_TO_INT(id)) { - case JSP_HTML_COLLECTION_LENGTH: - /* Write me! */ - break; - default: - break; - } - return JS_TRUE; -} +#include "dom/node.h" static JSBool HTMLCollection_item(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - /* Write me! */ + struct dom_node_list *list; + int ind; + + if (!obj || (!JS_InstanceOf(ctx, obj, (JSClass *)&HTMLCollection_class, NULL))) + return JS_FALSE; + + list = JS_GetPrivate(ctx, obj); + if (!list) + return JS_FALSE; + + if (!JS_ValueToInt32(ctx, argv[0], &ind)) + return JS_FALSE; + + if (ind >= list->size) + undef_to_jsval(ctx, rval); + else { + struct dom_node *node = list->entries[ind]; + + object_to_jsval(ctx, rval, node->ecmascript_obj); + } return JS_TRUE; } @@ -35,10 +39,48 @@ static JSBool HTMLCollection_namedItem(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { + struct dom_node_list *list; + + if (!obj || (!JS_InstanceOf(ctx, obj, (JSClass *)&HTMLCollection_class, NULL))) + return JS_FALSE; + + list = JS_GetPrivate(ctx, obj); + if (!list) + return JS_FALSE; + + /* Write me! */ return JS_TRUE; } +static JSBool +HTMLCollection_getProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp) +{ + struct dom_node_list *list; + + if (!obj || (!JS_InstanceOf(ctx, obj, (JSClass *)&HTMLCollection_class, NULL))) + return JS_FALSE; + + list = JS_GetPrivate(ctx, obj); + if (!list) + return JS_FALSE; + + if (JSVAL_IS_STRING(id)) + return HTMLCollection_namedItem(ctx, obj, 1, &id, vp); + + if (JSVAL_IS_INT(id)) { + switch (JSVAL_TO_INT(id)) { + case JSP_HTML_COLLECTION_LENGTH: + int_to_jsval(ctx, vp, list->size); + break; + default: + return HTMLCollection_item(ctx, obj, 1, &id, vp); + break; + } + } + return JS_TRUE; +} + const JSPropertySpec HTMLCollection_props[] = { { "length", JSP_HTML_COLLECTION_LENGTH, JSPROP_ENUMERATE | JSPROP_READONLY }, { NULL } diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLFieldSetElement.h b/src/document/dom/ecmascript/spidermonkey/html/HTMLFieldSetElement.h index c8fac645..cfbc0491 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLFieldSetElement.h +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLFieldSetElement.h @@ -9,7 +9,7 @@ extern const JSPropertySpec HTMLFieldSetElement_props[]; struct FIELDSET_struct { struct HTMLElement_struct html; - struct dom_node *form; + struct dom_node *form; /* Must be first! */ }; void make_FIELDSET_object(JSContext *ctx, struct dom_node *node); diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.c b/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.c index aa41b60b..81962f15 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.c +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.c @@ -6,8 +6,11 @@ #include "document/dom/ecmascript/spidermonkey.h" #include "document/dom/ecmascript/spidermonkey/Node.h" +#include "document/dom/ecmascript/spidermonkey/html/HTMLCollection.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h" +#include "document/dom/ecmascript/spidermonkey/html/HTMLInputElement.h" #include "dom/node.h" +#include "dom/sgml/html/html.h" static JSBool HTMLFormElement_getProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp) @@ -32,8 +35,24 @@ HTMLFormElement_getProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp) switch (JSVAL_TO_INT(id)) { case JSP_HTML_FORM_ELEMENT_ELEMENTS: - string_to_jsval(ctx, vp, html->elements); - /* Write me! */ + if (!html->elements) + undef_to_jsval(ctx, vp); + else { + if (html->elements->ctx == ctx) + object_to_jsval(ctx, vp, html->elements->ecmascript_obj); + else { + JSObject *new_obj; + + html->elements->ctx = ctx; + new_obj = JS_NewObject(ctx, + (JSClass *)&HTMLCollection_class, NULL, NULL); + if (new_obj) { + JS_SetPrivate(ctx, new_obj, html->elements); + } + html->elements->ecmascript_obj = new_obj; + object_to_jsval(ctx, vp, new_obj); + } + } break; case JSP_HTML_FORM_ELEMENT_LENGTH: int_to_jsval(ctx, vp, html->length); @@ -154,19 +173,81 @@ void make_FORM_object(JSContext *ctx, struct dom_node *node) { struct html_objects *o = JS_GetContextPrivate(ctx); + struct FORM_struct *form; node->data.element.html_data = mem_calloc(1, sizeof(struct FORM_struct)); - if (node->data.element.html_data) { + form = node->data.element.html_data; + if (form) { node->ecmascript_obj = JS_NewObject(ctx, (JSClass *)&HTMLFormElement_class, o->HTMLElement_object, NULL); } } +static void +del_from_elements(struct dom_node_list *list, struct dom_node *node) +{ + struct INPUT_struct *html = node->data.element.html_data; + + if (html) { + html->form = NULL; + } + del_from_dom_node_list(list, node); +} + +void +register_form_element(struct dom_node *form, struct dom_node *node) +{ + struct INPUT_struct *html = node->data.element.html_data; + struct FORM_struct *data = form->data.element.html_data; + + if (html) { + html->form = form; + data->elements = add_to_dom_node_list(&data->elements, node, -1); + } +} + +void +unregister_form_element(struct dom_node *form, struct dom_node *node) +{ + struct FORM_struct *data = form->data.element.html_data; + struct dom_node_list *list = data->elements; + + del_from_elements(list, node); +} + +struct dom_node * +find_parent_form(struct dom_node *node) +{ + if (!node) + return NULL; + + while (1) { + node = node->parent; + if (!node) + break; + if (node->type == DOM_NODE_ELEMENT && node->data.element.type == HTML_ELEMENT_FORM) + break; + } + return node; +} + +static void +done_elements(struct dom_node_list *list) +{ + while (list->size) + del_from_elements(list, list->entries[0]); + if (list->ecmascript_obj) { + JS_SetPrivate(list->ctx, list->ecmascript_obj, NULL); + } + mem_free(list); +} + void done_FORM_object(void *data) { struct FORM_struct *d = data; - /* elements */ + if (d->elements) + done_elements(d->elements); mem_free_if(d->name); mem_free_if(d->accept_charset); mem_free_if(d->action); diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h b/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h index 25dc7b8a..b7594200 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h @@ -10,7 +10,7 @@ extern const JSPropertySpec HTMLFormElement_props[]; struct FORM_struct { struct HTMLElement_struct html; - unsigned char *elements; /* FIXME: proper type */ + struct dom_node_list *elements; unsigned char *name; unsigned char *accept_charset; unsigned char *action; @@ -22,4 +22,8 @@ struct FORM_struct { void make_FORM_object(JSContext *ctx, struct dom_node *node); void done_FORM_object(void *data); +void register_form_element(struct dom_node *form, struct dom_node *node); +void unregister_form_element(struct dom_node *form, struct dom_node *node); +struct dom_node *find_parent_form(struct dom_node *node); + #endif diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLInputElement.h b/src/document/dom/ecmascript/spidermonkey/html/HTMLInputElement.h index c91cceae..a6004419 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLInputElement.h +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLInputElement.h @@ -10,8 +10,8 @@ extern const JSPropertySpec HTMLInputElement_props[]; struct INPUT_struct { struct HTMLElement_struct html; + struct dom_node *form; /* Must be first! */ unsigned char *default_value; - struct dom_node *form; unsigned char *accept; unsigned char *access_key; unsigned char *align; diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLIsIndexElement.h b/src/document/dom/ecmascript/spidermonkey/html/HTMLIsIndexElement.h index 7cf87a43..b25591af 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLIsIndexElement.h +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLIsIndexElement.h @@ -10,7 +10,7 @@ extern const JSPropertySpec HTMLIsIndexElement_props[]; struct ISINDEX_struct { struct HTMLElement_struct html; - struct dom_node *form; + struct dom_node *form; /* Must be first! */ unsigned char *prompt; }; diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLLabelElement.h b/src/document/dom/ecmascript/spidermonkey/html/HTMLLabelElement.h index d8d78edd..fc69473c 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLLabelElement.h +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLLabelElement.h @@ -10,7 +10,7 @@ extern const JSPropertySpec HTMLLabelElement_props[]; struct LABEL_struct { struct HTMLElement_struct html; - struct dom_node *form; + struct dom_node *form; /* Must be first! */ unsigned char *access_key; unsigned char *html_for; }; diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLLegendElement.h b/src/document/dom/ecmascript/spidermonkey/html/HTMLLegendElement.h index a7d40368..eca6fd3f 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLLegendElement.h +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLLegendElement.h @@ -10,7 +10,7 @@ extern const JSPropertySpec HTMLLegendElement_props[]; struct LEGEND_struct { struct HTMLElement_struct html; - struct dom_node *form; + struct dom_node *form; /* Must be first! */ unsigned char *access_key; unsigned char *align; }; diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLObjectElement.h b/src/document/dom/ecmascript/spidermonkey/html/HTMLObjectElement.h index 0605928c..ae27d48d 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLObjectElement.h +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLObjectElement.h @@ -10,7 +10,7 @@ extern const JSPropertySpec HTMLObjectElement_props[]; struct OBJECT_struct { struct HTMLElement_struct html; - struct dom_node *form; + struct dom_node *form; /* Must be first! */ unsigned char *code; unsigned char *align; unsigned char *archive; diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLSelectElement.h b/src/document/dom/ecmascript/spidermonkey/html/HTMLSelectElement.h index 18b1dc2b..771dc4cd 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLSelectElement.h +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLSelectElement.h @@ -10,9 +10,9 @@ extern const JSPropertySpec HTMLSelectElement_props[]; struct SELECT_struct { struct HTMLElement_struct html; + struct dom_node *form; /* Must be first! */ unsigned char *type; unsigned char *value; - struct dom_node *form; unsigned char *options; /* FIXME: proper type */ unsigned char *name; int selected_index; diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLTextAreaElement.h b/src/document/dom/ecmascript/spidermonkey/html/HTMLTextAreaElement.h index 0850cea2..bb356c8a 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLTextAreaElement.h +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLTextAreaElement.h @@ -10,8 +10,8 @@ extern const JSPropertySpec HTMLTextAreaElement_props[]; struct TEXTAREA_struct { struct HTMLElement_struct html; + struct dom_node *form; /* Must be first! */ unsigned char *default_value; - struct dom_node *form; unsigned char *access_key; unsigned char *name; unsigned char *type;