Author: takkaria
Date: Thu Jun 26 13:19:49 2008
New Revision: 4457
URL:
http://source.netsurf-browser.org?rev=4457&view=rev
Log:
Add namespace awareness right through the code, in preparation for handling foreign
content properly.
Modified:
trunk/hubbub/src/treebuilder/after_head.c
trunk/hubbub/src/treebuilder/in_body.c
trunk/hubbub/src/treebuilder/in_caption.c
trunk/hubbub/src/treebuilder/in_cell.c
trunk/hubbub/src/treebuilder/in_column_group.c
trunk/hubbub/src/treebuilder/in_head.c
trunk/hubbub/src/treebuilder/in_head_noscript.c
trunk/hubbub/src/treebuilder/in_row.c
trunk/hubbub/src/treebuilder/in_select.c
trunk/hubbub/src/treebuilder/in_table_body.c
trunk/hubbub/src/treebuilder/internal.h
trunk/hubbub/src/treebuilder/treebuilder.c
Modified: trunk/hubbub/src/treebuilder/after_head.c
URL:
http://source.netsurf-browser.org/trunk/hubbub/src/treebuilder/after_head...
==============================================================================
--- trunk/hubbub/src/treebuilder/after_head.c (original)
+++ trunk/hubbub/src/treebuilder/after_head.c Thu Jun 26 13:19:49 2008
@@ -55,27 +55,28 @@
} 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 */
Modified: trunk/hubbub/src/treebuilder/in_body.c
URL:
http://source.netsurf-browser.org/trunk/hubbub/src/treebuilder/in_body.c?...
==============================================================================
--- trunk/hubbub/src/treebuilder/in_body.c (original)
+++ trunk/hubbub/src/treebuilder/in_body.c Thu Jun 26 13:19:49 2008
@@ -571,10 +571,12 @@
}
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_input_in_body(hubbub_treebuilder *treebuilder,
const hubbub_token *token)
{
+ hubbub_ns ns;
element_type otype;
void *node;
@@ -861,7 +864,7 @@
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 @@
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 @@
/** \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 @@
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 @@
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 @@
}
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 @@
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 @@
close_implied_end_tags(treebuilder, UNKNOWN);
do {
+ hubbub_ns ns;
void *node;
if (!element_stack_pop(treebuilder,
- &otype, &node)) {
+ &ns, &otype, &node)) {
/** \todo errors */
}
Modified: trunk/hubbub/src/treebuilder/in_caption.c
URL:
http://source.netsurf-browser.org/trunk/hubbub/src/treebuilder/in_caption...
==============================================================================
--- trunk/hubbub/src/treebuilder/in_caption.c (original)
+++ trunk/hubbub/src/treebuilder/in_caption.c Thu Jun 26 13:19:49 2008
@@ -74,6 +74,7 @@
}
if (handled || reprocess) {
+ hubbub_ns ns;
element_type otype = UNKNOWN;
void *node;
@@ -85,7 +86,8 @@
while (otype != CAPTION) {
/** \todo parse error */
- if (!element_stack_pop(treebuilder, &otype, &node)) {
+ if (!element_stack_pop(treebuilder, &ns, &otype,
+ &node)) {
/** \todo errors */
}
}
Modified: trunk/hubbub/src/treebuilder/in_cell.c
URL:
http://source.netsurf-browser.org/trunk/hubbub/src/treebuilder/in_cell.c?...
==============================================================================
--- trunk/hubbub/src/treebuilder/in_cell.c (original)
+++ trunk/hubbub/src/treebuilder/in_cell.c Thu Jun 26 13:19:49 2008
@@ -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 @@
/** \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 @@
if (type == TH || TD) {
if (element_in_scope(treebuilder, type, true)) {
+ hubbub_ns ns;
element_type otype = UNKNOWN;
void *node;
@@ -95,7 +98,7 @@
while (otype != type) {
if (!element_stack_pop(treebuilder,
- &otype, &node)) {
+ &ns, &otype, &node)) {
/** \todo errors */
}
}
Modified: trunk/hubbub/src/treebuilder/in_column_group.c
URL:
http://source.netsurf-browser.org/trunk/hubbub/src/treebuilder/in_column_...
==============================================================================
--- trunk/hubbub/src/treebuilder/in_column_group.c (original)
+++ trunk/hubbub/src/treebuilder/in_column_group.c Thu Jun 26 13:19:49 2008
@@ -81,11 +81,12 @@
}
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 */
}
Modified: trunk/hubbub/src/treebuilder/in_head.c
URL:
http://source.netsurf-browser.org/trunk/hubbub/src/treebuilder/in_head.c?...
==============================================================================
--- trunk/hubbub/src/treebuilder/in_head.c (original)
+++ trunk/hubbub/src/treebuilder/in_head.c Thu Jun 26 13:19:49 2008
@@ -164,10 +164,11 @@
}
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 */
}
Modified: trunk/hubbub/src/treebuilder/in_head_noscript.c
URL:
http://source.netsurf-browser.org/trunk/hubbub/src/treebuilder/in_head_no...
==============================================================================
--- trunk/hubbub/src/treebuilder/in_head_noscript.c (original)
+++ trunk/hubbub/src/treebuilder/in_head_noscript.c Thu Jun 26 13:19:49 2008
@@ -81,10 +81,11 @@
}
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 */
}
Modified: trunk/hubbub/src/treebuilder/in_row.c
URL:
http://source.netsurf-browser.org/trunk/hubbub/src/treebuilder/in_row.c?r...
==============================================================================
--- trunk/hubbub/src/treebuilder/in_row.c (original)
+++ trunk/hubbub/src/treebuilder/in_row.c Thu Jun 26 13:19:49 2008
@@ -25,10 +25,11 @@
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 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 */
}
Modified: trunk/hubbub/src/treebuilder/in_select.c
URL:
http://source.netsurf-browser.org/trunk/hubbub/src/treebuilder/in_select....
==============================================================================
--- trunk/hubbub/src/treebuilder/in_select.c (original)
+++ trunk/hubbub/src/treebuilder/in_select.c Thu Jun 26 13:19:49 2008
@@ -26,6 +26,7 @@
{
bool reprocess = false;
+ hubbub_ns ns;
element_type otype;
void *node;
@@ -51,7 +52,7 @@
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 @@
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 @@
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 @@
}
} 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 */
}
Modified: trunk/hubbub/src/treebuilder/in_table_body.c
URL:
http://source.netsurf-browser.org/trunk/hubbub/src/treebuilder/in_table_b...
==============================================================================
--- trunk/hubbub/src/treebuilder/in_table_body.c (original)
+++ trunk/hubbub/src/treebuilder/in_table_body.c Thu Jun 26 13:19:49 2008
@@ -26,10 +26,11 @@
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 @@
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 @@
/* "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 @@
/** \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 */
}
Modified: trunk/hubbub/src/treebuilder/internal.h
URL:
http://source.netsurf-browser.org/trunk/hubbub/src/treebuilder/internal.h...
==============================================================================
--- trunk/hubbub/src/treebuilder/internal.h (original)
+++ trunk/hubbub/src/treebuilder/internal.h Thu Jun 26 13:19:49 2008
@@ -33,6 +33,7 @@
typedef struct element_context
{
+ hubbub_ns ns;
element_type type;
void *node;
} element_context;
@@ -50,6 +51,7 @@
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_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);
Modified: trunk/hubbub/src/treebuilder/treebuilder.c
URL:
http://source.netsurf-browser.org/trunk/hubbub/src/treebuilder/treebuilde...
==============================================================================
--- trunk/hubbub/src/treebuilder/treebuilder.c (original)
+++ trunk/hubbub/src/treebuilder/treebuilder.c Thu Jun 26 13:19:49 2008
@@ -601,8 +601,9 @@
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 @@
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 @@
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 @@
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 @@
* 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 @@
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 @@
* \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 @@
}
}
+ *ns = stack[slot].ns;
*type = stack[slot].type;
*node = stack[slot].node;
@@ -1051,9 +1057,10 @@
{
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;
}