summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Sidwell <andy@entai.co.uk>2008-06-26 18:19:49 +0000
committerAndrew Sidwell <andy@entai.co.uk>2008-06-26 18:19:49 +0000
commit17447f074c102bdac9fdf3e1e0308c1b2e9718b6 (patch)
treec057331a8d3da9da9f8b567beb0f7dd4df26ee12
parent9acb291f49419a1ebe0235f6622ef4e2976f9f33 (diff)
downloadlibhubbub-17447f074c102bdac9fdf3e1e0308c1b2e9718b6.tar.gz
libhubbub-17447f074c102bdac9fdf3e1e0308c1b2e9718b6.tar.bz2
Add namespace awareness right through the code, in preparation for handling foreign content properly.
svn path=/trunk/hubbub/; revision=4457
-rw-r--r--src/treebuilder/after_head.c13
-rw-r--r--src/treebuilder/in_body.c35
-rw-r--r--src/treebuilder/in_caption.c4
-rw-r--r--src/treebuilder/in_cell.c9
-rw-r--r--src/treebuilder/in_column_group.c3
-rw-r--r--src/treebuilder/in_head.c3
-rw-r--r--src/treebuilder/in_head_noscript.c3
-rw-r--r--src/treebuilder/in_row.c6
-rw-r--r--src/treebuilder/in_select.c13
-rw-r--r--src/treebuilder/in_table_body.c11
-rw-r--r--src/treebuilder/internal.h6
-rw-r--r--src/treebuilder/treebuilder.c29
12 files changed, 86 insertions, 49 deletions
diff --git a/src/treebuilder/after_head.c b/src/treebuilder/after_head.c
index e8d3e79..ac68dfb 100644
--- a/src/treebuilder/after_head.c
+++ b/src/treebuilder/after_head.c
@@ -55,27 +55,28 @@ bool handle_after_head(hubbub_treebuilder *treebuilder,
} else if (type == BASE || type == LINK || type == META ||
type == NOFRAMES || type == SCRIPT ||
type == STYLE || type == TITLE) {
+ hubbub_ns ns;
element_type otype;
void *node;
/** \todo parse error */
- if (!element_stack_push(treebuilder,
- HEAD,
+ if (!element_stack_push(treebuilder,
+ HUBBUB_NS_HTML,
+ HEAD,
treebuilder->context.head_element)) {
/** \todo errors */
}
-
-
/* Process as "in head" */
reprocess = process_in_head(treebuilder, token);
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype,
+ &node)) {
/** \todo errors */
}
- /* No need to unref node as we never increased
+ /* No need to unref node as we never increased
* its reference count when pushing it on the stack */
} else if (type == HEAD) {
/** \todo parse error */
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index 5196a7b..739e0c2 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -571,10 +571,12 @@ void process_dd_dt_li_in_body(hubbub_treebuilder *treebuilder,
}
do {
+ hubbub_ns ns;
element_type otype;
void *node;
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns,
+ &otype, &node)) {
/** \todo errors */
}
@@ -846,6 +848,7 @@ void process_image_in_body(hubbub_treebuilder *treebuilder,
void process_input_in_body(hubbub_treebuilder *treebuilder,
const hubbub_token *token)
{
+ hubbub_ns ns;
element_type otype;
void *node;
@@ -861,7 +864,7 @@ void process_input_in_body(hubbub_treebuilder *treebuilder,
treebuilder->context.current_node].node);
}
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype, &node)) {
/** \todo errors */
}
@@ -1111,9 +1114,11 @@ void process_0container_in_body(hubbub_treebuilder *treebuilder,
close_implied_end_tags(treebuilder, UNKNOWN);
do {
+ hubbub_ns ns;
void *node;
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype,
+ &node)) {
/** \todo errors */
}
@@ -1144,11 +1149,12 @@ void process_0p_in_body(hubbub_treebuilder *treebuilder)
/** \todo parse error */
}
- while(element_in_scope(treebuilder, P, false)) {
+ while (element_in_scope(treebuilder, P, false)) {
+ hubbub_ns ns;
element_type type;
void *node;
- if (!element_stack_pop(treebuilder, &type, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &type, &node)) {
/** \todo errors */
}
@@ -1195,9 +1201,10 @@ void process_0dd_dt_li_in_body(hubbub_treebuilder *treebuilder,
close_implied_end_tags(treebuilder, type);
do {
+ hubbub_ns ns;
void *node;
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype, &node)) {
/** \todo errors */
}
@@ -1239,9 +1246,11 @@ void process_0h_in_body(hubbub_treebuilder *treebuilder,
close_implied_end_tags(treebuilder, UNKNOWN);
do {
+ hubbub_ns ns;
void *node;
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype,
+ &node)) {
/** \todo errors */
}
@@ -1482,14 +1491,15 @@ bool aa_find_furthest_block(hubbub_treebuilder *treebuilder,
}
if (fb > treebuilder->context.current_node) {
+ hubbub_ns ns;
element_type type;
void *node;
uint32_t index;
- /* Pop all elements off the stack up to,
+ /* Pop all elements off the stack up to,
* and including, the formatting element */
do {
- if (!element_stack_pop(treebuilder, &type, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &type, &node)) {
/** \todo errors */
}
@@ -1811,9 +1821,11 @@ void process_0applet_button_marquee_object_in_body(
close_implied_end_tags(treebuilder, UNKNOWN);
do {
+ hubbub_ns ns;
void *node;
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype,
+ &node)) {
/** \todo errors */
}
@@ -1878,10 +1890,11 @@ void process_0generic_in_body(hubbub_treebuilder *treebuilder,
close_implied_end_tags(treebuilder, UNKNOWN);
do {
+ hubbub_ns ns;
void *node;
if (!element_stack_pop(treebuilder,
- &otype, &node)) {
+ &ns, &otype, &node)) {
/** \todo errors */
}
diff --git a/src/treebuilder/in_caption.c b/src/treebuilder/in_caption.c
index 123ba76..c6e0e18 100644
--- a/src/treebuilder/in_caption.c
+++ b/src/treebuilder/in_caption.c
@@ -74,6 +74,7 @@ bool handle_in_caption(hubbub_treebuilder *treebuilder,
}
if (handled || reprocess) {
+ hubbub_ns ns;
element_type otype = UNKNOWN;
void *node;
@@ -85,7 +86,8 @@ bool handle_in_caption(hubbub_treebuilder *treebuilder,
while (otype != CAPTION) {
/** \todo parse error */
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype,
+ &node)) {
/** \todo errors */
}
}
diff --git a/src/treebuilder/in_cell.c b/src/treebuilder/in_cell.c
index 98913c6..0159edc 100644
--- a/src/treebuilder/in_cell.c
+++ b/src/treebuilder/in_cell.c
@@ -21,9 +21,11 @@
*/
static inline void close_cell(hubbub_treebuilder *treebuilder)
{
+ hubbub_ns ns;
+ element_type otype = UNKNOWN;
void *node;
+
element_type type;
- element_type otype = UNKNOWN;
if (element_in_scope(treebuilder, TD, true)) {
type = TD;
@@ -37,7 +39,7 @@ static inline void close_cell(hubbub_treebuilder *treebuilder)
/** \todo parse error */
while (otype != type) {
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype, &node)) {
/** \todo errors */
}
}
@@ -87,6 +89,7 @@ bool handle_in_cell(hubbub_treebuilder *treebuilder, const hubbub_token *token)
if (type == TH || TD) {
if (element_in_scope(treebuilder, type, true)) {
+ hubbub_ns ns;
element_type otype = UNKNOWN;
void *node;
@@ -95,7 +98,7 @@ bool handle_in_cell(hubbub_treebuilder *treebuilder, const hubbub_token *token)
while (otype != type) {
if (!element_stack_pop(treebuilder,
- &otype, &node)) {
+ &ns, &otype, &node)) {
/** \todo errors */
}
}
diff --git a/src/treebuilder/in_column_group.c b/src/treebuilder/in_column_group.c
index 35043b8..bb762b4 100644
--- a/src/treebuilder/in_column_group.c
+++ b/src/treebuilder/in_column_group.c
@@ -81,11 +81,12 @@ bool handle_in_column_group(hubbub_treebuilder *treebuilder,
}
if (handled || reprocess) {
+ hubbub_ns ns;
element_type otype;
void *node;
/* Pop the current node (which will be a colgroup) */
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype, &node)) {
/** \todo errors */
}
diff --git a/src/treebuilder/in_head.c b/src/treebuilder/in_head.c
index f5fb099..925bf57 100644
--- a/src/treebuilder/in_head.c
+++ b/src/treebuilder/in_head.c
@@ -164,10 +164,11 @@ bool handle_in_head(hubbub_treebuilder *treebuilder,
}
if (handled || reprocess) {
+ hubbub_ns ns;
element_type otype;
void *node;
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype, &node)) {
/** \todo errors */
}
diff --git a/src/treebuilder/in_head_noscript.c b/src/treebuilder/in_head_noscript.c
index 97a48f7..4eebf4e 100644
--- a/src/treebuilder/in_head_noscript.c
+++ b/src/treebuilder/in_head_noscript.c
@@ -81,10 +81,11 @@ bool handle_in_head_noscript(hubbub_treebuilder *treebuilder,
}
if (handled || reprocess) {
+ hubbub_ns ns;
element_type otype;
void *node;
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype, &node)) {
/** \todo errors */
}
diff --git a/src/treebuilder/in_row.c b/src/treebuilder/in_row.c
index ea600aa..9a6e10d 100644
--- a/src/treebuilder/in_row.c
+++ b/src/treebuilder/in_row.c
@@ -25,10 +25,11 @@ static void table_clear_stack(hubbub_treebuilder *treebuilder)
treebuilder->context.current_node].type;
while (cur_node != TR && cur_node != HTML) {
+ hubbub_ns ns;
element_type type;
void *node;
- if (!element_stack_pop(treebuilder, &type, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &type, &node)) {
/** \todo errors */
}
@@ -48,13 +49,14 @@ static void table_clear_stack(hubbub_treebuilder *treebuilder)
*/
static inline bool act_as_if_end_tag_tr(hubbub_treebuilder *treebuilder)
{
+ hubbub_ns ns;
element_type otype;
void *node;
/** \todo fragment case */
table_clear_stack(treebuilder);
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype, &node)) {
/** \todo errors */
}
diff --git a/src/treebuilder/in_select.c b/src/treebuilder/in_select.c
index eb35317..5085b32 100644
--- a/src/treebuilder/in_select.c
+++ b/src/treebuilder/in_select.c
@@ -26,6 +26,7 @@ bool handle_in_select(hubbub_treebuilder *treebuilder,
{
bool reprocess = false;
+ hubbub_ns ns;
element_type otype;
void *node;
@@ -51,7 +52,7 @@ bool handle_in_select(hubbub_treebuilder *treebuilder,
process_tag_in_body(treebuilder, token);
} else if (type == OPTION) {
if (current_node(treebuilder) == OPTION) {
- if (!element_stack_pop(treebuilder, &otype,
+ if (!element_stack_pop(treebuilder, &ns, &otype,
&node)) {
/** \todo errors */
}
@@ -60,14 +61,14 @@ bool handle_in_select(hubbub_treebuilder *treebuilder,
insert_element(treebuilder, &token->data.tag);
} else if (type == OPTGROUP) {
if (current_node(treebuilder) == OPTION) {
- if (!element_stack_pop(treebuilder, &otype,
+ if (!element_stack_pop(treebuilder, &ns, &otype,
&node)) {
/** \todo errors */
}
}
if (current_node(treebuilder) == OPTGROUP) {
- if (!element_stack_pop(treebuilder, &otype,
+ if (!element_stack_pop(treebuilder, &ns, &otype,
&node)) {
/** \todo errors */
}
@@ -99,14 +100,14 @@ bool handle_in_select(hubbub_treebuilder *treebuilder,
if (type == OPTGROUP) {
if (current_node(treebuilder) == OPTION &&
prev_node(treebuilder) == OPTGROUP) {
- if (!element_stack_pop(treebuilder, &otype,
+ if (!element_stack_pop(treebuilder, &ns, &otype,
&node)) {
/** \todo errors */
}
}
if (current_node(treebuilder) == OPTGROUP) {
- if (!element_stack_pop(treebuilder, &otype,
+ if (!element_stack_pop(treebuilder, &ns, &otype,
&node)) {
/** \todo errors */
}
@@ -115,7 +116,7 @@ bool handle_in_select(hubbub_treebuilder *treebuilder,
}
} else if (type == OPTION) {
if (current_node(treebuilder) == OPTION) {
- if (!element_stack_pop(treebuilder, &otype,
+ if (!element_stack_pop(treebuilder, &ns, &otype,
&node)) {
/** \todo errors */
}
diff --git a/src/treebuilder/in_table_body.c b/src/treebuilder/in_table_body.c
index ef91f55..3e0aa25 100644
--- a/src/treebuilder/in_table_body.c
+++ b/src/treebuilder/in_table_body.c
@@ -26,10 +26,11 @@ static void table_clear_stack(hubbub_treebuilder *treebuilder)
while (cur_node != TBODY && cur_node != TFOOT &&
cur_node != THEAD && cur_node != HTML) {
+ hubbub_ns ns;
element_type type;
void *node;
- if (!element_stack_pop(treebuilder, &type, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &type, &node)) {
/** \todo errors */
}
@@ -51,6 +52,7 @@ static bool table_sub_start_or_table_end(hubbub_treebuilder *treebuilder)
if (element_in_scope(treebuilder, TBODY, true) ||
element_in_scope(treebuilder, THEAD, true) ||
element_in_scope(treebuilder, TFOOT, true)) {
+ hubbub_ns ns;
element_type otype;
void *node;
@@ -59,7 +61,7 @@ static bool table_sub_start_or_table_end(hubbub_treebuilder *treebuilder)
/* "Act as if an end tag with the same name as the current
* node had been seen" -- this behaviour should be identical
* to handling for (tbody/tfoot/thead) end tags in this mode */
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype, &node)) {
/** \todo errors */
}
@@ -134,12 +136,13 @@ bool handle_in_column_group(hubbub_treebuilder *treebuilder,
/** \todo parse error */
/* Ignore the token */
} else {
+ hubbub_ns ns;
element_type otype;
void *node;
table_clear_stack(treebuilder);
- if (!element_stack_pop(treebuilder, &otype,
- &node)) {
+ if (!element_stack_pop(treebuilder, &ns,
+ &otype, &node)) {
/** \todo errors */
}
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index 6a35632..6f7278c 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -33,6 +33,7 @@ typedef enum
typedef struct element_context
{
+ hubbub_ns ns;
element_type type;
void *node;
} element_context;
@@ -50,6 +51,7 @@ typedef struct formatting_list_entry
typedef struct hubbub_treebuilder_context
{
insertion_mode mode; /**< The current insertion mode */
+ insertion_mode second_mode; /**< The secondary insertion mode */
#define ELEMENT_STACK_CHUNK 128
element_context *element_stack; /**< Stack of open elements */
@@ -134,9 +136,9 @@ bool is_formatting_element(element_type type);
bool is_phrasing_element(element_type type);
bool element_stack_push(hubbub_treebuilder *treebuilder,
- element_type type, void *node);
+ hubbub_ns ns, element_type type, void *node);
bool element_stack_pop(hubbub_treebuilder *treebuilder,
- element_type *type, void **node);
+ hubbub_ns *ns, element_type *type, void **node);
bool element_stack_pop_until(hubbub_treebuilder *treebuilder,
element_type type);
element_type current_node(hubbub_treebuilder *treebuilder);
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index 28621bd..cef73d3 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -601,8 +601,9 @@ void reconstruct_active_formatting_list(hubbub_treebuilder *treebuilder)
return;
}
- if (!element_stack_push(treebuilder,
- entry->details.type, appended)) {
+ if (!element_stack_push(treebuilder,
+ entry->details.ns, entry->details.type,
+ appended)) {
/** \todo handle memory exhaustion */
treebuilder->tree_handler->unref_node(
treebuilder->tree_handler->ctx,
@@ -612,10 +613,10 @@ void reconstruct_active_formatting_list(hubbub_treebuilder *treebuilder)
clone);
}
- if (!formatting_list_replace(treebuilder, entry,
- entry->details.type, clone,
+ if (!formatting_list_replace(treebuilder, entry,
+ entry->details.type, clone,
treebuilder->context.current_node,
- &prev_type, &prev_node,
+ &prev_type, &prev_node,
&prev_stack_index)) {
/** \todo handle errors */
treebuilder->tree_handler->unref_node(
@@ -692,8 +693,9 @@ void insert_element(hubbub_treebuilder *treebuilder, const hubbub_tag *tag)
treebuilder->tree_handler->unref_node(treebuilder->tree_handler->ctx,
appended);
- if (!element_stack_push(treebuilder,
- element_type_from_name(treebuilder, &tag->name),
+ if (!element_stack_push(treebuilder,
+ tag->ns,
+ element_type_from_name(treebuilder, &tag->name),
node)) {
/** \todo errors */
}
@@ -750,13 +752,14 @@ void close_implied_end_tags(hubbub_treebuilder *treebuilder,
while (type == DD || type == DT || type == LI || type == OPTION ||
type == OPTGROUP || type == P || type == RP ||
type == RT) {
+ hubbub_ns ns;
element_type otype;
void *node;
if (except != UNKNOWN && type == except)
break;
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype, &node)) {
/** \todo errors */
}
@@ -953,12 +956,13 @@ bool is_phrasing_element(element_type type)
* Push an element onto the stack of open elements
*
* \param treebuilder The treebuilder instance containing the stack
+ * \param ns The namespace of element being pushed
* \param type The type of element being pushed
* \param node The node to push
* \return True on success, false on memory exhaustion
*/
bool element_stack_push(hubbub_treebuilder *treebuilder,
- element_type type, void *node)
+ hubbub_ns ns, element_type type, void *node)
{
uint32_t slot = treebuilder->context.current_node + 1;
@@ -977,6 +981,7 @@ bool element_stack_push(hubbub_treebuilder *treebuilder,
treebuilder->context.stack_alloc += ELEMENT_STACK_CHUNK;
}
+ treebuilder->context.element_stack[slot].ns = ns;
treebuilder->context.element_stack[slot].type = type;
treebuilder->context.element_stack[slot].node = node;
@@ -998,7 +1003,7 @@ bool element_stack_push(hubbub_treebuilder *treebuilder,
* \return True on success, false on memory exhaustion.
*/
bool element_stack_pop(hubbub_treebuilder *treebuilder,
- element_type *type, void **node)
+ hubbub_ns *ns, element_type *type, void **node)
{
element_context *stack = treebuilder->context.element_stack;
uint32_t slot = treebuilder->context.current_node;
@@ -1031,6 +1036,7 @@ bool element_stack_pop(hubbub_treebuilder *treebuilder,
}
}
+ *ns = stack[slot].ns;
*type = stack[slot].type;
*node = stack[slot].node;
@@ -1051,9 +1057,10 @@ bool element_stack_pop_until(hubbub_treebuilder *treebuilder,
{
element_type otype = UNKNOWN;
void *node;
+ hubbub_ns ns;
while (otype != type) {
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype, &node)) {
/** \todo error -- never happens */
return false;
}