diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2019-05-04 10:12:35 +0100 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2019-05-04 10:12:35 +0100 |
commit | 41b0a260811a0880e2f84e29e20e3ebea9d0b6fe (patch) | |
tree | c69351198875239bfbe789d8076c1e403222def9 | |
parent | 4fdf474eaaca503d3bb261e9637a63e4a48cb27c (diff) | |
download | libdom-41b0a260811a0880e2f84e29e20e3ebea9d0b6fe.tar.gz libdom-41b0a260811a0880e2f84e29e20e3ebea9d0b6fe.tar.bz2 |
Begin to support SCRIPT elements flags
Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
-rw-r--r-- | bindings/hubbub/parser.c | 35 | ||||
-rw-r--r-- | include/dom/html/html_script_element.h | 16 | ||||
-rw-r--r-- | src/html/html_script_element.c | 39 | ||||
-rw-r--r-- | src/html/html_script_element.h | 1 |
4 files changed, 91 insertions, 0 deletions
diff --git a/bindings/hubbub/parser.c b/bindings/hubbub/parser.c index 9dfe738..6ee3004 100644 --- a/bindings/hubbub/parser.c +++ b/bindings/hubbub/parser.c @@ -226,6 +226,41 @@ static hubbub_error create_element(void *parser, const hubbub_tag *tag, goto clean1; } + /* Now do some special per-element-type handling */ + dom_html_element_type tag_type; + err = dom_html_element_get_tag_type(element, &tag_type); + if (err != DOM_NO_ERR) { + dom_parser->msg(DOM_MSG_CRITICAL, dom_parser->mctx, + "Can't get tag type out of element"); + goto clean1; + } + + switch (tag_type) { + case DOM_HTML_ELEMENT_TYPE_SCRIPT: { + /* Kickstart of https://html.spec.whatwg.org/multipage/scripting.html#script-processing-model */ + dom_html_script_element *script = (dom_html_script_element *)element; + dom_html_script_element_flags flags; + err = dom_html_script_element_get_flags(script, &flags); + if (err != DOM_NO_ERR) { + dom_parser->msg(DOM_MSG_CRITICAL, dom_parser->mctx, + "Can't get flags out of script element"); + goto clean1; + } + flags |= DOM_HTML_SCRIPT_ELEMENT_FLAG_PARSER_INSERTED; + err = dom_html_script_element_set_flags(script, flags); + if (err != DOM_NO_ERR) { + dom_parser->msg(DOM_MSG_CRITICAL, dom_parser->mctx, + "Can't set flags into script element"); + goto clean1; + } + break; + } + default: + /* Nothing */ + break; + } + + *result = element; clean1: diff --git a/include/dom/html/html_script_element.h b/include/dom/html/html_script_element.h index 855bf9d..880ca1c 100644 --- a/include/dom/html/html_script_element.h +++ b/include/dom/html/html_script_element.h @@ -4,7 +4,9 @@ * http://www.opensource.org/licenses/mit-license.php * Copyright 2009 Bo Yang <struggleyb.nku@gmail.com> * Copyright 2014 Rupinder Singh Khokhar <rsk1coder99@gmail.com> + * Copyright 2019 Daniel Silverstone <dsilvers@digital-scurf.org> */ + #ifndef dom_html_script_element_h_ #define dom_html_script_element_h_ @@ -14,6 +16,20 @@ typedef struct dom_html_script_element dom_html_script_element; +typedef enum { + DOM_HTML_SCRIPT_ELEMENT_FLAG_ALREADY_STARTED = 1 << 0, + DOM_HTML_SCRIPT_ELEMENT_FLAG_PARSER_INSERTED = 1 << 1, + DOM_HTML_SCRIPT_ELEMENT_FLAG_NON_BLOCKING = 1 << 2, + DOM_HTML_SCRIPT_ELEMENT_FLAG_READY_TO_BE_PARSER_EXECUTED = 1 << 3, + DOM_HTML_SCRIPT_ELEMENT_FLAG_FROM_EXTERNAL = 1 << 4, +} dom_html_script_element_flags; + +dom_exception dom_html_script_element_get_flags( + dom_html_script_element *ele, dom_html_script_element_flags *flags); + +dom_exception dom_html_script_element_set_flags( + dom_html_script_element *ele, dom_html_script_element_flags flags); + dom_exception dom_html_script_element_get_defer( dom_html_script_element *ele, bool *defer); diff --git a/src/html/html_script_element.c b/src/html/html_script_element.c index d20d727..e8dfb1d 100644 --- a/src/html/html_script_element.c +++ b/src/html/html_script_element.c @@ -60,6 +60,8 @@ dom_exception _dom_html_script_element_initialise( struct dom_html_element_create_params *params, struct dom_html_script_element *ele) { + ele->flags = DOM_HTML_SCRIPT_ELEMENT_FLAG_NON_BLOCKING; + return _dom_html_element_initialise(params, &ele->base); } @@ -273,3 +275,40 @@ dom_exception dom_html_script_element_set_text( { return _dom_node_set_text_content((dom_node_internal *)ele, text); } + +/** + * Read the internal node flags + * + * \param ele The dom_html_script_element object + * \param flags Where to fill out the flags + * \return DOM_NO_ERR on success + */ +dom_exception dom_html_script_element_get_flags( + dom_html_script_element *ele, + dom_html_script_element_flags *flags) +{ + assert(flags != NULL); + assert(ele != NULL); + + *flags = ele->flags; + + return DOM_NO_ERR; +} + +/** + * Set the internal node flags + * + * \param ele The dom_html_script_element object + * \param flags The flags to retain + * \return DOM_NO_ERR on success + */ +dom_exception dom_html_script_element_set_flags( + dom_html_script_element *ele, + dom_html_script_element_flags flags) +{ + assert(ele != NULL); + + ele->flags = flags; + + return DOM_NO_ERR; +} diff --git a/src/html/html_script_element.h b/src/html/html_script_element.h index 9b1d704..1b34f6a 100644 --- a/src/html/html_script_element.h +++ b/src/html/html_script_element.h @@ -16,6 +16,7 @@ struct dom_html_script_element { struct dom_html_element base; /**< The base class */ + dom_html_script_element_flags flags; }; /* Create a dom_html_script_element object */ |