void destroy_tree(node *root) { node *n, *p; uint32_t i; for (n = root->children; n != NULL; n = p) { p = n->next; destroy_tree(n); } for (i = 0; i < root->n_attrs; ++i) { lwc_string_unref(root->attrs[i].name); lwc_string_unref(root->attrs[i].value); } free(root->attrs); if (root->classes != NULL) { for (i = 0; i < root->n_classes; ++i) { lwc_string_unref(root->classes[i]); } free(root->classes); } if (root->libcss_node_data != NULL) { css_libcss_node_data_handler(&select_handler, CSS_NODE_DELETED, NULL, root, NULL, root->libcss_node_data); } lwc_string_unref(root->name); free(root); }
/* Handler for libcss_node_data, stored as libdom node user data */ static void nscss_dom_user_data_handler(dom_node_operation operation, dom_string *key, void *data, struct dom_node *src, struct dom_node *dst) { css_error error; if (dom_string_isequal(corestring_dom___ns_key_libcss_node_data, key) == false || data == NULL) { return; } switch (operation) { case DOM_NODE_CLONED: error = css_libcss_node_data_handler(&selection_handler, CSS_NODE_CLONED, NULL, src, dst, data); if (error != CSS_OK) NSLOG(netsurf, INFO, "Failed to clone libcss_node_data."); break; case DOM_NODE_RENAMED: error = css_libcss_node_data_handler(&selection_handler, CSS_NODE_MODIFIED, NULL, src, NULL, data); if (error != CSS_OK) NSLOG(netsurf, INFO, "Failed to update libcss_node_data."); break; case DOM_NODE_IMPORTED: case DOM_NODE_ADOPTED: case DOM_NODE_DELETED: error = css_libcss_node_data_handler(&selection_handler, CSS_NODE_DELETED, NULL, src, NULL, data); if (error != CSS_OK) NSLOG(netsurf, INFO, "Failed to delete libcss_node_data."); break; default: NSLOG(netsurf, INFO, "User data operation not handled."); assert(0); } }
static css_error set_libcss_node_data(void *pw, void *n, void *libcss_node_data) { UNUSED(pw); UNUSED(n); /* Since we're not storing it, ensure node data gets deleted */ css_libcss_node_data_handler(&select_handler, CSS_NODE_DELETED, pw, n, NULL, libcss_node_data); return CSS_OK; }