diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2012-03-28 12:48:09 +0000 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2012-03-28 12:48:09 +0000 |
commit | fea71815737d9da24f66c440f02aa16ee256c770 (patch) | |
tree | 3ea8aa59e816fb7e4a477b4428457102e113cb15 | |
parent | d49cde3fba68a70832e09f10b8a18406deecba28 (diff) | |
download | libdom-fea71815737d9da24f66c440f02aa16ee256c770.tar.gz libdom-fea71815737d9da24f66c440f02aa16ee256c770.tar.bz2 |
Add some functions to implement some of LibCSS's selection callbacks, as an experiment in clawing back performance. May well get reverted.
svn path=/trunk/libdom/; revision=13755
-rw-r--r-- | include/dom/core/element.h | 12 | ||||
-rw-r--r-- | src/core/element.c | 86 |
2 files changed, 98 insertions, 0 deletions
diff --git a/include/dom/core/element.h b/include/dom/core/element.h index df093a4..91b763f 100644 --- a/include/dom/core/element.h +++ b/include/dom/core/element.h @@ -352,4 +352,16 @@ static inline dom_exception dom_element_has_class( dom_element_has_class((dom_element *) (e), \ (lwc_string *) (n), (bool *) (m)) + +/* Functions for implementing some libcss selection callbacks. + * Note that they don't take a reference to the returned element, as such they + * are UNSAFE if you require the returned element to live beyond the next time + * the DOM gets a chance to change. */ +dom_exception dom_element_named_ancestor_node(dom_element *element, + lwc_string *name, dom_element **ancestor); +dom_exception dom_element_named_parent_node(dom_element *element, + lwc_string *name, dom_element **parent); +dom_exception dom_element_parent_node(dom_element *element, + dom_element **parent); + #endif diff --git a/src/core/element.c b/src/core/element.c index fbb2388..a792ae5 100644 --- a/src/core/element.c +++ b/src/core/element.c @@ -1225,6 +1225,92 @@ dom_exception _dom_element_has_class(struct dom_element *element, return DOM_NO_ERR; } +/** + * Get a named ancestor node + * + * \param element Element to consider + * \param name Node name to look for + * \param ancestor Pointer to location to receive node pointer + * \return DOM_NO_ERR. + */ +dom_exception dom_element_named_ancestor_node(dom_element *element, + lwc_string *name, dom_element **ancestor) +{ + dom_node_internal *node = (dom_node_internal *)element; + + *ancestor = NULL; + + for (node = node->parent; node != NULL; node = node->parent) { + if (node->type != DOM_ELEMENT_NODE) + continue; + + assert(node->name != NULL); + + if (dom_string_caseless_lwc_isequal(node->name, name)) { + *ancestor = (dom_element *)node; + break; + } + } + + return DOM_NO_ERR; +} + +/** + * Get a named parent node + * + * \param element Element to consider + * \param name Node name to look for + * \param parent Pointer to location to receive node pointer + * \return DOM_NO_ERR. + */ +dom_exception dom_element_named_parent_node(dom_element *element, + lwc_string *name, dom_element **parent) +{ + dom_node_internal *node = (dom_node_internal *)element; + + *parent = NULL; + + for (node = node->parent; node != NULL; node = node->parent) { + if (node->type != DOM_ELEMENT_NODE) + continue; + + assert(node->name != NULL); + + if (dom_string_caseless_lwc_isequal(node->name, name)) { + *parent = (dom_element *)node; + } + break; + } + + return DOM_NO_ERR; +} + +/** + * Get a named parent node + * + * \param element Element to consider + * \param name Node name to look for + * \param parent Pointer to location to receive node pointer + * \return DOM_NO_ERR. + */ +dom_exception dom_element_parent_node(dom_element *element, + dom_element **parent) +{ + dom_node_internal *node = (dom_node_internal *)element; + + *parent = NULL; + + for (node = node->parent; node != NULL; node = node->parent) { + if (node->type != DOM_ELEMENT_NODE) + continue; + + *parent = (dom_element *)node; + break; + } + + return DOM_NO_ERR; +} + /*------------- The overload virtual functions ------------------------*/ /* Overload function of Node, please refer src/core/node.c for detail */ |