summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2012-03-28 12:48:09 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2012-03-28 12:48:09 +0000
commit06aebd84b7e2cc8e573642b220b1667afff0bff6 (patch)
tree3ea8aa59e816fb7e4a477b4428457102e113cb15
parent863290c26870d1f4b56d4bc6d4ea1fb95e7798fb (diff)
downloadlibdom-06aebd84b7e2cc8e573642b220b1667afff0bff6.tar.gz
libdom-06aebd84b7e2cc8e573642b220b1667afff0bff6.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.h12
-rw-r--r--src/core/element.c86
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 */