diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLButtonElement.c b/src/document/dom/ecmascript/spidermonkey/html/HTMLButtonElement.c index bb4b772f..a8a91df6 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLButtonElement.c +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLButtonElement.c @@ -7,6 +7,7 @@ #include "document/dom/ecmascript/spidermonkey.h" #include "document/dom/ecmascript/spidermonkey/Node.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLButtonElement.h" +#include "document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h" #include "dom/node.h" static JSBool @@ -130,6 +131,7 @@ make_BUTTON_object(JSContext *ctx, struct dom_node *node) node->data.element.html_data = mem_calloc(1, sizeof(struct BUTTON_struct)); if (node->data.element.html_data) { node->ecmascript_obj = JS_NewObject(ctx, (JSClass *)&HTMLButtonElement_class, o->HTMLElement_object, NULL); + register_form_element(node); } } @@ -138,7 +140,7 @@ done_BUTTON_object(struct dom_node *node) { struct BUTTON_struct *d = node->data.element.html_data; - /* form musn't be freed */ + unregister_form_element(d->form, node); mem_free_if(d->access_key); mem_free_if(d->name); mem_free_if(d->type); diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLFieldSetElement.c b/src/document/dom/ecmascript/spidermonkey/html/HTMLFieldSetElement.c index 7f37ad19..eee62e0b 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLFieldSetElement.c +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLFieldSetElement.c @@ -8,6 +8,7 @@ #include "document/dom/ecmascript/spidermonkey/Node.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLElement.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLFieldSetElement.h" +#include "document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h" #include "dom/node.h" static JSBool @@ -67,10 +68,14 @@ make_FIELDSET_object(JSContext *ctx, struct dom_node *node) node->data.element.html_data = mem_calloc(1, sizeof(struct FIELDSET_struct)); if (node->data.element.html_data) { node->ecmascript_obj = JS_NewObject(ctx, (JSClass *)&HTMLFieldSetElement_class, o->HTMLElement_object, NULL); + register_form_element(node); } } void done_FIELDSET_object(struct dom_node *node) { + struct FIELDSET_struct *d = node->data.element.html_data; + + unregister_form_element(d->form, node); } diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.c b/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.c index 83061abb..e86495da 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.c +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.c @@ -193,33 +193,9 @@ del_from_elements(struct dom_node_list *list, struct dom_node *node) 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 * +static struct dom_node * find_parent_form(struct dom_node *node) { - if (!node) - return NULL; - while (1) { node = node->parent; if (!node) @@ -230,6 +206,37 @@ find_parent_form(struct dom_node *node) return node; } +void +register_form_element(struct dom_node *node) +{ + struct dom_node *form; + + if (!node) + return; + form = find_parent_form(node); + if (form) { + 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) +{ + if (form) { + struct FORM_struct *data = form->data.element.html_data; + struct dom_node_list *list = data->elements; + + del_from_elements(list, node); + } +} + + static void done_elements(struct dom_node_list *list) { diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h b/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h index 28cddba9..f2caffd3 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h @@ -22,8 +22,7 @@ struct FORM_struct { void make_FORM_object(JSContext *ctx, struct dom_node *node); void done_FORM_object(struct dom_node *node); -void register_form_element(struct dom_node *form, struct dom_node *node); +void register_form_element(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.c b/src/document/dom/ecmascript/spidermonkey/html/HTMLInputElement.c index 847c59df..38851705 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLInputElement.c +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLInputElement.c @@ -6,6 +6,7 @@ #include "document/dom/ecmascript/spidermonkey.h" #include "document/dom/ecmascript/spidermonkey/Node.h" +#include "document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLInputElement.h" #include "dom/node.h" @@ -244,6 +245,7 @@ make_INPUT_object(JSContext *ctx, struct dom_node *node) node->data.element.html_data = mem_calloc(1, sizeof(struct INPUT_struct)); if (node->data.element.html_data) { node->ecmascript_obj = JS_NewObject(ctx, (JSClass *)&HTMLInputElement_class, o->HTMLElement_object, NULL); + register_form_element(node); } } @@ -252,8 +254,8 @@ done_INPUT_object(struct dom_node *node) { struct INPUT_struct *d = node->data.element.html_data; + unregister_form_element(d->form, node); mem_free_if(d->default_value); - /* form ? */ mem_free_if(d->accept); mem_free_if(d->access_key); mem_free_if(d->align); diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLIsIndexElement.c b/src/document/dom/ecmascript/spidermonkey/html/HTMLIsIndexElement.c index 0439ecb0..d8eb7279 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLIsIndexElement.c +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLIsIndexElement.c @@ -6,6 +6,7 @@ #include "document/dom/ecmascript/spidermonkey.h" #include "document/dom/ecmascript/spidermonkey/Node.h" +#include "document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLIsIndexElement.h" #include "dom/node.h" @@ -99,6 +100,7 @@ make_ISINDEX_object(JSContext *ctx, struct dom_node *node) node->data.element.html_data = mem_calloc(1, sizeof(struct ISINDEX_struct)); if (node->data.element.html_data) { node->ecmascript_obj = JS_NewObject(ctx, (JSClass *)&HTMLIsIndexElement_class, o->HTMLElement_object, NULL); + register_form_element(node); } } @@ -107,6 +109,6 @@ done_ISINDEX_object(struct dom_node *node) { struct ISINDEX_struct *d = node->data.element.html_data; - /* form ? */ + unregister_form_element(d->form, node); mem_free_if(d->prompt); } diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLLabelElement.c b/src/document/dom/ecmascript/spidermonkey/html/HTMLLabelElement.c index 83624680..414b9336 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLLabelElement.c +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLLabelElement.c @@ -6,6 +6,7 @@ #include "document/dom/ecmascript/spidermonkey.h" #include "document/dom/ecmascript/spidermonkey/Node.h" +#include "document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLLabelElement.h" #include "dom/node.h" @@ -106,6 +107,7 @@ make_LABEL_object(JSContext *ctx, struct dom_node *node) node->data.element.html_data = mem_calloc(1, sizeof(struct LABEL_struct)); if (node->data.element.html_data) { node->ecmascript_obj = JS_NewObject(ctx, (JSClass *)&HTMLLabelElement_class, o->HTMLElement_object, NULL); + register_form_element(node); } } @@ -114,7 +116,7 @@ done_LABEL_object(struct dom_node *node) { struct LABEL_struct *d = node->data.element.html_data; - /* form ? */ + unregister_form_element(d->form, node); mem_free_if(d->access_key); mem_free_if(d->html_for); } diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLLegendElement.c b/src/document/dom/ecmascript/spidermonkey/html/HTMLLegendElement.c index f3dfce3d..4ea42bc3 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLLegendElement.c +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLLegendElement.c @@ -6,6 +6,7 @@ #include "document/dom/ecmascript/spidermonkey.h" #include "document/dom/ecmascript/spidermonkey/Node.h" +#include "document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLLegendElement.h" #include "dom/node.h" @@ -106,6 +107,7 @@ make_LEGEND_object(JSContext *ctx, struct dom_node *node) node->data.element.html_data = mem_calloc(1, sizeof(struct LEGEND_struct)); if (node->data.element.html_data) { node->ecmascript_obj = JS_NewObject(ctx, (JSClass *)&HTMLLegendElement_class, o->HTMLElement_object, NULL); + register_form_element(node); } } @@ -114,7 +116,7 @@ done_LEGEND_object(struct dom_node *node) { struct LEGEND_struct *d = node->data.element.html_data; - /* form ? */ + unregister_form_element(d->form, node); mem_free_if(d->access_key); mem_free_if(d->align); } diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLObjectElement.c b/src/document/dom/ecmascript/spidermonkey/html/HTMLObjectElement.c index 81d17afa..25f8770f 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLObjectElement.c +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLObjectElement.c @@ -6,6 +6,7 @@ #include "document/dom/ecmascript/spidermonkey.h" #include "document/dom/ecmascript/spidermonkey/Node.h" +#include "document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLObjectElement.h" #include "dom/node.h" @@ -212,6 +213,7 @@ make_OBJECT_object(JSContext *ctx, struct dom_node *node) node->data.element.html_data = mem_calloc(1, sizeof(struct OBJECT_struct)); if (node->data.element.html_data) { node->ecmascript_obj = JS_NewObject(ctx, (JSClass *)&HTMLObjectElement_class, o->HTMLElement_object, NULL); + register_form_element(node); } } @@ -220,7 +222,7 @@ done_OBJECT_object(struct dom_node *node) { struct OBJECT_struct *d = node->data.element.html_data; - /* form ? */ + unregister_form_element(d->form, node); mem_free_if(d->code); mem_free_if(d->align); mem_free_if(d->archive); diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLOptionElement.c b/src/document/dom/ecmascript/spidermonkey/html/HTMLOptionElement.c index a544e66a..78ee0470 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLOptionElement.c +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLOptionElement.c @@ -6,6 +6,7 @@ #include "document/dom/ecmascript/spidermonkey.h" #include "document/dom/ecmascript/spidermonkey/Node.h" +#include "document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLOptionElement.h" #include "dom/node.h" @@ -135,6 +136,7 @@ make_OPTION_object(JSContext *ctx, struct dom_node *node) node->data.element.html_data = mem_calloc(1, sizeof(struct OPTION_struct)); if (node->data.element.html_data) { node->ecmascript_obj = JS_NewObject(ctx, (JSClass *)&HTMLOptionElement_class, o->HTMLElement_object, NULL); + register_form_element(node); } } @@ -143,7 +145,7 @@ done_OPTION_object(struct dom_node *node) { struct OPTION_struct *d = node->data.element.html_data; - /* form ? */ + unregister_form_element(d->form, node); mem_free_if(d->text); mem_free_if(d->label); mem_free_if(d->value); diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLSelectElement.c b/src/document/dom/ecmascript/spidermonkey/html/HTMLSelectElement.c index 32cf7e74..79166b1b 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLSelectElement.c +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLSelectElement.c @@ -6,6 +6,7 @@ #include "document/dom/ecmascript/spidermonkey.h" #include "document/dom/ecmascript/spidermonkey/Node.h" +#include "document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLSelectElement.h" #include "dom/node.h" @@ -189,6 +190,7 @@ make_SELECT_object(JSContext *ctx, struct dom_node *node) node->data.element.html_data = mem_calloc(1, sizeof(struct SELECT_struct)); if (node->data.element.html_data) { node->ecmascript_obj = JS_NewObject(ctx, (JSClass *)&HTMLSelectElement_class, o->HTMLElement_object, NULL); + register_form_element(node); } } @@ -197,8 +199,8 @@ done_SELECT_object(struct dom_node *node) { struct SELECT_struct *d = node->data.element.html_data; + unregister_form_element(d->form, node); mem_free_if(d->type); mem_free_if(d->value); - /* form, options ? */ mem_free_if(d->name); } diff --git a/src/document/dom/ecmascript/spidermonkey/html/HTMLTextAreaElement.c b/src/document/dom/ecmascript/spidermonkey/html/HTMLTextAreaElement.c index 866611c2..821f0c46 100644 --- a/src/document/dom/ecmascript/spidermonkey/html/HTMLTextAreaElement.c +++ b/src/document/dom/ecmascript/spidermonkey/html/HTMLTextAreaElement.c @@ -6,6 +6,7 @@ #include "document/dom/ecmascript/spidermonkey.h" #include "document/dom/ecmascript/spidermonkey/Node.h" +#include "document/dom/ecmascript/spidermonkey/html/HTMLFormElement.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLTextAreaElement.h" #include "dom/node.h" @@ -183,6 +184,7 @@ make_TEXTAREA_object(JSContext *ctx, struct dom_node *node) node->data.element.html_data = mem_calloc(1, sizeof(struct TEXTAREA_struct)); if (node->data.element.html_data) { node->ecmascript_obj = JS_NewObject(ctx, (JSClass *)&HTMLTextAreaElement_class, o->HTMLElement_object, NULL); + register_form_element(node); } } @@ -191,8 +193,8 @@ done_TEXTAREA_object(struct dom_node *node) { struct TEXTAREA_struct *d = node->data.element.html_data; + unregister_form_element(d->form, node); mem_free_if(d->default_value); - /* What to do with d->form? */ mem_free_if(d->access_key); mem_free_if(d->name); mem_free_if(d->type);