summaryrefslogtreecommitdiff
path: root/src/html/html_form_element.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/html/html_form_element.c')
-rw-r--r--src/html/html_form_element.c81
1 files changed, 26 insertions, 55 deletions
diff --git a/src/html/html_form_element.c b/src/html/html_form_element.c
index 1dd1992..b3ac05f 100644
--- a/src/html/html_form_element.c
+++ b/src/html/html_form_element.c
@@ -11,12 +11,8 @@
#include <dom/html/html_form_element.h>
#include "html/html_form_element.h"
-#include "html/html_input_element.h"
-#include "html/html_select_element.h"
-#include "html/html_text_area_element.h"
-#include "html/html_button_element.h"
-#include "html/html_collection.h"
+#include "html/html_form_controls_collection.h"
#include "html/html_document.h"
#include "core/node.h"
@@ -29,8 +25,6 @@ static struct dom_element_protected_vtable _protect_vtable = {
DOM_HTML_FORM_ELEMENT_PROTECT_VTABLE
};
-static bool _dom_is_form_control(struct dom_node_internal *node, void *ctx);
-
/**
* Create a dom_html_form_element object
*
@@ -71,6 +65,8 @@ dom_exception _dom_html_form_element_initialise(
err = _dom_html_element_initialise(params, &ele->base);
+ ele->elements = NULL;
+
return err;
}
@@ -81,6 +77,10 @@ dom_exception _dom_html_form_element_initialise(
*/
void _dom_html_form_element_finalise(struct dom_html_form_element *ele)
{
+ if (ele->elements != NULL) {
+ dom_html_form_controls_collection_unref(ele->elements);
+ ele->elements = NULL;
+ }
_dom_html_element_finalise(&ele->base);
}
@@ -167,15 +167,23 @@ dom_exception _dom_html_form_element_copy_internal(
* \return DOM_NO_ERR on success, appropriate dom_exception on failure.
*/
dom_exception dom_html_form_element_get_elements(dom_html_form_element *ele,
- struct dom_html_collection **col)
+ dom_html_form_controls_collection **col)
{
dom_exception err;
- dom_html_document *doc = (dom_html_document *) dom_node_get_owner(ele);
+
+ if (ele->elements != NULL) {
+ dom_html_form_controls_collection_ref(ele->elements);
+ *col = ele->elements;
+ return DOM_NO_ERR;
+ }
- assert(doc != NULL);
- err = _dom_html_collection_create(doc,
- (dom_node_internal *) doc,
- _dom_is_form_control, ele, col);
+ err = _dom_html_form_controls_collection_create(ele, col);
+
+ if (err == DOM_NO_ERR) {
+ dom_html_form_controls_collection_ref(*col);
+ ele->elements = *col;
+ }
+
return err;
}
@@ -190,20 +198,16 @@ dom_exception dom_html_form_element_get_length(dom_html_form_element *ele,
uint32_t *len)
{
dom_exception err;
- dom_html_document *doc = (dom_html_document *) dom_node_get_owner(ele);
- dom_html_collection *col;
+ dom_html_form_controls_collection *col;
- assert(doc != NULL);
- err = _dom_html_collection_create(doc,
- (dom_node_internal *) doc,
- _dom_is_form_control, ele, &col);
+ err = dom_html_form_element_get_elements(ele, &col);
+
if (err != DOM_NO_ERR)
return err;
-
- err = dom_html_collection_get_length(col, len);
+ err = dom_html_form_controls_collection_get_length(col, len);
- dom_html_collection_unref(col);
+ dom_html_form_controls_collection_unref(col);
return err;
}
@@ -293,36 +297,3 @@ dom_exception dom_html_form_element_reset(dom_html_form_element *ele)
doc->memoised[hds_reset], true,
true, &success);
}
-
-/*-----------------------------------------------------------------------*/
-/* Internal functions */
-
-/* Callback function to test whether certain node is a form control, see
- * src/html/html_collection.h for detail. */
-static bool _dom_is_form_control(struct dom_node_internal *node, void *ctx)
-{
- struct dom_html_document *doc =
- (struct dom_html_document *)(node->owner);
- struct dom_html_form_element *form = ctx;
-
-
- assert(node->type == DOM_ELEMENT_NODE);
-
- /* Form controls are INPUT TEXTAREA SELECT and BUTTON*/
- if (dom_string_caseless_isequal(node->name,
- doc->elements[DOM_HTML_ELEMENT_TYPE_INPUT]))
- return ((dom_html_input_element *)node)->form == form;
- if (dom_string_caseless_isequal(node->name,
- doc->elements[DOM_HTML_ELEMENT_TYPE_TEXTAREA]))
- return ((dom_html_text_area_element *)node)->form == form;
- if (dom_string_caseless_isequal(node->name,
- doc->elements[DOM_HTML_ELEMENT_TYPE_SELECT]))
- return ((dom_html_select_element *)node)->form == form;
- if (dom_string_caseless_isequal(node->name,
- doc->elements[DOM_HTML_ELEMENT_TYPE_BUTTON])) {
- return ((dom_html_button_element *)node)->form == form;
- }
-
- return false;
-}
-