diff options
-rw-r--r-- | src/treebuilder/in_body.c | 132 | ||||
-rw-r--r-- | test/data/tree-construction/INDEX | 4 |
2 files changed, 72 insertions, 64 deletions
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c index bdf2c0b..04eb8c2 100644 --- a/src/treebuilder/in_body.c +++ b/src/treebuilder/in_body.c @@ -653,11 +653,22 @@ hubbub_error process_form_in_body(hubbub_treebuilder *treebuilder, { hubbub_error err; - if (treebuilder->context.form_element != NULL) { + element_context *stack = treebuilder->context.element_stack; + bool template_in_stack = false; + uint32_t n; + for (n = treebuilder->context.current_node; + n > 0; n--) { + if(stack[n].type == TEMPLATE) { + template_in_stack = true; + break; + } + } + if (treebuilder->context.form_element != NULL && + template_in_stack == false) { /** \todo parse error */ } else { - if (element_in_scope(treebuilder, P, NONE)) { - err = process_0p_in_body(treebuilder); + if (element_in_scope(treebuilder, P, BUTTON_SCOPE)) { + err = close_p_in_body(treebuilder); if (err != HUBBUB_OK) return err; } @@ -673,9 +684,11 @@ hubbub_error process_form_in_body(hubbub_treebuilder *treebuilder, treebuilder->context.element_stack[ treebuilder->context.current_node].node); - treebuilder->context.form_element = - treebuilder->context.element_stack[ - treebuilder->context.current_node].node; + if(template_in_stack == false) { + treebuilder->context.form_element = + treebuilder->context.element_stack[ + treebuilder->context.current_node].node; + } } return HUBBUB_OK; @@ -1151,51 +1164,64 @@ hubbub_error process_isindex_in_body(hubbub_treebuilder *treebuilder, { hubbub_error err; hubbub_token dummy; + element_context *stack = treebuilder->context.element_stack; hubbub_attribute *action = NULL; hubbub_attribute *prompt = NULL; hubbub_attribute *attrs = NULL; size_t n_attrs = 0; + uint32_t n; + bool template_in_stack = false; - /** \todo parse error */ + hubbub_ns ns; + void *node; + element_type o_type; - if (treebuilder->context.form_element != NULL) + for (n = treebuilder->context.current_node; + n > 0; n--) { + if(stack[n].type == TEMPLATE) { + template_in_stack = true; + break; + } + } + if (template_in_stack == false && + treebuilder->context.form_element != NULL) return HUBBUB_OK; /* First up, clone the token's attributes */ - if (token->data.tag.n_attributes > 0) { - uint32_t i; - attrs = malloc((token->data.tag.n_attributes + 1) * - sizeof(hubbub_attribute)); - if (attrs == NULL) - return HUBBUB_NOMEM; - - for (i = 0; i < token->data.tag.n_attributes; i++) { - hubbub_attribute *attr = &token->data.tag.attributes[i]; - const uint8_t *name = attr->name.ptr; + attrs = malloc((token->data.tag.n_attributes + 1) * + sizeof(hubbub_attribute)); + if (attrs == NULL) + return HUBBUB_NOMEM; + uint32_t i; + for (i = 0; i < token->data.tag.n_attributes; i++) { + hubbub_attribute *attr = &token->data.tag.attributes[i]; + const uint8_t *name = attr->name.ptr; - if (strncmp((const char *) name, "action", + if (strncmp((const char *) name, "action", attr->name.len) == 0) { - action = attr; - } else if (strncmp((const char *) name, "prompt", + action = attr; + } else if (strncmp((const char *) name, "prompt", attr->name.len) == 0) { - prompt = attr; - } else if (strncmp((const char *) name, "name", + prompt = attr; + } else if (strncmp((const char *) name, "name", attr->name.len) == 0) { - } else { - attrs[n_attrs++] = *attr; - } + } else { + attrs[n_attrs++] = *attr; } - - attrs[n_attrs].ns = HUBBUB_NS_HTML; - attrs[n_attrs].name.ptr = (const uint8_t *) "name"; - attrs[n_attrs].name.len = SLEN("name"); - attrs[n_attrs].value.ptr = (const uint8_t *) "isindex"; - attrs[n_attrs].value.len = SLEN("isindex"); - n_attrs++; } + attrs[n_attrs].ns = HUBBUB_NS_HTML; + attrs[n_attrs].name.ptr = (const uint8_t *) "name"; + attrs[n_attrs].name.len = SLEN("name"); + attrs[n_attrs].value.ptr = (const uint8_t *) "isindex"; + attrs[n_attrs].value.len = SLEN("isindex"); + n_attrs++; + + /* isindex algorithm */ + treebuilder->context.frameset_ok = false; + /* Set up dummy as a start tag token */ dummy.type = HUBBUB_TOKEN_START_TAG; dummy.data.tag.ns = HUBBUB_NS_HTML; @@ -1225,25 +1251,13 @@ hubbub_error process_isindex_in_body(hubbub_treebuilder *treebuilder, return err; } - /* Act as if <p> were seen */ - dummy.data.tag.name.ptr = (const uint8_t *) "p"; - dummy.data.tag.name.len = SLEN("p"); - dummy.data.tag.n_attributes = 0; - dummy.data.tag.attributes = NULL; - - err = process_container_in_body(treebuilder, &dummy); - if (err != HUBBUB_OK) { - free(attrs); - return err; - } - /* Act as if <label> were seen */ dummy.data.tag.name.ptr = (const uint8_t *) "label"; dummy.data.tag.name.len = SLEN("label"); dummy.data.tag.n_attributes = 0; dummy.data.tag.attributes = NULL; - err = process_phrasing_in_body(treebuilder, &dummy); + err = insert_element(treebuilder, &dummy.data.tag, true); if (err != HUBBUB_OK) { free(attrs); return err; @@ -1255,7 +1269,9 @@ hubbub_error process_isindex_in_body(hubbub_treebuilder *treebuilder, dummy.data.character = prompt->value; } else { /** \todo Localisation */ -#define PROMPT "This is a searchable index. Insert your search keywords here: " + /** \todo what does input field here mean? + the text in the input field? */ +#define PROMPT "This is a searchable index. Enter search keywords: " dummy.data.character.ptr = (const uint8_t *) PROMPT; dummy.data.character.len = SLEN(PROMPT); #undef PROMPT @@ -1276,12 +1292,6 @@ hubbub_error process_isindex_in_body(hubbub_treebuilder *treebuilder, dummy.data.tag.n_attributes = n_attrs; dummy.data.tag.attributes = attrs; - err = reconstruct_active_formatting_list(treebuilder); - if (err != HUBBUB_OK) { - free(attrs); - return err; - } - err = insert_element(treebuilder, &dummy.data.tag, false); if (err != HUBBUB_OK) { free(attrs); @@ -1291,16 +1301,14 @@ hubbub_error process_isindex_in_body(hubbub_treebuilder *treebuilder, /* No longer need attrs */ free(attrs); - treebuilder->context.frameset_ok = false; - /* Act as if </label> was seen */ - err = process_0generic_in_body(treebuilder, LABEL); - assert(err == HUBBUB_OK); - /* Act as if </p> was seen */ - err = process_0p_in_body(treebuilder); - if (err != HUBBUB_OK) - return err; + element_stack_pop(treebuilder, + &ns, &o_type, &node); + + treebuilder->tree_handler->unref_node( + treebuilder->tree_handler->ctx, + node); /* Act as if <hr> was seen */ dummy.data.tag.name.ptr = (const uint8_t *) "hr"; @@ -1308,7 +1316,7 @@ hubbub_error process_isindex_in_body(hubbub_treebuilder *treebuilder, dummy.data.tag.n_attributes = 0; dummy.data.tag.attributes = NULL; - err = process_hr_in_body(treebuilder, &dummy); + err = insert_element(treebuilder, &dummy.data.tag, false); if (err != HUBBUB_OK) return err; diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX index cc639b5..3b3136b 100644 --- a/test/data/tree-construction/INDEX +++ b/test/data/tree-construction/INDEX @@ -14,7 +14,7 @@ adoption02.dat html5lib tests for the adoption agency algorithm #entities02.dat NA #html5test-com.dat NA #inbody01.dat NA -#isindex.dat NA +isindex.dat html5lib treebuilder tests for isindex element #main-element.dat NA #pending-spec-changes.dat NA #pending-spec-changes-plain-text-unsafe.dat NA @@ -44,7 +44,7 @@ tests1.dat html5lib treebuilder tests #tests24.dat NA #tests25.dat NA #tests26.dat NA -#tests2.dat NA +tests2.dat html5lib treebuilder tests #tests3.dat NA tests4.dat html5lib treebuilder tests tests5.dat html5lib treebuilder tests |