From 646aed64ff07fa356f8aef034e77792cf634b053 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 6 Dec 2012 18:04:43 +0000 Subject: change to parameterised parser binding creation --- render/html.c | 138 ++++++++++++++++++--------------------------------------- utils/libdom.c | 82 +++++++++++++++++++++++++++++++--- utils/libdom.h | 14 +++++- 3 files changed, 131 insertions(+), 103 deletions(-) diff --git a/render/html.c b/render/html.c index 812c6909b..0b2c54365 100644 --- a/render/html.c +++ b/render/html.c @@ -112,60 +112,6 @@ static nserror css_error_to_nserror(css_error error) return NSERROR_CSS; } -static nserror -dom_hubbub_error_to_nserror(dom_hubbub_error error) -{ - switch (error) { - - /* HUBBUB_REPROCESS is not handled here because it can - * never occur outside the hubbub treebuilder - */ - - case DOM_HUBBUB_OK: - /* parsed ok */ - return NSERROR_OK; - - case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_PAUSED): - /* hubbub input paused */ - return NSERROR_OK; - - case DOM_HUBBUB_NOMEM: - /* out of memory error from DOM */ - return NSERROR_NOMEM; - - case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_ENCODINGCHANGE): - /* encoding changed */ - return NSERROR_ENCODING_CHANGE; - - case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_NOMEM): - /* out of memory error from parser */ - return NSERROR_NOMEM; - - case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_BADPARM): - return NSERROR_BAD_PARAMETER; - - case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_INVALID): - return NSERROR_INVALID; - - case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_FILENOTFOUND): - return NSERROR_NOT_FOUND; - - case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_NEEDDATA): - return NSERROR_NEED_DATA; - - case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_BADENCODING): - return NSERROR_BAD_ENCODING; - - case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_UNKNOWN): - /* currently only generated by the libdom hubbub binding */ - return NSERROR_DOM; - default: - /* unknown error */ - /** @todo better error handling and reporting */ - return NSERROR_UNKNOWN; - } - return NSERROR_UNKNOWN; -} static void html_destroy_objects(html_content *html) { @@ -371,6 +317,8 @@ html_create_html_data(html_content *c, const http_parameter *params) { lwc_string *charset; nserror nerror; + dom_hubbub_parser_params parse_params; + dom_hubbub_error error; c->parser = NULL; c->document = NULL; @@ -424,36 +372,37 @@ html_create_html_data(html_content *c, const http_parameter *params) } /* Create the parser binding */ - c->parser = dom_hubbub_parser_create(c->encoding, - true, - nsoption_bool(enable_javascript), - NULL, - html_process_script, - c, - &c->document); - if ((c->parser == NULL) && (c->encoding != NULL)) { + parse_params.enc = c->encoding; + parse_params.fix_enc = true; + parse_params.enable_script = nsoption_bool(enable_javascript); + parse_params.msg = NULL; + parse_params.script = html_process_script; + parse_params.ctx = c; + + error = dom_hubbub_parser_create(&parse_params, + &c->parser, + &c->document); + if ((error != DOM_HUBBUB_OK) && (c->encoding != NULL)) { /* Ok, we don't support the declared encoding. Bailing out * isn't exactly user-friendly, so fall back to autodetect */ free(c->encoding); c->encoding = NULL; - c->parser = dom_hubbub_parser_create(c->encoding, - true, - nsoption_bool(enable_javascript), - NULL, - html_process_script, - c, - &c->document); + parse_params.enc = c->encoding; + + error = dom_hubbub_parser_create(&parse_params, + &c->parser, + &c->document); } - if (c->parser == NULL) { + if (error != DOM_HUBBUB_OK) { nsurl_unref(c->base_url); c->base_url = NULL; lwc_string_unref(c->universal); c->universal = NULL; - return NSERROR_NOMEM; + return libdom_hubbub_error_to_nserror(error); } return NSERROR_OK; @@ -510,6 +459,7 @@ html_process_encoding_change(struct content *c, unsigned int size) { html_content *html = (html_content *) c; + dom_hubbub_parser_params parse_params; dom_hubbub_error error; const char *encoding; const char *source_data; @@ -539,15 +489,18 @@ html_process_encoding_change(struct content *c, dom_node_unref(html->document); } + parse_params.enc = html->encoding; + parse_params.fix_enc = true; + parse_params.enable_script = nsoption_bool(enable_javascript); + parse_params.msg = NULL; + parse_params.script = html_process_script; + parse_params.ctx = html; + /* Create new binding, using the new encoding */ - html->parser = dom_hubbub_parser_create(html->encoding, - true, - nsoption_bool(enable_javascript), - NULL, - html_process_script, - html, - &html->document); - if (html->parser == NULL) { + error = dom_hubbub_parser_create(&parse_params, + &html->parser, + &html->document); + if (error != DOM_HUBBUB_OK) { /* Ok, we don't support the declared encoding. Bailing out * isn't exactly user-friendly, so fall back to Windows-1252 */ free(html->encoding); @@ -555,21 +508,14 @@ html_process_encoding_change(struct content *c, if (html->encoding == NULL) { return NSERROR_NOMEM; } + parse_params.enc = html->encoding; - html->parser = dom_hubbub_parser_create(html->encoding, - true, - nsoption_bool(enable_javascript), - NULL, - html_process_script, - html, - &html->document); - - if (html->parser == NULL) { - /** @todo add a message callback function and pass the - * parser errors back instead of everything being - * OOM - */ - return NSERROR_NOMEM; + error = dom_hubbub_parser_create(&parse_params, + &html->parser, + &html->document); + + if (error != DOM_HUBBUB_OK) { + return libdom_hubbub_error_to_nserror(error); } } @@ -584,7 +530,7 @@ html_process_encoding_change(struct content *c, (const uint8_t *)source_data, source_size); - return dom_hubbub_error_to_nserror(error); + return libdom_hubbub_error_to_nserror(error); } @@ -603,7 +549,7 @@ html_process_data(struct content *c, const char *data, unsigned int size) (const uint8_t *) data, size); - err = dom_hubbub_error_to_nserror(dom_ret); + err = libdom_hubbub_error_to_nserror(dom_ret); /* deal with encoding change */ if (err == NSERROR_ENCODING_CHANGE) { @@ -1993,7 +1939,7 @@ html_begin_conversion(html_content *htmlc) LOG(("Parsing failed")); content_broadcast_errorcode(&htmlc->base, - dom_hubbub_error_to_nserror(error)); + libdom_hubbub_error_to_nserror(error)); return false; } diff --git a/utils/libdom.c b/utils/libdom.c index 3b6cd15b1..ebb90eeb4 100644 --- a/utils/libdom.c +++ b/utils/libdom.c @@ -22,7 +22,6 @@ #include #include -#include #include "utils/config.h" #include "utils/log.h" @@ -254,6 +253,70 @@ void libdom_iterate_child_elements(dom_node *parent, dom_nodelist_unref(children); } +/* exported interface documented in libdom.h */ +nserror libdom_hubbub_error_to_nserror(dom_hubbub_error error) +{ + switch (error) { + + /* HUBBUB_REPROCESS is not handled here because it can + * never occur outside the hubbub treebuilder + */ + + case DOM_HUBBUB_OK: + /* parsed ok */ + return NSERROR_OK; + + case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_PAUSED): + /* hubbub input paused */ + return NSERROR_OK; + + case DOM_HUBBUB_NOMEM: + /* out of memory error from DOM */ + return NSERROR_NOMEM; + + case DOM_HUBBUB_BADPARM: + /* Bad parameter passed to creation */ + return NSERROR_BAD_PARAMETER; + + case DOM_HUBBUB_DOM: + /* DOM call returned error */ + return NSERROR_DOM; + + case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_ENCODINGCHANGE): + /* encoding changed */ + return NSERROR_ENCODING_CHANGE; + + case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_NOMEM): + /* out of memory error from parser */ + return NSERROR_NOMEM; + + case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_BADPARM): + return NSERROR_BAD_PARAMETER; + + case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_INVALID): + return NSERROR_INVALID; + + case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_FILENOTFOUND): + return NSERROR_NOT_FOUND; + + case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_NEEDDATA): + return NSERROR_NEED_DATA; + + case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_BADENCODING): + return NSERROR_BAD_ENCODING; + + case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_UNKNOWN): + /* currently only generated by the libdom hubbub binding */ + return NSERROR_DOM; + default: + /* unknown error */ + /** @todo better error handling and reporting */ + return NSERROR_UNKNOWN; + } + return NSERROR_UNKNOWN; +} + + static void ignore_dom_msg(uint32_t severity, void *ctx, const char *msg, ...) { } @@ -261,6 +324,7 @@ static void ignore_dom_msg(uint32_t severity, void *ctx, const char *msg, ...) /* exported interface documented in libdom.h */ nserror libdom_parse_file(const char *filename, const char *encoding, dom_document **doc) { + dom_hubbub_parser_params parse_params; dom_hubbub_error error; dom_hubbub_parser *parser; dom_document *document; @@ -273,11 +337,17 @@ nserror libdom_parse_file(const char *filename, const char *encoding, dom_docume return NSERROR_NOT_FOUND; } - parser = dom_hubbub_parser_create(encoding, false, false, - ignore_dom_msg, NULL, NULL, &document); - if (parser == NULL) { + parse_params.enc = encoding; + parse_params.fix_enc = false; + parse_params.enable_script = false; + parse_params.msg = ignore_dom_msg; + parse_params.script = NULL; + parse_params.ctx = NULL; + + error = dom_hubbub_parser_create(&parse_params, &parser, &document); + if (error != DOM_HUBBUB_OK) { fclose(fp); - return NSERROR_DOM; + return libdom_hubbub_error_to_nserror(error); } while (feof(fp) == 0) { @@ -297,7 +367,7 @@ nserror libdom_parse_file(const char *filename, const char *encoding, dom_docume dom_node_unref(document); dom_hubbub_parser_destroy(parser); fclose(fp); - return NSERROR_DOM; + return libdom_hubbub_error_to_nserror(error); } dom_hubbub_parser_destroy(parser); diff --git a/utils/libdom.h b/utils/libdom.h index d79c92d81..36caf01bf 100644 --- a/utils/libdom.h +++ b/utils/libdom.h @@ -28,7 +28,11 @@ #include -/* depth-first walk the dom calling callback for each element +#include +#include + +/** + * depth-first walk the dom calling callback for each element * * \param root the dom node to use as the root of the tree walk * \return true if all nodes were examined, false if the callback terminated @@ -65,4 +69,12 @@ void libdom_iterate_child_elements(dom_node *parent, nserror libdom_parse_file(const char *filename, const char *encoding, dom_document **doc); +/** + * Convert libdom hubbub binding errors to nserrors. + * + * \param error The hubbub binding error to convert + * \return The appropriate nserror + */ +nserror libdom_hubbub_error_to_nserror(dom_hubbub_error error); + #endif -- cgit v1.2.3