summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2019-05-04 10:12:35 +0100
committerDaniel Silverstone <dsilvers@digital-scurf.org>2019-05-04 10:12:35 +0100
commit41b0a260811a0880e2f84e29e20e3ebea9d0b6fe (patch)
treec69351198875239bfbe789d8076c1e403222def9
parent4fdf474eaaca503d3bb261e9637a63e4a48cb27c (diff)
downloadlibdom-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.c35
-rw-r--r--include/dom/html/html_script_element.h16
-rw-r--r--src/html/html_script_element.c39
-rw-r--r--src/html/html_script_element.h1
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 */