remove redundant domutils and put functionality in existing utils/libdom

This commit is contained in:
Vincent Sanders 2012-11-10 11:20:31 +00:00
parent 617d655c7b
commit a79e098817
9 changed files with 184 additions and 212 deletions

View File

@ -19,7 +19,7 @@ S_RENDER := box.c box_construct.c box_normalise.c \
S_UTILS := base64.c corestrings.c filename.c filepath.c hashtable.c \
libdom.c locale.c log.c messages.c nsurl.c talloc.c url.c \
utf8.c utils.c useragent.c domutils.c
utf8.c utils.c useragent.c
S_HTTP := challenge.c generics.c primitives.c parameter.c \
content-disposition.c content-type.c www-authenticate.c

View File

@ -35,7 +35,7 @@
#include "desktop/options.h"
#include "desktop/tree_url_node.h"
#include "utils/corestrings.h"
#include "utils/domutils.h"
#include "utils/libdom.h"
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/url.h"
@ -495,7 +495,7 @@ static void tree_url_load_entry(dom_node *li, tree_url_load_ctx *ctx)
nserror error;
/* The li must contain an "a" element */
a = find_first_named_dom_element(li, corestring_lwc_a);
a = libdom_find_first_element(li, corestring_lwc_a);
if (a == NULL) {
warn_user("TreeLoadError", "(Missing <a> in <li>)");
return;
@ -710,7 +710,7 @@ static void tree_url_load_directory(dom_node *ul, tree_url_load_ctx *ctx)
assert(ctx != NULL);
assert(ctx->directory != NULL);
domutils_iterate_child_elements(ul, tree_url_load_directory_cb, ctx);
libdom_iterate_child_elements(ul, tree_url_load_directory_cb, ctx);
}
/**
@ -732,13 +732,13 @@ bool tree_urlfile_load(const char *filename, struct tree *tree,
return false;
}
document = domutils_parse_file(filename, "iso-8859-1");
document = libdom_parse_file(filename, "iso-8859-1");
if (document == NULL) {
warn_user("TreeLoadError", messages_get("ParsingFail"));
return false;
}
html = find_first_named_dom_element((dom_node *) document,
html = libdom_find_first_element((dom_node *) document,
corestring_lwc_html);
if (html == NULL) {
dom_node_unref(document);
@ -746,7 +746,7 @@ bool tree_urlfile_load(const char *filename, struct tree *tree,
return false;
}
body = find_first_named_dom_element(html, corestring_lwc_body);
body = libdom_find_first_element(html, corestring_lwc_body);
if (body == NULL) {
dom_node_unref(html);
dom_node_unref(document);
@ -754,7 +754,7 @@ bool tree_urlfile_load(const char *filename, struct tree *tree,
return false;
}
ul = find_first_named_dom_element(body, corestring_lwc_ul);
ul = libdom_find_first_element(body, corestring_lwc_ul);
if (ul == NULL) {
dom_node_unref(body);
dom_node_unref(html);

View File

@ -13,7 +13,7 @@ preamble %{
#include "utils/config.h"
#include "utils/log.h"
#include "utils/corestrings.h"
#include "utils/domutils.h"
#include "utils/libdom.h"
#include "content/urldb.h"
@ -78,7 +78,7 @@ getter head %{
}
if (element != NULL) {
head = find_first_named_dom_element(element, corestring_lwc_head) ;
head = libdom_find_first_element(element, corestring_lwc_head) ;
if (head != NULL) {
jsret = jsapi_new_HTMLElement(cx, NULL, NULL, (dom_element *)head, private->htmlc);
}
@ -100,7 +100,7 @@ getter body %{
}
if (element != NULL) {
body = find_first_named_dom_element(element, corestring_lwc_body) ;
body = libdom_find_first_element(element, corestring_lwc_body) ;
if (body != NULL) {
jsret = jsapi_new_HTMLElement(cx, NULL, NULL, (dom_element *)body, private->htmlc);
}

View File

@ -43,3 +43,15 @@ api finalise %{
dom_node_unref(private->node);
}
%}
getter firstElementChild %{
%}
getter lastElementChild %{
%}
getter previousElementSibling %{
%}
getter nextElementSibling %{
%}

View File

@ -53,7 +53,6 @@
#include "utils/url.h"
#include "utils/utf8.h"
#include "utils/utils.h"
#include "utils/domutils.h"
#define CHUNK 4096
@ -2032,7 +2031,7 @@ html_begin_conversion(html_content *htmlc)
}
dom_string_unref(node_name);
head = find_first_named_dom_element(html, corestring_lwc_head);
head = libdom_find_first_element(html, corestring_lwc_head);
if (head != NULL) {
if (html_head(htmlc, head) == false) {
msg_data.error = messages_get("NoMemory");

View File

@ -1,160 +0,0 @@
/*
* Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
* NetSurf is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* NetSurf is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <dom/dom.h>
#include <dom/bindings/hubbub/parser.h>
#include "utils/config.h"
#include "utils/log.h"
#include "domutils.h"
/* search children of a node for first named element */
dom_node *find_first_named_dom_element(dom_node *parent, lwc_string *element_name)
{
dom_node *element;
dom_exception exc;
dom_string *node_name = NULL;
dom_node_type node_type;
dom_node *next_node;
exc = dom_node_get_first_child(parent, &element);
if ((exc != DOM_NO_ERR) || (element == NULL)) {
return NULL;
}
/* find first node thats a element */
do {
exc = dom_node_get_node_type(element, &node_type);
if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) {
exc = dom_node_get_node_name(element, &node_name);
if ((exc == DOM_NO_ERR) && (node_name != NULL)) {
if (dom_string_caseless_lwc_isequal(node_name,
element_name)) {
dom_string_unref(node_name);
break;
}
dom_string_unref(node_name);
}
}
exc = dom_node_get_next_sibling(element, &next_node);
dom_node_unref(element);
if (exc == DOM_NO_ERR) {
element = next_node;
} else {
element = NULL;
}
} while (element != NULL);
return element;
}
void domutils_iterate_child_elements(dom_node *parent,
domutils_iterate_cb cb, void *ctx)
{
dom_nodelist *children;
uint32_t index, num_children;
dom_exception error;
error = dom_node_get_child_nodes(parent, &children);
if (error != DOM_NO_ERR || children == NULL)
return;
error = dom_nodelist_get_length(children, &num_children);
if (error != DOM_NO_ERR) {
dom_nodelist_unref(children);
return;
}
for (index = 0; index < num_children; index++) {
dom_node *child;
dom_node_type type;
error = dom_nodelist_item(children, index, &child);
if (error != DOM_NO_ERR) {
dom_nodelist_unref(children);
return;
}
error = dom_node_get_node_type(child, &type);
if (error == DOM_NO_ERR && type == DOM_ELEMENT_NODE) {
if (cb(child, ctx) == false) {
dom_node_unref(child);
dom_nodelist_unref(children);
return;
}
}
dom_node_unref(child);
}
dom_nodelist_unref(children);
}
static void ignore_dom_msg(uint32_t severity, void *ctx, const char *msg, ...)
{
}
dom_document *domutils_parse_file(const char *filename, const char *encoding)
{
dom_hubbub_error error;
dom_hubbub_parser *parser;
dom_document *document;
FILE *fp = NULL;
#define BUF_SIZE 512
uint8_t buf[BUF_SIZE];
fp = fopen(filename, "r");
if (fp == NULL) {
return NULL;
}
parser = dom_hubbub_parser_create(encoding, false, false,
ignore_dom_msg, NULL, NULL, &document);
if (parser == NULL) {
fclose(fp);
return NULL;
}
while (feof(fp) == 0) {
size_t read = fread(buf, sizeof(buf[0]), BUF_SIZE, fp);
error = dom_hubbub_parser_parse_chunk(parser, buf, read);
if (error != DOM_HUBBUB_OK) {
dom_node_unref(document);
dom_hubbub_parser_destroy(parser);
fclose(fp);
return NULL;
}
}
error = dom_hubbub_parser_completed(parser);
if (error != DOM_HUBBUB_OK) {
dom_node_unref(document);
dom_hubbub_parser_destroy(parser);
fclose(fp);
return NULL;
}
dom_hubbub_parser_destroy(parser);
return document;
}

View File

@ -1,37 +0,0 @@
/*
* Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
* NetSurf is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* NetSurf is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _NETSURF_UTILS_DOMUTILS_H_
#define _NETSURF_UTILS_DOMUTILS_H_
#include <stdbool.h>
#include <dom/dom.h>
typedef bool (*domutils_iterate_cb)(dom_node *node, void *ctx);
dom_node *find_first_named_dom_element(dom_node *parent,
lwc_string *element_name);
void domutils_iterate_child_elements(dom_node *parent,
domutils_iterate_cb cb, void *ctx);
dom_document *domutils_parse_file(const char *filename,
const char *encoding);
#endif

View File

@ -21,10 +21,14 @@
*/
#include <assert.h>
#include <dom/dom.h>
#include <dom/bindings/hubbub/parser.h>
#include "utils/config.h"
#include "utils/log.h"
#include "utils/libdom.h"
/* exported interface documented in libdom.h */
bool libdom_treewalk(dom_node *root,
bool (*callback)(dom_node *node, dom_string *name, void *ctx),
@ -129,6 +133,7 @@ struct find_element_ctx {
lwc_string *search;
dom_node *found;
};
/* libdom_treewalk callback for libdom_find_element */
static bool libdom_find_element_callback(dom_node *node, dom_string *name,
void *ctx)
@ -162,3 +167,140 @@ dom_node *libdom_find_element(dom_node *node, lwc_string *element_name)
return data.found;
}
/* exported interface documented in libdom.h */
dom_node *libdom_find_first_element(dom_node *parent, lwc_string *element_name)
{
dom_node *element;
dom_exception exc;
dom_string *node_name = NULL;
dom_node_type node_type;
dom_node *next_node;
exc = dom_node_get_first_child(parent, &element);
if ((exc != DOM_NO_ERR) || (element == NULL)) {
return NULL;
}
/* find first node thats a element */
do {
exc = dom_node_get_node_type(element, &node_type);
if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) {
exc = dom_node_get_node_name(element, &node_name);
if ((exc == DOM_NO_ERR) && (node_name != NULL)) {
if (dom_string_caseless_lwc_isequal(node_name,
element_name)) {
dom_string_unref(node_name);
break;
}
dom_string_unref(node_name);
}
}
exc = dom_node_get_next_sibling(element, &next_node);
dom_node_unref(element);
if (exc == DOM_NO_ERR) {
element = next_node;
} else {
element = NULL;
}
} while (element != NULL);
return element;
}
/* exported interface documented in libdom.h */
void libdom_iterate_child_elements(dom_node *parent,
libdom_iterate_cb cb, void *ctx)
{
dom_nodelist *children;
uint32_t index, num_children;
dom_exception error;
error = dom_node_get_child_nodes(parent, &children);
if (error != DOM_NO_ERR || children == NULL)
return;
error = dom_nodelist_get_length(children, &num_children);
if (error != DOM_NO_ERR) {
dom_nodelist_unref(children);
return;
}
for (index = 0; index < num_children; index++) {
dom_node *child;
dom_node_type type;
error = dom_nodelist_item(children, index, &child);
if (error != DOM_NO_ERR) {
dom_nodelist_unref(children);
return;
}
error = dom_node_get_node_type(child, &type);
if (error == DOM_NO_ERR && type == DOM_ELEMENT_NODE) {
if (cb(child, ctx) == false) {
dom_node_unref(child);
dom_nodelist_unref(children);
return;
}
}
dom_node_unref(child);
}
dom_nodelist_unref(children);
}
static void ignore_dom_msg(uint32_t severity, void *ctx, const char *msg, ...)
{
}
/* exported interface documented in libdom.h */
dom_document *libdom_parse_file(const char *filename, const char *encoding)
{
dom_hubbub_error error;
dom_hubbub_parser *parser;
dom_document *document;
FILE *fp = NULL;
#define BUF_SIZE 512
uint8_t buf[BUF_SIZE];
fp = fopen(filename, "r");
if (fp == NULL) {
return NULL;
}
parser = dom_hubbub_parser_create(encoding, false, false,
ignore_dom_msg, NULL, NULL, &document);
if (parser == NULL) {
fclose(fp);
return NULL;
}
while (feof(fp) == 0) {
size_t read = fread(buf, sizeof(buf[0]), BUF_SIZE, fp);
error = dom_hubbub_parser_parse_chunk(parser, buf, read);
if (error != DOM_HUBBUB_OK) {
dom_node_unref(document);
dom_hubbub_parser_destroy(parser);
fclose(fp);
return NULL;
}
}
error = dom_hubbub_parser_completed(parser);
if (error != DOM_HUBBUB_OK) {
dom_node_unref(document);
dom_hubbub_parser_destroy(parser);
fclose(fp);
return NULL;
}
dom_hubbub_parser_destroy(parser);
return document;
}

View File

@ -48,4 +48,20 @@ bool libdom_treewalk(dom_node *root,
*/
dom_node *libdom_find_element(dom_node *node, lwc_string *element_name);
/**
* Search children of a node for first named element
* \param parent dom_node to search children of, or NULL
* \param element_name name of element to find
* \return first child of node which is an element and matches name, or
* NULL if not found or parameter node is NULL
*/
dom_node *libdom_find_first_element(dom_node *parent, lwc_string *element_name);
typedef bool (*libdom_iterate_cb)(dom_node *node, void *ctx);
void libdom_iterate_child_elements(dom_node *parent,
libdom_iterate_cb cb, void *ctx);
dom_document *libdom_parse_file(const char *filename, const char *encoding);
#endif