libnsfb: branch master updated. release/0.1.1-3-gae2f608
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libnsfb.git/shortlog/ae2f608a4a64f29be1e98...
...commit http://git.netsurf-browser.org/libnsfb.git/commit/ae2f608a4a64f29be1e98dc...
...tree http://git.netsurf-browser.org/libnsfb.git/tree/ae2f608a4a64f29be1e98dc0c...
The branch, master has been updated
via ae2f608a4a64f29be1e98dc0c66288770b64cadc (commit)
from 88b4af2eef0f89b46980cc1bbba77955f445d6b9 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libnsfb.git/commit/?id=ae2f608a4a64f29be1e...
commit ae2f608a4a64f29be1e98dc0c66288770b64cadc
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Fix rendering of 1bpp glyphs when glyph data is greater than one byte wide
diff --git a/src/plot/common.c b/src/plot/common.c
index 063f68d..b051131 100644
--- a/src/plot/common.c
+++ b/src/plot/common.c
@@ -149,7 +149,6 @@ glyph1(nsfb_t *nsfb,
int width;
int height;
const size_t line_len = PLOT_LINELEN(nsfb->linelen);
- const int first_col = 1 << (loc->x1 - loc->x0 - 1);
const uint8_t *row;
if (!nsfb_plot_clip_ctx(nsfb, loc))
@@ -172,7 +171,7 @@ glyph1(nsfb_t *nsfb,
for (; pvideo < pvideo_limit; pvideo += line_len) {
for (xloop = xoff; xloop < width; xloop++) {
- if ((*row & (first_col >> xloop)) != 0) {
+ if (row[xloop / 8] & ((1<<7) >> (xloop % 8))) {
*(pvideo + xloop) = fgcol;
}
}
-----------------------------------------------------------------------
Summary of changes:
src/plot/common.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/src/plot/common.c b/src/plot/common.c
index 063f68d..b051131 100644
--- a/src/plot/common.c
+++ b/src/plot/common.c
@@ -149,7 +149,6 @@ glyph1(nsfb_t *nsfb,
int width;
int height;
const size_t line_len = PLOT_LINELEN(nsfb->linelen);
- const int first_col = 1 << (loc->x1 - loc->x0 - 1);
const uint8_t *row;
if (!nsfb_plot_clip_ctx(nsfb, loc))
@@ -172,7 +171,7 @@ glyph1(nsfb_t *nsfb,
for (; pvideo < pvideo_limit; pvideo += line_len) {
for (xloop = xoff; xloop < width; xloop++) {
- if ((*row & (first_col >> xloop)) != 0) {
+ if (row[xloop / 8] & ((1<<7) >> (xloop % 8))) {
*(pvideo + xloop) = fgcol;
}
}
--
NetSurf Framebuffer library
9 years, 1 month
libdom: branch rupindersingh/libdom_recovered updated. release/0.1.0-66-g0411dc6
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libdom.git/shortlog/0411dc6ff54fc981387a94...
...commit http://git.netsurf-browser.org/libdom.git/commit/0411dc6ff54fc981387a946e...
...tree http://git.netsurf-browser.org/libdom.git/tree/0411dc6ff54fc981387a946ef5...
The branch, rupindersingh/libdom_recovered has been updated
discards 820505e3971db569db39f94f811cb832e82bd5d5 (commit)
via 0411dc6ff54fc981387a946ef523466b179177f6 (commit)
This update added new revisions after undoing existing revisions. That is
to say, the old revision is not a strict subset of the new revision. This
situation occurs when you --force push a change and generate a repository
containing something like this:
* -- * -- B -- O -- O -- O (820505e3971db569db39f94f811cb832e82bd5d5)
\
N -- N -- N (0411dc6ff54fc981387a946ef523466b179177f6)
When this happens we assume that you've already had alert emails for all
of the O revisions, and so we here report only the revisions in the N
branch from the common base, B.
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libdom.git/commit/?id=0411dc6ff54fc981387a...
commit 0411dc6ff54fc981387a946ef523466b179177f6
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
ref counting on insert_cell & get_row_index
diff --git a/src/html/html_tablerow_element.c b/src/html/html_tablerow_element.c
index 174bce1..0e4c3a8 100644
--- a/src/html/html_tablerow_element.c
+++ b/src/html/html_tablerow_element.c
@@ -176,10 +176,15 @@ SIMPLE_GET_SET(v_align);
dom_exception dom_html_table_row_element_get_row_index(
dom_html_table_row_element *table_row, int32_t *row_index)
{
- dom_node_internal *n = ((dom_node_internal *)table_row)->parent;
+ dom_exception exp;
+ dom_node_internal *n =
+ ((dom_node_internal *)table_row)->parent;
dom_node_internal *parent = n;
- dom_html_document *doc = (dom_html_document *) ((dom_node_internal *) table_row)->owner;
+ dom_html_document *doc =
+ (dom_html_document *) ((dom_node_internal *) table_row)->owner;
+
uint32_t count = 0;
+
for(n = n->first_child; n != (dom_node_internal *)table_row;
n = n->next) {
if(n->type == DOM_ELEMENT_NODE &&
@@ -199,21 +204,42 @@ dom_exception dom_html_table_row_element_get_row_index(
n = parent->parent;
dom_html_table_section_element *t_head;
dom_html_collection *rows;
- dom_html_table_element_get_t_head(
+ exp = dom_html_table_element_get_t_head(
(dom_html_table_element *)(parent->parent),
&t_head);
- dom_html_table_section_element_get_rows(t_head,
+ if (exp != DOM_NO_ERR) {
+ return exp;
+ }
+
+ exp = dom_html_table_section_element_get_rows(t_head,
&rows);
+ if (exp != DOM_NO_ERR) {
+ dom_node_unref(t_head);
+ return exp;
+ }
+
dom_html_collection_get_length(rows,
&len);
+ dom_html_collection_unref(rows);
+
count += len;
- for(n = n->first_child;n != parent && n != NULL;
+
+ for (n = n->first_child;n != parent && n != NULL;
n = n->next) {
- if(dom_string_caseless_isequal(n->name, doc->memoised[hds_TBODY])) {
- dom_html_table_section_element_get_rows(
+ if (dom_string_caseless_isequal(n->name, doc->memoised[hds_TBODY])) {
+ exp = dom_html_table_section_element_get_rows(
(dom_html_table_section_element *)n,
&rows);
- dom_html_collection_get_length(rows, &len);
+ if (exp != DOM_NO_ERR) {
+ return exp;
+ }
+
+ exp = dom_html_collection_get_length(rows, &len);
+ dom_html_collection_unref(rows);
+ if (exp != DOM_NO_ERR) {
+ return exp;
+ }
+
count += len;
}
}
@@ -307,26 +333,37 @@ dom_exception dom_html_table_row_element_insert_cell(
return exp;
exp = dom_html_table_row_element_get_cells(element, &cells);
- if(exp != DOM_NO_ERR)
+ if(exp != DOM_NO_ERR) {
+ dom_node_unref(*cell);
return exp;
+ }
exp = dom_html_collection_get_length(cells, &len);
- if(exp != DOM_NO_ERR)
+ if(exp != DOM_NO_ERR) {
+ dom_node_unref(*cell);
return exp;
+ }
if(index < -1 || index > (int32_t)len) {
/* Check for index validity */
+ dom_html_collection_unref (cells);
return DOM_INDEX_SIZE_ERR;
} else if(index == -1 || index == (int32_t)len) {
- return _dom_node_append_child((dom_node_internal *)element,
- (dom_node_internal *)*cell,
- (dom_node_internal **)cell);
+ dom_node *new_cell;
+ dom_html_collection_unref(cells);
+
+ return dom_node_append_child(element,
+ *cell,
+ &new_cell);
} else {
+ dom_node *new_cell;
dom_html_collection_item(cells,
index, &node);
- return _dom_node_insert_before((dom_node_internal *)element,
- (dom_node_internal *)*cell, (dom_node_internal *)node,
- (dom_node_internal **)cell);
+ dom_html_collection_unref(cells);
+
+ return dom_node_insert_before(element,
+ *cell, node,
+ &new_cell);
}
}
-----------------------------------------------------------------------
Summary of changes:
src/html/html_tablerow_element.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/html/html_tablerow_element.c b/src/html/html_tablerow_element.c
index 72a6697..0e4c3a8 100644
--- a/src/html/html_tablerow_element.c
+++ b/src/html/html_tablerow_element.c
@@ -346,11 +346,11 @@ dom_exception dom_html_table_row_element_insert_cell(
if(index < -1 || index > (int32_t)len) {
/* Check for index validity */
- dom_collection_unref (cells);
+ dom_html_collection_unref (cells);
return DOM_INDEX_SIZE_ERR;
} else if(index == -1 || index == (int32_t)len) {
dom_node *new_cell;
- dom_collection_unref(cells);
+ dom_html_collection_unref(cells);
return dom_node_append_child(element,
*cell,
@@ -359,7 +359,7 @@ dom_exception dom_html_table_row_element_insert_cell(
dom_node *new_cell;
dom_html_collection_item(cells,
index, &node);
- dom_collection_unref(cells);
+ dom_html_collection_unref(cells);
return dom_node_insert_before(element,
*cell, node,
--
Document Object Model library
9 years, 1 month
libdom: branch rupindersingh/libdom_recovered updated. release/0.1.0-66-g820505e
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libdom.git/shortlog/820505e3971db569db39f9...
...commit http://git.netsurf-browser.org/libdom.git/commit/820505e3971db569db39f94f...
...tree http://git.netsurf-browser.org/libdom.git/tree/820505e3971db569db39f94f81...
The branch, rupindersingh/libdom_recovered has been updated
via 820505e3971db569db39f94f811cb832e82bd5d5 (commit)
from 12fbcd3d88177c35c5435ae400c17025c1ca9181 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libdom.git/commit/?id=820505e3971db569db39...
commit 820505e3971db569db39f94f811cb832e82bd5d5
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
ref counting on insert_cell & get_row_index
diff --git a/src/html/html_tablerow_element.c b/src/html/html_tablerow_element.c
index 174bce1..72a6697 100644
--- a/src/html/html_tablerow_element.c
+++ b/src/html/html_tablerow_element.c
@@ -176,10 +176,15 @@ SIMPLE_GET_SET(v_align);
dom_exception dom_html_table_row_element_get_row_index(
dom_html_table_row_element *table_row, int32_t *row_index)
{
- dom_node_internal *n = ((dom_node_internal *)table_row)->parent;
+ dom_exception exp;
+ dom_node_internal *n =
+ ((dom_node_internal *)table_row)->parent;
dom_node_internal *parent = n;
- dom_html_document *doc = (dom_html_document *) ((dom_node_internal *) table_row)->owner;
+ dom_html_document *doc =
+ (dom_html_document *) ((dom_node_internal *) table_row)->owner;
+
uint32_t count = 0;
+
for(n = n->first_child; n != (dom_node_internal *)table_row;
n = n->next) {
if(n->type == DOM_ELEMENT_NODE &&
@@ -199,21 +204,42 @@ dom_exception dom_html_table_row_element_get_row_index(
n = parent->parent;
dom_html_table_section_element *t_head;
dom_html_collection *rows;
- dom_html_table_element_get_t_head(
+ exp = dom_html_table_element_get_t_head(
(dom_html_table_element *)(parent->parent),
&t_head);
- dom_html_table_section_element_get_rows(t_head,
+ if (exp != DOM_NO_ERR) {
+ return exp;
+ }
+
+ exp = dom_html_table_section_element_get_rows(t_head,
&rows);
+ if (exp != DOM_NO_ERR) {
+ dom_node_unref(t_head);
+ return exp;
+ }
+
dom_html_collection_get_length(rows,
&len);
+ dom_html_collection_unref(rows);
+
count += len;
- for(n = n->first_child;n != parent && n != NULL;
+
+ for (n = n->first_child;n != parent && n != NULL;
n = n->next) {
- if(dom_string_caseless_isequal(n->name, doc->memoised[hds_TBODY])) {
- dom_html_table_section_element_get_rows(
+ if (dom_string_caseless_isequal(n->name, doc->memoised[hds_TBODY])) {
+ exp = dom_html_table_section_element_get_rows(
(dom_html_table_section_element *)n,
&rows);
- dom_html_collection_get_length(rows, &len);
+ if (exp != DOM_NO_ERR) {
+ return exp;
+ }
+
+ exp = dom_html_collection_get_length(rows, &len);
+ dom_html_collection_unref(rows);
+ if (exp != DOM_NO_ERR) {
+ return exp;
+ }
+
count += len;
}
}
@@ -307,26 +333,37 @@ dom_exception dom_html_table_row_element_insert_cell(
return exp;
exp = dom_html_table_row_element_get_cells(element, &cells);
- if(exp != DOM_NO_ERR)
+ if(exp != DOM_NO_ERR) {
+ dom_node_unref(*cell);
return exp;
+ }
exp = dom_html_collection_get_length(cells, &len);
- if(exp != DOM_NO_ERR)
+ if(exp != DOM_NO_ERR) {
+ dom_node_unref(*cell);
return exp;
+ }
if(index < -1 || index > (int32_t)len) {
/* Check for index validity */
+ dom_collection_unref (cells);
return DOM_INDEX_SIZE_ERR;
} else if(index == -1 || index == (int32_t)len) {
- return _dom_node_append_child((dom_node_internal *)element,
- (dom_node_internal *)*cell,
- (dom_node_internal **)cell);
+ dom_node *new_cell;
+ dom_collection_unref(cells);
+
+ return dom_node_append_child(element,
+ *cell,
+ &new_cell);
} else {
+ dom_node *new_cell;
dom_html_collection_item(cells,
index, &node);
- return _dom_node_insert_before((dom_node_internal *)element,
- (dom_node_internal *)*cell, (dom_node_internal *)node,
- (dom_node_internal **)cell);
+ dom_collection_unref(cells);
+
+ return dom_node_insert_before(element,
+ *cell, node,
+ &new_cell);
}
}
-----------------------------------------------------------------------
Summary of changes:
src/html/html_tablerow_element.c | 69 +++++++++++++++++++++++++++++---------
1 files changed, 53 insertions(+), 16 deletions(-)
diff --git a/src/html/html_tablerow_element.c b/src/html/html_tablerow_element.c
index 174bce1..72a6697 100644
--- a/src/html/html_tablerow_element.c
+++ b/src/html/html_tablerow_element.c
@@ -176,10 +176,15 @@ SIMPLE_GET_SET(v_align);
dom_exception dom_html_table_row_element_get_row_index(
dom_html_table_row_element *table_row, int32_t *row_index)
{
- dom_node_internal *n = ((dom_node_internal *)table_row)->parent;
+ dom_exception exp;
+ dom_node_internal *n =
+ ((dom_node_internal *)table_row)->parent;
dom_node_internal *parent = n;
- dom_html_document *doc = (dom_html_document *) ((dom_node_internal *) table_row)->owner;
+ dom_html_document *doc =
+ (dom_html_document *) ((dom_node_internal *) table_row)->owner;
+
uint32_t count = 0;
+
for(n = n->first_child; n != (dom_node_internal *)table_row;
n = n->next) {
if(n->type == DOM_ELEMENT_NODE &&
@@ -199,21 +204,42 @@ dom_exception dom_html_table_row_element_get_row_index(
n = parent->parent;
dom_html_table_section_element *t_head;
dom_html_collection *rows;
- dom_html_table_element_get_t_head(
+ exp = dom_html_table_element_get_t_head(
(dom_html_table_element *)(parent->parent),
&t_head);
- dom_html_table_section_element_get_rows(t_head,
+ if (exp != DOM_NO_ERR) {
+ return exp;
+ }
+
+ exp = dom_html_table_section_element_get_rows(t_head,
&rows);
+ if (exp != DOM_NO_ERR) {
+ dom_node_unref(t_head);
+ return exp;
+ }
+
dom_html_collection_get_length(rows,
&len);
+ dom_html_collection_unref(rows);
+
count += len;
- for(n = n->first_child;n != parent && n != NULL;
+
+ for (n = n->first_child;n != parent && n != NULL;
n = n->next) {
- if(dom_string_caseless_isequal(n->name, doc->memoised[hds_TBODY])) {
- dom_html_table_section_element_get_rows(
+ if (dom_string_caseless_isequal(n->name, doc->memoised[hds_TBODY])) {
+ exp = dom_html_table_section_element_get_rows(
(dom_html_table_section_element *)n,
&rows);
- dom_html_collection_get_length(rows, &len);
+ if (exp != DOM_NO_ERR) {
+ return exp;
+ }
+
+ exp = dom_html_collection_get_length(rows, &len);
+ dom_html_collection_unref(rows);
+ if (exp != DOM_NO_ERR) {
+ return exp;
+ }
+
count += len;
}
}
@@ -307,26 +333,37 @@ dom_exception dom_html_table_row_element_insert_cell(
return exp;
exp = dom_html_table_row_element_get_cells(element, &cells);
- if(exp != DOM_NO_ERR)
+ if(exp != DOM_NO_ERR) {
+ dom_node_unref(*cell);
return exp;
+ }
exp = dom_html_collection_get_length(cells, &len);
- if(exp != DOM_NO_ERR)
+ if(exp != DOM_NO_ERR) {
+ dom_node_unref(*cell);
return exp;
+ }
if(index < -1 || index > (int32_t)len) {
/* Check for index validity */
+ dom_collection_unref (cells);
return DOM_INDEX_SIZE_ERR;
} else if(index == -1 || index == (int32_t)len) {
- return _dom_node_append_child((dom_node_internal *)element,
- (dom_node_internal *)*cell,
- (dom_node_internal **)cell);
+ dom_node *new_cell;
+ dom_collection_unref(cells);
+
+ return dom_node_append_child(element,
+ *cell,
+ &new_cell);
} else {
+ dom_node *new_cell;
dom_html_collection_item(cells,
index, &node);
- return _dom_node_insert_before((dom_node_internal *)element,
- (dom_node_internal *)*cell, (dom_node_internal *)node,
- (dom_node_internal **)cell);
+ dom_collection_unref(cells);
+
+ return dom_node_insert_before(element,
+ *cell, node,
+ &new_cell);
}
}
--
Document Object Model library
9 years, 1 month
libdom: branch rupindersingh/libdom_recovered updated. release/0.1.0-65-g12fbcd3
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libdom.git/shortlog/12fbcd3d88177c35c5435a...
...commit http://git.netsurf-browser.org/libdom.git/commit/12fbcd3d88177c35c5435ae4...
...tree http://git.netsurf-browser.org/libdom.git/tree/12fbcd3d88177c35c5435ae400...
The branch, rupindersingh/libdom_recovered has been updated
via 12fbcd3d88177c35c5435ae400c17025c1ca9181 (commit)
from 1eaa38650c5a828ff47cc145ac843bde3840ec1c (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libdom.git/commit/?id=12fbcd3d88177c35c543...
commit 12fbcd3d88177c35c5435ae400c17025c1ca9181
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
remove precaching cell index
diff --git a/src/html/html_tablecell_element.c b/src/html/html_tablecell_element.c
index cc596c1..83ebb0c 100644
--- a/src/html/html_tablecell_element.c
+++ b/src/html/html_tablecell_element.c
@@ -61,7 +61,6 @@ dom_exception _dom_html_table_cell_element_initialise(struct dom_html_document *
dom_string *tag_name, dom_string *namespace, dom_string *prefix,
struct dom_html_table_cell_element *ele)
{
- ele->id = -1;
return _dom_html_element_initialise(doc, &ele->base,
tag_name,
namespace, prefix);
@@ -181,49 +180,45 @@ SIMPLE_GET_SET(width);
dom_exception dom_html_table_cell_element_get_cell_index(
dom_html_table_cell_element *table_cell, int32_t *cell_index)
{
- if(table_cell->id == -1) {
- dom_node_internal *n = ((dom_node_internal *)table_cell)->parent;
- dom_html_document *doc = (dom_html_document *)(n->owner);
- int32_t cnt = 0;
- while(n != NULL) {
- if(dom_string_caseless_isequal(doc->memoised[hds_TR],n->name)) {
- break;
- }
- n = n->parent;
+ dom_node_internal *n = ((dom_node_internal *)table_cell)->parent;
+ dom_html_document *doc = (dom_html_document *)(n->owner);
+ int32_t cnt = 0;
+ while(n != NULL) {
+ if(dom_string_caseless_isequal(doc->memoised[hds_TR],n->name)) {
+ break;
+ }
+ n = n->parent;
+ }
+ dom_node_internal *root = n;
+ while(n != NULL) {
+ if(n == (dom_node_internal *)table_cell) {
+ break;
+ } else if((n->type == DOM_ELEMENT_NODE) &&
+ (dom_string_caseless_isequal(doc->memoised[hds_TD],n->name) ||
+ dom_string_caseless_isequal(doc->memoised[hds_TH],n->name))) {
+ cnt += 1;
}
- dom_node_internal *root = n;
- while(n != NULL) {
- if(n == (dom_node_internal *)table_cell) {
- break;
- } else if((n->type == DOM_ELEMENT_NODE) &&
- (dom_string_caseless_isequal(doc->memoised[hds_TD],n->name) ||
- dom_string_caseless_isequal(doc->memoised[hds_TH],n->name))) {
- ((dom_html_table_cell_element *)n)->id = cnt;
- cnt += 1;
+ if(n->first_child != NULL) {
+ n = n->first_child;
+ } else if(n->next != NULL) {
+ n = n->next;
+ } else {
+ /* No children and siblings */
+ struct dom_node_internal *parent = n->parent;
+ while (n == parent->last_child &&
+ n != root) {
+ n = parent;
+ parent = parent->parent;
}
- if(n->first_child != NULL) {
- n = n->first_child;
- } else if(n->next != NULL) {
- n = n->next;
- } else {
- /* No children and siblings */
- struct dom_node_internal *parent = n->parent;
- while (n == parent->last_child &&
- n != root) {
- n = parent;
- parent = parent->parent;
- }
- if(n == root) {
- n = NULL;
- } else {
- n = n->next;
- }
+ if(n == root) {
+ n = NULL;
+ } else {
+ n = n->next;
}
}
- table_cell->id = cnt;
}
- *cell_index = table_cell->id;
+ *cell_index = cnt;
return DOM_NO_ERR;
}
diff --git a/src/html/html_tablecell_element.h b/src/html/html_tablecell_element.h
index 801c3c0..5a48439 100644
--- a/src/html/html_tablecell_element.h
+++ b/src/html/html_tablecell_element.h
@@ -16,8 +16,6 @@
struct dom_html_table_cell_element {
struct dom_html_element base;
/**< The base class */
- int32_t id;
- /**< The Index Associated with the cell*/
};
/* Create a dom_html_table_cell_element object */
-----------------------------------------------------------------------
Summary of changes:
src/html/html_tablecell_element.c | 71 +++++++++++++++++--------------------
src/html/html_tablecell_element.h | 2 -
2 files changed, 33 insertions(+), 40 deletions(-)
diff --git a/src/html/html_tablecell_element.c b/src/html/html_tablecell_element.c
index cc596c1..83ebb0c 100644
--- a/src/html/html_tablecell_element.c
+++ b/src/html/html_tablecell_element.c
@@ -61,7 +61,6 @@ dom_exception _dom_html_table_cell_element_initialise(struct dom_html_document *
dom_string *tag_name, dom_string *namespace, dom_string *prefix,
struct dom_html_table_cell_element *ele)
{
- ele->id = -1;
return _dom_html_element_initialise(doc, &ele->base,
tag_name,
namespace, prefix);
@@ -181,49 +180,45 @@ SIMPLE_GET_SET(width);
dom_exception dom_html_table_cell_element_get_cell_index(
dom_html_table_cell_element *table_cell, int32_t *cell_index)
{
- if(table_cell->id == -1) {
- dom_node_internal *n = ((dom_node_internal *)table_cell)->parent;
- dom_html_document *doc = (dom_html_document *)(n->owner);
- int32_t cnt = 0;
- while(n != NULL) {
- if(dom_string_caseless_isequal(doc->memoised[hds_TR],n->name)) {
- break;
- }
- n = n->parent;
+ dom_node_internal *n = ((dom_node_internal *)table_cell)->parent;
+ dom_html_document *doc = (dom_html_document *)(n->owner);
+ int32_t cnt = 0;
+ while(n != NULL) {
+ if(dom_string_caseless_isequal(doc->memoised[hds_TR],n->name)) {
+ break;
+ }
+ n = n->parent;
+ }
+ dom_node_internal *root = n;
+ while(n != NULL) {
+ if(n == (dom_node_internal *)table_cell) {
+ break;
+ } else if((n->type == DOM_ELEMENT_NODE) &&
+ (dom_string_caseless_isequal(doc->memoised[hds_TD],n->name) ||
+ dom_string_caseless_isequal(doc->memoised[hds_TH],n->name))) {
+ cnt += 1;
}
- dom_node_internal *root = n;
- while(n != NULL) {
- if(n == (dom_node_internal *)table_cell) {
- break;
- } else if((n->type == DOM_ELEMENT_NODE) &&
- (dom_string_caseless_isequal(doc->memoised[hds_TD],n->name) ||
- dom_string_caseless_isequal(doc->memoised[hds_TH],n->name))) {
- ((dom_html_table_cell_element *)n)->id = cnt;
- cnt += 1;
+ if(n->first_child != NULL) {
+ n = n->first_child;
+ } else if(n->next != NULL) {
+ n = n->next;
+ } else {
+ /* No children and siblings */
+ struct dom_node_internal *parent = n->parent;
+ while (n == parent->last_child &&
+ n != root) {
+ n = parent;
+ parent = parent->parent;
}
- if(n->first_child != NULL) {
- n = n->first_child;
- } else if(n->next != NULL) {
- n = n->next;
- } else {
- /* No children and siblings */
- struct dom_node_internal *parent = n->parent;
- while (n == parent->last_child &&
- n != root) {
- n = parent;
- parent = parent->parent;
- }
- if(n == root) {
- n = NULL;
- } else {
- n = n->next;
- }
+ if(n == root) {
+ n = NULL;
+ } else {
+ n = n->next;
}
}
- table_cell->id = cnt;
}
- *cell_index = table_cell->id;
+ *cell_index = cnt;
return DOM_NO_ERR;
}
diff --git a/src/html/html_tablecell_element.h b/src/html/html_tablecell_element.h
index 801c3c0..5a48439 100644
--- a/src/html/html_tablecell_element.h
+++ b/src/html/html_tablecell_element.h
@@ -16,8 +16,6 @@
struct dom_html_table_cell_element {
struct dom_html_element base;
/**< The base class */
- int32_t id;
- /**< The Index Associated with the cell*/
};
/* Create a dom_html_table_cell_element object */
--
Document Object Model library
9 years, 1 month
netsurf: branch master updated. release/3.1-362-g43fea75
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/43fea75b7290cdcbfafa8...
...commit http://git.netsurf-browser.org/netsurf.git/commit/43fea75b7290cdcbfafa8e1...
...tree http://git.netsurf-browser.org/netsurf.git/tree/43fea75b7290cdcbfafa8e159...
The branch, master has been updated
via 43fea75b7290cdcbfafa8e159dc3832581352755 (commit)
from 116149c61c3d14da579c9e9be14f48f41ebd4f37 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=43fea75b7290cdcbfaf...
commit 43fea75b7290cdcbfafa8e159dc3832581352755
Author: François Revol <revol(a)free.fr>
Commit: François Revol <revol(a)free.fr>
beos: Disable non-working menu entries
So at lest people won't expect too much.
diff --git a/beos/scaffolding.cpp b/beos/scaffolding.cpp
index 0f87420..45815fa 100644
--- a/beos/scaffolding.cpp
+++ b/beos/scaffolding.cpp
@@ -1496,7 +1496,7 @@ void nsbeos_attach_toplevel_view(nsbeos_scaffolding *g, BView *view)
}
-static BMenuItem *make_menu_item(const char *name, BMessage *message)
+static BMenuItem *make_menu_item(const char *name, BMessage *message, bool enabled=false)
{
BMenuItem *item;
BString label(messages_get(name));
@@ -1546,6 +1546,8 @@ static BMenuItem *make_menu_item(const char *name, BMessage *message)
item = new BMenuItem(label.String(), message, key, mods);
+ item->SetEnabled(enabled);
+
return item;
}
@@ -1730,7 +1732,7 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
menu->AddItem(item);
message = new BMessage(APPLICATION_QUIT);
- item = make_menu_item("Quit", message);
+ item = make_menu_item("Quit", message, true);
menu->AddItem(item);
// Page menu
@@ -1778,11 +1780,11 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
menu->AddItem(item);
message = new BMessage(BROWSER_NEW_WINDOW);
- item = make_menu_item("NewWindow", message);
+ item = make_menu_item("NewWindow", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_VIEW_SOURCE);
- item = make_menu_item("ViewSrc", message);
+ item = make_menu_item("ViewSrc", message, true);
menu->AddItem(item);
// Object menu
@@ -1809,15 +1811,15 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
g->menu_bar->AddItem(menu);
message = new BMessage(BROWSER_NAVIGATE_HOME);
- item = make_menu_item("Home", message);
+ item = make_menu_item("Home", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_BACK);
- item = make_menu_item("Back", message);
+ item = make_menu_item("Back", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_FORWARD);
- item = make_menu_item("Forward", message);
+ item = make_menu_item("Forward", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_UP);
@@ -1825,11 +1827,11 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_RELOAD);
- item = make_menu_item("Reload", message);
+ item = make_menu_item("Reload", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_STOP);
- item = make_menu_item("Stop", message);
+ item = make_menu_item("Stop", message, true);
menu->AddItem(item);
// View menu
-----------------------------------------------------------------------
Summary of changes:
beos/scaffolding.cpp | 20 +++++++++++---------
1 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/beos/scaffolding.cpp b/beos/scaffolding.cpp
index 0f87420..45815fa 100644
--- a/beos/scaffolding.cpp
+++ b/beos/scaffolding.cpp
@@ -1496,7 +1496,7 @@ void nsbeos_attach_toplevel_view(nsbeos_scaffolding *g, BView *view)
}
-static BMenuItem *make_menu_item(const char *name, BMessage *message)
+static BMenuItem *make_menu_item(const char *name, BMessage *message, bool enabled=false)
{
BMenuItem *item;
BString label(messages_get(name));
@@ -1546,6 +1546,8 @@ static BMenuItem *make_menu_item(const char *name, BMessage *message)
item = new BMenuItem(label.String(), message, key, mods);
+ item->SetEnabled(enabled);
+
return item;
}
@@ -1730,7 +1732,7 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
menu->AddItem(item);
message = new BMessage(APPLICATION_QUIT);
- item = make_menu_item("Quit", message);
+ item = make_menu_item("Quit", message, true);
menu->AddItem(item);
// Page menu
@@ -1778,11 +1780,11 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
menu->AddItem(item);
message = new BMessage(BROWSER_NEW_WINDOW);
- item = make_menu_item("NewWindow", message);
+ item = make_menu_item("NewWindow", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_VIEW_SOURCE);
- item = make_menu_item("ViewSrc", message);
+ item = make_menu_item("ViewSrc", message, true);
menu->AddItem(item);
// Object menu
@@ -1809,15 +1811,15 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
g->menu_bar->AddItem(menu);
message = new BMessage(BROWSER_NAVIGATE_HOME);
- item = make_menu_item("Home", message);
+ item = make_menu_item("Home", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_BACK);
- item = make_menu_item("Back", message);
+ item = make_menu_item("Back", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_FORWARD);
- item = make_menu_item("Forward", message);
+ item = make_menu_item("Forward", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_UP);
@@ -1825,11 +1827,11 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel)
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_RELOAD);
- item = make_menu_item("Reload", message);
+ item = make_menu_item("Reload", message, true);
menu->AddItem(item);
message = new BMessage(BROWSER_NAVIGATE_STOP);
- item = make_menu_item("Stop", message);
+ item = make_menu_item("Stop", message, true);
menu->AddItem(item);
// View menu
--
NetSurf Browser
9 years, 1 month
libdom: branch master updated. release/0.1.0-67-g57ea08b
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libdom.git/shortlog/57ea08b15ad6262ca9ba17...
...commit http://git.netsurf-browser.org/libdom.git/commit/57ea08b15ad6262ca9ba17a8...
...tree http://git.netsurf-browser.org/libdom.git/tree/57ea08b15ad6262ca9ba17a83a...
The branch, master has been updated
via 57ea08b15ad6262ca9ba17a83a41c43111918617 (commit)
via 1eaa38650c5a828ff47cc145ac843bde3840ec1c (commit)
via fd73a1bac9d352c77c2e8412d076f16ae06a795d (commit)
via 98ad579a47319265989eb419f66e782a8a7ae4a6 (commit)
from 576557609560a6577b9a47fd0fd44c4bcda8b5b8 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libdom.git/commit/?id=57ea08b15ad6262ca9ba...
commit 57ea08b15ad6262ca9ba17a83a41c43111918617
Merge: 5765576 1eaa386
Author: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Commit: Daniel Silverstone <dsilvers(a)digital-scurf.org>
Merge remote-tracking branch 'origin/rupindersingh/libdom_recovered'
-----------------------------------------------------------------------
Summary of changes:
src/html/html_frame_element.c | 7 ++-
src/html/html_iframe_element.c | 7 ++-
src/html/html_style_element.c | 42 +-------------------
src/html/html_style_element.h | 2 -
src/html/html_tablesection_element.c | 32 +++++++++++----
...eElement09.xml => HTMLFrameElement09.xml.kfail} | 0
...Element11.xml => HTMLIFrameElement11.xml.kfail} | 0
7 files changed, 35 insertions(+), 55 deletions(-)
rename test/testcases/tests/level2/html/{HTMLFrameElement09.xml => HTMLFrameElement09.xml.kfail} (100%)
rename test/testcases/tests/level2/html/{HTMLIFrameElement11.xml => HTMLIFrameElement11.xml.kfail} (100%)
diff --git a/src/html/html_frame_element.c b/src/html/html_frame_element.c
index 16534b5..a03b32d 100644
--- a/src/html/html_frame_element.c
+++ b/src/html/html_frame_element.c
@@ -281,7 +281,10 @@ dom_exception dom_html_frame_element_get_content_document(
dom_html_frame_element *ele,
dom_document **content_document)
{
- *content_document = dom_node_get_owner(ele);
- return DOM_NO_ERR;
+ /* We don't support creating documents
+ from within here */
+ UNUSED(ele);
+ UNUSED(content_document);
+ return DOM_NOT_SUPPORTED_ERR;
}
diff --git a/src/html/html_iframe_element.c b/src/html/html_iframe_element.c
index 6f15b3e..0972d56 100644
--- a/src/html/html_iframe_element.c
+++ b/src/html/html_iframe_element.c
@@ -263,7 +263,10 @@ dom_exception dom_html_iframe_element_get_content_document(
dom_html_iframe_element *ele,
dom_document **content_document)
{
- *content_document = dom_node_get_owner(ele);
- return DOM_NO_ERR;
+ /* We don't support creating documents
+ from within here */
+ UNUSED(ele);
+ UNUSED(content_document);
+ return DOM_NOT_SUPPORTED_ERR;
}
diff --git a/src/html/html_style_element.c b/src/html/html_style_element.c
index 681f0b8..c97955e 100644
--- a/src/html/html_style_element.c
+++ b/src/html/html_style_element.c
@@ -55,7 +55,6 @@ dom_exception _dom_html_style_element_initialise(struct dom_html_document *doc,
struct dom_html_style_element *ele)
{
dom_string *name = NULL;
- dom_string *media_default = NULL;
dom_exception err;
err = dom_string_create((const uint8_t *) "STYLE", SLEN("STYLE"),
@@ -63,12 +62,6 @@ dom_exception _dom_html_style_element_initialise(struct dom_html_document *doc,
if (err != DOM_NO_ERR)
return err;
- err = dom_string_create((const uint8_t *) "screen", SLEN("screen"),
- &media_default);
- if (err != DOM_NO_ERR)
- return err;
-
- ele->media = media_default;
err = _dom_html_element_initialise(doc, &ele->base, name, NULL, NULL);
dom_string_unref(name);
@@ -168,7 +161,7 @@ dom_exception dom_html_style_element_set_##attr( \
#define SIMPLE_GET_SET(attr) SIMPLE_GET(attr) SIMPLE_SET(attr)
SIMPLE_GET_SET(type);
-SIMPLE_SET(media);
+SIMPLE_GET_SET(media);
/**
* Get the disabled property
@@ -198,36 +191,3 @@ dom_exception dom_html_style_element_set_disabled(dom_html_style_element *ele,
SLEN("disabled"), disabled);
}
-/**
- * Get the media property
- *
- * \param ele The dom_html_style_element object
- * \param media The returned status
- * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
- */
-dom_exception dom_html_style_element_get_media(dom_html_style_element *ele,
- dom_string **media)
-{
- dom_html_document *doc;
- bool has_value = false;
- dom_exception err;
-
- doc = (dom_html_document *) ((dom_node_internal *) ele)->owner;
-
- err = dom_element_has_attribute(ele,
- doc->memoised[hds_media], &has_value);
- if(err !=DOM_NO_ERR)
- return err;
-
- if(has_value) {
- return dom_element_get_attribute(ele,
- doc->memoised[hds_media], media);
- }
-
- *media = ele->media;
- if (*media != NULL)
- dom_string_ref(*media);
- return DOM_NO_ERR;
-
-}
-
diff --git a/src/html/html_style_element.h b/src/html/html_style_element.h
index 285da94..e7a47e5 100644
--- a/src/html/html_style_element.h
+++ b/src/html/html_style_element.h
@@ -15,8 +15,6 @@
struct dom_html_style_element {
struct dom_html_element base;
/**< The base class */
- dom_string *media;
- /**< The default string value for the media attribute*/
};
/* Create a dom_html_style_element object */
diff --git a/src/html/html_tablesection_element.c b/src/html/html_tablesection_element.c
index af4ccb6..dbc0902 100644
--- a/src/html/html_tablesection_element.c
+++ b/src/html/html_tablesection_element.c
@@ -217,26 +217,42 @@ dom_exception dom_html_table_section_element_insert_row(
return exp;
exp = dom_html_table_section_element_get_rows(element, &rows);
- if(exp != DOM_NO_ERR)
+ if(exp != DOM_NO_ERR) {
+ dom_node_unref(new_row);
+ new_row = NULL;
return exp;
+ }
exp = dom_html_collection_get_length(rows, &len);
- if(exp != DOM_NO_ERR)
+
+
+ if(exp != DOM_NO_ERR) {
+ dom_node_unref(new_row);
+ new_row = NULL;
+ dom_html_collection_unref(rows);
return exp;
+ }
if(index < -1 || index > (int32_t)len) {
/* Check for index validity */
+ dom_html_collection_unref(rows);
return DOM_INDEX_SIZE_ERR;
} else if(index == -1 || index == (int32_t)len) {
- return _dom_node_append_child((dom_node_internal *)element,
- (dom_node_internal *)*new_row,
- (dom_node_internal **)new_row);
+ dom_node *new_node;
+ dom_html_collection_unref(rows);
+ return dom_node_append_child(element,
+ *new_row,
+ &new_node);
} else {
+ dom_node *new_node;
+
dom_html_collection_item(rows,
index, &node);
- return _dom_node_insert_before((dom_node_internal *)element,
- (dom_node_internal *)*new_row, (dom_node_internal *)node,
- (dom_node_internal **)new_row);
+ dom_html_collection_unref(rows);
+
+ return dom_node_insert_before(element,
+ *new_row, node,
+ &new_node);
}
}
diff --git a/test/testcases/tests/level2/html/HTMLFrameElement09.xml b/test/testcases/tests/level2/html/HTMLFrameElement09.xml.kfail
similarity index 100%
rename from test/testcases/tests/level2/html/HTMLFrameElement09.xml
rename to test/testcases/tests/level2/html/HTMLFrameElement09.xml.kfail
diff --git a/test/testcases/tests/level2/html/HTMLIFrameElement11.xml b/test/testcases/tests/level2/html/HTMLIFrameElement11.xml.kfail
similarity index 100%
rename from test/testcases/tests/level2/html/HTMLIFrameElement11.xml
rename to test/testcases/tests/level2/html/HTMLIFrameElement11.xml.kfail
--
Document Object Model library
9 years, 1 month
libdom: branch rupindersingh/libdom_recovered updated. release/0.1.0-64-g1eaa386
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libdom.git/shortlog/1eaa38650c5a828ff47cc1...
...commit http://git.netsurf-browser.org/libdom.git/commit/1eaa38650c5a828ff47cc145...
...tree http://git.netsurf-browser.org/libdom.git/tree/1eaa38650c5a828ff47cc145ac...
The branch, rupindersingh/libdom_recovered has been updated
discards bc498327ec097f7694ca36cbe3314be5b06dbfc7 (commit)
via 1eaa38650c5a828ff47cc145ac843bde3840ec1c (commit)
via fd73a1bac9d352c77c2e8412d076f16ae06a795d (commit)
This update added new revisions after undoing existing revisions. That is
to say, the old revision is not a strict subset of the new revision. This
situation occurs when you --force push a change and generate a repository
containing something like this:
* -- * -- B -- O -- O -- O (bc498327ec097f7694ca36cbe3314be5b06dbfc7)
\
N -- N -- N (1eaa38650c5a828ff47cc145ac843bde3840ec1c)
When this happens we assume that you've already had alert emails for all
of the O revisions, and so we here report only the revisions in the N
branch from the common base, B.
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libdom.git/commit/?id=1eaa38650c5a828ff47c...
commit 1eaa38650c5a828ff47cc145ac843bde3840ec1c
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
table section ref counting (will be rebased if buggy)
diff --git a/src/html/html_tablesection_element.c b/src/html/html_tablesection_element.c
index af4ccb6..dbc0902 100644
--- a/src/html/html_tablesection_element.c
+++ b/src/html/html_tablesection_element.c
@@ -217,26 +217,42 @@ dom_exception dom_html_table_section_element_insert_row(
return exp;
exp = dom_html_table_section_element_get_rows(element, &rows);
- if(exp != DOM_NO_ERR)
+ if(exp != DOM_NO_ERR) {
+ dom_node_unref(new_row);
+ new_row = NULL;
return exp;
+ }
exp = dom_html_collection_get_length(rows, &len);
- if(exp != DOM_NO_ERR)
+
+
+ if(exp != DOM_NO_ERR) {
+ dom_node_unref(new_row);
+ new_row = NULL;
+ dom_html_collection_unref(rows);
return exp;
+ }
if(index < -1 || index > (int32_t)len) {
/* Check for index validity */
+ dom_html_collection_unref(rows);
return DOM_INDEX_SIZE_ERR;
} else if(index == -1 || index == (int32_t)len) {
- return _dom_node_append_child((dom_node_internal *)element,
- (dom_node_internal *)*new_row,
- (dom_node_internal **)new_row);
+ dom_node *new_node;
+ dom_html_collection_unref(rows);
+ return dom_node_append_child(element,
+ *new_row,
+ &new_node);
} else {
+ dom_node *new_node;
+
dom_html_collection_item(rows,
index, &node);
- return _dom_node_insert_before((dom_node_internal *)element,
- (dom_node_internal *)*new_row, (dom_node_internal *)node,
- (dom_node_internal **)new_row);
+ dom_html_collection_unref(rows);
+
+ return dom_node_insert_before(element,
+ *new_row, node,
+ &new_node);
}
}
commitdiff http://git.netsurf-browser.org/libdom.git/commit/?id=fd73a1bac9d352c77c2e...
commit fd73a1bac9d352c77c2e8412d076f16ae06a795d
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
fix style element string leak & also removed returning of default value
diff --git a/src/html/html_style_element.c b/src/html/html_style_element.c
index 681f0b8..c97955e 100644
--- a/src/html/html_style_element.c
+++ b/src/html/html_style_element.c
@@ -55,7 +55,6 @@ dom_exception _dom_html_style_element_initialise(struct dom_html_document *doc,
struct dom_html_style_element *ele)
{
dom_string *name = NULL;
- dom_string *media_default = NULL;
dom_exception err;
err = dom_string_create((const uint8_t *) "STYLE", SLEN("STYLE"),
@@ -63,12 +62,6 @@ dom_exception _dom_html_style_element_initialise(struct dom_html_document *doc,
if (err != DOM_NO_ERR)
return err;
- err = dom_string_create((const uint8_t *) "screen", SLEN("screen"),
- &media_default);
- if (err != DOM_NO_ERR)
- return err;
-
- ele->media = media_default;
err = _dom_html_element_initialise(doc, &ele->base, name, NULL, NULL);
dom_string_unref(name);
@@ -168,7 +161,7 @@ dom_exception dom_html_style_element_set_##attr( \
#define SIMPLE_GET_SET(attr) SIMPLE_GET(attr) SIMPLE_SET(attr)
SIMPLE_GET_SET(type);
-SIMPLE_SET(media);
+SIMPLE_GET_SET(media);
/**
* Get the disabled property
@@ -198,36 +191,3 @@ dom_exception dom_html_style_element_set_disabled(dom_html_style_element *ele,
SLEN("disabled"), disabled);
}
-/**
- * Get the media property
- *
- * \param ele The dom_html_style_element object
- * \param media The returned status
- * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
- */
-dom_exception dom_html_style_element_get_media(dom_html_style_element *ele,
- dom_string **media)
-{
- dom_html_document *doc;
- bool has_value = false;
- dom_exception err;
-
- doc = (dom_html_document *) ((dom_node_internal *) ele)->owner;
-
- err = dom_element_has_attribute(ele,
- doc->memoised[hds_media], &has_value);
- if(err !=DOM_NO_ERR)
- return err;
-
- if(has_value) {
- return dom_element_get_attribute(ele,
- doc->memoised[hds_media], media);
- }
-
- *media = ele->media;
- if (*media != NULL)
- dom_string_ref(*media);
- return DOM_NO_ERR;
-
-}
-
diff --git a/src/html/html_style_element.h b/src/html/html_style_element.h
index 285da94..e7a47e5 100644
--- a/src/html/html_style_element.h
+++ b/src/html/html_style_element.h
@@ -15,8 +15,6 @@
struct dom_html_style_element {
struct dom_html_element base;
/**< The base class */
- dom_string *media;
- /**< The default string value for the media attribute*/
};
/* Create a dom_html_style_element object */
-----------------------------------------------------------------------
Summary of changes:
src/html/html_tablesection_element.c | 32 ++++++++++++++++++++++++--------
1 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/src/html/html_tablesection_element.c b/src/html/html_tablesection_element.c
index af4ccb6..dbc0902 100644
--- a/src/html/html_tablesection_element.c
+++ b/src/html/html_tablesection_element.c
@@ -217,26 +217,42 @@ dom_exception dom_html_table_section_element_insert_row(
return exp;
exp = dom_html_table_section_element_get_rows(element, &rows);
- if(exp != DOM_NO_ERR)
+ if(exp != DOM_NO_ERR) {
+ dom_node_unref(new_row);
+ new_row = NULL;
return exp;
+ }
exp = dom_html_collection_get_length(rows, &len);
- if(exp != DOM_NO_ERR)
+
+
+ if(exp != DOM_NO_ERR) {
+ dom_node_unref(new_row);
+ new_row = NULL;
+ dom_html_collection_unref(rows);
return exp;
+ }
if(index < -1 || index > (int32_t)len) {
/* Check for index validity */
+ dom_html_collection_unref(rows);
return DOM_INDEX_SIZE_ERR;
} else if(index == -1 || index == (int32_t)len) {
- return _dom_node_append_child((dom_node_internal *)element,
- (dom_node_internal *)*new_row,
- (dom_node_internal **)new_row);
+ dom_node *new_node;
+ dom_html_collection_unref(rows);
+ return dom_node_append_child(element,
+ *new_row,
+ &new_node);
} else {
+ dom_node *new_node;
+
dom_html_collection_item(rows,
index, &node);
- return _dom_node_insert_before((dom_node_internal *)element,
- (dom_node_internal *)*new_row, (dom_node_internal *)node,
- (dom_node_internal **)new_row);
+ dom_html_collection_unref(rows);
+
+ return dom_node_insert_before(element,
+ *new_row, node,
+ &new_node);
}
}
--
Document Object Model library
9 years, 1 month
libdom: branch rupindersingh/libdom_recovered updated. release/0.1.0-63-gbc49832
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libdom.git/shortlog/bc498327ec097f7694ca36...
...commit http://git.netsurf-browser.org/libdom.git/commit/bc498327ec097f7694ca36cb...
...tree http://git.netsurf-browser.org/libdom.git/tree/bc498327ec097f7694ca36cbe3...
The branch, rupindersingh/libdom_recovered has been updated
discards e66af1bbdd74cb9d21b0658afdfb4edd389dc016 (commit)
discards c03f61d04128bffadd38897b111db81e331370e9 (commit)
via bc498327ec097f7694ca36cbe3314be5b06dbfc7 (commit)
via 98ad579a47319265989eb419f66e782a8a7ae4a6 (commit)
This update added new revisions after undoing existing revisions. That is
to say, the old revision is not a strict subset of the new revision. This
situation occurs when you --force push a change and generate a repository
containing something like this:
* -- * -- B -- O -- O -- O (e66af1bbdd74cb9d21b0658afdfb4edd389dc016)
\
N -- N -- N (bc498327ec097f7694ca36cbe3314be5b06dbfc7)
When this happens we assume that you've already had alert emails for all
of the O revisions, and so we here report only the revisions in the N
branch from the common base, B.
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libdom.git/commit/?id=bc498327ec097f7694ca...
commit bc498327ec097f7694ca36cbe3314be5b06dbfc7
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
fix select element string leak & also removed returning of default value
diff --git a/src/html/html_style_element.c b/src/html/html_style_element.c
index 681f0b8..c97955e 100644
--- a/src/html/html_style_element.c
+++ b/src/html/html_style_element.c
@@ -55,7 +55,6 @@ dom_exception _dom_html_style_element_initialise(struct dom_html_document *doc,
struct dom_html_style_element *ele)
{
dom_string *name = NULL;
- dom_string *media_default = NULL;
dom_exception err;
err = dom_string_create((const uint8_t *) "STYLE", SLEN("STYLE"),
@@ -63,12 +62,6 @@ dom_exception _dom_html_style_element_initialise(struct dom_html_document *doc,
if (err != DOM_NO_ERR)
return err;
- err = dom_string_create((const uint8_t *) "screen", SLEN("screen"),
- &media_default);
- if (err != DOM_NO_ERR)
- return err;
-
- ele->media = media_default;
err = _dom_html_element_initialise(doc, &ele->base, name, NULL, NULL);
dom_string_unref(name);
@@ -168,7 +161,7 @@ dom_exception dom_html_style_element_set_##attr( \
#define SIMPLE_GET_SET(attr) SIMPLE_GET(attr) SIMPLE_SET(attr)
SIMPLE_GET_SET(type);
-SIMPLE_SET(media);
+SIMPLE_GET_SET(media);
/**
* Get the disabled property
@@ -198,36 +191,3 @@ dom_exception dom_html_style_element_set_disabled(dom_html_style_element *ele,
SLEN("disabled"), disabled);
}
-/**
- * Get the media property
- *
- * \param ele The dom_html_style_element object
- * \param media The returned status
- * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
- */
-dom_exception dom_html_style_element_get_media(dom_html_style_element *ele,
- dom_string **media)
-{
- dom_html_document *doc;
- bool has_value = false;
- dom_exception err;
-
- doc = (dom_html_document *) ((dom_node_internal *) ele)->owner;
-
- err = dom_element_has_attribute(ele,
- doc->memoised[hds_media], &has_value);
- if(err !=DOM_NO_ERR)
- return err;
-
- if(has_value) {
- return dom_element_get_attribute(ele,
- doc->memoised[hds_media], media);
- }
-
- *media = ele->media;
- if (*media != NULL)
- dom_string_ref(*media);
- return DOM_NO_ERR;
-
-}
-
diff --git a/src/html/html_style_element.h b/src/html/html_style_element.h
index 285da94..e7a47e5 100644
--- a/src/html/html_style_element.h
+++ b/src/html/html_style_element.h
@@ -15,8 +15,6 @@
struct dom_html_style_element {
struct dom_html_element base;
/**< The base class */
- dom_string *media;
- /**< The default string value for the media attribute*/
};
/* Create a dom_html_style_element object */
commitdiff http://git.netsurf-browser.org/libdom.git/commit/?id=98ad579a47319265989e...
commit 98ad579a47319265989eb419f66e782a8a7ae4a6
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
We don't support making documents through dom internals
diff --git a/src/html/html_frame_element.c b/src/html/html_frame_element.c
index 16534b5..a03b32d 100644
--- a/src/html/html_frame_element.c
+++ b/src/html/html_frame_element.c
@@ -281,7 +281,10 @@ dom_exception dom_html_frame_element_get_content_document(
dom_html_frame_element *ele,
dom_document **content_document)
{
- *content_document = dom_node_get_owner(ele);
- return DOM_NO_ERR;
+ /* We don't support creating documents
+ from within here */
+ UNUSED(ele);
+ UNUSED(content_document);
+ return DOM_NOT_SUPPORTED_ERR;
}
diff --git a/src/html/html_iframe_element.c b/src/html/html_iframe_element.c
index 6f15b3e..0972d56 100644
--- a/src/html/html_iframe_element.c
+++ b/src/html/html_iframe_element.c
@@ -263,7 +263,10 @@ dom_exception dom_html_iframe_element_get_content_document(
dom_html_iframe_element *ele,
dom_document **content_document)
{
- *content_document = dom_node_get_owner(ele);
- return DOM_NO_ERR;
+ /* We don't support creating documents
+ from within here */
+ UNUSED(ele);
+ UNUSED(content_document);
+ return DOM_NOT_SUPPORTED_ERR;
}
diff --git a/test/testcases/tests/level2/html/HTMLFrameElement09.xml b/test/testcases/tests/level2/html/HTMLFrameElement09.xml
deleted file mode 100644
index 9ae0e16..0000000
--- a/test/testcases/tests/level2/html/HTMLFrameElement09.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-
-Copyright (c) 2001-2004 World Wide Web Consortium,
-(Massachusetts Institute of Technology, Institut National de
-Recherche en Informatique et en Automatique, Keio University). All
-Rights Reserved. This program is distributed under the W3C's Software
-Intellectual Property License. This program is distributed in the
-hope that it will be useful, but WITHOUT ANY WARRANTY; without even
-the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-PURPOSE.
-
-See W3C License http://www.w3.org/Consortium/Legal/ for more details.
-
--->
-<!DOCTYPE test SYSTEM "dom2.dtd">
-<test xmlns="http://www.w3.org/2001/DOM-Test-Suite/Level-2" name="HTMLFrameElement09">
-<metadata>
-<title>HTMLFrameElement09</title>
-<creator>NIST</creator>
-<description>
- The contentDocument attribute specifies the document this frame contains,
- if there is any and it is available, or null otherwise.
-
- Retrieve the contentDocument attribute of the first FRAME element
- and examine its TITLE value.
-</description>
-<contributor>Rick Rivello</contributor>
-<date qualifier="created">2002-07-03</date>
-<subject resource="http://www.w3.org/TR/DOM-Level-2-HTML/html#ID-78799536"/>
-</metadata>
-<var name="testNode" type="Element"/>
-<var name="cd" type="Document" />
-<var name="vtitle" type="DOMString"/>
-<var name="doc" type="Document"/>
-<load var="doc" href="frame2" willBeModified="false"/>
-<getElementById interface="Document" obj="doc" var="testNode" elementId='"Frame1"'/>
-<contentDocument interface="HTMLFrameElement" obj="testNode" var="cd"/>
-<title interface="HTMLDocument" obj="cd" var="vtitle"/>
-<assertEquals actual="vtitle" expected='"NIST DOM HTML Test - FRAME2"' id="titleLink" ignoreCase="false" />
-</test>
diff --git a/test/testcases/tests/level2/html/HTMLFrameElement09.xml.kfail b/test/testcases/tests/level2/html/HTMLFrameElement09.xml.kfail
new file mode 100644
index 0000000..9ae0e16
--- /dev/null
+++ b/test/testcases/tests/level2/html/HTMLFrameElement09.xml.kfail
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+
+Copyright (c) 2001-2004 World Wide Web Consortium,
+(Massachusetts Institute of Technology, Institut National de
+Recherche en Informatique et en Automatique, Keio University). All
+Rights Reserved. This program is distributed under the W3C's Software
+Intellectual Property License. This program is distributed in the
+hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE.
+
+See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+
+-->
+<!DOCTYPE test SYSTEM "dom2.dtd">
+<test xmlns="http://www.w3.org/2001/DOM-Test-Suite/Level-2" name="HTMLFrameElement09">
+<metadata>
+<title>HTMLFrameElement09</title>
+<creator>NIST</creator>
+<description>
+ The contentDocument attribute specifies the document this frame contains,
+ if there is any and it is available, or null otherwise.
+
+ Retrieve the contentDocument attribute of the first FRAME element
+ and examine its TITLE value.
+</description>
+<contributor>Rick Rivello</contributor>
+<date qualifier="created">2002-07-03</date>
+<subject resource="http://www.w3.org/TR/DOM-Level-2-HTML/html#ID-78799536"/>
+</metadata>
+<var name="testNode" type="Element"/>
+<var name="cd" type="Document" />
+<var name="vtitle" type="DOMString"/>
+<var name="doc" type="Document"/>
+<load var="doc" href="frame2" willBeModified="false"/>
+<getElementById interface="Document" obj="doc" var="testNode" elementId='"Frame1"'/>
+<contentDocument interface="HTMLFrameElement" obj="testNode" var="cd"/>
+<title interface="HTMLDocument" obj="cd" var="vtitle"/>
+<assertEquals actual="vtitle" expected='"NIST DOM HTML Test - FRAME2"' id="titleLink" ignoreCase="false" />
+</test>
diff --git a/test/testcases/tests/level2/html/HTMLIFrameElement11.xml b/test/testcases/tests/level2/html/HTMLIFrameElement11.xml
deleted file mode 100644
index 4220a43..0000000
--- a/test/testcases/tests/level2/html/HTMLIFrameElement11.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-
-Copyright (c) 2001-2004 World Wide Web Consortium,
-(Massachusetts Institute of Technology, Institut National de
-Recherche en Informatique et en Automatique, Keio University). All
-Rights Reserved. This program is distributed under the W3C's Software
-Intellectual Property License. This program is distributed in the
-hope that it will be useful, but WITHOUT ANY WARRANTY; without even
-the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-PURPOSE.
-
-See W3C License http://www.w3.org/Consortium/Legal/ for more details.
-
--->
-<!DOCTYPE test SYSTEM "dom2.dtd">
-<test xmlns="http://www.w3.org/2001/DOM-Test-Suite/Level-2" name="HTMLIFrameElement11">
-<metadata>
-<title>HTMLIFrameElement11</title>
-<creator>NIST</creator>
-<description>
- Retrieve the contentDocument attribute of the second IFRAME element
- and examine its title.
-</description>
-<contributor>Rick Rivello</contributor>
-<date qualifier="created">2002-07-03</date>
-<subject resource="http://www.w3.org/TR/DOM-Level-2-HTML/html#ID-67133006"/>
-</metadata>
-<var name="testNode" type="Element"/>
-<var name="cd" type="Document" />
-<var name="vtitle" type="DOMString"/>
-<var name="doc" type="Document"/>
-<load var="doc" href="iframe2" willBeModified="false"/>
-<getElementById interface="Document" obj="doc" var="testNode" elementId='"Iframe2"'/>
-<contentDocument interface="HTMLIFrameElement" obj="testNode" var="cd"/>
-<title interface="HTMLDocument" obj="cd" var="vtitle"/>
-<assertEquals actual="vtitle" expected='"NIST DOM HTML Test - IFRAME2"' id="titleLink" ignoreCase="false" />
-</test>
diff --git a/test/testcases/tests/level2/html/HTMLIFrameElement11.xml.kfail b/test/testcases/tests/level2/html/HTMLIFrameElement11.xml.kfail
new file mode 100644
index 0000000..4220a43
--- /dev/null
+++ b/test/testcases/tests/level2/html/HTMLIFrameElement11.xml.kfail
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+
+Copyright (c) 2001-2004 World Wide Web Consortium,
+(Massachusetts Institute of Technology, Institut National de
+Recherche en Informatique et en Automatique, Keio University). All
+Rights Reserved. This program is distributed under the W3C's Software
+Intellectual Property License. This program is distributed in the
+hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE.
+
+See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+
+-->
+<!DOCTYPE test SYSTEM "dom2.dtd">
+<test xmlns="http://www.w3.org/2001/DOM-Test-Suite/Level-2" name="HTMLIFrameElement11">
+<metadata>
+<title>HTMLIFrameElement11</title>
+<creator>NIST</creator>
+<description>
+ Retrieve the contentDocument attribute of the second IFRAME element
+ and examine its title.
+</description>
+<contributor>Rick Rivello</contributor>
+<date qualifier="created">2002-07-03</date>
+<subject resource="http://www.w3.org/TR/DOM-Level-2-HTML/html#ID-67133006"/>
+</metadata>
+<var name="testNode" type="Element"/>
+<var name="cd" type="Document" />
+<var name="vtitle" type="DOMString"/>
+<var name="doc" type="Document"/>
+<load var="doc" href="iframe2" willBeModified="false"/>
+<getElementById interface="Document" obj="doc" var="testNode" elementId='"Iframe2"'/>
+<contentDocument interface="HTMLIFrameElement" obj="testNode" var="cd"/>
+<title interface="HTMLDocument" obj="cd" var="vtitle"/>
+<assertEquals actual="vtitle" expected='"NIST DOM HTML Test - IFRAME2"' id="titleLink" ignoreCase="false" />
+</test>
-----------------------------------------------------------------------
Summary of changes:
--
Document Object Model library
9 years, 1 month
libdom: branch rupindersingh/libdom_recovered updated. release/0.1.0-63-ge66af1b
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libdom.git/shortlog/e66af1bbdd74cb9d21b065...
...commit http://git.netsurf-browser.org/libdom.git/commit/e66af1bbdd74cb9d21b0658a...
...tree http://git.netsurf-browser.org/libdom.git/tree/e66af1bbdd74cb9d21b0658afd...
The branch, rupindersingh/libdom_recovered has been updated
via e66af1bbdd74cb9d21b0658afdfb4edd389dc016 (commit)
via c03f61d04128bffadd38897b111db81e331370e9 (commit)
from 6115e07b25016949aa60476293754a9c1e200998 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libdom.git/commit/?id=e66af1bbdd74cb9d21b0...
commit e66af1bbdd74cb9d21b0658afdfb4edd389dc016
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
fix select element string leak & also removed returning of default value
diff --git a/src/html/html_style_element.c b/src/html/html_style_element.c
index 681f0b8..c97955e 100644
--- a/src/html/html_style_element.c
+++ b/src/html/html_style_element.c
@@ -55,7 +55,6 @@ dom_exception _dom_html_style_element_initialise(struct dom_html_document *doc,
struct dom_html_style_element *ele)
{
dom_string *name = NULL;
- dom_string *media_default = NULL;
dom_exception err;
err = dom_string_create((const uint8_t *) "STYLE", SLEN("STYLE"),
@@ -63,12 +62,6 @@ dom_exception _dom_html_style_element_initialise(struct dom_html_document *doc,
if (err != DOM_NO_ERR)
return err;
- err = dom_string_create((const uint8_t *) "screen", SLEN("screen"),
- &media_default);
- if (err != DOM_NO_ERR)
- return err;
-
- ele->media = media_default;
err = _dom_html_element_initialise(doc, &ele->base, name, NULL, NULL);
dom_string_unref(name);
@@ -168,7 +161,7 @@ dom_exception dom_html_style_element_set_##attr( \
#define SIMPLE_GET_SET(attr) SIMPLE_GET(attr) SIMPLE_SET(attr)
SIMPLE_GET_SET(type);
-SIMPLE_SET(media);
+SIMPLE_GET_SET(media);
/**
* Get the disabled property
@@ -198,36 +191,3 @@ dom_exception dom_html_style_element_set_disabled(dom_html_style_element *ele,
SLEN("disabled"), disabled);
}
-/**
- * Get the media property
- *
- * \param ele The dom_html_style_element object
- * \param media The returned status
- * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
- */
-dom_exception dom_html_style_element_get_media(dom_html_style_element *ele,
- dom_string **media)
-{
- dom_html_document *doc;
- bool has_value = false;
- dom_exception err;
-
- doc = (dom_html_document *) ((dom_node_internal *) ele)->owner;
-
- err = dom_element_has_attribute(ele,
- doc->memoised[hds_media], &has_value);
- if(err !=DOM_NO_ERR)
- return err;
-
- if(has_value) {
- return dom_element_get_attribute(ele,
- doc->memoised[hds_media], media);
- }
-
- *media = ele->media;
- if (*media != NULL)
- dom_string_ref(*media);
- return DOM_NO_ERR;
-
-}
-
diff --git a/src/html/html_style_element.h b/src/html/html_style_element.h
index 285da94..e7a47e5 100644
--- a/src/html/html_style_element.h
+++ b/src/html/html_style_element.h
@@ -15,8 +15,6 @@
struct dom_html_style_element {
struct dom_html_element base;
/**< The base class */
- dom_string *media;
- /**< The default string value for the media attribute*/
};
/* Create a dom_html_style_element object */
commitdiff http://git.netsurf-browser.org/libdom.git/commit/?id=c03f61d04128bffadd38...
commit c03f61d04128bffadd38897b111db81e331370e9
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
We don
't support making documents through dom internals
diff --git a/src/html/html_frame_element.c b/src/html/html_frame_element.c
index 16534b5..a03b32d 100644
--- a/src/html/html_frame_element.c
+++ b/src/html/html_frame_element.c
@@ -281,7 +281,10 @@ dom_exception dom_html_frame_element_get_content_document(
dom_html_frame_element *ele,
dom_document **content_document)
{
- *content_document = dom_node_get_owner(ele);
- return DOM_NO_ERR;
+ /* We don't support creating documents
+ from within here */
+ UNUSED(ele);
+ UNUSED(content_document);
+ return DOM_NOT_SUPPORTED_ERR;
}
diff --git a/src/html/html_iframe_element.c b/src/html/html_iframe_element.c
index 6f15b3e..0972d56 100644
--- a/src/html/html_iframe_element.c
+++ b/src/html/html_iframe_element.c
@@ -263,7 +263,10 @@ dom_exception dom_html_iframe_element_get_content_document(
dom_html_iframe_element *ele,
dom_document **content_document)
{
- *content_document = dom_node_get_owner(ele);
- return DOM_NO_ERR;
+ /* We don't support creating documents
+ from within here */
+ UNUSED(ele);
+ UNUSED(content_document);
+ return DOM_NOT_SUPPORTED_ERR;
}
diff --git a/test/testcases/tests/level2/html/HTMLFrameElement09.xml b/test/testcases/tests/level2/html/HTMLFrameElement09.xml
deleted file mode 100644
index 9ae0e16..0000000
--- a/test/testcases/tests/level2/html/HTMLFrameElement09.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-
-Copyright (c) 2001-2004 World Wide Web Consortium,
-(Massachusetts Institute of Technology, Institut National de
-Recherche en Informatique et en Automatique, Keio University). All
-Rights Reserved. This program is distributed under the W3C's Software
-Intellectual Property License. This program is distributed in the
-hope that it will be useful, but WITHOUT ANY WARRANTY; without even
-the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-PURPOSE.
-
-See W3C License http://www.w3.org/Consortium/Legal/ for more details.
-
--->
-<!DOCTYPE test SYSTEM "dom2.dtd">
-<test xmlns="http://www.w3.org/2001/DOM-Test-Suite/Level-2" name="HTMLFrameElement09">
-<metadata>
-<title>HTMLFrameElement09</title>
-<creator>NIST</creator>
-<description>
- The contentDocument attribute specifies the document this frame contains,
- if there is any and it is available, or null otherwise.
-
- Retrieve the contentDocument attribute of the first FRAME element
- and examine its TITLE value.
-</description>
-<contributor>Rick Rivello</contributor>
-<date qualifier="created">2002-07-03</date>
-<subject resource="http://www.w3.org/TR/DOM-Level-2-HTML/html#ID-78799536"/>
-</metadata>
-<var name="testNode" type="Element"/>
-<var name="cd" type="Document" />
-<var name="vtitle" type="DOMString"/>
-<var name="doc" type="Document"/>
-<load var="doc" href="frame2" willBeModified="false"/>
-<getElementById interface="Document" obj="doc" var="testNode" elementId='"Frame1"'/>
-<contentDocument interface="HTMLFrameElement" obj="testNode" var="cd"/>
-<title interface="HTMLDocument" obj="cd" var="vtitle"/>
-<assertEquals actual="vtitle" expected='"NIST DOM HTML Test - FRAME2"' id="titleLink" ignoreCase="false" />
-</test>
diff --git a/test/testcases/tests/level2/html/HTMLFrameElement09.xml.kfail b/test/testcases/tests/level2/html/HTMLFrameElement09.xml.kfail
new file mode 100644
index 0000000..9ae0e16
--- /dev/null
+++ b/test/testcases/tests/level2/html/HTMLFrameElement09.xml.kfail
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+
+Copyright (c) 2001-2004 World Wide Web Consortium,
+(Massachusetts Institute of Technology, Institut National de
+Recherche en Informatique et en Automatique, Keio University). All
+Rights Reserved. This program is distributed under the W3C's Software
+Intellectual Property License. This program is distributed in the
+hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE.
+
+See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+
+-->
+<!DOCTYPE test SYSTEM "dom2.dtd">
+<test xmlns="http://www.w3.org/2001/DOM-Test-Suite/Level-2" name="HTMLFrameElement09">
+<metadata>
+<title>HTMLFrameElement09</title>
+<creator>NIST</creator>
+<description>
+ The contentDocument attribute specifies the document this frame contains,
+ if there is any and it is available, or null otherwise.
+
+ Retrieve the contentDocument attribute of the first FRAME element
+ and examine its TITLE value.
+</description>
+<contributor>Rick Rivello</contributor>
+<date qualifier="created">2002-07-03</date>
+<subject resource="http://www.w3.org/TR/DOM-Level-2-HTML/html#ID-78799536"/>
+</metadata>
+<var name="testNode" type="Element"/>
+<var name="cd" type="Document" />
+<var name="vtitle" type="DOMString"/>
+<var name="doc" type="Document"/>
+<load var="doc" href="frame2" willBeModified="false"/>
+<getElementById interface="Document" obj="doc" var="testNode" elementId='"Frame1"'/>
+<contentDocument interface="HTMLFrameElement" obj="testNode" var="cd"/>
+<title interface="HTMLDocument" obj="cd" var="vtitle"/>
+<assertEquals actual="vtitle" expected='"NIST DOM HTML Test - FRAME2"' id="titleLink" ignoreCase="false" />
+</test>
diff --git a/test/testcases/tests/level2/html/HTMLIFrameElement11.xml b/test/testcases/tests/level2/html/HTMLIFrameElement11.xml
deleted file mode 100644
index 4220a43..0000000
--- a/test/testcases/tests/level2/html/HTMLIFrameElement11.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-
-Copyright (c) 2001-2004 World Wide Web Consortium,
-(Massachusetts Institute of Technology, Institut National de
-Recherche en Informatique et en Automatique, Keio University). All
-Rights Reserved. This program is distributed under the W3C's Software
-Intellectual Property License. This program is distributed in the
-hope that it will be useful, but WITHOUT ANY WARRANTY; without even
-the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-PURPOSE.
-
-See W3C License http://www.w3.org/Consortium/Legal/ for more details.
-
--->
-<!DOCTYPE test SYSTEM "dom2.dtd">
-<test xmlns="http://www.w3.org/2001/DOM-Test-Suite/Level-2" name="HTMLIFrameElement11">
-<metadata>
-<title>HTMLIFrameElement11</title>
-<creator>NIST</creator>
-<description>
- Retrieve the contentDocument attribute of the second IFRAME element
- and examine its title.
-</description>
-<contributor>Rick Rivello</contributor>
-<date qualifier="created">2002-07-03</date>
-<subject resource="http://www.w3.org/TR/DOM-Level-2-HTML/html#ID-67133006"/>
-</metadata>
-<var name="testNode" type="Element"/>
-<var name="cd" type="Document" />
-<var name="vtitle" type="DOMString"/>
-<var name="doc" type="Document"/>
-<load var="doc" href="iframe2" willBeModified="false"/>
-<getElementById interface="Document" obj="doc" var="testNode" elementId='"Iframe2"'/>
-<contentDocument interface="HTMLIFrameElement" obj="testNode" var="cd"/>
-<title interface="HTMLDocument" obj="cd" var="vtitle"/>
-<assertEquals actual="vtitle" expected='"NIST DOM HTML Test - IFRAME2"' id="titleLink" ignoreCase="false" />
-</test>
diff --git a/test/testcases/tests/level2/html/HTMLIFrameElement11.xml.kfail b/test/testcases/tests/level2/html/HTMLIFrameElement11.xml.kfail
new file mode 100644
index 0000000..4220a43
--- /dev/null
+++ b/test/testcases/tests/level2/html/HTMLIFrameElement11.xml.kfail
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+
+Copyright (c) 2001-2004 World Wide Web Consortium,
+(Massachusetts Institute of Technology, Institut National de
+Recherche en Informatique et en Automatique, Keio University). All
+Rights Reserved. This program is distributed under the W3C's Software
+Intellectual Property License. This program is distributed in the
+hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE.
+
+See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+
+-->
+<!DOCTYPE test SYSTEM "dom2.dtd">
+<test xmlns="http://www.w3.org/2001/DOM-Test-Suite/Level-2" name="HTMLIFrameElement11">
+<metadata>
+<title>HTMLIFrameElement11</title>
+<creator>NIST</creator>
+<description>
+ Retrieve the contentDocument attribute of the second IFRAME element
+ and examine its title.
+</description>
+<contributor>Rick Rivello</contributor>
+<date qualifier="created">2002-07-03</date>
+<subject resource="http://www.w3.org/TR/DOM-Level-2-HTML/html#ID-67133006"/>
+</metadata>
+<var name="testNode" type="Element"/>
+<var name="cd" type="Document" />
+<var name="vtitle" type="DOMString"/>
+<var name="doc" type="Document"/>
+<load var="doc" href="iframe2" willBeModified="false"/>
+<getElementById interface="Document" obj="doc" var="testNode" elementId='"Iframe2"'/>
+<contentDocument interface="HTMLIFrameElement" obj="testNode" var="cd"/>
+<title interface="HTMLDocument" obj="cd" var="vtitle"/>
+<assertEquals actual="vtitle" expected='"NIST DOM HTML Test - IFRAME2"' id="titleLink" ignoreCase="false" />
+</test>
-----------------------------------------------------------------------
Summary of changes:
src/html/html_frame_element.c | 7 ++-
src/html/html_iframe_element.c | 7 ++-
src/html/html_style_element.c | 42 +-------------------
src/html/html_style_element.h | 2 -
...eElement09.xml => HTMLFrameElement09.xml.kfail} | 0
...Element11.xml => HTMLIFrameElement11.xml.kfail} | 0
6 files changed, 11 insertions(+), 47 deletions(-)
rename test/testcases/tests/level2/html/{HTMLFrameElement09.xml => HTMLFrameElement09.xml.kfail} (100%)
rename test/testcases/tests/level2/html/{HTMLIFrameElement11.xml => HTMLIFrameElement11.xml.kfail} (100%)
diff --git a/src/html/html_frame_element.c b/src/html/html_frame_element.c
index 16534b5..a03b32d 100644
--- a/src/html/html_frame_element.c
+++ b/src/html/html_frame_element.c
@@ -281,7 +281,10 @@ dom_exception dom_html_frame_element_get_content_document(
dom_html_frame_element *ele,
dom_document **content_document)
{
- *content_document = dom_node_get_owner(ele);
- return DOM_NO_ERR;
+ /* We don't support creating documents
+ from within here */
+ UNUSED(ele);
+ UNUSED(content_document);
+ return DOM_NOT_SUPPORTED_ERR;
}
diff --git a/src/html/html_iframe_element.c b/src/html/html_iframe_element.c
index 6f15b3e..0972d56 100644
--- a/src/html/html_iframe_element.c
+++ b/src/html/html_iframe_element.c
@@ -263,7 +263,10 @@ dom_exception dom_html_iframe_element_get_content_document(
dom_html_iframe_element *ele,
dom_document **content_document)
{
- *content_document = dom_node_get_owner(ele);
- return DOM_NO_ERR;
+ /* We don't support creating documents
+ from within here */
+ UNUSED(ele);
+ UNUSED(content_document);
+ return DOM_NOT_SUPPORTED_ERR;
}
diff --git a/src/html/html_style_element.c b/src/html/html_style_element.c
index 681f0b8..c97955e 100644
--- a/src/html/html_style_element.c
+++ b/src/html/html_style_element.c
@@ -55,7 +55,6 @@ dom_exception _dom_html_style_element_initialise(struct dom_html_document *doc,
struct dom_html_style_element *ele)
{
dom_string *name = NULL;
- dom_string *media_default = NULL;
dom_exception err;
err = dom_string_create((const uint8_t *) "STYLE", SLEN("STYLE"),
@@ -63,12 +62,6 @@ dom_exception _dom_html_style_element_initialise(struct dom_html_document *doc,
if (err != DOM_NO_ERR)
return err;
- err = dom_string_create((const uint8_t *) "screen", SLEN("screen"),
- &media_default);
- if (err != DOM_NO_ERR)
- return err;
-
- ele->media = media_default;
err = _dom_html_element_initialise(doc, &ele->base, name, NULL, NULL);
dom_string_unref(name);
@@ -168,7 +161,7 @@ dom_exception dom_html_style_element_set_##attr( \
#define SIMPLE_GET_SET(attr) SIMPLE_GET(attr) SIMPLE_SET(attr)
SIMPLE_GET_SET(type);
-SIMPLE_SET(media);
+SIMPLE_GET_SET(media);
/**
* Get the disabled property
@@ -198,36 +191,3 @@ dom_exception dom_html_style_element_set_disabled(dom_html_style_element *ele,
SLEN("disabled"), disabled);
}
-/**
- * Get the media property
- *
- * \param ele The dom_html_style_element object
- * \param media The returned status
- * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
- */
-dom_exception dom_html_style_element_get_media(dom_html_style_element *ele,
- dom_string **media)
-{
- dom_html_document *doc;
- bool has_value = false;
- dom_exception err;
-
- doc = (dom_html_document *) ((dom_node_internal *) ele)->owner;
-
- err = dom_element_has_attribute(ele,
- doc->memoised[hds_media], &has_value);
- if(err !=DOM_NO_ERR)
- return err;
-
- if(has_value) {
- return dom_element_get_attribute(ele,
- doc->memoised[hds_media], media);
- }
-
- *media = ele->media;
- if (*media != NULL)
- dom_string_ref(*media);
- return DOM_NO_ERR;
-
-}
-
diff --git a/src/html/html_style_element.h b/src/html/html_style_element.h
index 285da94..e7a47e5 100644
--- a/src/html/html_style_element.h
+++ b/src/html/html_style_element.h
@@ -15,8 +15,6 @@
struct dom_html_style_element {
struct dom_html_element base;
/**< The base class */
- dom_string *media;
- /**< The default string value for the media attribute*/
};
/* Create a dom_html_style_element object */
diff --git a/test/testcases/tests/level2/html/HTMLFrameElement09.xml b/test/testcases/tests/level2/html/HTMLFrameElement09.xml.kfail
similarity index 100%
rename from test/testcases/tests/level2/html/HTMLFrameElement09.xml
rename to test/testcases/tests/level2/html/HTMLFrameElement09.xml.kfail
diff --git a/test/testcases/tests/level2/html/HTMLIFrameElement11.xml b/test/testcases/tests/level2/html/HTMLIFrameElement11.xml.kfail
similarity index 100%
rename from test/testcases/tests/level2/html/HTMLIFrameElement11.xml
rename to test/testcases/tests/level2/html/HTMLIFrameElement11.xml.kfail
--
Document Object Model library
9 years, 1 month
libhubbub: branch rupindersingh/libhubbub updated. release/0.3.0-43-g5a27384
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libhubbub.git/shortlog/5a27384efbe9d77d23e...
...commit http://git.netsurf-browser.org/libhubbub.git/commit/5a27384efbe9d77d23e72...
...tree http://git.netsurf-browser.org/libhubbub.git/tree/5a27384efbe9d77d23e72b5...
The branch, rupindersingh/libhubbub has been updated
discards 8a5c3854225df4889b63adc121dc1de8fd7ebdb2 (commit)
discards 1f7c629b7ec4c3cf4c009ae473ec6eb770246131 (commit)
discards 4be73254bf584314b9a70bac46cb0962ea615dc0 (commit)
discards 06eefc6fc2146a0186500a409f30c701eb719128 (commit)
discards b53540052fb5e078d523cd6ede43f1ebb6cf4115 (commit)
discards 920084dc0718834b21f16c764fbc20865b8405b9 (commit)
discards dc92a622879627e7920ccc264b839eb4891d27d4 (commit)
discards b0c34199c412ea43a701337fb623074fc00f2ad7 (commit)
discards b997dea68f7f503a3563f5b7e93ce0744a143199 (commit)
discards 76156584dbc23c7fa8bec16c58234f115c6b99d0 (commit)
discards e687e606705aaa81e9a5367a2bf8eef04e52df64 (commit)
discards 1165e4854dfc76fb594d1397850fc21143c89c79 (commit)
discards 4c5fecdabf76c781639fcae35096626397eca7a4 (commit)
discards ad2ba64cc641fc66e64662bbff62b955cb934dc2 (commit)
discards aff0e099e52f6300074166c3aba13ea0466bb28d (commit)
discards 2d4784ca3a14cb7fe53f0d9e47e8ae3726cac126 (commit)
discards 770dce7648f10aca5c9a7e8870750fe634e0433e (commit)
discards 6a2746068f66f606b25f71498b9fdab4b50accdb (commit)
discards 2e5d044c5610c8ccf831dfdb60b1f79649ec3f09 (commit)
discards 6bf64c0326c919c44f1b688163f1730a68cda181 (commit)
discards cadc7f044e59592e5a0bfa5c2ad09ea0c5c1cf4b (commit)
discards 27a0c375adea1df2dd875f6fd3919262f775a582 (commit)
discards adb9a74d4fcca689197d7b43ad0ffc2501cc2fbd (commit)
discards a50a5cc486e8620ccd252d04570acd554bc4955e (commit)
discards 7b6b8eb6fcbdd175540902ca699e7e704b90f9e0 (commit)
discards ed40cfa6f552e9d2658516b74b1ac4c8ea458df2 (commit)
discards 3178f06b79706f451af98b962d81cdd67bb1d563 (commit)
discards 40492e8f626689261bdbba97314fd25d89793cfa (commit)
discards df4209002cff669ef95f58c5e93e74bc96bc42ba (commit)
discards 9ec50cf1f6d36935d4bcfcfd4c9f1dc3c62a056d (commit)
discards e22c3949f0315d2e53eda43821919f256a609ed4 (commit)
via 5a27384efbe9d77d23e72b5944fc37885d695a4b (commit)
via 64f88876bf286a7e297e691f22a643aeb65ac69e (commit)
via 32f3897a95dbe2bca5bdd97eb3ee619b6a76c520 (commit)
via b727289bc37d3a09c6d13e0a5a2c1cf4100fca91 (commit)
via 85d89573a740b22893320634e616b6b017f8ebfe (commit)
via f52e4af53059056fbdbef0f9c0879054bc529e74 (commit)
via aa3fbf71d4e1938d703b5c2d3623074a5f0b5409 (commit)
via db61f45ce72f217026c6cfdb513cd7131443566e (commit)
via 7ef24e7e48c9677567edfb96b7040e2f55940518 (commit)
via b791a7f3067a7716b2b4b9b473c6d3055508d00d (commit)
via 05d1b645d8fe3c53965df6f621a69405db036df8 (commit)
via c2eec322dd1e4cedcedc284849021da9620e9bf3 (commit)
via 6a734926f4901c1963570d902e31e3c74a14cba6 (commit)
via 59beca91857b5d026dcf6bea9abc1f96e504b80d (commit)
via 87c7febfe9502f302453ac4140562fe245f71b6c (commit)
via 432ba566a7868be7e080bfea409d0e6bca1d8d93 (commit)
via 1219611794ddb4e55805af37ae2f6e9b2f5a24d2 (commit)
via fa946872de0edd68982637a08b88d617de3c9a1c (commit)
via 454807f3803f572557aeadbd53c8f1064592536f (commit)
via a7d104f8eaee2743ee68d4573996a4a5d272163f (commit)
via cb926c0cc0026eca03857b97648d7c195595ebfc (commit)
via 0577e6fe3bfc32be9f81b3958525fdd3edc5467a (commit)
via cbf089f7a6be8b9eb22ec4a0220c01be9f49ad11 (commit)
via ed926caf5f57e393fc3d9d22156098519eaeaf58 (commit)
via 12ac2948863ace2fd183fc67e0018e6e223ae980 (commit)
via 69d15c35c2b40f8b683bc680126683c0c6500bd8 (commit)
via b1ee6c8baaa655f20254db8381a3e23214e96917 (commit)
via f58ad55ebee65dbfc0efe8691e74089fc452d297 (commit)
via e9d04c61733b2ae215623820b9964e80d7a0fac1 (commit)
via 02ea40191dd1509d82e55e999031c9b17b4569cc (commit)
via 64523b2243280b0c81e2f84d06fe439ea20d6eb9 (commit)
via 53e5d831ee49749f1f920c4812df6c8240d6d0ff (commit)
via 7f7626bc3e4cf50fa9db858ee403dba1710ab060 (commit)
This update added new revisions after undoing existing revisions. That is
to say, the old revision is not a strict subset of the new revision. This
situation occurs when you --force push a change and generate a repository
containing something like this:
* -- * -- B -- O -- O -- O (8a5c3854225df4889b63adc121dc1de8fd7ebdb2)
\
N -- N -- N (5a27384efbe9d77d23e72b5944fc37885d695a4b)
When this happens we assume that you've already had alert emails for all
of the O revisions, and so we here report only the revisions in the N
branch from the common base, B.
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=5a27384efbe9d77d2...
commit 5a27384efbe9d77d23e72b5944fc37885d695a4b
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
small fix to 'in_head_noscript' mode
diff --git a/src/treebuilder/in_head_noscript.c b/src/treebuilder/in_head_noscript.c
index d13ca30..9f3338a 100644
--- a/src/treebuilder/in_head_noscript.c
+++ b/src/treebuilder/in_head_noscript.c
@@ -48,7 +48,8 @@ hubbub_error handle_in_head_noscript(hubbub_treebuilder *treebuilder,
err = handle_in_body(treebuilder, token);
} else if (type == NOSCRIPT) {
handled = true;
- } else if (type == LINK || type == META || type == NOFRAMES ||
+ } else if (type == BASEFONT || type == BGSOUND ||
+ type == LINK || type == META || type == NOFRAMES ||
type == STYLE) {
/* Process as "in head" */
err = handle_in_head(treebuilder, token);
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=64f88876bf286a7e2...
commit 64f88876bf286a7e297e691f22a643aeb65ac69e
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
correctly handle meta element in head
diff --git a/src/treebuilder/in_head.c b/src/treebuilder/in_head.c
index a10ba23..9429058 100644
--- a/src/treebuilder/in_head.c
+++ b/src/treebuilder/in_head.c
@@ -33,6 +33,7 @@ static hubbub_error process_meta_in_head(hubbub_treebuilder *treebuilder,
uint16_t content_type_enc = 0;
size_t i;
hubbub_error err = HUBBUB_OK;
+ bool http_equiv = false;
err = insert_element(treebuilder, &token->data.tag, false);
if (err != HUBBUB_OK)
@@ -57,6 +58,20 @@ static hubbub_error process_meta_in_head(hubbub_treebuilder *treebuilder,
for (i = 0; i < token->data.tag.n_attributes; i++) {
hubbub_attribute *attr = &token->data.tag.attributes[i];
+ if (hubbub_string_match_ci(attr->name.ptr, attr->name.len,
+ (const uint8_t *) "http-equiv",
+ SLEN("http-equiv")) == true &&
+ hubbub_string_match_ci(attr->value.ptr, attr->value.len,
+ (const uint8_t *) "content-type",
+ SLEN("content-type")) == true
+ ) {
+ http_equiv = true;
+ }
+ }
+
+ for (i = 0; i < token->data.tag.n_attributes; i++) {
+ hubbub_attribute *attr = &token->data.tag.attributes[i];
+
if (hubbub_string_match(attr->name.ptr, attr->name.len,
(const uint8_t *) "charset",
SLEN("charset")) == true) {
@@ -66,7 +81,8 @@ static hubbub_error process_meta_in_head(hubbub_treebuilder *treebuilder,
attr->value.len);
} else if (hubbub_string_match(attr->name.ptr, attr->name.len,
(const uint8_t *) "content",
- SLEN("content")) == true) {
+ SLEN("content")) == true &&
+ http_equiv == true) {
/* Extract charset from Content-Type */
content_type_enc = hubbub_charset_parse_content(
attr->value.ptr, attr->value.len);
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=32f3897a95dbe2bca...
commit 32f3897a95dbe2bca5bdd97eb3ee619b6a76c520
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
The foreign breakout method doesn't neccessarily break out of foreign state. Hence, it is only a candidate to do so. It will be decided during reprocessing whether to breakout or not.
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index edfc73b..5359364 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -1853,7 +1853,7 @@ hubbub_error process_0presentational_in_body(hubbub_treebuilder *treebuilder,
uint32_t common_ancestor;
uint32_t furthest_block;
bookmark bookmark;
- uint32_t last_node;
+ uint32_t last_node = 0;
void *reparented;
void *fe_clone = NULL;
void *clone_appended = NULL;
diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c
index ddade53..681faeb 100644
--- a/src/treebuilder/in_foreign_content.c
+++ b/src/treebuilder/in_foreign_content.c
@@ -313,16 +313,6 @@ static bool element_in_scope_in_non_html_ns(hubbub_treebuilder *treebuilder)
assert((signed) treebuilder->context.current_node >= 0);
for (node = treebuilder->context.current_node; node > 0; node--) {
- element_type node_type = stack[node].type;
-
- /* The list of element types given in the spec here are the
- * scoping elements excluding TABLE and HTML. TABLE is handled
- * in the previous conditional and HTML should only occur
- * as the first node in the stack, which is never processed
- * in this loop. */
- if (node_type == TABLE || is_scoping_element(node_type))
- break;
-
if (stack[node].ns != HUBBUB_NS_HTML)
return true;
}
@@ -363,9 +353,10 @@ static hubbub_error process_as_in_secondary(hubbub_treebuilder *treebuilder,
}
/**
- * Break out of foreign content as a result of certain start tags or EOF.
+ * Handle certain start tags. Reprocessing is a must
+ * after calling this function.
*/
-static void foreign_break_out(hubbub_treebuilder *treebuilder)
+static void candidate_foreign_breakout(hubbub_treebuilder *treebuilder)
{
element_context *stack = treebuilder->context.element_stack;
hubbub_ns ns;
@@ -375,6 +366,11 @@ static void foreign_break_out(hubbub_treebuilder *treebuilder)
/** \todo parse error */
/** todo fragment case */
+ element_stack_pop(treebuilder, &ns, &type, &node);
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx,
+ node);
+
ns = stack[treebuilder->context.current_node].ns;
type = current_node(treebuilder);
size_t n_attrs = stack[
@@ -400,7 +396,6 @@ static void foreign_break_out(hubbub_treebuilder *treebuilder)
attrs = stack[treebuilder->context.current_node].
attributes;
}
- treebuilder->context.mode = treebuilder->context.second_mode;
}
@@ -490,7 +485,7 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
type == SUB || type == SUP || type == TABLE ||
type == TT || type == U || type == UL ||
type == VAR) {
- foreign_break_out(treebuilder);
+ candidate_foreign_breakout(treebuilder);
err = HUBBUB_REPROCESS;
handled = true;
} else if (type == FONT) {
@@ -518,7 +513,7 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
}
if (found) {
- foreign_break_out(treebuilder);
+ candidate_foreign_breakout(treebuilder);
err = HUBBUB_REPROCESS;
handled = true;
}
@@ -554,7 +549,7 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
uint32_t node;
element_context *stack = treebuilder->context.element_stack;
- for (node = treebuilder->context.current_node; node > 1; node--) {
+ for (node = treebuilder->context.current_node; node > 0;) {
if(stack[node].type == type) {
hubbub_ns ns;
element_type type;
@@ -568,17 +563,17 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
} while(node_iterator != vnode);
return HUBBUB_OK;
}
- if(stack[node].ns == HUBBUB_NS_HTML) {
+ if(stack[--node].ns == HUBBUB_NS_HTML) {
break;
}
}
- if(node > 1) {
+ if(node > 0) {
err = process_as_in_secondary(treebuilder, token);
}
}
break;
case HUBBUB_TOKEN_EOF:
- foreign_break_out(treebuilder);
+ candidate_foreign_breakout(treebuilder);
err = HUBBUB_REPROCESS;
break;
}
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index f8cb288..3ae35b4 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -1,4 +1,4 @@
-# Index file for tokeniser tests
+# Index file for treebuilder tests
#
# Test Description
@@ -27,7 +27,7 @@ scriptdata01.dat html5lib script related treebuilder tests
#scripted/webkit01.dat NA
tables01.dat html5lib treebuilder tests
#template.dat NA
-#tests10.dat NA
+tests10.dat html5lib treebuilder tests
tests11.dat html5lib treebuilder tests
tests12.dat html5lib treebuilder tests
tests14.dat html5lib treebuilder tests
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=b727289bc37d3a09c...
commit b727289bc37d3a09c6d13e0a5a2c1cf4100fca91
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Fixed check for special element. Also fixed the adoption agency.
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index ca2a34b..edfc73b 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -785,7 +785,7 @@ hubbub_error process_dd_dt_li_in_body(hubbub_treebuilder *treebuilder,
/* Find last LI/(DD,DT) on stack, if any */
for (node = treebuilder->context.current_node; node > 0; node--) {
element_type ntype = stack[node].type;
-
+ hubbub_ns ns = stack[node].ns;
if (type == LI && ntype == LI)
break;
@@ -793,7 +793,7 @@ hubbub_error process_dd_dt_li_in_body(hubbub_treebuilder *treebuilder,
(ntype == DD || ntype == DT)))
break;
- if (is_special_element(ntype) &&
+ if (is_special_element(ntype, ns) &&
ntype != ADDRESS &&
ntype != DIV &&
ntype != P)
@@ -1819,6 +1819,29 @@ hubbub_error process_0presentational_in_body(hubbub_treebuilder *treebuilder,
element_type type)
{
hubbub_error err;
+ formatting_list_entry *entry;
+ bool found = false;
+
+ for (entry = treebuilder->context.formatting_list_end;
+ entry != NULL; entry = entry->prev) {
+ if(entry->stack_index ==
+ treebuilder->context.current_node) {
+ found = 1;
+ break;
+ }
+ }
+ if ((!found) && current_node(treebuilder) == type) {
+ hubbub_ns ns;
+ element_type otype;
+ void *node;
+
+ element_stack_pop(treebuilder, &ns, &otype, &node);
+
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx,
+ node);
+ return HUBBUB_OK;
+ }
/* Welcome to the adoption agency */
uint32_t counter = 0;
@@ -2102,8 +2125,8 @@ hubbub_error aa_find_furthest_block(hubbub_treebuilder *treebuilder,
for (fb = fe_index + 1; fb <= treebuilder->context.current_node; fb++) {
element_type type = treebuilder->context.element_stack[fb].type;
-
- if (!(is_phrasing_element(type) || is_formatting_element(type)))
+ hubbub_ns ns = treebuilder->context.element_stack[fb].ns;
+ if (is_special_element(type, ns))
break;
}
@@ -2579,7 +2602,8 @@ hubbub_error process_0generic_in_body(hubbub_treebuilder *treebuilder,
}
break;
- } else if (is_special_element(stack[node].type)) {
+ } else if (is_special_element(stack[node].type,
+ stack[node].ns)) {
/** \todo parse error */
break;
}
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index 18a34bd..b13b122 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -175,7 +175,7 @@ hubbub_error complete_script(hubbub_treebuilder *treebuilder);
element_type element_type_from_name(hubbub_treebuilder *treebuilder,
const hubbub_string *tag_name);
-bool is_special_element(element_type type);
+bool is_special_element(element_type type, hubbub_ns ns);
bool is_scoping_element(element_type type);
bool is_formatting_element(element_type type);
bool is_phrasing_element(element_type type);
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index 9cc4b12..d220dba 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -1192,11 +1192,13 @@ element_type element_type_from_name(hubbub_treebuilder *treebuilder,
* \param type Node type to consider
* \return True iff node is a special element
*/
-bool is_special_element(element_type type)
+bool is_special_element(element_type type, hubbub_ns ns)
{
- return (type <= TH) ||
- (type >= MI && type <= ANNOTATION_XML) ||
- (type >=FOREIGNOBJECT && type <= DESC);
+ return ((ns == HUBBUB_NS_HTML)&&(type <= TH)) ||
+ (ns == HUBBUB_NS_MATHML &&
+ (type >= MI && type <= ANNOTATION_XML)) ||
+ (ns == HUBBUB_NS_SVG &&
+ (type >=FOREIGNOBJECT && type <= DESC));
}
/**
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=85d89573a740b2289...
commit 85d89573a740b22893320634e616b6b017f8ebfe
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Added support for template tag. However, the client currently doesn't support it. Hence, the only thing left to be done is to callback the client during insert_element, taking proper care of the template tags
diff --git a/src/treebuilder/Makefile b/src/treebuilder/Makefile
index 31feae1..e48c0a9 100644
--- a/src/treebuilder/Makefile
+++ b/src/treebuilder/Makefile
@@ -6,6 +6,6 @@ DIR_SOURCES := treebuilder.c \
in_cell.c in_select.c in_select_in_table.c \
in_foreign_content.c after_body.c in_frameset.c \
after_frameset.c after_after_body.c after_after_frameset.c \
- generic_rcdata.c
+ in_template.c generic_rcdata.c
include $(NSBUILD)/Makefile.subdir
diff --git a/src/treebuilder/after_head.c b/src/treebuilder/after_head.c
index f39299f..3a5d4c9 100644
--- a/src/treebuilder/after_head.c
+++ b/src/treebuilder/after_head.c
@@ -58,7 +58,8 @@ hubbub_error handle_after_head(hubbub_treebuilder *treebuilder,
} else if (type == BASE || type == BASEFONT || type == BGSOUND ||
type == LINK || type == META ||
type == NOFRAMES || type == SCRIPT ||
- type == STYLE || type == TITLE) {
+ type == STYLE || type == TEMPLATE ||
+ type == TITLE) {
hubbub_ns ns;
element_type otype;
void *node;
@@ -98,6 +99,8 @@ hubbub_error handle_after_head(hubbub_treebuilder *treebuilder,
if (type == HTML || type == BODY || type == BR) {
err = HUBBUB_REPROCESS;
+ } else if(type == TEMPLATE) {
+ err = handle_in_head(treebuilder, token);
} else {
/** \todo parse error */
}
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index bd73f08..ca2a34b 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -164,6 +164,12 @@ hubbub_error handle_in_body(hubbub_treebuilder *treebuilder,
err = process_end_tag(treebuilder, token);
break;
case HUBBUB_TOKEN_EOF:
+ if (treebuilder->context.current_template_mode > -1) {
+ treebuilder->context.mode =
+ IN_TEMPLATE;
+ err = HUBBUB_REPROCESS;
+ break;
+ }
for (i = treebuilder->context.current_node;
i > 0; i--) {
element_type type =
@@ -211,7 +217,6 @@ hubbub_error process_character(hubbub_treebuilder *treebuilder,
err = reconstruct_active_formatting_list(treebuilder);
if (err != HUBBUB_OK)
return err;
-
if (treebuilder->context.strip_leading_lr) {
const uint8_t *str = dummy.ptr;
@@ -267,7 +272,8 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
err = process_html_in_body(treebuilder, token);
} else if (type == BASE || type == BASEFONT || type == BGSOUND ||
type == LINK || type == META || type == NOFRAMES ||
- type == SCRIPT || type == STYLE || type == TITLE) {
+ type == SCRIPT || type == STYLE || type == TEMPLATE
+ || type == TITLE) {
/* Process as "in head" */
err = handle_in_head(treebuilder, token);
} else if (type == BODY) {
@@ -519,6 +525,8 @@ hubbub_error process_end_tag(hubbub_treebuilder *treebuilder,
(treebuilder->context.enable_scripting &&
type == NOSCRIPT)) {
/** \todo parse error */
+ } else if (type == TEMPLATE) {
+ err = handle_in_head(treebuilder, token);
} else {
err = process_0generic_in_body(treebuilder, type);
}
@@ -591,6 +599,9 @@ hubbub_error process_html_in_body(hubbub_treebuilder *treebuilder,
const hubbub_token *token)
{
/** \todo parse error */
+ if(template_in_stack(treebuilder))
+ return HUBBUB_OK;
+
return add_attributes_stack(treebuilder, token,
0);
}
@@ -607,7 +618,8 @@ hubbub_error process_body_in_body(hubbub_treebuilder *treebuilder,
/** \todo parse error */
if (treebuilder->context.current_node < 1 ||
- treebuilder->context.element_stack[1].type != BODY)
+ treebuilder->context.element_stack[1].type != BODY ||
+ template_in_stack(treebuilder))
return HUBBUB_OK;
treebuilder->context.frameset_ok = false;
@@ -721,18 +733,10 @@ hubbub_error process_form_in_body(hubbub_treebuilder *treebuilder,
{
hubbub_error err;
- 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;
- }
- }
+ bool in_stack = template_in_stack(treebuilder);
+
if (treebuilder->context.form_element != NULL &&
- template_in_stack == false) {
+ in_stack == false) {
/** \todo parse error */
} else {
if (element_in_scope(treebuilder, P, BUTTON_SCOPE)) {
@@ -752,7 +756,7 @@ hubbub_error process_form_in_body(hubbub_treebuilder *treebuilder,
treebuilder->context.element_stack[
treebuilder->context.current_node].node);
- if(template_in_stack == false) {
+ if(in_stack == false) {
treebuilder->context.form_element =
treebuilder->context.element_stack[
treebuilder->context.current_node].node;
@@ -1236,26 +1240,18 @@ 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;
+ bool in_stack = template_in_stack(
+ treebuilder);
hubbub_ns ns;
void *node;
element_type o_type;
- for (n = treebuilder->context.current_node;
- n > 0; n--) {
- if(stack[n].type == TEMPLATE) {
- template_in_stack = true;
- break;
- }
- }
- if (template_in_stack == false &&
+ if (in_stack == false &&
treebuilder->context.form_element != NULL)
return HUBBUB_OK;
@@ -1592,6 +1588,22 @@ hubbub_error process_0form_in_body(hubbub_treebuilder *treebuilder)
void *node = treebuilder->context.form_element;
uint32_t idx = 0;
+ if(template_in_stack (treebuilder)) {
+ if(!element_in_scope(treebuilder, FORM, NONE)) {
+ /** \todo parse error */
+ } else {
+ close_implied_end_tags(treebuilder,
+ UNKNOWN);
+
+ if(current_node(treebuilder) != FORM) {
+ /** \todo parse error */
+ }
+ element_stack_pop_until(treebuilder,
+ FORM);
+ }
+ return HUBBUB_OK;
+ }
+
if (treebuilder->context.form_element != NULL)
treebuilder->tree_handler->unref_node(
treebuilder->tree_handler->ctx,
@@ -1600,8 +1612,7 @@ hubbub_error process_0form_in_body(hubbub_treebuilder *treebuilder)
idx = element_in_scope(treebuilder, FORM, NONE);
- if (idx == 0 || node == NULL ||
- treebuilder->context.element_stack[idx].node != node) {
+ if (idx == 0 || node == NULL) {
/** \todo parse error */
} else {
hubbub_ns ns;
@@ -1616,7 +1627,7 @@ hubbub_error process_0form_in_body(hubbub_treebuilder *treebuilder)
/** \todo parse error */
}
- element_stack_remove(treebuilder, idx,
+ element_stack_remove(treebuilder, idx,
&ns, &otype, &onode);
treebuilder->tree_handler->unref_node(
diff --git a/src/treebuilder/in_column_group.c b/src/treebuilder/in_column_group.c
index 9436fc6..b69332b 100644
--- a/src/treebuilder/in_column_group.c
+++ b/src/treebuilder/in_column_group.c
@@ -53,6 +53,8 @@ hubbub_error handle_in_column_group(hubbub_treebuilder *treebuilder,
false);
/** \todo ack sc flag */
+ } else if(type == TEMPLATE) {
+ err = handle_in_head(treebuilder, token);
} else {
err = HUBBUB_REPROCESS;
}
@@ -68,6 +70,8 @@ hubbub_error handle_in_column_group(hubbub_treebuilder *treebuilder,
handled = true;
} else if (type == COL) {
/** \todo parse error */
+ } else if(type == TEMPLATE) {
+ err = handle_in_head(treebuilder, token);
} else {
err = HUBBUB_REPROCESS;
}
diff --git a/src/treebuilder/in_head.c b/src/treebuilder/in_head.c
index 52a2e3f..a10ba23 100644
--- a/src/treebuilder/in_head.c
+++ b/src/treebuilder/in_head.c
@@ -19,7 +19,6 @@
#include "utils/utils.h"
#include "utils/string.h"
-
/**
* Process a meta tag as if "in head".
*
@@ -164,6 +163,47 @@ hubbub_error handle_in_head(hubbub_treebuilder *treebuilder,
err = parse_generic_rcdata(treebuilder, token, HUBBUB_CONTENT_MODEL_SCRIPTDATA);
} else if (type == HEAD) {
/** \todo parse error */
+ } else if (type == TEMPLATE) {
+ err = insert_element(treebuilder, &token->data.tag,
+ true);
+ if (err != HUBBUB_OK)
+ return err;
+
+ /* Insert a Marker */
+ treebuilder->tree_handler->ref_node(
+ treebuilder->tree_handler->ctx,
+ treebuilder->context.element_stack[
+ treebuilder->context.current_node].node);
+
+ err = formatting_list_append(treebuilder, token->data.tag.ns, type,
+ treebuilder->context.element_stack[
+ treebuilder->context.current_node].node,
+ token->data.tag.attributes, token->data.tag.n_attributes,
+ treebuilder->context.current_node);
+ if (err != HUBBUB_OK) {
+ hubbub_ns ns;
+ element_type type;
+ void *node;
+ remove_node_from_dom(treebuilder,
+ treebuilder->context.element_stack[
+ treebuilder->context.current_node].node);
+
+ element_stack_pop(treebuilder, &ns, &type, &node);
+
+ /* Unref twice (once for stack, once for formatting list) */
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx, node);
+
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx, node);
+
+ return err;
+ }
+
+ treebuilder->context.frameset_ok = false;
+ treebuilder->context.mode = IN_TEMPLATE;
+
+ err = template_stack_push(treebuilder, IN_TEMPLATE);
} else {
err = HUBBUB_REPROCESS;
}
@@ -176,9 +216,29 @@ hubbub_error handle_in_head(hubbub_treebuilder *treebuilder,
if (type == HEAD) {
handled = true;
+ } else if(type == TEMPLATE) {
+ /**todo parse error */
+ if(!template_in_stack(treebuilder)) {
+ /** \todo parse error */
+ break;
+ }
+ insertion_mode mode;
+ close_implied_end_tags_thorough(treebuilder);
+
+ err = element_stack_pop_until(treebuilder,
+ TEMPLATE);
+ if (err != HUBBUB_OK)
+ return err;
+
+ clear_active_formatting_list_to_marker(
+ treebuilder);
+ err = template_stack_pop (treebuilder, &mode);
+ reset_insertion_mode (treebuilder);
} else if (type == HTML || type == BODY || type == BR) {
err = HUBBUB_REPROCESS;
- } /** \todo parse error */
+ } else {
+ /** \todo parse error */
+ }
}
break;
case HUBBUB_TOKEN_EOF:
diff --git a/src/treebuilder/in_row.c b/src/treebuilder/in_row.c
index 0446e6f..c31d826 100644
--- a/src/treebuilder/in_row.c
+++ b/src/treebuilder/in_row.c
@@ -23,7 +23,8 @@ static void table_clear_stack(hubbub_treebuilder *treebuilder)
{
element_type cur_node = current_node(treebuilder);
- while (cur_node != TR && cur_node != HTML) {
+ while (cur_node != TR && cur_node != TEMPLATE &&
+ cur_node != HTML) {
hubbub_ns ns;
element_type type;
void *node;
diff --git a/src/treebuilder/in_select.c b/src/treebuilder/in_select.c
index 7675dc5..c3db89d 100644
--- a/src/treebuilder/in_select.c
+++ b/src/treebuilder/in_select.c
@@ -100,7 +100,7 @@ hubbub_error handle_in_select(hubbub_treebuilder *treebuilder,
if (type != SELECT)
err = HUBBUB_REPROCESS;
- } else if (type == SCRIPT) {
+ } else if (type == SCRIPT || type == TEMPLATE) {
err = handle_in_head(treebuilder, token);
} else {
/** \todo parse error */
@@ -153,6 +153,8 @@ hubbub_error handle_in_select(hubbub_treebuilder *treebuilder,
/* fragment case */
/** \todo parse error */
}
+ } else if (type == TEMPLATE) {
+ err = handle_in_head(treebuilder, token);
}
}
break;
diff --git a/src/treebuilder/in_table.c b/src/treebuilder/in_table.c
index cf61827..03dc4f7 100644
--- a/src/treebuilder/in_table.c
+++ b/src/treebuilder/in_table.c
@@ -26,7 +26,7 @@ static inline void clear_stack_table_context(hubbub_treebuilder *treebuilder)
element_type type = current_node(treebuilder);
void *node;
- while (type != TABLE && type != HTML) {
+ while (type != TABLE && type != HTML && type != TEMPLATE) {
element_stack_pop(treebuilder, &ns, &type, &node);
treebuilder->tree_handler->unref_node(
@@ -208,23 +208,16 @@ hubbub_error handle_in_table(hubbub_treebuilder *treebuilder,
reset_insertion_mode(treebuilder);
err = HUBBUB_REPROCESS;
- } else if (type == STYLE || type == SCRIPT) {
+ } else if (type == STYLE || type == SCRIPT ||
+ type == TEMPLATE) {
err = handle_in_head(treebuilder, token);
} else if (type == INPUT) {
err = process_input_in_table(treebuilder, token);
handled = (err == HUBBUB_OK);
} else if(type == FORM) {
- 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(template_in_stack == true ||
+ bool in_stack = template_in_stack(treebuilder);
+
+ if(in_stack == true ||
treebuilder->context.form_element != NULL ) {
/* ignore the token*/
break;
@@ -268,6 +261,8 @@ hubbub_error handle_in_table(hubbub_treebuilder *treebuilder,
type == TBODY || type == TD || type == TFOOT ||
type == TH || type == THEAD || type == TR) {
/** \todo parse error */
+ } else if (type == TEMPLATE) {
+ err = handle_in_head(treebuilder, token);
} else {
handled = false;
}
diff --git a/src/treebuilder/in_table_body.c b/src/treebuilder/in_table_body.c
index c8c26cf..e6fbcc3 100644
--- a/src/treebuilder/in_table_body.c
+++ b/src/treebuilder/in_table_body.c
@@ -24,7 +24,8 @@ static void table_clear_stack(hubbub_treebuilder *treebuilder)
element_type cur_node = current_node(treebuilder);
while (cur_node != TBODY && cur_node != TFOOT &&
- cur_node != THEAD && cur_node != HTML) {
+ cur_node != THEAD && cur_node != HTML &&
+ cur_node != TEMPLATE) {
hubbub_ns ns;
element_type type;
void *node;
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index de371b0..18a34bd 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -166,6 +166,7 @@ hubbub_error insert_element(hubbub_treebuilder *treebuilder,
const hubbub_tag *tag_name, bool push);
void close_implied_end_tags(hubbub_treebuilder *treebuilder,
element_type except);
+void close_implied_end_tags_thorough(hubbub_treebuilder *treebuilder);
void reset_insertion_mode(hubbub_treebuilder *treebuilder);
hubbub_error append_text(hubbub_treebuilder *treebuilder,
const hubbub_string *string);
@@ -224,6 +225,7 @@ bool is_mathml_text_integration (element_type type,
bool is_html_integration (element_type type,
hubbub_ns ns, hubbub_attribute *attrs,
size_t n_attrs);
+bool template_in_stack (hubbub_treebuilder *treebuilder);
/* in_foreign_content.c */
void adjust_mathml_attributes(hubbub_treebuilder *treebuilder, hubbub_tag *tag);
diff --git a/src/treebuilder/modes.h b/src/treebuilder/modes.h
index 411e7a6..eefe18e 100644
--- a/src/treebuilder/modes.h
+++ b/src/treebuilder/modes.h
@@ -34,6 +34,7 @@ typedef enum
AFTER_FRAMESET,
AFTER_AFTER_BODY,
AFTER_AFTER_FRAMESET,
+ IN_TEMPLATE,
GENERIC_RCDATA
} insertion_mode;
@@ -86,5 +87,7 @@ hubbub_error handle_after_after_body(hubbub_treebuilder *treebuilder,
const hubbub_token *token);
hubbub_error handle_after_after_frameset(hubbub_treebuilder *treebuilder,
const hubbub_token *token);
+hubbub_error handle_in_template(hubbub_treebuilder *treebuilder,
+ const hubbub_token *token);
#endif
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index 8f0e7e3..9cc4b12 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -389,6 +389,9 @@ hubbub_error hubbub_treebuilder_token_handler(const hubbub_token *token,
mode(AFTER_AFTER_FRAMESET)
err = handle_after_after_frameset(treebuilder, token);
break;
+ mode(IN_TEMPLATE)
+ err = handle_in_template(treebuilder, token);
+ break;
mode(GENERIC_RCDATA)
err = handle_generic_rcdata(treebuilder, token);
break;
@@ -934,11 +937,11 @@ hubbub_error insert_element(hubbub_treebuilder *treebuilder,
}
/**
- * Close implied end tags
+ * close implied end tags
*
- * \param treebuilder The treebuilder instance
- * \param except Tag type to exclude from processing [DD,DT,LI,OPTION,
- * OPTGROUP,P,RP,RT], UNKNOWN to exclude nothing
+ * \param treebuilder the treebuilder instance
+ * \param except tag type to exclude from processing [dd,dt,li,option,
+ * optgroup,p,rp,rt], unknown to exclude nothing
*/
void close_implied_end_tags(hubbub_treebuilder *treebuilder,
element_type except)
@@ -970,6 +973,39 @@ void close_implied_end_tags(hubbub_treebuilder *treebuilder,
}
/**
+ * close implied end tags "thoroughly"
+ *
+ * \param treebuilder the treebuilder instance
+ */
+void close_implied_end_tags_thorough(hubbub_treebuilder *treebuilder)
+{
+ element_type type;
+
+ type = treebuilder->context.element_stack[
+ treebuilder->context.current_node].type;
+
+ while(type == CAPTION || type == COLGROUP || type == DD ||
+ type == DT || type == LI || type == OPTION ||
+ type == OPTGROUP || type == P || type == RP ||
+ type == RT || type == TBODY || type == TD ||
+ type ==TFOOT || type == TH ||
+ type == THEAD || type == TR) {
+ hubbub_ns ns;
+ element_type otype;
+ void *node;
+
+ element_stack_pop(treebuilder, &ns, &otype, &node);
+
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx,
+ node);
+
+ type = treebuilder->context.element_stack[
+ treebuilder->context.current_node].type;
+ }
+}
+
+/**
* Reset the insertion mode
*
* \param treebuilder The treebuilder to reset
@@ -1027,6 +1063,11 @@ void reset_insertion_mode(hubbub_treebuilder *treebuilder)
case TABLE:
treebuilder->context.mode = IN_TABLE;
return;
+ case TEMPLATE:
+ treebuilder->context.mode =
+ treebuilder->context.template_stack[
+ treebuilder->context.current_template_mode];
+ return;
case HEAD:
/* fragment case */
treebuilder->context.mode = IN_HEAD;
@@ -1820,6 +1861,23 @@ bool is_html_integration (element_type type,
return false;
}
+/**
+ * Check whether the stack of open elements has a template element
+ *
+ * \param treebuilder The treebuilder instance
+ */
+bool template_in_stack (hubbub_treebuilder *treebuilder) {
+ uint32_t i;
+ element_context* stack =
+ treebuilder->context.element_stack;
+ for(i = treebuilder->context.current_node; i > 0;
+ i--) {
+ if(stack[i].type == TEMPLATE) {
+ return true;
+ }
+ }
+ return false;
+}
#ifndef NDEBUG
/**
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=f52e4af53059056fb...
commit f52e4af53059056fbdbef0f9c0879054bc529e74
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
template insertion mode stack implemented
diff --git a/src/tokeniser/tokeniser.c b/src/tokeniser/tokeniser.c
index 66c36d5..a44de07 100644
--- a/src/tokeniser/tokeniser.c
+++ b/src/tokeniser/tokeniser.c
@@ -3263,7 +3263,7 @@ hubbub_error hubbub_tokeniser_handle_cdata_block(hubbub_tokeniser *tokeniser)
c = *cptr;
- if (c == ']' && (tokeniser->context.match_cdata.end >= 0)) {
+ if (c == ']') {
tokeniser->context.pending += len;
tokeniser->context.match_cdata.end += len;
} else if (c == '>' && tokeniser->context.match_cdata.end >= 2) {
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index 5d3c75f..de371b0 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -57,6 +57,7 @@ typedef struct element_context
* instead of the current node." */
void *node; /**< Node pointer */
+
hubbub_attribute *attributes; /**< The attributes associated with
* element*/
size_t n_attributes; /**< Number of attributes associated
@@ -84,6 +85,11 @@ typedef struct hubbub_treebuilder_context
insertion_mode mode; /**< The current insertion mode */
insertion_mode second_mode; /**< The secondary insertion mode */
+#define TEMPLATE_STACK_CHUNK 32
+ insertion_mode *template_stack; /**< The stack of Template insertion modes*/
+ int32_t current_template_mode; /**< The index of template_stack's top element*/
+ uint32_t template_stack_alloc; /**< Number of stack slots allocated */
+
#define ELEMENT_STACK_CHUNK 128
element_context *element_stack; /**< Stack of open elements */
uint32_t stack_alloc; /**< Number of stack slots allocated */
@@ -178,6 +184,12 @@ hubbub_error element_stack_push(hubbub_treebuilder *treebuilder,
hubbub_attribute *attrs, size_t n_attrs);
hubbub_error element_stack_pop(hubbub_treebuilder *treebuilder,
hubbub_ns *ns, element_type *type, void **node);
+
+hubbub_error template_stack_push(hubbub_treebuilder *treebuilder,
+ insertion_mode mode);
+hubbub_error template_stack_pop(hubbub_treebuilder *treebuilder,
+ insertion_mode *mode);
+
hubbub_error element_stack_pop_until(hubbub_treebuilder *treebuilder,
element_type type);
hubbub_error element_stack_remove(hubbub_treebuilder *treebuilder,
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index eb6bb51..8f0e7e3 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -138,6 +138,16 @@ hubbub_error hubbub_treebuilder_create(hubbub_tokeniser *tokeniser,
free(tb);
return HUBBUB_NOMEM;
}
+
+ tb->context.template_stack = malloc(
+ TEMPLATE_STACK_CHUNK * sizeof(insertion_mode));
+ if (tb->context.template_stack == NULL) {
+ free(tb);
+ return HUBBUB_NOMEM;
+ }
+ tb->context.template_stack_alloc = TEMPLATE_STACK_CHUNK;
+ tb->context.current_template_mode = -1;
+
tb->context.stack_alloc = ELEMENT_STACK_CHUNK;
/* We rely on HTML not being equal to zero to determine
* if the first item in the stack is in use. Assert this here. */
@@ -160,6 +170,7 @@ hubbub_error hubbub_treebuilder_create(hubbub_tokeniser *tokeniser,
HUBBUB_TOKENISER_TOKEN_HANDLER, &tokparams);
if (error != HUBBUB_OK) {
free(tb->context.element_stack);
+ free(tb->context.template_stack);
free(tb);
return error;
}
@@ -216,16 +227,21 @@ hubbub_error hubbub_treebuilder_destroy(hubbub_treebuilder *treebuilder)
treebuilder->tree_handler->unref_node(
treebuilder->tree_handler->ctx,
treebuilder->context.element_stack[n].node);
+
}
if (treebuilder->context.element_stack[0].type == HTML) {
treebuilder->tree_handler->unref_node(
treebuilder->tree_handler->ctx,
treebuilder->context.element_stack[0].node);
}
+ /*\todo free attributes?*/
}
free(treebuilder->context.element_stack);
treebuilder->context.element_stack = NULL;
+ free(treebuilder->context.template_stack);
+ treebuilder->context.template_stack = NULL;
+
for (entry = treebuilder->context.formatting_list; entry != NULL;
entry = next) {
next = entry->next;
@@ -235,7 +251,7 @@ hubbub_error hubbub_treebuilder_destroy(hubbub_treebuilder *treebuilder)
treebuilder->tree_handler->ctx,
entry->details.node);
}
-
+ /*\todo free attributes? */
free(entry);
}
@@ -1291,6 +1307,59 @@ hubbub_error element_stack_pop(hubbub_treebuilder *treebuilder,
}
/**
+ * Push an element onto the stack of Template Insertion Modes
+ *
+ * \param treebuilder The treebuilder instance containing the stack
+ * \param mode The insertion mode being pushed
+ * \return HUBBUB_OK on success, appropriate error otherwise.
+ */
+hubbub_error template_stack_push(hubbub_treebuilder *treebuilder,
+ insertion_mode mode)
+{
+ int32_t slot = treebuilder->context.current_template_mode + 1;
+
+ if (slot >= (signed)treebuilder->context.template_stack_alloc) {
+ insertion_mode *temp = realloc(
+ treebuilder->context.template_stack,
+ (treebuilder->context.template_stack_alloc +
+ TEMPLATE_STACK_CHUNK) *
+ sizeof(insertion_mode));
+
+ if (temp == NULL)
+ return HUBBUB_NOMEM;
+
+ treebuilder->context.template_stack = temp;
+ treebuilder->context.template_stack_alloc += TEMPLATE_STACK_CHUNK;
+ }
+
+ treebuilder->context.template_stack[slot] = mode;
+
+ treebuilder->context.current_template_mode = slot;
+
+ return HUBBUB_OK;
+}
+
+/**
+ * Pop an element off the stack of Template Insertion Modes
+ *
+ * \param ns Pointer to location to receive insertion mode
+ * \return HUBBUB_OK on success, appropriate error otherwise.
+ */
+hubbub_error template_stack_pop(hubbub_treebuilder *treebuilder,
+ insertion_mode *mode)
+{
+ int32_t stack =
+ treebuilder->context.current_template_mode;
+ *mode = treebuilder->context.template_stack[stack];
+
+ treebuilder->context.current_template_mode -= 1;
+
+ assert( treebuilder->context.current_template_mode >= -1);
+
+ return HUBBUB_OK;
+}
+
+/**
* Pop elements until an element of type "element" has been popped.
*
* \return HUBBUB_OK on success, appropriate error otherwise.
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=aa3fbf71d4e1938d7...
commit aa3fbf71d4e1938d703b5c2d3623074a5f0b5409
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Enabling some passed tests
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index fade2d6..f8cb288 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -8,8 +8,8 @@ after-after-body.dat html5lib Insertion Mode specific tests
after-after-frameset.dat html5lib Insertion Mode specific tests
after-body.dat html5lib Insertion Mode specific tests
comments01.dat html5lib treebuilder tests
-#doctype01.dat NA
-#domjs-unsafe.dat NA
+doctype01.dat html5lib tests for doctype tag
+domjs-unsafe.dat html5lib tests for special characters
entities01.dat html5lib tests for special characters
entities02.dat html5lib tests for special characters
html5test-com.dat html5lib treebuilder tests
@@ -18,10 +18,10 @@ isindex.dat html5lib treebuilder tests for isindex element
main-element.dat html5lib tests
pending-spec-changes.dat html5lib treebuilder tests
pending-spec-changes-plain-text-unsafe.dat html5lib tests for special characters
-#plain-text-unsafe.dat NA
+plain-text-unsafe.dat html5lib tests for special characters
README.md html5lib treebuilder tests
regression.dat html5lib treebuilder tests
-scriptdata01.dat NA
+scriptdata01.dat html5lib script related treebuilder tests
#scripted/adoption01.dat NA
#scripted/ark.dat NA
#scripted/webkit01.dat NA
@@ -32,13 +32,13 @@ tests11.dat html5lib treebuilder tests
tests12.dat html5lib treebuilder tests
tests14.dat html5lib treebuilder tests
tests15.dat html5lib treebuilder tests
-#tests16.dat NA
+tests16.dat html5lib treebuilder tests
tests17.dat html5lib treebuilder tests
tests18.dat html5lib treebuilder tests
tests19.dat html5lib treebuilder tests
tests1.dat html5lib treebuilder tests
tests20.dat html5lib treebuilder tests
-#tests21.dat NA
+tests21.dat html5lib treebuilder tests
tests22.dat html5lib treebuilder tests
tests23.dat html5lib treebuilder tests
tests24.dat html5lib treebuilder tests
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=db61f45ce72f21702...
commit db61f45ce72f217026c6cfdb513cd7131443566e
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Fixed a bug in cdata block tokenisation. Also fixed handling of br close tag in body
diff --git a/src/tokeniser/tokeniser.c b/src/tokeniser/tokeniser.c
index 500a88d..66c36d5 100644
--- a/src/tokeniser/tokeniser.c
+++ b/src/tokeniser/tokeniser.c
@@ -3255,7 +3255,7 @@ hubbub_error hubbub_tokeniser_handle_cdata_block(hubbub_tokeniser *tokeniser)
if (error != PARSERUTILS_OK) {
if (error == PARSERUTILS_EOF) {
tokeniser->state = STATE_DATA;
- return emit_current_chars(tokeniser);
+ return HUBBUB_OK;
} else {
return hubbub_error_from_parserutils_error(error);
}
@@ -3263,17 +3263,18 @@ hubbub_error hubbub_tokeniser_handle_cdata_block(hubbub_tokeniser *tokeniser)
c = *cptr;
- if (c == ']' && (tokeniser->context.match_cdata.end == 0 ||
- tokeniser->context.match_cdata.end == 1)) {
+ if (c == ']' && (tokeniser->context.match_cdata.end >= 0)) {
tokeniser->context.pending += len;
tokeniser->context.match_cdata.end += len;
- } else if (c == '>' && tokeniser->context.match_cdata.end == 2) {
+ } else if (c == '>' && tokeniser->context.match_cdata.end >= 2) {
/* Remove the previous two "]]" */
tokeniser->context.pending -= 2;
tokeniser->context.match_cdata.end = 0;
/* Emit any pending characters */
- emit_current_chars(tokeniser);
+ if(tokeniser->context.pending > 0) {
+ emit_current_chars(tokeniser);
+ }
/* Now move past the "]]>" bit */
parserutils_inputstream_advance(tokeniser->input, SLEN("]]>"));
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index 33b563e..bd73f08 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -1187,7 +1187,7 @@ hubbub_error process_hr_in_body(hubbub_treebuilder *treebuilder,
hubbub_error err;
if (element_in_scope(treebuilder, P, BUTTON_SCOPE)) {
- err = process_0p_in_body(treebuilder);
+ err = close_p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
}
@@ -2522,6 +2522,8 @@ hubbub_error process_0br_in_body(hubbub_treebuilder *treebuilder)
if (err != HUBBUB_OK)
return err;
+ treebuilder->context.frameset_ok = false;
+
return insert_element(treebuilder, &tag, false);
}
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=7ef24e7e48c967756...
commit 7ef24e7e48c9677567edfb96b7040e2f55940518
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Correctly handled NULL characters at some places
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index dcccdd0..33b563e 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -204,6 +204,10 @@ hubbub_error process_character(hubbub_treebuilder *treebuilder,
bool lr_flag = treebuilder->context.strip_leading_lr;
const uint8_t *p;
+ if(dummy.ptr[0] == '\0') {
+ return HUBBUB_OK;
+ }
+
err = reconstruct_active_formatting_list(treebuilder);
if (err != HUBBUB_OK)
return err;
diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c
index 97fb1d0..ddade53 100644
--- a/src/treebuilder/in_foreign_content.c
+++ b/src/treebuilder/in_foreign_content.c
@@ -20,6 +20,12 @@
#define S(s) s, SLEN(s)
/**
+ * UTF-8 encoding of U+FFFD REPLACEMENT CHARACTER
+ */
+static const uint8_t u_fffd[3] = { '\xEF', '\xBF', '\xBD' };
+static const hubbub_string u_fffd_str = { u_fffd, sizeof(u_fffd) };
+
+/**
* Mapping table for case changes
*/
typedef struct
@@ -436,9 +442,11 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
is_mathml_text_integration(cur_node, cur_node_ns)) {
return process_as_in_secondary(treebuilder, token);
}
-
c = (token->data.character.ptr);
- if(*c != '\t' && *c != '\r' && *c != ' ' && *c != '\n' && *c != '\f') {
+ if(c[0] == '\0') {
+ err = append_text(treebuilder, &u_fffd_str);
+ return err;
+ } else if(*c != '\t' && *c != '\r' && *c != ' ' && *c != '\n' && *c != '\f') {
treebuilder->context.frameset_ok = false;
}
diff --git a/src/treebuilder/in_select.c b/src/treebuilder/in_select.c
index 7c15b49..7675dc5 100644
--- a/src/treebuilder/in_select.c
+++ b/src/treebuilder/in_select.c
@@ -32,6 +32,9 @@ hubbub_error handle_in_select(hubbub_treebuilder *treebuilder,
switch (token->type) {
case HUBBUB_TOKEN_CHARACTER:
+ if((token->data.character.ptr[0]) == '\0') {
+ break;
+ }
err = append_text(treebuilder, &token->data.character);
break;
case HUBBUB_TOKEN_COMMENT:
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=b791a7f3067a7716b...
commit b791a7f3067a7716b2b4b9b473c6d3055508d00d
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Merged the updates to tests made a few days ago
diff --git a/test/data/tokeniser2/contentModelFlags.test b/test/data/tokeniser2/contentModelFlags.test
index a8b1695..89b8170 100644
--- a/test/data/tokeniser2/contentModelFlags.test
+++ b/test/data/tokeniser2/contentModelFlags.test
@@ -48,6 +48,12 @@
"input":"</foo>bar</xmp>",
"output":[["Character", "</foo>bar"], ["EndTag", "xmp"]]},
+{"description":"Partial end tags leading straight into partial end tags",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"</xmp</xmp</xmp>",
+"output":[["Character", "</xmp</xmp"], ["EndTag", "xmp"]]},
+
{"description":"End tag with incorrect name in RCDATA or RAWTEXT (starting like correct name)",
"initialStates":["RCDATA state", "RAWTEXT state"],
"lastStartTag":"xmp",
diff --git a/test/data/tokeniser2/domjs.test b/test/data/tokeniser2/domjs.test
index afb17bc..ce37883 100644
--- a/test/data/tokeniser2/domjs.test
+++ b/test/data/tokeniser2/domjs.test
@@ -11,13 +11,20 @@
"output":["ParseError", ["Comment", "?\u000a"]]
},
{
+ "description":"CRLFLF in bogus comment state",
+ "input":"<?\u000d\u000a\u000a",
+ "output":["ParseError", ["Comment", "?\u000a\u000a"]]
+ },
+ {
"description":"NUL in RCDATA and RAWTEXT",
+ "doubleEscaped":true,
"initialStates":["RCDATA state", "RAWTEXT state"],
"input":"\u0000",
"output":["ParseError", ["Character", "\uFFFD"]]
},
{
"description":"leading U+FEFF must pass through",
+ "doubleEscaped":true,
"input":"\\uFEFFfoo\\uFEFFbar",
"output":[["Character", "\\uFEFFfoo\\uFEFFbar"]]
},
@@ -75,6 +82,7 @@
},
{
"description":"--!NUL in comment ",
+ "doubleEscaped":true,
"input":"<!----!\u0000-->",
"output":["ParseError", "ParseError", ["Comment", "--!\uFFFD"]]
},
diff --git a/test/data/tokeniser2/xmlViolation.test b/test/data/tokeniser2/xmlViolation.test
index 93c6351..137d964 100644
--- a/test/data/tokeniser2/xmlViolation.test
+++ b/test/data/tokeniser2/xmlViolation.test
@@ -1,4 +1,4 @@
-{"tests": [
+{"xmlViolationTests": [
{"description":"Non-XML character",
"input":"a\uFFFFb",
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=05d1b645d8fe3c539...
commit 05d1b645d8fe3c53965df6f621a69405db036df8
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Minor fixes to charset detection. Currently pre-scanning upto 1024 bytes. Removed larger cases in which encoding declaration is beyond 512 bytes, for the time-being. Also removed some outdated tests.
diff --git a/src/charset/detect.c b/src/charset/detect.c
index fd3de13..ebd6b32 100644
--- a/src/charset/detect.c
+++ b/src/charset/detect.c
@@ -215,13 +215,13 @@ uint16_t hubbub_charset_scan_meta(const uint8_t *data, size_t len)
if (data == NULL)
return 0;
- end = pos + min(512, len);
+ end = pos + min(1024, len);
/* 1. */
while (pos < end) {
/* a */
if (PEEK("<!--")) {
- pos += SLEN("<!--");
+ pos += SLEN("<!");
ADVANCE("-->");
/* b */
} else if (PEEK("<meta")) {
@@ -303,6 +303,8 @@ uint16_t hubbub_charset_parse_attributes(const uint8_t **pos,
const uint8_t *value;
uint32_t namelen, valuelen;
uint16_t mibenum = 0;
+ bool got_pragma = false;
+ bool need_pragma = true;
if (pos == NULL || *pos == NULL || end == NULL)
return 0;
@@ -327,12 +329,23 @@ uint16_t hubbub_charset_parse_attributes(const uint8_t **pos,
mibenum = parserutils_charset_mibenum_from_name(
(const char *) value, valuelen);
+ need_pragma = false;
/* 5 */
+
} else if (namelen == SLEN("content") && valuelen > 0 &&
strncasecmp((const char *) name, "content",
- SLEN("content")) == 0) {
+ SLEN("content")) == 0 &&
+ mibenum == 0) {
mibenum = hubbub_charset_parse_content(value,
valuelen);
+ need_pragma = true;
+ } else if (namelen == SLEN("http-equiv") && valuelen ==
+ SLEN("content-type") && strncasecmp((const char *)
+ value, "content-type",
+ SLEN("content-type")) == 0 &&
+ strncasecmp((const char *) name, "http-equiv",
+ SLEN("http-equiv")) == 0) {
+ got_pragma = true;
}
/* 6 */
@@ -349,12 +362,14 @@ uint16_t hubbub_charset_parse_attributes(const uint8_t **pos,
}
/* 7 */
- if (mibenum != 0) {
+
+ }
+ if (mibenum != 0) {
+ if(got_pragma != false || need_pragma != true) {
/* confidence = tentative; */
return mibenum;
}
}
-
return 0;
}
@@ -505,13 +520,6 @@ bool hubbub_charset_get_attribute(const uint8_t **data, const uint8_t *end,
return false;
}
- /* 2. Invalid element open character */
- if (*pos == '<') {
- pos--;
- *data = pos;
- return false;
- }
-
/* 3. End of element */
if (*pos == '>') {
*data = pos;
@@ -537,7 +545,7 @@ bool hubbub_charset_get_attribute(const uint8_t **data, const uint8_t *end,
}
/* c */
- if (*pos == '/' || *pos == '<' || *pos == '>') {
+ if (*pos == '/' || *pos == '>') {
*data = pos;
return true;
}
@@ -631,7 +639,7 @@ bool hubbub_charset_get_attribute(const uint8_t **data, const uint8_t *end,
while (pos < end) {
/* 12. Extract unquoted value */
/* a */
- if (ISSPACE(*pos) || *pos == '<' || *pos == '>') {
+ if (ISSPACE(*pos) || *pos == '>') {
*data = pos;
return true;
}
diff --git a/test/data/csdetect/INDEX b/test/data/csdetect/INDEX
index f873854..253bfb5 100644
--- a/test/data/csdetect/INDEX
+++ b/test/data/csdetect/INDEX
@@ -5,7 +5,7 @@
bom.dat UTF Byte Order Mark detection tests
non-ascii-meta.dat Tests for meta charsets claiming to be non-ASCII
test-yahoo-jp.dat Yahoo! Japan, from html5lib testcases
-tests1.dat Assorted tests, including edge cases, from html5lib
+#tests1.dat This set has some outdated cases, so permanantely disabled
tests2.dat Further tests from html5lib
regression.dat Regression tests
overrides.dat Character encoding overrides from 8.2.2.2.
diff --git a/test/data/encoding/INDEX b/test/data/encoding/INDEX
index 98cfb7c..82693a7 100644
--- a/test/data/encoding/INDEX
+++ b/test/data/encoding/INDEX
@@ -2,7 +2,7 @@
#
# Test Description
-#tests1.dat html5lib tests (part 1)
-#tests2.dat html5lib tests (part 2)
+tests1.dat html5lib tests (part 1)
+tests2.dat html5lib tests (part 2)
test-yahoo-jp.dat html5lib tests (part 3)
diff --git a/test/data/encoding/tests1.dat b/test/data/encoding/tests1.dat
index 5b585e7..4df9c7e 100644
--- a/test/data/encoding/tests1.dat
+++ b/test/data/encoding/tests1.dat
@@ -298,63 +298,6 @@ iso8859-2
#encoding
iso8859-2
-#data
-<!-- 1024 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-->
-<meta charset="iso8859-2">
-#encoding
-iso8859-2
-
-#data
-<!-- 1025 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz-->
-<meta charset="iso8859-2">
-#encoding
-iso8859-2
-
-#data
-<!-- 2048 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-->
-<meta charset="iso8859-2">
-#encoding
-iso8859-2
-
-#data
-<!-- 2049 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz-->
-<meta charset="iso8859-2">
-#encoding
-iso8859-2
-
-#data
-<!-- 4096 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-->
-<meta charset="iso8859-2">
-#encoding
-iso8859-2
-
-#data
-<!-- 4097 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz-->
-<meta charset="iso8859-2">
-#encoding
-iso8859-2
-
-#data
-<!-- 8192 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-->
-<meta charset="iso8859-2">
-#encoding
-iso8859-2
-
-#data
-<!-- 8193 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz-->
-<meta charset="iso8859-2">
-#encoding
-iso8859-2
-
-#data
-<!-- multi-script test -->
-<script>alert('step 1 of 3 ("�")')</script>
-<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
-<script>alert('step 2 of 3 ("�")')</script>
-<meta charset="iso8859-2">
-<script>alert('step 3 of 3 ("�")')</script>
-#encoding
-iso8859-2
#data
<!DOCTYPE HTML>
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=c2eec322dd1e4cedc...
commit c2eec322dd1e4cedcedc284849021da9620e9bf3
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
fixed small space errors in printing of nodes
diff --git a/test/tree2.c b/test/tree2.c
index 15e9901..e769221 100644
--- a/test/tree2.c
+++ b/test/tree2.c
@@ -856,9 +856,9 @@ static void node_print(buf_t *buf, node_t *node, unsigned depth)
if (node->data.doctype.public_id) {
buf_add(buf, " \"");
buf_add(buf, node->data.doctype.public_id);
- buf_add(buf, "\" ");
+ buf_add(buf, "\"");
} else {
- buf_add(buf, "\"\" ");
+ buf_add(buf, " \"\"");
}
if (node->data.doctype.system_id) {
@@ -866,7 +866,7 @@ static void node_print(buf_t *buf, node_t *node, unsigned depth)
buf_add(buf, node->data.doctype.system_id);
buf_add(buf, "\"");
} else {
- buf_add(buf, "\"\"");
+ buf_add(buf, " \"\"");
}
}
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=6a734926f4901c196...
commit 6a734926f4901c1963570d902e31e3c74a14cba6
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
tiny fix in tester & enabling some tests
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index c249b98..fade2d6 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -12,12 +12,12 @@ comments01.dat html5lib treebuilder tests
#domjs-unsafe.dat NA
entities01.dat html5lib tests for special characters
entities02.dat html5lib tests for special characters
-#html5test-com.dat NA
+html5test-com.dat html5lib treebuilder tests
inbody01.dat html5lib Insertion Mode specific tests
isindex.dat html5lib treebuilder tests for isindex element
-#main-element.dat NA
+main-element.dat html5lib tests
pending-spec-changes.dat html5lib treebuilder tests
-#pending-spec-changes-plain-text-unsafe.dat NA
+pending-spec-changes-plain-text-unsafe.dat html5lib tests for special characters
#plain-text-unsafe.dat NA
README.md html5lib treebuilder tests
regression.dat html5lib treebuilder tests
diff --git a/test/tree2.c b/test/tree2.c
index d5d4c72..15e9901 100644
--- a/test/tree2.c
+++ b/test/tree2.c
@@ -251,7 +251,7 @@ int main(int argc, char **argv)
assert(hubbub_parser_completed(parser) == HUBBUB_OK);
state = READING_ERRORS;
} else {
- size_t len = strlen(line);
+ size_t len = parse_strlen(line,sizeof line);
if (state == READING_DATA_AFTER_FIRST) {
assert(hubbub_parser_parse_chunk(parser,
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=59beca91857b5d026...
commit 59beca91857b5d026dcf6bea9abc1f96e504b80d
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
This is perhaps the best way to treat an incoming script content_model_flag. Black-boxing is mantained, & a switch is allowed only to a script data state. Script content model can't be incorporated in the style of rcdata & rawtext data, wherein it was easy to make a 1to1 matching between handlers and states. Also fixed the tokeniser to properly handle script tags. tokeniser was earlier modified in commit 7b6b8eb6fcbdd175540902ca699e7e704b90f9e0, has now been tested & bugs removed. Additionaly, in every loop of the dispatcher, it will be checked whether it is safe for tokeniser to process CDATA, and corresponding opts on the tokeniser will be set. this may slow the library down because of repeated checking in every loop. The tokeniser code has become unbearably messy due to the script tags, so a little tiding up & optimisation will be done later ;)
diff --git a/include/hubbub/types.h b/include/hubbub/types.h
index 6e2b1a9..a812e9f 100644
--- a/include/hubbub/types.h
+++ b/include/hubbub/types.h
@@ -34,7 +34,8 @@ typedef enum hubbub_content_model {
HUBBUB_CONTENT_MODEL_RCDATA,
HUBBUB_CONTENT_MODEL_CDATA,
HUBBUB_CONTENT_MODEL_PLAINTEXT,
- HUBBUB_CONTENT_MODEL_RAWTEXT
+ HUBBUB_CONTENT_MODEL_RAWTEXT,
+ HUBBUB_CONTENT_MODEL_SCRIPTDATA
} hubbub_content_model;
/**
diff --git a/src/tokeniser/tokeniser.c b/src/tokeniser/tokeniser.c
index 1d16ba4..500a88d 100644
--- a/src/tokeniser/tokeniser.c
+++ b/src/tokeniser/tokeniser.c
@@ -426,7 +426,17 @@ hubbub_error hubbub_tokeniser_setopt(hubbub_tokeniser *tokeniser,
tokeniser->error_pw = params->error_handler.pw;
break;
case HUBBUB_TOKENISER_CONTENT_MODEL:
- tokeniser->content_model = params->content_model.model;
+ if(params->content_model.model == HUBBUB_CONTENT_MODEL_SCRIPTDATA) {
+ /*There is no other way to achieve this switch,
+ since we have multiple states coming
+ into some handlers. The only way to
+ avoid this is to not club the states at all,
+ and have standalone handlers for each state in
+ script domain.*/
+ tokeniser->state = STATE_SCRIPT_DATA;
+ } else {
+ tokeniser->content_model = params->content_model.model;
+ }
break;
case HUBBUB_TOKENISER_PROCESS_CDATA:
tokeniser->process_cdata_section = params->process_cdata;
@@ -774,6 +784,7 @@ hubbub_error hubbub_tokeniser_handle_data(hubbub_tokeniser *tokeniser)
/* Buffer '<' */
tokeniser->context.pending = len;
+
if(tokeniser->state == STATE_SCRIPT_DATA) {
tokeniser->state = STATE_SCRIPT_DATA_LESS_THAN;
} else if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED) {
@@ -813,15 +824,15 @@ hubbub_error hubbub_tokeniser_handle_data(hubbub_tokeniser *tokeniser)
}
/* Emit a null or a replacement character */
- if(tokeniser->content_model != HUBBUB_CONTENT_MODEL_PCDATA) {
+ if(tokeniser->content_model != HUBBUB_CONTENT_MODEL_PCDATA ||
+ tokeniser->state == STATE_SCRIPT_DATA ||
+ tokeniser->state == STATE_SCRIPT_DATA_ESCAPED ||
+ tokeniser->state == STATE_SCRIPT_DATA_DOUBLE_ESCAPED) {
emit_character_token(tokeniser, &u_fffd_str);
} else {
emit_character_token(tokeniser, &u_null_str);
}
- if(tokeniser->state == STATE_SCRIPT_DATA_DOUBLE_ESCAPED ||
- tokeniser->state == STATE_SCRIPT_DATA_ESCAPED) {
- tokeniser->state = STATE_DATA;
- }
+
/* Advance past NUL */
parserutils_inputstream_advance(tokeniser->input, 1);
} else if (c == '\r' && tokeniser->content_model != HUBBUB_CONTENT_MODEL_PLAINTEXT) {
@@ -855,14 +866,22 @@ hubbub_error hubbub_tokeniser_handle_data(hubbub_tokeniser *tokeniser)
tokeniser->state = STATE_SCRIPT_DATA_ESCAPED_DASH;
}
tokeniser->context.pending += len;
+ break;
} else {
/* Just collect into buffer */
tokeniser->context.pending += len;
}
}
- if (tokeniser->state != STATE_TAG_OPEN &&
- (tokeniser->state != STATE_DATA || error == PARSERUTILS_EOF) &&
+ if (tokeniser->state != STATE_SCRIPT_DATA_LESS_THAN &&
+ tokeniser->state != STATE_SCRIPT_DATA_ESCAPED_LESS_THAN &&
+ tokeniser->state != STATE_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN &&
+ tokeniser->state != STATE_TAG_OPEN &&
+ ((tokeniser->state != STATE_DATA &&
+ tokeniser->state != STATE_SCRIPT_DATA &&
+ tokeniser->state != STATE_SCRIPT_DATA_ESCAPED &&
+ tokeniser->state != STATE_SCRIPT_DATA_DOUBLE_ESCAPED) ||
+ error == PARSERUTILS_EOF) &&
tokeniser->context.pending > 0) {
/* Emit any pending characters */
emit_current_chars(tokeniser);
@@ -872,9 +891,7 @@ hubbub_error hubbub_tokeniser_handle_data(hubbub_tokeniser *tokeniser)
/* there is no need to switch from SCRIPT_DATA or
the SCRIPT_DATA_ESCAPED states to the DATA state because
all the neccessary emitting is being done here itself.
- Still, this is being done here to mantain the conformance
- to specs */
- tokeniser->state = STATE_DATA;
+ */
token.type = HUBBUB_TOKEN_EOF;
hubbub_tokeniser_emit_token(tokeniser, &token);
}
@@ -952,7 +969,6 @@ hubbub_error hubbub_tokeniser_handle_tag_open(hubbub_tokeniser *tokeniser)
const uint8_t *cptr;
parserutils_error error;
uint8_t c;
-
assert(tokeniser->context.pending == 1);
/* assert(tokeniser->context.chars.ptr[0] == '<'); */
@@ -996,7 +1012,6 @@ hubbub_error hubbub_tokeniser_handle_tag_open(hubbub_tokeniser *tokeniser)
if(tokeniser->state == STATE_SCRIPT_DATA_LESS_THAN) {
tokeniser->state = STATE_SCRIPT_DATA_ESCAPE_START;
tokeniser->context.pending += len;
- return emit_current_chars(tokeniser);
} else {
parserutils_inputstream_advance(tokeniser->input,
SLEN("<!"));
@@ -1069,7 +1084,9 @@ hubbub_error hubbub_tokeniser_handle_close_tag_open(hubbub_tokeniser *tokeniser)
if (tokeniser->content_model == HUBBUB_CONTENT_MODEL_RCDATA ||
tokeniser->content_model == HUBBUB_CONTENT_MODEL_RAWTEXT ||
tokeniser->content_model ==
- HUBBUB_CONTENT_MODEL_CDATA) {
+ HUBBUB_CONTENT_MODEL_CDATA ||
+ tokeniser->state == STATE_SCRIPT_DATA_END_TAG_OPEN ||
+ tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_END_TAG_OPEN) {
uint8_t *start_tag_name =
tokeniser->context.last_start_tag_name;
size_t start_tag_len =
@@ -1233,21 +1250,20 @@ hubbub_error hubbub_tokeniser_handle_tag_name(hubbub_tokeniser *tokeniser)
if (error != PARSERUTILS_OK) {
if (error == PARSERUTILS_EOF) {
- tokeniser->state = STATE_DATA;
if(tokeniser->content_model == HUBBUB_CONTENT_MODEL_RCDATA ||
tokeniser->content_model == HUBBUB_CONTENT_MODEL_RAWTEXT) {
- return emit_current_chars(tokeniser);
+ tokeniser->state = STATE_DATA;
} else if(tokeniser->state == STATE_SCRIPT_DATA_END_TAG_NAME) {
tokeniser->state = STATE_SCRIPT_DATA;
- return emit_current_chars(tokeniser);
} else if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_END_TAG_NAME) {
tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
- return emit_current_chars(tokeniser);
} else {
parserutils_inputstream_advance(tokeniser->input,
tokeniser->context.pending);
+ tokeniser->state = STATE_DATA;
return HUBBUB_OK;
}
+ return emit_current_chars(tokeniser);
} else {
return hubbub_error_from_parserutils_error(error);
}
@@ -1262,8 +1278,10 @@ hubbub_error hubbub_tokeniser_handle_tag_name(hubbub_tokeniser *tokeniser)
COLLECT(ctag->name, &c, len);
tokeniser->context.pending += len;
} else if (tokeniser->context.close_tag_match.match == false &&
- tokeniser->content_model !=
- HUBBUB_CONTENT_MODEL_PCDATA) {
+ (tokeniser->content_model !=
+ HUBBUB_CONTENT_MODEL_PCDATA ||
+ tokeniser->state == STATE_SCRIPT_DATA_END_TAG_NAME ||
+ tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_END_TAG_NAME)) {
/* We should emit "</" here, but instead we leave it in the
* buffer so the data state emits it with any characters
* following it */
@@ -1274,8 +1292,6 @@ hubbub_error hubbub_tokeniser_handle_tag_name(hubbub_tokeniser *tokeniser)
} else {
tokeniser->state = STATE_DATA;
}
-
- return emit_current_chars(tokeniser);
} else {
if (c == '\t' || c == '\n' || c == '\f' || c == ' ' || c == '\r') {
tokeniser->context.pending += len;
@@ -1296,10 +1312,10 @@ hubbub_error hubbub_tokeniser_handle_tag_name(hubbub_tokeniser *tokeniser)
return emit_current_chars(tokeniser);
} else if(tokeniser->state == STATE_SCRIPT_DATA_END_TAG_NAME) {
tokeniser->state = STATE_SCRIPT_DATA;
- tokeniser->context.pending += len;
+ return emit_current_chars(tokeniser);
} else if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_END_TAG_NAME) {
tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
- tokeniser->context.pending += len;
+ return emit_current_chars(tokeniser);
} else {
COLLECT(ctag->name, cptr, len);
tokeniser->context.pending += len;
@@ -1322,7 +1338,7 @@ hubbub_error hubbub_tokeniser_handle_script_data_escaped_dash(hubbub_tokeniser *
if (error != PARSERUTILS_OK) {
if (error == PARSERUTILS_EOF) {
tokeniser->state = STATE_DATA;
- return emit_current_chars(tokeniser);
+ return HUBBUB_OK;
} else {
return hubbub_error_from_parserutils_error(error);
}
@@ -1339,8 +1355,10 @@ hubbub_error hubbub_tokeniser_handle_script_data_escaped_dash(hubbub_tokeniser *
tokeniser->context.pending += len;
} else if(c == '<') {
- /*emit any pending characters*/
- emit_current_chars(tokeniser);
+ if(tokeniser->context.pending > 0) {
+ /*emit any pending characters*/
+ emit_current_chars(tokeniser);
+ }
if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_DASH ||
tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_DASH_DASH) {
tokeniser->state = STATE_SCRIPT_DATA_ESCAPED_LESS_THAN;
@@ -1362,8 +1380,6 @@ hubbub_error hubbub_tokeniser_handle_script_data_escaped_dash(hubbub_tokeniser *
if(err != HUBBUB_OK)
return err;
- tokeniser->context.pending += len;
-
parserutils_inputstream_advance(tokeniser->input, len);
if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_DASH ||
@@ -1399,21 +1415,27 @@ hubbub_error hubbub_tokeniser_handle_script_data_escaped_less_than(hubbub_tokeni
if(error != PARSERUTILS_OK) {
if (error == PARSERUTILS_EOF) {
if(tokeniser->state == STATE_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN) {
- tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
- } else {
tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPED;
+ } else {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
}
- return emit_current_chars(tokeniser);
+ return HUBBUB_OK;
} else {
return hubbub_error_from_parserutils_error(error);
}
}
c = *cptr;
-
if (c == '/') {
tokeniser->context.pending += len;
+ tokeniser->context.close_tag_match.match = false;
+ tokeniser->context.close_tag_match.count = 0;
+
if(tokeniser->state == STATE_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN) {
+ START_BUF(ctag->name, "", 0);
+ ctag->n_attributes = 0;
+ tokeniser->context.current_tag_type =
+ HUBBUB_TOKEN_END_TAG;
tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPE_END;
} else {
tokeniser->state = STATE_SCRIPT_DATA_ESCAPED_END_TAG_OPEN;
@@ -1443,6 +1465,7 @@ hubbub_error hubbub_tokeniser_handle_script_data_escaped_less_than(hubbub_tokeni
tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPE_START;
} else {
tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
+ return emit_current_chars(tokeniser);
}
return HUBBUB_OK;
}
@@ -1499,7 +1522,7 @@ hubbub_error hubbub_tokeniser_handle_script_data_double_escape_start(hubbub_toke
} else {
tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
}
- return emit_current_chars(tokeniser);
+ return HUBBUB_OK;
} else {
return hubbub_error_from_parserutils_error(error);
}
@@ -1509,7 +1532,7 @@ hubbub_error hubbub_tokeniser_handle_script_data_double_escape_start(hubbub_toke
if (c == '\t' || c == '\f' || c == '\r' || c == ' ' || c == '/' ||
c == '>') {
- if(hubbub_string_match_ci(ctag->name.ptr,
+ if(hubbub_string_match_ci(tokeniser->buffer->data,
ctag->name.len,
S("script"))) {
if(end) {
@@ -1526,12 +1549,13 @@ hubbub_error hubbub_tokeniser_handle_script_data_double_escape_start(hubbub_toke
}
tokeniser->context.pending += len;
+ return emit_current_chars(tokeniser);
} else if ('A' <= c && c <= 'Z') {
uint8_t lc = (c + 0x20);
- COLLECT(ctag->name, &lc, len);
+ COLLECT_MS(ctag->name, &lc, len);
tokeniser->context.pending += len;
} else if('a' <=c && c <= 'z') {
- COLLECT(ctag->name, &c, len);
+ COLLECT_MS(ctag->name, &c, len);
tokeniser->context.pending += len;
} else {
if(end) {
@@ -3246,6 +3270,7 @@ hubbub_error hubbub_tokeniser_handle_cdata_block(hubbub_tokeniser *tokeniser)
} else if (c == '>' && tokeniser->context.match_cdata.end == 2) {
/* Remove the previous two "]]" */
tokeniser->context.pending -= 2;
+ tokeniser->context.match_cdata.end = 0;
/* Emit any pending characters */
emit_current_chars(tokeniser);
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index d684702..dcccdd0 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -325,7 +325,7 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
treebuilder->context.frameset_ok = false;
- err = parse_generic_rcdata(treebuilder, token, false);
+ err = parse_generic_rcdata(treebuilder, token, HUBBUB_CONTENT_MODEL_RAWTEXT);
} else if (type == TABLE) {
if(treebuilder->quirks_mode != HUBBUB_QUIRKS_MODE_FULL &&
element_in_scope(treebuilder, P,
@@ -384,7 +384,7 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
type == NOSCRIPT)) {
if (type == IFRAME)
treebuilder->context.frameset_ok = false;
- err = parse_generic_rcdata(treebuilder, token, false);
+ err = parse_generic_rcdata(treebuilder, token, HUBBUB_CONTENT_MODEL_RAWTEXT);
} else if (type == SELECT) {
err = process_select_in_body(treebuilder, token);
if (err != HUBBUB_OK)
@@ -1403,7 +1403,7 @@ hubbub_error process_textarea_in_body(hubbub_treebuilder *treebuilder,
{
treebuilder->context.strip_leading_lr = true;
treebuilder->context.frameset_ok = false;
- return parse_generic_rcdata(treebuilder, token, true);
+ return parse_generic_rcdata(treebuilder, token, HUBBUB_CONTENT_MODEL_RCDATA);
}
/**
diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c
index 73a061d..97fb1d0 100644
--- a/src/treebuilder/in_foreign_content.c
+++ b/src/treebuilder/in_foreign_content.c
@@ -551,12 +551,13 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
hubbub_ns ns;
element_type type;
void *node_iterator;
- while(node_iterator !=stack[node].node) {
+ void *vnode = stack[node].node;
+ do{
element_stack_pop(treebuilder, &ns, &type, &node_iterator);
treebuilder->tree_handler->unref_node(
treebuilder->tree_handler->ctx,
node_iterator);
- }
+ } while(node_iterator != vnode);
return HUBBUB_OK;
}
if(stack[node].ns == HUBBUB_NS_HTML) {
diff --git a/src/treebuilder/in_head.c b/src/treebuilder/in_head.c
index 9568789..52a2e3f 100644
--- a/src/treebuilder/in_head.c
+++ b/src/treebuilder/in_head.c
@@ -142,13 +142,13 @@ hubbub_error handle_in_head(hubbub_treebuilder *treebuilder,
} else if (type == META) {
err = process_meta_in_head(treebuilder, token);
} else if (type == TITLE) {
- err = parse_generic_rcdata(treebuilder, token, true);
+ err = parse_generic_rcdata(treebuilder, token, HUBBUB_CONTENT_MODEL_RCDATA);
} else if (type == NOFRAMES || type == STYLE) {
- err = parse_generic_rcdata(treebuilder, token, false);
+ err = parse_generic_rcdata(treebuilder, token, HUBBUB_CONTENT_MODEL_RAWTEXT);
} else if (type == NOSCRIPT) {
if (treebuilder->context.enable_scripting) {
err = parse_generic_rcdata(treebuilder, token,
- false);
+ HUBBUB_CONTENT_MODEL_RAWTEXT);
} else {
err = insert_element(treebuilder,
&token->data.tag, true);
@@ -161,7 +161,7 @@ hubbub_error handle_in_head(hubbub_treebuilder *treebuilder,
/** \todo need to ensure that the client callback
* sets the parser-inserted/already-executed script
* flags. */
- err = parse_generic_rcdata(treebuilder, token, false);
+ err = parse_generic_rcdata(treebuilder, token, HUBBUB_CONTENT_MODEL_SCRIPTDATA);
} else if (type == HEAD) {
/** \todo parse error */
} else {
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index a5f0b22..5d3c75f 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -146,7 +146,7 @@ hubbub_error process_in_table_text(
hubbub_error process_comment_append(hubbub_treebuilder *treebuilder,
const hubbub_token *token, void *parent);
hubbub_error parse_generic_rcdata(hubbub_treebuilder *treebuilder,
- const hubbub_token *token, bool rcdata);
+ const hubbub_token *token, hubbub_content_model content_model);
uint32_t element_in_scope(hubbub_treebuilder *treebuilder,
element_type type, element_scope scope);
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index 568a589..eb6bb51 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -379,6 +379,14 @@ hubbub_error hubbub_treebuilder_token_handler(const hubbub_token *token,
}
}
+ hubbub_tokeniser_optparams params;
+ hubbub_error e;
+ params.process_cdata = (treebuilder->context.element_stack[
+ treebuilder->context.current_node].ns != HUBBUB_NS_HTML);
+ e = hubbub_tokeniser_setopt(treebuilder->tokeniser, HUBBUB_TOKENISER_PROCESS_CDATA, ¶ms);
+ UNUSED(e);
+ assert(e == HUBBUB_OK);
+
return err;
}
@@ -523,11 +531,11 @@ hubbub_error process_comment_append(hubbub_treebuilder *treebuilder,
*
* \param treebuilder The treebuilder instance
* \param token The current token
- * \param rcdata True for RCDATA, false for CDATA
+ * \param content_model The content-model in which the algorithm is being evoked
* \return HUBBUB_OK on success, appropriate error otherwise
*/
hubbub_error parse_generic_rcdata(hubbub_treebuilder *treebuilder,
- const hubbub_token *token, bool rcdata)
+ const hubbub_token *token, hubbub_content_model content_model)
{
hubbub_error error;
element_type type;
@@ -539,10 +547,10 @@ hubbub_error parse_generic_rcdata(hubbub_treebuilder *treebuilder,
if (error != HUBBUB_OK)
return error;
- params.content_model.model = rcdata ? HUBBUB_CONTENT_MODEL_RCDATA
- : HUBBUB_CONTENT_MODEL_RAWTEXT;
+ params.content_model.model = content_model;
error = hubbub_tokeniser_setopt(treebuilder->tokeniser,
- HUBBUB_TOKENISER_CONTENT_MODEL, ¶ms);
+ HUBBUB_TOKENISER_CONTENT_MODEL, ¶ms);
+
/* There is no way that setopt can fail. Ensure this. */
assert(error == HUBBUB_OK);
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index 45126b7..c249b98 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -21,7 +21,7 @@ pending-spec-changes.dat html5lib treebuilder tests
#plain-text-unsafe.dat NA
README.md html5lib treebuilder tests
regression.dat html5lib treebuilder tests
-#scriptdata01.dat NA
+scriptdata01.dat NA
#scripted/adoption01.dat NA
#scripted/ark.dat NA
#scripted/webkit01.dat NA
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=87c7febfe9502f302...
commit 87c7febfe9502f302453ac4140562fe245f71b6c
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Fixed dd/dt/li start tag handler once again. Also fixed resting of insertion mode. Also fixed some things in after_after_frameset state
diff --git a/src/treebuilder/after_after_frameset.c b/src/treebuilder/after_after_frameset.c
index f068714..e9d1176 100644
--- a/src/treebuilder/after_after_frameset.c
+++ b/src/treebuilder/after_after_frameset.c
@@ -25,23 +25,28 @@ hubbub_error handle_after_after_frameset(hubbub_treebuilder *treebuilder,
const hubbub_token *token)
{
hubbub_error err = HUBBUB_OK;
-
switch (token->type) {
case HUBBUB_TOKEN_CHARACTER:
- err = process_characters_expect_whitespace(treebuilder,
- token, true);
- if (err == HUBBUB_REPROCESS)
- treebuilder->context.mode = IN_FRAMESET;
+ {
+ const uint8_t *data = token->data.character.ptr;
+ uint8_t c = data[0];
+ if (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\f') {
+ err = handle_in_body(treebuilder, token);
+ }
+
+ }
break;
case HUBBUB_TOKEN_COMMENT:
err = process_comment_append(treebuilder, token,
treebuilder->context.document);
break;
case HUBBUB_TOKEN_END_TAG:
- case HUBBUB_TOKEN_DOCTYPE:
/** \todo parse error */
/* ignore token */
break;
+ case HUBBUB_TOKEN_DOCTYPE:
+ err = handle_in_body(treebuilder, token);
+ break;
case HUBBUB_TOKEN_START_TAG:
{
element_type type = element_type_from_name(treebuilder,
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index f5fdc89..d684702 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -785,8 +785,7 @@ hubbub_error process_dd_dt_li_in_body(hubbub_treebuilder *treebuilder,
(ntype == DD || ntype == DT)))
break;
- if (!is_formatting_element(ntype) &&
- !is_phrasing_element(ntype) &&
+ if (is_special_element(ntype) &&
ntype != ADDRESS &&
ntype != DIV &&
ntype != P)
@@ -794,10 +793,11 @@ hubbub_error process_dd_dt_li_in_body(hubbub_treebuilder *treebuilder,
}
/* If we found one, then pop all nodes up to and including it */
- if (stack[node].type == LI || stack[node].type == DD ||
- stack[node].type == DT) {
+ if((stack[node].type == LI && type == LI) ||
+ ((stack[node].type == DT || stack[node].type == DD) &&
+ (type == DD || type == DT))) {
- close_implied_end_tags(treebuilder, type);
+ close_implied_end_tags(treebuilder, stack[node].type);
/* Check that we're only popping one node
* and emit a parse error if not */
if (treebuilder->context.current_node > node) {
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index a965c5a..568a589 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -966,8 +966,21 @@ void reset_insertion_mode(hubbub_treebuilder *treebuilder)
switch (stack[node].type) {
case SELECT:
+ {
/* fragment case */
- break;
+ uint32_t ancestor;
+ for(ancestor = node - 1; ancestor > 0; ancestor --) {
+ if(stack[node].type == TEMPLATE) {
+ break;
+ }
+ if(stack[node].type == TABLE) {
+ treebuilder->context.mode = IN_CELL;
+ return;
+ }
+ }
+ treebuilder->context.mode = IN_SELECT;
+ return;
+ }
case TD:
case TH:
treebuilder->context.mode = IN_CELL;
@@ -985,26 +998,37 @@ void reset_insertion_mode(hubbub_treebuilder *treebuilder)
return;
case COLGROUP:
/* fragment case */
- break;
+ treebuilder->context.mode = IN_COLUMN_GROUP;
+ return;
case TABLE:
treebuilder->context.mode = IN_TABLE;
return;
case HEAD:
/* fragment case */
- break;
+ treebuilder->context.mode = IN_HEAD;
+ return;
case BODY:
treebuilder->context.mode = IN_BODY;
return;
case FRAMESET:
/* fragment case */
- break;
+ treebuilder->context.mode = IN_FRAMESET;
+ return;
case HTML:
+ {
/* fragment case */
- break;
+ if(treebuilder->context.head_element == NULL) {
+ treebuilder->context.mode = BEFORE_HEAD;
+ } else {
+ treebuilder->context.mode = AFTER_HEAD;
+ }
+ }
+ return;
default:
break;
}
}
+ return;
}
/**
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index c93217f..45126b7 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -54,5 +54,5 @@ tests8.dat html5lib treebuilder tests
tests9.dat html5lib treebuilder tests
tests_innerHTML_1.dat html5lib treebuilder tests
tricky01.dat html5lib treebuilder tests
-#webkit01.dat NA
+webkit01.dat html5lib treebuilder tests
webkit02.dat html5lib treebuilder tests
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=432ba566a7868be7e...
commit 432ba566a7868be7e080bfea409d0e6bca1d8d93
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Enabling tests
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index 1c1b78f..c93217f 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -4,46 +4,46 @@
adoption01.dat html5lib tests for the adoption agency algorithm
adoption02.dat html5lib tests for the adoption agency algorithm
-#after-after-body.dat NA
-#after-after-frameset.dat NA
-#after-body.dat NA
-#comments01.dat NA
+after-after-body.dat html5lib Insertion Mode specific tests
+after-after-frameset.dat html5lib Insertion Mode specific tests
+after-body.dat html5lib Insertion Mode specific tests
+comments01.dat html5lib treebuilder tests
#doctype01.dat NA
#domjs-unsafe.dat NA
-#entities01.dat NA
-#entities02.dat NA
+entities01.dat html5lib tests for special characters
+entities02.dat html5lib tests for special characters
#html5test-com.dat NA
-#inbody01.dat NA
+inbody01.dat html5lib Insertion Mode specific tests
isindex.dat html5lib treebuilder tests for isindex element
#main-element.dat NA
-#pending-spec-changes.dat NA
+pending-spec-changes.dat html5lib treebuilder tests
#pending-spec-changes-plain-text-unsafe.dat NA
#plain-text-unsafe.dat NA
-#README.md NA
-#regression.dat NA
+README.md html5lib treebuilder tests
+regression.dat html5lib treebuilder tests
#scriptdata01.dat NA
#scripted/adoption01.dat NA
#scripted/ark.dat NA
#scripted/webkit01.dat NA
-#tables01.dat NA
+tables01.dat html5lib treebuilder tests
#template.dat NA
#tests10.dat NA
-#tests11.dat NA
-#tests12.dat NA
+tests11.dat html5lib treebuilder tests
+tests12.dat html5lib treebuilder tests
tests14.dat html5lib treebuilder tests
-#tests15.dat NA
+tests15.dat html5lib treebuilder tests
#tests16.dat NA
-#tests17.dat NA
-#tests18.dat NA
+tests17.dat html5lib treebuilder tests
+tests18.dat html5lib treebuilder tests
tests19.dat html5lib treebuilder tests
tests1.dat html5lib treebuilder tests
tests20.dat html5lib treebuilder tests
#tests21.dat NA
-#tests22.dat NA
-#tests23.dat NA
-#tests24.dat NA
-#tests25.dat NA
-#tests26.dat NA
+tests22.dat html5lib treebuilder tests
+tests23.dat html5lib treebuilder tests
+tests24.dat html5lib treebuilder tests
+tests25.dat html5lib treebuilder tests
+tests26.dat html5lib treebuilder tests
tests2.dat html5lib treebuilder tests
tests3.dat html5lib treebuilder tests
tests4.dat html5lib treebuilder tests
@@ -52,7 +52,7 @@ tests6.dat html5lib treebuilder tests
tests7.dat html5lib treebuilder tests
tests8.dat html5lib treebuilder tests
tests9.dat html5lib treebuilder tests
-#tests_innerHTML_1.dat NA
-#tricky01.dat NA
+tests_innerHTML_1.dat html5lib treebuilder tests
+tricky01.dat html5lib treebuilder tests
#webkit01.dat NA
-#webkit02.dat NA
+webkit02.dat html5lib treebuilder tests
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=1219611794ddb4e55...
commit 1219611794ddb4e55805af37ae2f6e9b2f5a24d2
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
appending to formatting list makes use of comparing the attributes. Since we now have the facility to retrive attributes, this has now been implemented with a not so optimised brute force search
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index d741b5c..a965c5a 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -1401,7 +1401,9 @@ hubbub_error formatting_list_append(hubbub_treebuilder *treebuilder,
formatting_list_entry *entry;
uint32_t n_elements = 0;
formatting_list_entry *remove_entry;
- size_t i;
+ size_t i, j;
+
+ bool *hash_table = malloc(n_attrs * sizeof(bool));
for (entry = treebuilder->context.formatting_list_end;
entry != NULL; entry = entry->prev) {
@@ -1409,8 +1411,35 @@ hubbub_error formatting_list_append(hubbub_treebuilder *treebuilder,
if (is_scoping_element(entry->details.type))
break;
+ bool attrs_equal = (
+ n_attrs == entry->details.n_attributes);
+ for(i = 0; i < entry->details.n_attributes && attrs_equal; i++) {
+ memset(hash_table, 0, n_attrs * sizeof(bool));
+ bool found = false;
+ for(j = 0; j < n_attrs; j++) {
+ if(hubbub_string_match_ci(attrs[j].name.ptr,
+ attrs[j].name.len,
+ entry->details.attributes[i].name.ptr,
+ entry->details.attributes[i].name.len) &&
+ hubbub_string_match_ci(attrs[j].value.ptr,
+ attrs[j].value.len,
+ entry->details.attributes[i].value.ptr,
+ entry->details.attributes[i].value.len) &&
+ attrs[j].ns == entry->details.attributes[i].ns &&
+ hash_table[j] == false) {
+ hash_table[j] = true;
+ found = true;
+ break;
+ }
+ }
+ if(!found) {
+ attrs_equal = false;
+ }
+ }
+
if(entry->details.type == type &&
- entry->details.ns == ns)
+ entry->details.ns == ns &&
+ attrs_equal)
{
remove_entry = entry;
n_elements += 1;
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=fa946872de0edd689...
commit fa946872de0edd68982637a08b88d617de3c9a1c
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Now, since we have the support for retriving attributes from context, the foreing breakout function is updated to incorporate checking of attributes
diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c
index e6d22ac..73a061d 100644
--- a/src/treebuilder/in_foreign_content.c
+++ b/src/treebuilder/in_foreign_content.c
@@ -288,8 +288,8 @@ void adjust_foreign_attributes(hubbub_treebuilder *treebuilder,
}
}
-#undef S
+#undef S
/*** Foreign content insertion mode ***/
@@ -368,29 +368,18 @@ static void foreign_break_out(hubbub_treebuilder *treebuilder)
/** \todo parse error */
/** todo fragment case */
- element_stack_pop(treebuilder, &ns, &type, &node);
- treebuilder->tree_handler->unref_node(
- treebuilder->tree_handler->ctx,
- node);
-
- while (stack[treebuilder->context.current_node].ns !=
- HUBBUB_NS_HTML &&
- !(stack[treebuilder->context.current_node].ns ==
- HUBBUB_NS_MATHML && (
- stack[treebuilder->context.current_node].type ==
- MI || stack[treebuilder->context.current_node].type ==
- MO || stack[treebuilder->context.current_node].type ==
- MN || stack[treebuilder->context.current_node].type ==
- MS || stack[treebuilder->context.current_node].type ==
- MTEXT)) &&
- !(stack[treebuilder->context.current_node].ns ==
- HUBBUB_NS_SVG && (
- stack[treebuilder->context.current_node].type ==
- FOREIGNOBJECT ||
- stack[treebuilder->context.current_node].type ==
- DESC ||
- stack[treebuilder->context.current_node].type ==
- TITLE))
+
+ ns = stack[treebuilder->context.current_node].ns;
+ type = current_node(treebuilder);
+ size_t n_attrs = stack[
+ treebuilder->context.current_node].n_attributes;
+ hubbub_attribute *attrs =
+ stack[treebuilder->context.current_node].
+ attributes;
+ while (ns != HUBBUB_NS_HTML &&
+ !is_mathml_text_integration(type, ns) &&
+ !is_html_integration(type, ns, attrs,
+ n_attrs)
) {
element_stack_pop(treebuilder, &ns, &type, &node);
@@ -398,15 +387,17 @@ static void foreign_break_out(hubbub_treebuilder *treebuilder)
treebuilder->tree_handler->ctx,
node);
- if(ns == HUBBUB_NS_MATHML &&
- type == ANNOTATION_XML) {
- /*todo check for attributes */
- }
+ type = current_node(treebuilder);
+ ns = stack[treebuilder->context.current_node].ns;
+ n_attrs = stack[
+ treebuilder->context.current_node].n_attributes;
+ attrs = stack[treebuilder->context.current_node].
+ attributes;
}
-
treebuilder->context.mode = treebuilder->context.second_mode;
}
+
/**
* Handle tokens in "in foreign content" insertion mode
*
@@ -418,37 +409,41 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
const hubbub_token *token)
{
hubbub_ns cur_node_ns = treebuilder->context.element_stack[
- treebuilder->context.current_node].ns;
+ treebuilder->context.current_node].ns;
element_type cur_node = current_node(treebuilder);
- element_type type = element_type_from_name(treebuilder,
- &token->data.tag.name);
+ hubbub_attribute *cur_node_attrs;
+ size_t cur_node_n_attrs;
+
+ cur_node_attrs = treebuilder->context.element_stack[
+ treebuilder->context.current_node].attributes;
+
+ cur_node_n_attrs = treebuilder->context.element_stack[
+ treebuilder->context.current_node].n_attributes;
if (treebuilder->context.current_node == 0 ||
- cur_node_ns == HUBBUB_NS_HTML ||
- (cur_node_ns == HUBBUB_NS_MATHML &&
- (type != MGLYPH && type != MALIGNMARK) &&
- (cur_node == MI || cur_node == MO ||
- cur_node == MN || cur_node == MS ||
- cur_node == MTEXT)) ||
- (type == SVG && (cur_node_ns == HUBBUB_NS_MATHML &&
- cur_node == ANNOTATION_XML)) ||
- (cur_node_ns == HUBBUB_NS_SVG &&
- (cur_node == FOREIGNOBJECT ||
- cur_node == DESC ||
- cur_node == TITLE))) {
+ cur_node_ns == HUBBUB_NS_HTML) {
return process_as_in_secondary(treebuilder, token);
}
+
hubbub_error err = HUBBUB_OK;
const uint8_t *c;
switch (token->type) {
case HUBBUB_TOKEN_CHARACTER:
+ {
+ if(is_html_integration(cur_node, cur_node_ns,
+ cur_node_attrs, cur_node_n_attrs) ||
+ is_mathml_text_integration(cur_node, cur_node_ns)) {
+ return process_as_in_secondary(treebuilder, token);
+ }
+
c = (token->data.character.ptr);
if(*c != '\t' && *c != '\r' && *c != ' ' && *c != '\n' && *c != '\f') {
treebuilder->context.frameset_ok = false;
}
err = append_text(treebuilder, &token->data.character);
+ }
break;
case HUBBUB_TOKEN_COMMENT:
err = process_comment_append(treebuilder, token,
@@ -461,7 +456,17 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
case HUBBUB_TOKEN_START_TAG:
{
bool handled = false;
- if (type == B || type == BIG || type == BLOCKQUOTE ||
+ element_type type = element_type_from_name(treebuilder,
+ &token->data.tag.name);
+
+ if ((is_mathml_text_integration(cur_node, cur_node_ns) &&
+ type != MGLYPH && type != MALIGNMARK) ||
+ (type == SVG && cur_node_ns == HUBBUB_NS_MATHML &&
+ cur_node == ANNOTATION_XML) ||
+ is_html_integration(cur_node, cur_node_ns,
+ cur_node_attrs, cur_node_n_attrs)) {
+ return process_as_in_secondary(treebuilder, token);
+ } else if (type == B || type == BIG || type == BLOCKQUOTE ||
type == BODY || type == BR || type == CENTER ||
type == CODE || type == DD || type == DIV ||
type == DL || type == DT || type == EM ||
@@ -540,6 +545,7 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
&token->data.tag.name);
uint32_t node;
element_context *stack = treebuilder->context.element_stack;
+
for (node = treebuilder->context.current_node; node > 1; node--) {
if(stack[node].type == type) {
hubbub_ns ns;
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index f1314bb..a5f0b22 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -207,6 +207,11 @@ hubbub_error formatting_list_replace(hubbub_treebuilder *treebuilder,
uint32_t *ostack_index);
void copy_attribute(hubbub_attribute *source,
hubbub_attribute *sink);
+bool is_mathml_text_integration (element_type type,
+ hubbub_ns ns);
+bool is_html_integration (element_type type,
+ hubbub_ns ns, hubbub_attribute *attrs,
+ size_t n_attrs);
/* in_foreign_content.c */
void adjust_mathml_attributes(hubbub_treebuilder *treebuilder, hubbub_tag *tag);
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index 6b89355..d741b5c 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -98,6 +98,8 @@ static const struct {
{ S("foreignobject"), FOREIGNOBJECT }
};
+#undef S
+
static bool is_form_associated(element_type type);
/**
@@ -1621,6 +1623,72 @@ void copy_attribute(hubbub_attribute *source,
return;
}
+#define S(s) (uint8_t *) s, SLEN(s)
+
+/**
+ * Checks if the node with the given properties is
+ * a mathml text integration point
+ * \param type The element type of the node
+ * \param ns The namespace of the node
+ */
+
+bool is_mathml_text_integration (element_type type,
+ hubbub_ns ns) {
+
+ if(ns == HUBBUB_NS_MATHML && (
+ type == MI || type == MO ||
+ type == MN || type == MS ||
+ type == MTEXT)) {
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Checks if the node with the given properties is
+ * a html integration point
+ * \param type The element type of the node
+ * \param ns The namespace of the node
+ * \param attrs Pointer to the list of attributes
+ * \param n_attrs Number of attributes on the node
+ */
+bool is_html_integration (element_type type,
+ hubbub_ns ns, hubbub_attribute *attrs,
+ size_t n_attrs) {
+
+ if(ns == HUBBUB_NS_MATHML &&
+ type == ANNOTATION_XML) {
+
+ size_t i;
+ bool found = false;
+
+ for(i = 0;i < n_attrs; i++) {
+ /*search for the given attributes in O(n_attrs) time complexity*/
+ if(hubbub_string_match_ci(attrs[i].name.ptr,
+ attrs[i].name.len, S("encoding")) &&
+ (hubbub_string_match_ci(attrs[i].value.ptr,
+ attrs[i].value.len,
+ S("text/html")) ||
+ hubbub_string_match_ci(attrs[i].value.ptr,
+ attrs[i].value.len,
+ S("application/xhtml+xml")))
+ ) {
+ found = true;
+ break;
+ }
+ }
+
+ if(found) {
+ return true;
+ }
+ } else if(ns == HUBBUB_NS_SVG &&(
+ type == FOREIGNOBJECT ||
+ type == DESC ||
+ type == TITLE)) {
+ return true;
+ }
+ return false;
+}
#ifndef NDEBUG
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index f280fba..1c1b78f 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -37,7 +37,7 @@ tests14.dat html5lib treebuilder tests
#tests18.dat NA
tests19.dat html5lib treebuilder tests
tests1.dat html5lib treebuilder tests
-#tests20.dat NA
+tests20.dat html5lib treebuilder tests
#tests21.dat NA
#tests22.dat NA
#tests23.dat NA
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=454807f3803f57255...
commit 454807f3803f572557aeadbd53c8f1064592536f
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Fixed some misplaced tags in in_body insertion mode. Also improved support for appending attributes to an element already in the stack
diff --git a/src/treebuilder/after_head.c b/src/treebuilder/after_head.c
index c2444bf..f39299f 100644
--- a/src/treebuilder/after_head.c
+++ b/src/treebuilder/after_head.c
@@ -48,13 +48,15 @@ hubbub_error handle_after_head(hubbub_treebuilder *treebuilder,
/* Process as if "in body" */
err = handle_in_body(treebuilder, token);
} else if (type == BODY) {
+ treebuilder->context.frameset_ok = false;
handled = true;
} else if (type == FRAMESET) {
err = insert_element(treebuilder, &token->data.tag,
true);
if (err == HUBBUB_OK)
treebuilder->context.mode = IN_FRAMESET;
- } else if (type == BASE || type == LINK || type == META ||
+ } else if (type == BASE || type == BASEFONT || type == BGSOUND ||
+ type == LINK || type == META ||
type == NOFRAMES || type == SCRIPT ||
type == STYLE || type == TITLE) {
hubbub_ns ns;
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index cf3630d..f5fdc89 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -115,6 +115,9 @@ static hubbub_error aa_remove_element_stack_item(
static hubbub_error aa_clone_and_replace_entries(
hubbub_treebuilder *treebuilder,
formatting_list_entry *element);
+static hubbub_error add_attributes_stack(
+ hubbub_treebuilder *treebuilder,
+ const hubbub_token *token, uint32_t stack_index);
/**
@@ -258,9 +261,9 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
if (type == HTML) {
err = process_html_in_body(treebuilder, token);
- } else if (type == BASE || type == COMMAND || type == LINK ||
- type == META || type == NOFRAMES || type == SCRIPT ||
- type == STYLE || type == TITLE) {
+ } else if (type == BASE || type == BASEFONT || type == BGSOUND ||
+ type == LINK || type == META || type == NOFRAMES ||
+ type == SCRIPT || type == STYLE || type == TITLE) {
/* Process as "in head" */
err = handle_in_head(treebuilder, token);
} else if (type == BODY) {
@@ -272,8 +275,9 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
type == DATAGRID || type == DETAILS ||
type == DIALOG || type == DIR ||
type == DIV || type == DL || type == FIELDSET ||
- type == FIGURE || type == FOOTER ||
- type == HEADER || type == MENU || type == NAV ||
+ type == FIGCAPTION || type == FIGURE || type == FOOTER ||
+ type == HEADER || type == HGROUP || type == MAIN ||
+ type == MENU || type == NAV ||
type == OL || type == P || type == SECTION ||
type == SUMMARY || type == UL) {
err = process_container_in_body(treebuilder, token);
@@ -337,10 +341,9 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
current_table(treebuilder)].tainted = false;
treebuilder->context.mode = IN_TABLE;
}
- } else if (type == AREA || type == BASEFONT ||
- type == BGSOUND || type == BR ||
+ } else if (type == AREA || type == BR ||
type == EMBED || type == IMG || type == INPUT ||
- type == WBR) {
+ type == KEYGEN || type == WBR) {
err = reconstruct_active_formatting_list(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -352,7 +355,7 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
size_t i;
bool found = 0;
- for (i = 0; i < token->data.tag.n_attributes; i++) {
+ for (i = 0; i < token->data.tag.n_attributes && type == INPUT; i++) {
hubbub_attribute *attr = &token->data.tag.attributes[i];
if (hubbub_string_match_ci(attr->name.ptr, attr->name.len,
@@ -434,7 +437,8 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
type == TD || type == TFOOT || type == TH ||
type == THEAD || type == TR) {
/** \todo parse error */
- } else if (type == PARAM) {
+ } else if (type == PARAM || type == MENUITEM || type == SOURCE ||
+ type == TRACK) {
err = insert_element(treebuilder, &token->data.tag, false);
/** \todo ack sc flag */
} else {
@@ -468,12 +472,16 @@ hubbub_error process_end_tag(hubbub_treebuilder *treebuilder,
* that wasn't ignored, reprocess this token */
err = process_0body_in_body(treebuilder);
} else if (type == ADDRESS || type == ARTICLE || type == ASIDE ||
- type == BLOCKQUOTE || type == CENTER || type == DIR ||
- type == DATAGRID || type == DIV || type == DL ||
- type == FIELDSET || type == FOOTER || type == HEADER ||
- type == LISTING || type == MENU || type == NAV ||
+ type == BLOCKQUOTE || type == BUTTON ||
+ type == CENTER || type == DETAILS ||
+ type == DIALOG || type == DIR ||
+ type == DIV || type == DL ||
+ type == FIELDSET || type == FIGCAPTION ||
+ type == FIGURE || type == FOOTER || type == HEADER ||
+ type == HGROUP || type == LISTING || type == MAIN ||
+ type == MENU || type == NAV ||
type == OL || type == PRE || type == SECTION ||
- type == UL) {
+ type == SUMMARY || type == UL) {
err = process_0container_in_body(treebuilder, type);
} else if (type == FORM) {
err = process_0form_in_body(treebuilder);
@@ -490,7 +498,7 @@ hubbub_error process_end_tag(hubbub_treebuilder *treebuilder,
type == STRIKE || type == STRONG ||
type == TT || type == U) {
err = process_0presentational_in_body(treebuilder, type);
- } else if (type == APPLET || type == BUTTON ||
+ } else if (type == APPLET ||
type == MARQUEE || type == OBJECT) {
err = process_0applet_button_marquee_object_in_body(
treebuilder, type);
@@ -503,8 +511,7 @@ hubbub_error process_end_tag(hubbub_treebuilder *treebuilder,
type == INPUT || type == ISINDEX ||
type == NOEMBED || type == NOFRAMES ||
type == PARAM || type == SELECT ||
- type == SPACER || type == TABLE ||
- type == TEXTAREA || type == WBR ||
+ type == TABLE || type == TEXTAREA || type == WBR ||
(treebuilder->context.enable_scripting &&
type == NOSCRIPT)) {
/** \todo parse error */
@@ -516,20 +523,20 @@ hubbub_error process_end_tag(hubbub_treebuilder *treebuilder,
}
/**
- * Process a html start tag as if in "in body"
+ * Append attributes to an element in the stack that are
+ * not already present
*
* \param treebuilder The treebuilder instance
* \param token The token to process
+ * \param stack_index Stack index of the element on which to append
*/
-hubbub_error process_html_in_body(hubbub_treebuilder *treebuilder,
- const hubbub_token *token)
-{
- /** \todo parse error */
+hubbub_error add_attributes_stack(hubbub_treebuilder *treebuilder,
+ const hubbub_token *token, uint32_t stack_index) {
size_t i;
hubbub_attribute *attrs =
- treebuilder->context.element_stack[0].attributes;
+ treebuilder->context.element_stack[stack_index].attributes;
size_t n_attrs =
- treebuilder->context.element_stack[0].n_attributes;
+ treebuilder->context.element_stack[stack_index].n_attributes;
size_t j;
const hubbub_tag *tag = &token->data.tag;
@@ -565,12 +572,26 @@ hubbub_error process_html_in_body(hubbub_treebuilder *treebuilder,
return treebuilder->tree_handler->add_attributes(
treebuilder->tree_handler->ctx,
- treebuilder->context.element_stack[0].node,
+ treebuilder->context.element_stack[stack_index].node,
&stack->attributes[stack->n_attributes] - dummy_len,
dummy_len);
}
/**
+ * Process a html start tag as if in "in body"
+ *
+ * \param treebuilder The treebuilder instance
+ * \param token The token to process
+ */
+hubbub_error process_html_in_body(hubbub_treebuilder *treebuilder,
+ const hubbub_token *token)
+{
+ /** \todo parse error */
+ return add_attributes_stack(treebuilder, token,
+ 0);
+}
+
+/**
* Process a body start tag as if in "in body"
*
* \param treebuilder The treebuilder instance
@@ -585,11 +606,9 @@ hubbub_error process_body_in_body(hubbub_treebuilder *treebuilder,
treebuilder->context.element_stack[1].type != BODY)
return HUBBUB_OK;
- return treebuilder->tree_handler->add_attributes(
- treebuilder->tree_handler->ctx,
- treebuilder->context.element_stack[1].node,
- token->data.tag.attributes,
- token->data.tag.n_attributes);
+ treebuilder->context.frameset_ok = false;
+ return add_attributes_stack(treebuilder, token,
+ 1);
}
/**
diff --git a/src/treebuilder/in_head.c b/src/treebuilder/in_head.c
index 0e9dd60..9568789 100644
--- a/src/treebuilder/in_head.c
+++ b/src/treebuilder/in_head.c
@@ -133,7 +133,8 @@ hubbub_error handle_in_head(hubbub_treebuilder *treebuilder,
if (type == HTML) {
/* Process as if "in body" */
err = handle_in_body(treebuilder, token);
- } else if (type == BASE || type == COMMAND || type == LINK) {
+ } else if (type == BASE || type == BASEFONT || type == BGSOUND ||
+ type == LINK) {
err = insert_element(treebuilder, &token->data.tag,
false);
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index 8a677b8..f280fba 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -35,7 +35,7 @@ tests14.dat html5lib treebuilder tests
#tests16.dat NA
#tests17.dat NA
#tests18.dat NA
-#tests19.dat NA
+tests19.dat html5lib treebuilder tests
tests1.dat html5lib treebuilder tests
#tests20.dat NA
#tests21.dat NA
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=a7d104f8eaee2743e...
commit a7d104f8eaee2743ee68d4573996a4a5d272163f
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Small fix to handle rp/rt start tag in body
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index f4ac2ad..cf3630d 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -72,6 +72,8 @@ static hubbub_error process_select_in_body(hubbub_treebuilder *treebuilder,
const hubbub_token *token);
static hubbub_error process_opt_in_body(hubbub_treebuilder *treebuilder,
const hubbub_token *token);
+static hubbub_error process_rp_rt_in_body(hubbub_treebuilder *treebuilder,
+ const hubbub_token *token);
static hubbub_error process_phrasing_in_body(hubbub_treebuilder *treebuilder,
const hubbub_token *token);
@@ -398,7 +400,7 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
} else if (type == OPTGROUP || type == OPTION) {
err = process_opt_in_body(treebuilder, token);
} else if (type == RP || type == RT) {
- /** \todo ruby */
+ err = process_rp_rt_in_body(treebuilder, token);
} else if (type == MATH || type == SVG) {
hubbub_tag tag = token->data.tag;
@@ -1441,6 +1443,27 @@ hubbub_error process_opt_in_body(hubbub_treebuilder *treebuilder,
}
/**
+ * Process a rp or rt start tag as if in "in body"
+ *
+ * \param treebuilder The treebuilder instance
+ * \param token The token to process
+ */
+hubbub_error process_rp_rt_in_body(hubbub_treebuilder *treebuilder,
+ const hubbub_token *token)
+{
+ if(element_in_scope(treebuilder, RUBY, NONE)) {
+ close_implied_end_tags(treebuilder, UNKNOWN);
+ }
+
+ if(treebuilder->context.element_stack[
+ treebuilder->context.current_node].type != RUBY) {
+ /** \todo parse error */
+ }
+
+ return insert_element(treebuilder, &token->data.tag, true);
+}
+
+/**
* Process a phrasing start tag as if in "in body"
*
* \param treebuilder The treebuilder instance
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index 32d7932..6b89355 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -61,6 +61,8 @@ static const struct {
{ S("option"), OPTION }, { S("output"), OUTPUT },
{ S("p"), P }, { S("param"), PARAM },
{ S("plaintext"), PLAINTEXT }, { S("pre"), PRE },
+ { S("ruby"), RUBY },
+ { S("rp"), RP }, { S("rt"), RT },
{ S("script"), SCRIPT }, { S("section"), SECTION },
{ S("select"), SELECT }, { S("source"), SOURCE },
{ S("spacer"), SPACER }, { S("style"), STYLE },
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=cb926c0cc0026eca0...
commit cb926c0cc0026eca03857b97648d7c195595ebfc
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Added support to get attribute names & values from the context. This slows down the library a very little bit. Optimizations will be done later.
diff --git a/src/treebuilder/after_head.c b/src/treebuilder/after_head.c
index 40955a8..c2444bf 100644
--- a/src/treebuilder/after_head.c
+++ b/src/treebuilder/after_head.c
@@ -67,7 +67,8 @@ hubbub_error handle_after_head(hubbub_treebuilder *treebuilder,
err = element_stack_push(treebuilder,
HUBBUB_NS_HTML,
HEAD,
- treebuilder->context.head_element);
+ treebuilder->context.head_element,
+ NULL, 0);
if (err != HUBBUB_OK)
return err;
diff --git a/src/treebuilder/before_html.c b/src/treebuilder/before_html.c
index 1ed3717..069696f 100644
--- a/src/treebuilder/before_html.c
+++ b/src/treebuilder/before_html.c
@@ -61,6 +61,7 @@ hubbub_error handle_before_html(hubbub_treebuilder *treebuilder,
if (handled || err == HUBBUB_REPROCESS) {
hubbub_error e;
void *html, *appended;
+ size_t i;
/* We can't use insert_element() here, as it assumes
* that we're inserting into current_node. There is
@@ -110,7 +111,23 @@ hubbub_error handle_before_html(hubbub_treebuilder *treebuilder,
treebuilder->context.element_stack[0].type = HTML;
treebuilder->context.element_stack[0].node = appended;
treebuilder->context.current_node = 0;
-
+ if(err != HUBBUB_REPROCESS) {
+ if(token->data.tag.n_attributes > 0){
+ treebuilder->context.element_stack[0].attributes =
+ (hubbub_attribute *)malloc(sizeof(hubbub_attribute) *
+ token->data.tag.n_attributes);
+ }
+
+ for(i = 0; i < token->data.tag.n_attributes; i++) {
+ copy_attribute(&token->data.tag.attributes[i],
+ &treebuilder->context.element_stack[0].attributes[i]);
+ }
+ treebuilder->context.element_stack[0].n_attributes =
+ token->data.tag.n_attributes;
+ } else {
+ treebuilder->context.element_stack[0].n_attributes =
+ 0;
+ }
/** \todo cache selection algorithm */
treebuilder->context.mode = BEFORE_HEAD;
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index eb82db0..f4ac2ad 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -523,12 +523,49 @@ hubbub_error process_html_in_body(hubbub_treebuilder *treebuilder,
const hubbub_token *token)
{
/** \todo parse error */
+ size_t i;
+ hubbub_attribute *attrs =
+ treebuilder->context.element_stack[0].attributes;
+ size_t n_attrs =
+ treebuilder->context.element_stack[0].n_attributes;
+
+ size_t j;
+ const hubbub_tag *tag = &token->data.tag;
+
+ bool found = 0;
+
+ size_t dummy_len = 0;
+ element_context *stack = treebuilder->context.element_stack;
+
+ /** This O(n^2) algorithm can be easily further reduced in time complexity to improve speed*/
+ for (j = 0; j < tag->n_attributes; j++) {
+ found = 0;
+ for (i = 0; i < n_attrs; i++) {
+ if (hubbub_string_match(attrs[i].name.ptr, attrs[i].name.len,
+ tag->attributes[j].name.ptr,
+ tag->attributes[j].name.len) == true) {
+ found = 1;
+ break;
+ }
+ }
+ if(!found) {
+ stack->n_attributes += 1;
+ stack->attributes =
+ realloc(stack->attributes,
+ stack->n_attributes
+ * sizeof (stack->attributes[0]));
+ copy_attribute(&tag->attributes[j],
+ &stack->attributes[
+ (stack->n_attributes)-1]);
+ dummy_len += 1;
+ }
+ }
return treebuilder->tree_handler->add_attributes(
treebuilder->tree_handler->ctx,
treebuilder->context.element_stack[0].node,
- token->data.tag.attributes,
- token->data.tag.n_attributes);
+ &stack->attributes[stack->n_attributes] - dummy_len,
+ dummy_len);
}
/**
@@ -876,6 +913,7 @@ hubbub_error process_a_in_body(hubbub_treebuilder *treebuilder,
err = formatting_list_append(treebuilder, token->data.tag.ns, A,
treebuilder->context.element_stack[
treebuilder->context.current_node].node,
+ token->data.tag.attributes, token->data.tag.n_attributes,
treebuilder->context.current_node);
if (err != HUBBUB_OK) {
hubbub_ns ns;
@@ -929,6 +967,7 @@ hubbub_error process_presentational_in_body(hubbub_treebuilder *treebuilder,
err = formatting_list_append(treebuilder, token->data.tag.ns, type,
treebuilder->context.element_stack[
treebuilder->context.current_node].node,
+ token->data.tag.attributes, token->data.tag.n_attributes,
treebuilder->context.current_node);
if (err != HUBBUB_OK) {
hubbub_ns ns;
@@ -995,6 +1034,7 @@ hubbub_error process_nobr_in_body(hubbub_treebuilder *treebuilder,
err = formatting_list_append(treebuilder, token->data.tag.ns, NOBR,
treebuilder->context.element_stack[
treebuilder->context.current_node].node,
+ token->data.tag.attributes, token->data.tag.n_attributes,
treebuilder->context.current_node);
if (err != HUBBUB_OK) {
hubbub_ns ns;
@@ -1082,6 +1122,7 @@ hubbub_error process_applet_marquee_object_in_body(
err = formatting_list_append(treebuilder, token->data.tag.ns, type,
treebuilder->context.element_stack[
treebuilder->context.current_node].node,
+ token->data.tag.attributes, token->data.tag.n_attributes,
treebuilder->context.current_node);
if (err != HUBBUB_OK) {
hubbub_ns ns;
@@ -1877,6 +1918,8 @@ hubbub_error process_0presentational_in_body(hubbub_treebuilder *treebuilder,
* we insert an entry for clone */
stack[furthest_block + 1].type = entry->details.type;
stack[furthest_block + 1].node = clone_appended;
+ hubbub_attribute *attrs = entry->details.attributes;
+ size_t n_attrs = entry->details.n_attributes;
/* 11 */
err = formatting_list_remove(treebuilder, entry,
@@ -1888,7 +1931,8 @@ hubbub_error process_0presentational_in_body(hubbub_treebuilder *treebuilder,
err = formatting_list_insert(treebuilder,
bookmark.prev, bookmark.next,
- ons, otype, clone_appended, furthest_block + 1);
+ ons, otype, clone_appended, attrs, n_attrs,
+ furthest_block + 1);
if (err != HUBBUB_OK) {
treebuilder->tree_handler->unref_node(
treebuilder->tree_handler->ctx,
@@ -2268,7 +2312,8 @@ hubbub_error aa_clone_and_replace_entries(hubbub_treebuilder *treebuilder,
/* Replace formatting list entry for node with clone */
err = formatting_list_replace(treebuilder, element,
element->details.ns, element->details.type,
- clone, element->stack_index,
+ clone, element->details.attributes,
+ element->details.n_attributes, element->stack_index,
&ons, &otype, &onode, &oindex);
assert(err == HUBBUB_OK);
diff --git a/src/treebuilder/in_row.c b/src/treebuilder/in_row.c
index 3bf9161..0446e6f 100644
--- a/src/treebuilder/in_row.c
+++ b/src/treebuilder/in_row.c
@@ -106,6 +106,8 @@ hubbub_error handle_in_row(hubbub_treebuilder *treebuilder,
token->data.tag.ns, type,
treebuilder->context.element_stack[
treebuilder->context.current_node].node,
+ token->data.tag.attributes,
+ token->data.tag.n_attributes,
treebuilder->context.current_node);
if (err != HUBBUB_OK) {
hubbub_ns ns;
diff --git a/src/treebuilder/in_table.c b/src/treebuilder/in_table.c
index 875e8ae..cf61827 100644
--- a/src/treebuilder/in_table.c
+++ b/src/treebuilder/in_table.c
@@ -121,6 +121,8 @@ hubbub_error handle_in_table(hubbub_treebuilder *treebuilder,
token->data.tag.ns, type,
treebuilder->context.element_stack[
treebuilder->context.current_node].node,
+ token->data.tag.attributes,
+ token->data.tag.n_attributes,
treebuilder->context.current_node);
if (err != HUBBUB_OK) {
treebuilder->tree_handler->unref_node(
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index 941f94a..f1314bb 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -57,6 +57,10 @@ typedef struct element_context
* instead of the current node." */
void *node; /**< Node pointer */
+ hubbub_attribute *attributes; /**< The attributes associated with
+ * element*/
+ size_t n_attributes; /**< Number of attributes associated
+ * with the element*/
} element_context;
/**
@@ -170,7 +174,8 @@ bool is_formatting_element(element_type type);
bool is_phrasing_element(element_type type);
hubbub_error element_stack_push(hubbub_treebuilder *treebuilder,
- hubbub_ns ns, element_type type, void *node);
+ hubbub_ns ns, element_type type, void *node,
+ hubbub_attribute *attrs, size_t n_attrs);
hubbub_error element_stack_pop(hubbub_treebuilder *treebuilder,
hubbub_ns *ns, element_type *type, void **node);
hubbub_error element_stack_pop_until(hubbub_treebuilder *treebuilder,
@@ -183,12 +188,12 @@ element_type current_node(hubbub_treebuilder *treebuilder);
element_type prev_node(hubbub_treebuilder *treebuilder);
hubbub_error formatting_list_append(hubbub_treebuilder *treebuilder,
- hubbub_ns ns, element_type type, void *node,
- uint32_t stack_index);
+ hubbub_ns ns, element_type type, void *node, hubbub_attribute *attrs,
+ size_t n_attrs, uint32_t stack_index);
hubbub_error formatting_list_insert(hubbub_treebuilder *treebuilder,
formatting_list_entry *prev, formatting_list_entry *next,
- hubbub_ns ns, element_type type, void *node,
- uint32_t stack_index);
+ hubbub_ns ns, element_type type, void *node, hubbub_attribute *attrs,
+ size_t n_attrs, uint32_t stack_index);
hubbub_error formatting_list_remove(hubbub_treebuilder *treebuilder,
formatting_list_entry *entry,
hubbub_ns *ns, element_type *type, void **node,
@@ -196,9 +201,12 @@ hubbub_error formatting_list_remove(hubbub_treebuilder *treebuilder,
hubbub_error formatting_list_replace(hubbub_treebuilder *treebuilder,
formatting_list_entry *entry,
hubbub_ns ns, element_type type, void *node,
+ hubbub_attribute *attrs, size_t n_attrs,
uint32_t stack_index,
hubbub_ns *ons, element_type *otype, void **onode,
uint32_t *ostack_index);
+void copy_attribute(hubbub_attribute *source,
+ hubbub_attribute *sink);
/* in_foreign_content.c */
void adjust_mathml_attributes(hubbub_treebuilder *treebuilder, hubbub_tag *tag);
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index 11ff2a2..32d7932 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -5,6 +5,8 @@
* Copyright 2008 John-Mark Bell <jmb(a)netsurf-browser.org>
*/
+#define _GNU_SOURCE
+
#include <assert.h>
#include <string.h>
@@ -137,6 +139,8 @@ hubbub_error hubbub_treebuilder_create(hubbub_tokeniser *tokeniser,
* if the first item in the stack is in use. Assert this here. */
assert(HTML != 0);
tb->context.element_stack[0].type = (element_type) 0;
+ tb->context.element_stack[0].attributes = NULL;
+ tb->context.element_stack[0].n_attributes = 0;
tb->context.strip_leading_lr = false;
tb->context.frameset_ok = true;
@@ -687,7 +691,9 @@ hubbub_error reconstruct_active_formatting_list(hubbub_treebuilder *treebuilder)
goto cleanup;
error = element_stack_push(treebuilder, entry->details.ns,
- entry->details.type, appended);
+ entry->details.type, appended,
+ entry->details.attributes,
+ entry->details.n_attributes);
if (error != HUBBUB_OK) {
remove_node_from_dom(treebuilder, appended);
@@ -716,8 +722,9 @@ hubbub_error reconstruct_active_formatting_list(hubbub_treebuilder *treebuilder)
error = formatting_list_replace(treebuilder, entry,
entry->details.ns, entry->details.type,
- node, sp,
- &prev_ns, &prev_type, &prev_node,
+ node, entry->details.attributes,
+ entry->details.n_attributes,
+ sp, &prev_ns, &prev_type, &prev_node,
&prev_stack_index);
/* Cannot fail. Ensure this. */
assert(error == HUBBUB_OK);
@@ -880,7 +887,8 @@ hubbub_error insert_element(hubbub_treebuilder *treebuilder,
if (push) {
error = element_stack_push(treebuilder,
- tag->ns, type, appended);
+ tag->ns, type, appended,
+ tag->attributes, tag->n_attributes);
if (error != HUBBUB_OK) {
remove_node_from_dom(treebuilder, appended);
@@ -1154,9 +1162,11 @@ bool is_form_associated(element_type type)
* \return HUBBUB_OK on success, appropriate error otherwise.
*/
hubbub_error element_stack_push(hubbub_treebuilder *treebuilder,
- hubbub_ns ns, element_type type, void *node)
+ hubbub_ns ns, element_type type, void *node,
+ hubbub_attribute *attrs, size_t n_attrs)
{
uint32_t slot = treebuilder->context.current_node + 1;
+ size_t i;
if (slot >= treebuilder->context.stack_alloc) {
element_context *temp = realloc(
@@ -1176,6 +1186,16 @@ hubbub_error element_stack_push(hubbub_treebuilder *treebuilder,
treebuilder->context.element_stack[slot].type = type;
treebuilder->context.element_stack[slot].node = node;
+ if(n_attrs > 0) {
+ treebuilder->context.element_stack[slot].attributes =
+ (hubbub_attribute *)malloc(n_attrs * sizeof(hubbub_attribute));
+ }
+ for (i = 0; i < n_attrs; i++) {
+ copy_attribute(&attrs[i],
+ &treebuilder->context.element_stack[slot].attributes[i]);
+ }
+ treebuilder->context.element_stack[slot].n_attributes = n_attrs;
+
treebuilder->context.current_node = slot;
return HUBBUB_OK;
@@ -1371,11 +1391,14 @@ element_type prev_node(hubbub_treebuilder *treebuilder)
*/
hubbub_error formatting_list_append(hubbub_treebuilder *treebuilder,
hubbub_ns ns, element_type type, void *node,
+ hubbub_attribute *attrs, size_t n_attrs,
uint32_t stack_index)
{
formatting_list_entry *entry;
uint32_t n_elements = 0;
formatting_list_entry *remove_entry;
+ size_t i;
+
for (entry = treebuilder->context.formatting_list_end;
entry != NULL; entry = entry->prev) {
/* Assumption: HTML and TABLE elements are not in the list */
@@ -1410,6 +1433,15 @@ hubbub_error formatting_list_append(hubbub_treebuilder *treebuilder,
entry->details.type = type;
entry->details.node = node;
entry->stack_index = stack_index;
+ if(n_attrs > 0) {
+ entry->details.attributes =
+ (hubbub_attribute *)malloc(n_attrs * sizeof(hubbub_attribute));
+ }
+ for(i = 0; i < n_attrs; i++) {
+ copy_attribute(&attrs[i],
+ &entry->details.attributes[i]);
+ }
+ entry->details.n_attributes = n_attrs;
entry->prev = treebuilder->context.formatting_list_end;
entry->next = NULL;
@@ -1439,9 +1471,11 @@ hubbub_error formatting_list_append(hubbub_treebuilder *treebuilder,
hubbub_error formatting_list_insert(hubbub_treebuilder *treebuilder,
formatting_list_entry *prev, formatting_list_entry *next,
hubbub_ns ns, element_type type, void *node,
+ hubbub_attribute *attrs, size_t n_attrs,
uint32_t stack_index)
{
formatting_list_entry *entry;
+ size_t i;
if (prev != NULL) {
assert(prev->next == next);
@@ -1459,6 +1493,15 @@ hubbub_error formatting_list_insert(hubbub_treebuilder *treebuilder,
entry->details.type = type;
entry->details.node = node;
entry->stack_index = stack_index;
+ entry->details.n_attributes = n_attrs;
+ if(n_attrs > 0) {
+ entry->details.attributes = (hubbub_attribute *)
+ malloc(n_attrs * sizeof(hubbub_attribute));
+ }
+ for(i = 0;i < n_attrs; i++) {
+ copy_attribute(&attrs[i],
+ &entry->details.attributes[i]);
+ }
entry->prev = prev;
entry->next = next;
@@ -1530,12 +1573,13 @@ hubbub_error formatting_list_remove(hubbub_treebuilder *treebuilder,
hubbub_error formatting_list_replace(hubbub_treebuilder *treebuilder,
formatting_list_entry *entry,
hubbub_ns ns, element_type type, void *node,
+ hubbub_attribute *attrs, size_t n_attrs,
uint32_t stack_index,
hubbub_ns *ons, element_type *otype, void **onode,
uint32_t *ostack_index)
{
UNUSED(treebuilder);
-
+ size_t i = 0;
*ons = entry->details.ns;
*otype = entry->details.type;
*onode = entry->details.node;
@@ -1544,11 +1588,36 @@ hubbub_error formatting_list_replace(hubbub_treebuilder *treebuilder,
entry->details.ns = ns;
entry->details.type = type;
entry->details.node = node;
+ entry->details.n_attributes = n_attrs;
+ if(n_attrs > 0) {
+ entry->details.attributes =
+ (hubbub_attribute *)malloc(n_attrs * sizeof(hubbub_attribute));
+ }
+ for(i = 0;i < n_attrs;i++) {
+ copy_attribute(&attrs[i],
+ &entry->details.attributes[i]);
+ }
entry->stack_index = stack_index;
return HUBBUB_OK;
}
+void copy_attribute(hubbub_attribute *source,
+ hubbub_attribute *sink) {
+
+ sink->ns = source->ns;
+
+ sink->name.ptr = (const uint8_t *) strndup(
+ (const char *) source->name.ptr,
+ source->name.len);
+ sink->name.len = source->name.len;
+
+ sink->value.ptr = (const uint8_t *) strndup(
+ (const char *) source->value.ptr,
+ source->value.len);
+ sink->value.len = source->value.len;
+ return;
+}
#ifndef NDEBUG
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index c8412aa..8a677b8 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -30,7 +30,7 @@ isindex.dat html5lib treebuilder tests for isindex element
#tests10.dat NA
#tests11.dat NA
#tests12.dat NA
-#tests14.dat NA
+tests14.dat html5lib treebuilder tests
#tests15.dat NA
#tests16.dat NA
#tests17.dat NA
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=0577e6fe3bfc32be9...
commit 0577e6fe3bfc32be9f81b3958525fdd3edc5467a
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
The foreign state is still bugy and fails some tests. It will be debugged after neccessary supporting modules are implemented
diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c
index 25169ff..e6d22ac 100644
--- a/src/treebuilder/in_foreign_content.c
+++ b/src/treebuilder/in_foreign_content.c
@@ -40,6 +40,8 @@ static const case_changes svg_attributes[] = {
{ S("contentstyletype"), "contentStyleType" },
{ S("diffuseconstant"), "diffuseConstant" },
{ S("edgemode"), "edgeMode" },
+ { S("externalresourcesrequired"),"externalResourcesRequired" },
+ { S("filterres"), "filterRes" },
{ S("filterunits"), "filterUnits" },
{ S("glyphref"), "glyphRef" },
{ S("gradienttransform"), "gradientTransform" },
@@ -360,20 +362,46 @@ static hubbub_error process_as_in_secondary(hubbub_treebuilder *treebuilder,
static void foreign_break_out(hubbub_treebuilder *treebuilder)
{
element_context *stack = treebuilder->context.element_stack;
+ hubbub_ns ns;
+ element_type type;
+ void *node;
/** \todo parse error */
+ /** todo fragment case */
+ element_stack_pop(treebuilder, &ns, &type, &node);
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx,
+ node);
while (stack[treebuilder->context.current_node].ns !=
- HUBBUB_NS_HTML) {
- hubbub_ns ns;
- element_type type;
- void *node;
+ HUBBUB_NS_HTML &&
+ !(stack[treebuilder->context.current_node].ns ==
+ HUBBUB_NS_MATHML && (
+ stack[treebuilder->context.current_node].type ==
+ MI || stack[treebuilder->context.current_node].type ==
+ MO || stack[treebuilder->context.current_node].type ==
+ MN || stack[treebuilder->context.current_node].type ==
+ MS || stack[treebuilder->context.current_node].type ==
+ MTEXT)) &&
+ !(stack[treebuilder->context.current_node].ns ==
+ HUBBUB_NS_SVG && (
+ stack[treebuilder->context.current_node].type ==
+ FOREIGNOBJECT ||
+ stack[treebuilder->context.current_node].type ==
+ DESC ||
+ stack[treebuilder->context.current_node].type ==
+ TITLE))
+ ) {
element_stack_pop(treebuilder, &ns, &type, &node);
-
treebuilder->tree_handler->unref_node(
treebuilder->tree_handler->ctx,
node);
+
+ if(ns == HUBBUB_NS_MATHML &&
+ type == ANNOTATION_XML) {
+ /*todo check for attributes */
+ }
}
treebuilder->context.mode = treebuilder->context.second_mode;
@@ -389,9 +417,30 @@ static void foreign_break_out(hubbub_treebuilder *treebuilder)
hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
const hubbub_token *token)
{
+ hubbub_ns cur_node_ns = treebuilder->context.element_stack[
+ treebuilder->context.current_node].ns;
+
+ element_type cur_node = current_node(treebuilder);
+ element_type type = element_type_from_name(treebuilder,
+ &token->data.tag.name);
+
+ if (treebuilder->context.current_node == 0 ||
+ cur_node_ns == HUBBUB_NS_HTML ||
+ (cur_node_ns == HUBBUB_NS_MATHML &&
+ (type != MGLYPH && type != MALIGNMARK) &&
+ (cur_node == MI || cur_node == MO ||
+ cur_node == MN || cur_node == MS ||
+ cur_node == MTEXT)) ||
+ (type == SVG && (cur_node_ns == HUBBUB_NS_MATHML &&
+ cur_node == ANNOTATION_XML)) ||
+ (cur_node_ns == HUBBUB_NS_SVG &&
+ (cur_node == FOREIGNOBJECT ||
+ cur_node == DESC ||
+ cur_node == TITLE))) {
+ return process_as_in_secondary(treebuilder, token);
+ }
hubbub_error err = HUBBUB_OK;
const uint8_t *c;
-
switch (token->type) {
case HUBBUB_TOKEN_CHARACTER:
c = (token->data.character.ptr);
@@ -411,27 +460,8 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
break;
case HUBBUB_TOKEN_START_TAG:
{
- hubbub_ns cur_node_ns = treebuilder->context.element_stack[
- treebuilder->context.current_node].ns;
-
- element_type cur_node = current_node(treebuilder);
- element_type type = element_type_from_name(treebuilder,
- &token->data.tag.name);
-
- if (cur_node_ns == HUBBUB_NS_HTML ||
- (cur_node_ns == HUBBUB_NS_MATHML &&
- (type != MGLYPH && type != MALIGNMARK) &&
- (cur_node == MI || cur_node == MO ||
- cur_node == MN || cur_node == MS ||
- cur_node == MTEXT)) ||
- (type == SVG && (cur_node_ns == HUBBUB_NS_MATHML &&
- cur_node == ANNOTATION_XML)) ||
- (cur_node_ns == HUBBUB_NS_SVG &&
- (cur_node == FOREIGNOBJECT ||
- cur_node == DESC ||
- cur_node == TITLE))) {
- err = process_as_in_secondary(treebuilder, token);
- } else if (type == B || type == BIG || type == BLOCKQUOTE ||
+ bool handled = false;
+ if (type == B || type == BIG || type == BLOCKQUOTE ||
type == BODY || type == BR || type == CENTER ||
type == CODE || type == DD || type == DIV ||
type == DL || type == DT || type == EM ||
@@ -449,9 +479,11 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
type == VAR) {
foreign_break_out(treebuilder);
err = HUBBUB_REPROCESS;
+ handled = true;
} else if (type == FONT) {
const hubbub_tag *tag = &token->data.tag;
size_t i;
+ bool found = false;
for (i = 0; i < tag->n_attributes; i++) {
hubbub_attribute *attr = &tag->attributes[i];
@@ -461,20 +493,24 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
if (hubbub_string_match(name, len,
(const uint8_t *) "color",
SLEN("color")) ||
- hubbub_string_match(name, len,
+ hubbub_string_match(name, len,
(const uint8_t *) "face",
SLEN("face")) ||
- hubbub_string_match(name, len,
+ hubbub_string_match(name, len,
(const uint8_t *) "size",
- SLEN("size")))
+ SLEN("size"))) {
+ found = true;
break;
+ }
}
- if (i != tag->n_attributes) {
+ if (found) {
foreign_break_out(treebuilder);
err = HUBBUB_REPROCESS;
+ handled = true;
}
- } else {
+ }
+ if (!handled) {
hubbub_tag tag = token->data.tag;
if (cur_node_ns == HUBBUB_NS_SVG) {
@@ -504,8 +540,7 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
&token->data.tag.name);
uint32_t node;
element_context *stack = treebuilder->context.element_stack;
-
- for (node = treebuilder->context.current_node; node > 0; node--) {
+ for (node = treebuilder->context.current_node; node > 1; node--) {
if(stack[node].type == type) {
hubbub_ns ns;
element_type type;
@@ -518,8 +553,13 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
}
return HUBBUB_OK;
}
+ if(stack[node].ns == HUBBUB_NS_HTML) {
+ break;
+ }
+ }
+ if(node > 1) {
+ err = process_as_in_secondary(treebuilder, token);
}
- err = process_as_in_secondary(treebuilder, token);
}
break;
case HUBBUB_TOKEN_EOF:
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index f86396f..c8412aa 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -50,8 +50,8 @@ tests4.dat html5lib treebuilder tests
tests5.dat html5lib treebuilder tests
tests6.dat html5lib treebuilder tests
tests7.dat html5lib treebuilder tests
-#tests8.dat NA
-#tests9.dat NA
+tests8.dat html5lib treebuilder tests
+tests9.dat html5lib treebuilder tests
#tests_innerHTML_1.dat NA
#tricky01.dat NA
#webkit01.dat NA
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=cbf089f7a6be8b9eb...
commit cbf089f7a6be8b9eb22ec4a0220c01be9f49ad11
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
fixed handlers of table related and select related elements
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index 43fc678..eb82db0 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -385,15 +385,15 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
if (err != HUBBUB_OK)
return err;
- if (treebuilder->context.mode == IN_BODY) {
- treebuilder->context.mode = IN_SELECT;
- } else if (treebuilder->context.mode == IN_TABLE ||
+ if (treebuilder->context.mode == IN_TABLE ||
treebuilder->context.mode == IN_CAPTION ||
treebuilder->context.mode == IN_COLUMN_GROUP ||
treebuilder->context.mode == IN_TABLE_BODY ||
treebuilder->context.mode == IN_ROW ||
treebuilder->context.mode == IN_CELL) {
treebuilder->context.mode = IN_SELECT_IN_TABLE;
+ } else {
+ treebuilder->context.mode = IN_SELECT;
}
} else if (type == OPTGROUP || type == OPTION) {
err = process_opt_in_body(treebuilder, token);
diff --git a/src/treebuilder/in_select.c b/src/treebuilder/in_select.c
index a49b568..7c15b49 100644
--- a/src/treebuilder/in_select.c
+++ b/src/treebuilder/in_select.c
@@ -83,10 +83,10 @@ hubbub_error handle_in_select(hubbub_treebuilder *treebuilder,
err = insert_element(treebuilder, &token->data.tag,
true);
- } else if (type == SELECT || type == INPUT ||
+ } else if (type == SELECT || type == KEYGEN || type == INPUT ||
type == TEXTAREA) {
- if (element_in_scope(treebuilder, SELECT, TABLE_SCOPE)) {
+ if (element_in_scope(treebuilder, SELECT, SELECT_SCOPE)) {
element_stack_pop_until(treebuilder,
SELECT);
reset_insertion_mode(treebuilder);
diff --git a/src/treebuilder/in_table.c b/src/treebuilder/in_table.c
index d3d32e8..875e8ae 100644
--- a/src/treebuilder/in_table.c
+++ b/src/treebuilder/in_table.c
@@ -80,16 +80,19 @@ hubbub_error handle_in_table(hubbub_treebuilder *treebuilder,
{
hubbub_error err = HUBBUB_OK;
bool handled = true;
+ element_type type =
+ current_node(treebuilder);
+ bool tainted = !(type == TABLE ||
+ type == TBODY || type == TFOOT ||
+ type == THEAD || type == TR);
switch (token->type) {
case HUBBUB_TOKEN_CHARACTER:
- if (treebuilder->context.element_stack[
- current_table(treebuilder)
- ].tainted) {
+ if (tainted) {
handled = false;
} else {
- err = process_characters_expect_whitespace(
- treebuilder, token, true);
+ err = process_in_table_text(
+ treebuilder, token);
handled = (err == HUBBUB_OK);
}
break;
@@ -105,9 +108,6 @@ hubbub_error handle_in_table(hubbub_treebuilder *treebuilder,
{
element_type type = element_type_from_name(treebuilder,
&token->data.tag.name);
- bool tainted = treebuilder->context.element_stack[
- current_table(treebuilder)
- ].tainted;
if (type == CAPTION) {
clear_stack_table_context(treebuilder);
@@ -206,11 +206,40 @@ hubbub_error handle_in_table(hubbub_treebuilder *treebuilder,
reset_insertion_mode(treebuilder);
err = HUBBUB_REPROCESS;
- } else if (!tainted && (type == STYLE || type == SCRIPT)) {
+ } else if (type == STYLE || type == SCRIPT) {
err = handle_in_head(treebuilder, token);
- } else if (!tainted && type == INPUT) {
+ } else if (type == INPUT) {
err = process_input_in_table(treebuilder, token);
handled = (err == HUBBUB_OK);
+ } else if(type == FORM) {
+ 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(template_in_stack == true ||
+ treebuilder->context.form_element != NULL ) {
+ /* ignore the token*/
+ break;
+ }
+ insert_element(treebuilder, &token->data.tag, true);
+ treebuilder->context.form_element =
+ treebuilder->context.element_stack[
+ treebuilder->context.current_node].node;
+ {
+ /* pop and unref */
+ hubbub_ns ns;
+ element_type otype;
+ void *node;
+
+ err = element_stack_pop(treebuilder, &ns,
+ &otype, &node);
+ }
} else {
handled = false;
}
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index 5eca574..941f94a 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -27,7 +27,7 @@ typedef enum
A, B, BIG, CODE, EM, FONT, I, NOBR, S, SMALL, STRIKE, STRONG, TT, U,
/* Phrasing */
/**< \todo Enumerate phrasing elements */
- COMMAND, DATAGRID, DIALOG, IMAGE,LABEL, OPTGROUP, OPTION, OUTPUT, RP, RT, RUBY, SPACER, SPAN, SUB, SUP, VAR,
+ COMMAND, DATAGRID, DIALOG, IMAGE, KEYGEN, LABEL, OPTGROUP, OPTION, OUTPUT, RP, RT, RUBY, SPACER, SPAN, SUB, SUP, VAR,
/* MathML */
MATH, MGLYPH, MALIGNMARK, MI, MO, MN, MS, MTEXT, ANNOTATION_XML,
/* SVG */
@@ -137,6 +137,8 @@ hubbub_error hubbub_treebuilder_token_handler(
hubbub_error process_characters_expect_whitespace(
hubbub_treebuilder *treebuilder, const hubbub_token *token,
bool insert_into_current_node);
+hubbub_error process_in_table_text(
+ hubbub_treebuilder *treebuilder, const hubbub_token *token);
hubbub_error process_comment_append(hubbub_treebuilder *treebuilder,
const hubbub_token *token, void *parent);
hubbub_error parse_generic_rcdata(hubbub_treebuilder *treebuilder,
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index a1bc802..11ff2a2 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -48,6 +48,7 @@ static const struct {
{ S("hr"), HR }, { S("iframe"), IFRAME },
{ S("image"), IMAGE }, { S("img"), IMG },
{ S("input"), INPUT }, { S("isindex"), ISINDEX },
+ { S("keygen"), KEYGEN },
{ S("li"), LI }, { S("link"), LINK },
{ S("listing"), LISTING }, { S("main"), MAIN },
{ S("menu"), MENU }, { S("menuitem"), MENUITEM },
@@ -425,6 +426,48 @@ hubbub_error process_characters_expect_whitespace(
}
/**
+ * Process a character token in table text
+ *
+ * \param treebuilder The treebuilder instance
+ * \param token The character token
+ * \return HUBBUB_REPROCESS if the token needs reprocessing
+ * HUBBUB_OK if it contained only whitespace,
+ * appropriate error otherwise
+ */
+hubbub_error process_in_table_text(
+ hubbub_treebuilder *treebuilder,
+ const hubbub_token *token)
+{
+ const uint8_t *data = token->data.character.ptr;
+ size_t len = token->data.character.len;
+ size_t c;
+
+ for (c = 0; c < len; c++) {
+ if (data[c] != 0x09 && data[c] != 0x0A &&
+ data[c] != 0x0C && data[c] != 0x20)
+ break;
+ }
+
+ if (c == len) {
+ hubbub_error error;
+ hubbub_string temp;
+
+ temp.ptr = data;
+ temp.len = c;
+
+ error = append_text(treebuilder, &temp);
+ if (error != HUBBUB_OK)
+ return error;
+ }
+
+ /* Non-whitespace characters in token, so reprocess */
+ if (c != len) {
+ return HUBBUB_REPROCESS;
+ }
+
+ return HUBBUB_OK;
+}
+/**
* Process a comment token, appending it to the given parent
*
* \param treebuilder The treebuilder instance
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index d45e4dd..f86396f 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -49,7 +49,7 @@ tests3.dat html5lib treebuilder tests
tests4.dat html5lib treebuilder tests
tests5.dat html5lib treebuilder tests
tests6.dat html5lib treebuilder tests
-#tests7.dat NA
+tests7.dat html5lib treebuilder tests
#tests8.dat NA
#tests9.dat NA
#tests_innerHTML_1.dat NA
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=ed926caf5f57e393f...
commit ed926caf5f57e393fc3d9d22156098519eaeaf58
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
added provision to get quirks mode of document from treebuilder, assuming treebuilder has one document associated with it. Also fixed table endtag handler in in_table insertion mode. Also fixed table starttag handler in in_body insertion mode
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index 04eb8c2..43fc678 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -321,7 +321,13 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
err = parse_generic_rcdata(treebuilder, token, false);
} else if (type == TABLE) {
- err = process_container_in_body(treebuilder, token);
+ if(treebuilder->quirks_mode != HUBBUB_QUIRKS_MODE_FULL &&
+ element_in_scope(treebuilder, P,
+ BUTTON_SCOPE)) {
+ err = close_p_in_body(treebuilder);
+ }
+ insert_element(treebuilder, &token->data.tag,
+ true);
if (err == HUBBUB_OK) {
treebuilder->context.frameset_ok = false;
diff --git a/src/treebuilder/in_table.c b/src/treebuilder/in_table.c
index 908d5ad..d3d32e8 100644
--- a/src/treebuilder/in_table.c
+++ b/src/treebuilder/in_table.c
@@ -225,7 +225,8 @@ hubbub_error handle_in_table(hubbub_treebuilder *treebuilder,
/** \todo fragment case */
if(!element_in_scope(treebuilder, TABLE, TABLE_SCOPE)) {
/* todo parse error */
- break;
+ handled = true;
+ break;
}
element_stack_pop_until(treebuilder, TABLE);
diff --git a/src/treebuilder/initial.c b/src/treebuilder/initial.c
index 9c2a6aa..2676757 100644
--- a/src/treebuilder/initial.c
+++ b/src/treebuilder/initial.c
@@ -125,7 +125,7 @@ static bool lookup_full_quirks(hubbub_treebuilder *treebuilder,
#define S(s) (uint8_t *) s, sizeof s - 1
/* Check the name is "HTML" (case-insensitively) */
- if (!hubbub_string_match_ci(name, name_len, S("HTML")))
+ if (!hubbub_string_match(name, name_len, S("html")))
return true;
/* No public id means not-quirks */
@@ -148,7 +148,116 @@ static bool lookup_full_quirks(hubbub_treebuilder *treebuilder,
hubbub_string_match_ci(public_id, public_id_len,
S("HTML")) ||
hubbub_string_match_ci(system_id, system_id_len,
- S("http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"))) {
+ S("http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd")) ||
+ starts_with(public_id, public_id_len,
+ S("-//AS//DTD HTML 3.0 asWedit + extensions//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//AdvaSoft Ltd//DTD HTML 3.0 asWedit + extensions//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML 2.0 Level 1//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML 2.0 Level 2//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML 2.0 Strict Level 1//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML 2.0 Strict Level 2//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML 2.0 Strict//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML 2.0//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML 2.1E//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML 3.0//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML 3.2 Final//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML 3.2//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML 3//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML Level 0//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML Level 1//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML Level 2//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML Level 3//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML Strict Level 0//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML Strict Level 1//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML Strict Level 2//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML Strict Level 3//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML Strict//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//IETF//DTD HTML//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//Metrius//DTD Metrius Presentational//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//Microsoft//DTD Internet Explorer 2.0 HTML Strict//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//Microsoft//DTD Internet Explorer 2.0 HTML//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//Microsoft//DTD Internet Explorer 2.0 Tables//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//Microsoft//DTD Internet Explorer 3.0 HTML Strict//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//Microsoft//DTD Internet Explorer 3.0 HTML//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//Microsoft//DTD Internet Explorer 3.0 Tables//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//Netscape Comm. Corp.//DTD HTML//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//Netscape Comm. Corp.//DTD Strict HTML//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//O'Reilly and Associates//DTD HTML 2.0//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//O'Reilly and Associates//DTD HTML Extended 1.0//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//O'Reilly and Associates//DTD HTML Extended Relaxed 1.0//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//SQ//DTD HTML 2.0 HoTMetaL + extensions//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//SoftQuad Software//DTD HoTMetaL PRO 6.0::19990601::extensions to HTML 4.0//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//SoftQuad//DTD HoTMetaL PRO 4.0::19971010::extensions to HTML 4.0//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//Spyglass//DTD HTML 2.0 Extended//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//Sun Microsystems Corp.//DTD HotJava HTML//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//Sun Microsystems Corp.//DTD HotJava Strict HTML//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//W3C//DTD HTML 3 1995-03-24//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//W3C//DTD HTML 3.2 Draft//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//W3C//DTD HTML 3.2 Final//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//W3C//DTD HTML 3.2//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//W3C//DTD HTML 3.2S Draft//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//W3C//DTD HTML 4.0 Frameset//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//W3C//DTD HTML 4.0 Transitional//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//W3C//DTD HTML Experimental 19960712//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//W3C//DTD HTML Experimental 970421//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//W3C//DTD W3 HTML//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//W3O//DTD W3 HTML 3.0//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//WebTechs//DTD Mozilla HTML 2.0//")) ||
+ starts_with(public_id, public_id_len,
+ S("-//WebTechs//DTD Mozilla HTML//"))
+ ) {
return true;
}
@@ -178,9 +287,7 @@ static bool lookup_limited_quirks(hubbub_treebuilder *treebuilder,
{
const uint8_t *public_id = cdoc->public_id.ptr;
size_t public_id_len = cdoc->public_id.len;
-
UNUSED(treebuilder);
-
#define S(s) (uint8_t *) s, sizeof s - 1
if (starts_with(public_id, public_id_len,
@@ -226,6 +333,7 @@ hubbub_error handle_initial(hubbub_treebuilder *treebuilder,
treebuilder->tree_handler->set_quirks_mode(
treebuilder->tree_handler->ctx,
HUBBUB_QUIRKS_MODE_FULL);
+ treebuilder->quirks_mode = HUBBUB_QUIRKS_MODE_FULL;
treebuilder->context.mode = BEFORE_HTML;
}
break;
@@ -271,10 +379,12 @@ hubbub_error handle_initial(hubbub_treebuilder *treebuilder,
treebuilder->tree_handler->set_quirks_mode(
treebuilder->tree_handler->ctx,
HUBBUB_QUIRKS_MODE_FULL);
+ treebuilder->quirks_mode = HUBBUB_QUIRKS_MODE_FULL;
} else if (lookup_limited_quirks(treebuilder, cdoc)) {
treebuilder->tree_handler->set_quirks_mode(
treebuilder->tree_handler->ctx,
HUBBUB_QUIRKS_MODE_LIMITED);
+ treebuilder->quirks_mode = HUBBUB_QUIRKS_MODE_LIMITED;
}
treebuilder->context.mode = BEFORE_HTML;
@@ -287,6 +397,7 @@ hubbub_error handle_initial(hubbub_treebuilder *treebuilder,
treebuilder->tree_handler->set_quirks_mode(
treebuilder->tree_handler->ctx,
HUBBUB_QUIRKS_MODE_FULL);
+ treebuilder->quirks_mode = HUBBUB_QUIRKS_MODE_FULL;
err = HUBBUB_REPROCESS;
break;
}
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index 2cd5e4a..5eca574 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -128,6 +128,7 @@ struct hubbub_treebuilder
hubbub_error_handler error_handler; /**< Error handler */
void *error_pw; /**< Error handler data */
+ hubbub_quirks_mode quirks_mode; /**< The quirks mode to which the document is set to*/
};
hubbub_error hubbub_treebuilder_token_handler(
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index 5d84ff0..a1bc802 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -142,6 +142,7 @@ hubbub_error hubbub_treebuilder_create(hubbub_tokeniser *tokeniser,
tb->error_handler = NULL;
tb->error_pw = NULL;
+ tb->quirks_mode = HUBBUB_QUIRKS_MODE_NONE;
tokparams.token_handler.handler = hubbub_treebuilder_token_handler;
tokparams.token_handler.pw = tb;
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index 3b3136b..d45e4dd 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -45,7 +45,7 @@ tests1.dat html5lib treebuilder tests
#tests25.dat NA
#tests26.dat NA
tests2.dat html5lib treebuilder tests
-#tests3.dat NA
+tests3.dat html5lib treebuilder tests
tests4.dat html5lib treebuilder tests
tests5.dat html5lib treebuilder tests
tests6.dat html5lib treebuilder tests
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=12ac2948863ace2fd...
commit 12ac2948863ace2fd183fc67e0018e6e223ae980
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
fixed isindex and form start tag handlers
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
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=69d15c35c2b40f8b6...
commit 69d15c35c2b40f8b683bc680126683c0c6500bd8
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Fixed enumerator entries & name-type mapping. Also fixed the option/optgroup tag starting handler. Also emitted on encountering a '<' in script related state. Also fixed the check for special element.
diff --git a/src/tokeniser/tokeniser.c b/src/tokeniser/tokeniser.c
index 158d09a..1d16ba4 100644
--- a/src/tokeniser/tokeniser.c
+++ b/src/tokeniser/tokeniser.c
@@ -1339,6 +1339,8 @@ hubbub_error hubbub_tokeniser_handle_script_data_escaped_dash(hubbub_tokeniser *
tokeniser->context.pending += len;
} else if(c == '<') {
+ /*emit any pending characters*/
+ emit_current_chars(tokeniser);
if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_DASH ||
tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_DASH_DASH) {
tokeniser->state = STATE_SCRIPT_DATA_ESCAPED_LESS_THAN;
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index 69ec3d6..bdf2c0b 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -1361,12 +1361,21 @@ hubbub_error process_select_in_body(hubbub_treebuilder *treebuilder,
hubbub_error process_opt_in_body(hubbub_treebuilder *treebuilder,
const hubbub_token *token)
{
- hubbub_error err;
+ hubbub_error err;
- if (element_in_scope(treebuilder, OPTION, NONE)) {
- err = process_0generic_in_body(treebuilder, OPTION);
- /* Cannot fail */
- assert(err == HUBBUB_OK);
+ element_context *stack = treebuilder->context.element_stack;
+ uint32_t node = treebuilder->context.current_node;
+ element_type ntype = stack[node].type;
+
+ if(ntype == OPTION) {
+ hubbub_ns ns;
+ void *node;
+ element_type otype;
+ element_stack_pop(treebuilder, &ns, &otype, &node);
+
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx,
+ node);
}
err = reconstruct_active_formatting_list(treebuilder);
@@ -2452,8 +2461,7 @@ hubbub_error process_0generic_in_body(hubbub_treebuilder *treebuilder,
}
break;
- } else if (!is_formatting_element(stack[node].type) &&
- !is_phrasing_element(stack[node].type)) {
+ } else if (is_special_element(stack[node].type)) {
/** \todo parse error */
break;
}
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index ccec4ed..2cd5e4a 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -14,20 +14,20 @@ typedef enum
{
/* Special */
ADDRESS, AREA, ARTICLE, ASIDE, BASE, BASEFONT, BGSOUND, BLOCKQUOTE,
- BODY, BR, CENTER, COL, COLGROUP, COMMAND, DATAGRID, DD, DETAILS,
- DIALOG, DIR, DIV, DL, DT, EMBED, FIELDSET, FIGURE, FOOTER, FORM, FRAME,
- FRAMESET, H1, H2, H3, H4, H5, H6, HEAD, HEADER, HGROUP, HR, IFRAME, IMAGE, IMG,
+ BODY, BR, CENTER, COL, COLGROUP, DD, DETAILS,
+ DIR, DIV, DL, DT, EMBED, FIELDSET, FIGCAPTION, FIGURE, FOOTER, FORM, FRAME,
+ FRAMESET, H1, H2, H3, H4, H5, H6, HEAD, HEADER, HGROUP, HR, IFRAME, IMG,
INPUT, ISINDEX, LI, LINK, LISTING, MAIN, MENU, MENUITEM, META, NAV, NOEMBED, NOFRAMES,
- NOSCRIPT, OL, OPTGROUP, OPTION, P, PARAM, PLAINTEXT, PRE, SCRIPT,
- SECTION, SELECT, SPACER, SOURCE, STYLE, SUMMARY, TBODY, TEMPLATE, TEXTAREA, TFOOT, THEAD, TITLE,
- TR, UL, WBR,
+ NOSCRIPT, OL, P, PARAM, PLAINTEXT, PRE, SCRIPT,
+ SECTION, SELECT, SOURCE, STYLE, SUMMARY, TBODY, TEMPLATE, TEXTAREA, TFOOT, THEAD, TITLE,
+ TR, TRACK, UL, WBR, XMP,
/* Scoping */
APPLET, BUTTON, CAPTION, HTML, MARQUEE, OBJECT, TABLE, TD, TH,
/* Formatting */
A, B, BIG, CODE, EM, FONT, I, NOBR, S, SMALL, STRIKE, STRONG, TT, U,
/* Phrasing */
/**< \todo Enumerate phrasing elements */
- LABEL, OUTPUT, RP, RT, RUBY, SPAN, SUB, SUP, VAR, XMP,
+ COMMAND, DATAGRID, DIALOG, IMAGE,LABEL, OPTGROUP, OPTION, OUTPUT, RP, RT, RUBY, SPACER, SPAN, SUB, SUP, VAR,
/* MathML */
MATH, MGLYPH, MALIGNMARK, MI, MO, MN, MS, MTEXT, ANNOTATION_XML,
/* SVG */
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index 115e541..5d84ff0 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -24,52 +24,64 @@ static const struct {
size_t len;
element_type type;
} name_type_map[] = {
- { S("address"), ADDRESS }, { S("area"), AREA },
- { S("b"), B },
+ { S("address"), ADDRESS },
+ { S("area"), AREA }, { S("article"), ARTICLE },
+ { S("aside"), ASIDE }, { S("b"), B },
{ S("base"), BASE }, { S("basefont"), BASEFONT },
{ S("bgsound"), BGSOUND }, { S("blockquote"), BLOCKQUOTE },
{ S("body"), BODY }, { S("br"), BR },
{ S("center"), CENTER }, { S("col"), COL },
{ S("code"), CODE },
{ S("colgroup"), COLGROUP }, { S("dd"), DD },
+ { S("details"), DETAILS },
{ S("dir"), DIR }, { S("div"), DIV },
{ S("dl"), DL }, { S("dt"), DT },
{ S("embed"), EMBED }, { S("fieldset"), FIELDSET },
+ { S("figcaption"), FIGCAPTION },{ S("figure"), FIGURE },
+ { S("footer"), FOOTER },
{ S("form"), FORM }, { S("frame"), FRAME },
{ S("frameset"), FRAMESET }, { S("h1"), H1 },
{ S("h2"), H2 }, { S("h3"), H3 },
{ S("h4"), H4 }, { S("h5"), H5 },
{ S("h6"), H6 }, { S("head"), HEAD },
+ { S("header"), HEADER }, { S("hgroup"), HGROUP },
{ S("hr"), HR }, { S("iframe"), IFRAME },
{ S("image"), IMAGE }, { S("img"), IMG },
{ S("input"), INPUT }, { S("isindex"), ISINDEX },
{ S("li"), LI }, { S("link"), LINK },
- { S("listing"), LISTING },
- { S("menu"), MENU },
- { S("meta"), META }, { S("noembed"), NOEMBED },
+ { S("listing"), LISTING }, { S("main"), MAIN },
+ { S("menu"), MENU }, { S("menuitem"), MENUITEM },
+ { S("meta"), META }, { S("nav"), NAV },
+ { S("noembed"), NOEMBED },
{ S("noframes"), NOFRAMES }, { S("noscript"), NOSCRIPT },
{ S("ol"), OL }, { S("optgroup"), OPTGROUP },
{ S("option"), OPTION }, { S("output"), OUTPUT },
{ S("p"), P }, { S("param"), PARAM },
{ S("plaintext"), PLAINTEXT }, { S("pre"), PRE },
- { S("script"), SCRIPT }, { S("select"), SELECT },
+ { S("script"), SCRIPT }, { S("section"), SECTION },
+ { S("select"), SELECT }, { S("source"), SOURCE },
{ S("spacer"), SPACER }, { S("style"), STYLE },
- { S("tbody"), TBODY }, { S("textarea"), TEXTAREA },
+ { S("summary"), SUMMARY }, { S("tbody"), TBODY },
+ { S("template"), TEMPLATE }, { S("textarea"), TEXTAREA },
{ S("tfoot"), TFOOT }, { S("thead"), THEAD },
{ S("title"), TITLE }, { S("tr"), TR },
+ { S("track"), TRACK },
{ S("ul"), UL }, { S("wbr"), WBR },
+ { S("xmp"), XMP },
{ S("applet"), APPLET }, { S("button"), BUTTON },
{ S("caption"), CAPTION }, { S("html"), HTML },
{ S("marquee"), MARQUEE }, { S("object"), OBJECT },
{ S("table"), TABLE }, { S("td"), TD },
{ S("th"), TH },
{ S("a"), A }, { S("b"), B },
- { S("big"), BIG }, { S("em"), EM },
+ { S("big"), BIG }, { S("code"), CODE },
+ { S("em"), EM },
{ S("font"), FONT }, { S("i"), I },
{ S("nobr"), NOBR }, { S("s"), S },
{ S("small"), SMALL }, { S("strike"), STRIKE },
- { S("strong"), STRONG }, { S("tt"), TT },
- { S("u"), U }, { S("xmp"), XMP },
+ { S("strong"), STRONG }, { S("span"), SPAN },
+ { S("tt"), TT },
+ { S("u"), U },
{ S("math"), MATH }, { S("mglyph"), MGLYPH },
{ S("malignmark"), MALIGNMARK },
@@ -78,7 +90,7 @@ static const struct {
{ S("mtext"), MTEXT }, { S("annotation-xml"), ANNOTATION_XML },
{ S("svg"), SVG }, { S("desc"), DESC },
- { S("foreignobject"), FOREIGNOBJECT },
+ { S("foreignobject"), FOREIGNOBJECT }
};
static bool is_form_associated(element_type type);
@@ -1037,7 +1049,9 @@ element_type element_type_from_name(hubbub_treebuilder *treebuilder,
*/
bool is_special_element(element_type type)
{
- return (type <= WBR);
+ return (type <= TH) ||
+ (type >= MI && type <= ANNOTATION_XML) ||
+ (type >=FOREIGNOBJECT && type <= DESC);
}
/**
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=b1ee6c8baaa655f20...
commit b1ee6c8baaa655f20254db8381a3e23214e96917
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
SCRIPT related states added to the tokeniser. This might still be buggy. All the script relted bug patches will be rebased from here. Some states can still be collapsed & the code can still be made more understandable & beautiful ;)
diff --git a/src/tokeniser/tokeniser.c b/src/tokeniser/tokeniser.c
index ca13366..158d09a 100644
--- a/src/tokeniser/tokeniser.c
+++ b/src/tokeniser/tokeniser.c
@@ -16,11 +16,14 @@
#include "utils/parserutilserror.h"
#include "utils/utils.h"
+#include "utils/string.h"
#include "hubbub/errors.h"
#include "tokeniser/entities.h"
#include "tokeniser/tokeniser.h"
+#define S(s) (uint8_t *) s, sizeof s - 1
+
/**
* Table of mappings between Windows-1252 codepoints 128-159 and UCS4
*/
@@ -98,7 +101,26 @@ typedef enum hubbub_tokeniser_state {
STATE_MATCH_CDATA,
STATE_CDATA_BLOCK,
STATE_NUMBERED_ENTITY,
- STATE_NAMED_ENTITY
+ STATE_NAMED_ENTITY,
+ STATE_SCRIPT_DATA,
+ STATE_SCRIPT_DATA_LESS_THAN,
+ STATE_SCRIPT_DATA_END_TAG_OPEN,
+ STATE_SCRIPT_DATA_END_TAG_NAME,
+ STATE_SCRIPT_DATA_ESCAPE_START,
+ STATE_SCRIPT_DATA_ESCAPE_START_DASH,
+ STATE_SCRIPT_DATA_ESCAPED,
+ STATE_SCRIPT_DATA_ESCAPED_DASH,
+ STATE_SCRIPT_DATA_ESCAPED_DASH_DASH,
+ STATE_SCRIPT_DATA_ESCAPED_LESS_THAN,
+ STATE_SCRIPT_DATA_ESCAPED_END_TAG_OPEN,
+ STATE_SCRIPT_DATA_ESCAPED_END_TAG_NAME,
+ STATE_SCRIPT_DATA_DOUBLE_ESCAPE_START,
+ STATE_SCRIPT_DATA_DOUBLE_ESCAPED,
+ STATE_SCRIPT_DATA_DOUBLE_ESCAPED_DASH,
+ STATE_SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH,
+ STATE_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN,
+ STATE_SCRIPT_DATA_DOUBLE_ESCAPE_END
+
} hubbub_tokeniser_state;
/**
@@ -206,6 +228,14 @@ static hubbub_error hubbub_tokeniser_handle_close_tag_open(
hubbub_tokeniser *tokeniser);
static hubbub_error hubbub_tokeniser_handle_tag_name(
hubbub_tokeniser *tokeniser);
+static hubbub_error hubbub_tokeniser_handle_script_data_escape_start(
+ hubbub_tokeniser *tokeniser);
+static hubbub_error hubbub_tokeniser_handle_script_data_escaped_dash(
+ hubbub_tokeniser *tokeniser);
+static hubbub_error hubbub_tokeniser_handle_script_data_escaped_less_than(
+ hubbub_tokeniser *tokeniser);
+static hubbub_error hubbub_tokeniser_handle_script_data_double_escape_start(
+ hubbub_tokeniser *tokeniser);
static hubbub_error hubbub_tokeniser_handle_before_attribute_name(
hubbub_tokeniser *tokeniser);
static hubbub_error hubbub_tokeniser_handle_attribute_name(
@@ -469,6 +499,9 @@ hubbub_error hubbub_tokeniser_run(hubbub_tokeniser *tokeniser)
while (cont == HUBBUB_OK) {
switch (tokeniser->state) {
state(STATE_DATA)
+ state(STATE_SCRIPT_DATA)
+ state(STATE_SCRIPT_DATA_ESCAPED)
+ state(STATE_SCRIPT_DATA_DOUBLE_ESCAPED)
cont = hubbub_tokeniser_handle_data(tokeniser);
break;
state(STATE_CHARACTER_REFERENCE_DATA)
@@ -476,15 +509,42 @@ hubbub_error hubbub_tokeniser_run(hubbub_tokeniser *tokeniser)
tokeniser);
break;
state(STATE_TAG_OPEN)
+ state(STATE_SCRIPT_DATA_LESS_THAN)
cont = hubbub_tokeniser_handle_tag_open(tokeniser);
break;
state(STATE_CLOSE_TAG_OPEN)
+ state(STATE_SCRIPT_DATA_END_TAG_OPEN)
+ state(STATE_SCRIPT_DATA_ESCAPED_END_TAG_OPEN)
cont = hubbub_tokeniser_handle_close_tag_open(
tokeniser);
break;
state(STATE_TAG_NAME)
+ state(STATE_SCRIPT_DATA_END_TAG_NAME)
+ state(STATE_SCRIPT_DATA_ESCAPED_END_TAG_NAME)
cont = hubbub_tokeniser_handle_tag_name(tokeniser);
break;
+ state(STATE_SCRIPT_DATA_ESCAPE_START)
+ state(STATE_SCRIPT_DATA_ESCAPE_START_DASH)
+ cont = hubbub_tokeniser_handle_script_data_escape_start(
+ tokeniser);
+ break;
+ state(STATE_SCRIPT_DATA_ESCAPED_DASH)
+ state(STATE_SCRIPT_DATA_ESCAPED_DASH_DASH)
+ state(STATE_SCRIPT_DATA_DOUBLE_ESCAPED_DASH)
+ state(STATE_SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH)
+ cont = hubbub_tokeniser_handle_script_data_escaped_dash(
+ tokeniser);
+ break;
+ state(STATE_SCRIPT_DATA_ESCAPED_LESS_THAN)
+ state(STATE_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN)
+ cont = hubbub_tokeniser_handle_script_data_escaped_less_than(
+ tokeniser);
+ break;
+ state(STATE_SCRIPT_DATA_DOUBLE_ESCAPE_START)
+ state(STATE_SCRIPT_DATA_DOUBLE_ESCAPE_END)
+ cont = hubbub_tokeniser_handle_script_data_double_escape_start(
+ tokeniser);
+ break;
state(STATE_BEFORE_ATTRIBUTE_NAME)
cont = hubbub_tokeniser_handle_before_attribute_name(
tokeniser);
@@ -625,6 +685,7 @@ hubbub_error hubbub_tokeniser_run(hubbub_tokeniser *tokeniser)
cont = hubbub_tokeniser_handle_named_entity(
tokeniser);
break;
+
}
}
@@ -687,7 +748,11 @@ hubbub_error hubbub_tokeniser_handle_data(hubbub_tokeniser *tokeniser)
if (c == '&' &&
(tokeniser->content_model == HUBBUB_CONTENT_MODEL_PCDATA ||
tokeniser->content_model == HUBBUB_CONTENT_MODEL_RCDATA) &&
- tokeniser->escape_flag == false) {
+ tokeniser->escape_flag == false &&
+ tokeniser->state != STATE_SCRIPT_DATA &&
+ tokeniser->state != STATE_SCRIPT_DATA_ESCAPED &&
+ tokeniser->state != STATE_SCRIPT_DATA_DOUBLE_ESCAPED
+ ) {
tokeniser->state =
STATE_CHARACTER_REFERENCE_DATA;
/* Don't eat the '&'; it'll be handled by entity
@@ -709,7 +774,15 @@ hubbub_error hubbub_tokeniser_handle_data(hubbub_tokeniser *tokeniser)
/* Buffer '<' */
tokeniser->context.pending = len;
- tokeniser->state = STATE_TAG_OPEN;
+ if(tokeniser->state == STATE_SCRIPT_DATA) {
+ tokeniser->state = STATE_SCRIPT_DATA_LESS_THAN;
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED_LESS_THAN;
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_DOUBLE_ESCAPED) {
+ tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN;
+ } else {
+ tokeniser->state = STATE_TAG_OPEN;
+ }
break;
} else if (c == '>' && tokeniser->escape_flag == true &&
(tokeniser->content_model ==
@@ -745,7 +818,10 @@ hubbub_error hubbub_tokeniser_handle_data(hubbub_tokeniser *tokeniser)
} else {
emit_character_token(tokeniser, &u_null_str);
}
-
+ if(tokeniser->state == STATE_SCRIPT_DATA_DOUBLE_ESCAPED ||
+ tokeniser->state == STATE_SCRIPT_DATA_ESCAPED) {
+ tokeniser->state = STATE_DATA;
+ }
/* Advance past NUL */
parserutils_inputstream_advance(tokeniser->input, 1);
} else if (c == '\r' && tokeniser->content_model != HUBBUB_CONTENT_MODEL_PLAINTEXT) {
@@ -772,6 +848,13 @@ hubbub_error hubbub_tokeniser_handle_data(hubbub_tokeniser *tokeniser)
/* Advance over */
parserutils_inputstream_advance(tokeniser->input, 1);
+ } else if(c == '-') {
+ if(tokeniser->state == STATE_SCRIPT_DATA_DOUBLE_ESCAPED) {
+ tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPED_DASH;
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED_DASH;
+ }
+ tokeniser->context.pending += len;
} else {
/* Just collect into buffer */
tokeniser->context.pending += len;
@@ -786,6 +869,12 @@ hubbub_error hubbub_tokeniser_handle_data(hubbub_tokeniser *tokeniser)
}
if (error == PARSERUTILS_EOF) {
+ /* there is no need to switch from SCRIPT_DATA or
+ the SCRIPT_DATA_ESCAPED states to the DATA state because
+ all the neccessary emitting is being done here itself.
+ Still, this is being done here to mantain the conformance
+ to specs */
+ tokeniser->state = STATE_DATA;
token.type = HUBBUB_TOKEN_EOF;
hubbub_tokeniser_emit_token(tokeniser, &token);
}
@@ -873,7 +962,11 @@ hubbub_error hubbub_tokeniser_handle_tag_open(hubbub_tokeniser *tokeniser)
if (error != PARSERUTILS_OK) {
if (error == PARSERUTILS_EOF) {
/* Return to data state with '<' still in "chars" */
- tokeniser->state = STATE_DATA;
+ if(tokeniser->state == STATE_SCRIPT_DATA_LESS_THAN) {
+ tokeniser->state = STATE_SCRIPT_DATA;
+ } else {
+ tokeniser->state = STATE_DATA;
+ }
return HUBBUB_OK;
} else {
return hubbub_error_from_parserutils_error(error);
@@ -887,8 +980,11 @@ hubbub_error hubbub_tokeniser_handle_tag_open(hubbub_tokeniser *tokeniser)
tokeniser->context.close_tag_match.match = false;
tokeniser->context.close_tag_match.count = 0;
-
- tokeniser->state = STATE_CLOSE_TAG_OPEN;
+ if(tokeniser->state == STATE_SCRIPT_DATA_LESS_THAN) {
+ tokeniser->state = STATE_SCRIPT_DATA_END_TAG_OPEN;
+ } else {
+ tokeniser->state = STATE_CLOSE_TAG_OPEN;
+ }
} else if (tokeniser->content_model == HUBBUB_CONTENT_MODEL_RCDATA ||
tokeniser->content_model == HUBBUB_CONTENT_MODEL_RAWTEXT ||
tokeniser->content_model ==
@@ -897,11 +993,19 @@ hubbub_error hubbub_tokeniser_handle_tag_open(hubbub_tokeniser *tokeniser)
tokeniser->state = STATE_DATA;
} else if (tokeniser->content_model == HUBBUB_CONTENT_MODEL_PCDATA) {
if (c == '!') {
- parserutils_inputstream_advance(tokeniser->input,
- SLEN("<!"));
+ if(tokeniser->state == STATE_SCRIPT_DATA_LESS_THAN) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPE_START;
+ tokeniser->context.pending += len;
+ return emit_current_chars(tokeniser);
+ } else {
+ parserutils_inputstream_advance(tokeniser->input,
+ SLEN("<!"));
- tokeniser->context.pending = 0;
- tokeniser->state = STATE_MARKUP_DECLARATION_OPEN;
+ tokeniser->context.pending = 0;
+ tokeniser->state = STATE_MARKUP_DECLARATION_OPEN;
+ }
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_LESS_THAN) {
+ tokeniser->state = STATE_SCRIPT_DATA;
} else if ('A' <= c && c <= 'Z') {
uint8_t lc = (c + 0x20);
@@ -1024,9 +1128,16 @@ hubbub_error hubbub_tokeniser_handle_close_tag_open(hubbub_tokeniser *tokeniser)
tokeniser->context.pending, &cptr, &len);
if (error == PARSERUTILS_EOF) {
+
/** \todo parse error */
/* Return to data state with "</" pending */
- tokeniser->state = STATE_DATA;
+ if(tokeniser->state == STATE_SCRIPT_DATA_END_TAG_OPEN) {
+ tokeniser->state = STATE_SCRIPT_DATA;
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_END_TAG_OPEN) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
+ } else {
+ tokeniser->state = STATE_DATA;
+ }
return HUBBUB_OK;
} else if (error != PARSERUTILS_OK) {
return hubbub_error_from_parserutils_error(error);
@@ -1044,8 +1155,13 @@ hubbub_error hubbub_tokeniser_handle_close_tag_open(hubbub_tokeniser *tokeniser)
HUBBUB_TOKEN_END_TAG;
tokeniser->context.pending += len;
-
- tokeniser->state = STATE_TAG_NAME;
+ if(tokeniser->state == STATE_SCRIPT_DATA_END_TAG_OPEN) {
+ tokeniser->state = STATE_SCRIPT_DATA_END_TAG_NAME;
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_END_TAG_OPEN) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED_END_TAG_NAME;
+ } else {
+ tokeniser->state = STATE_TAG_NAME;
+ }
} else if ('a' <= c && c <= 'z') {
START_BUF(tokeniser->context.current_tag.name,
cptr, len);
@@ -1056,10 +1172,21 @@ hubbub_error hubbub_tokeniser_handle_close_tag_open(hubbub_tokeniser *tokeniser)
tokeniser->context.pending += len;
- tokeniser->state = STATE_TAG_NAME;
+ if(tokeniser->state == STATE_SCRIPT_DATA_END_TAG_OPEN) {
+ tokeniser->state = STATE_SCRIPT_DATA_END_TAG_NAME;
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_END_TAG_OPEN) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED_END_TAG_NAME;
+ } else {
+ tokeniser->state = STATE_TAG_NAME;
+ }
} else if(tokeniser->content_model == HUBBUB_CONTENT_MODEL_RCDATA ||
tokeniser->content_model == HUBBUB_CONTENT_MODEL_RAWTEXT) {
tokeniser->state = STATE_DATA;
+
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_END_TAG_OPEN) {
+ tokeniser->state = STATE_SCRIPT_DATA;
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_END_TAG_OPEN) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
} else if (c == '>') {
/* Cursor still at "</", need to collect ">" */
tokeniser->context.pending += len;
@@ -1110,6 +1237,12 @@ hubbub_error hubbub_tokeniser_handle_tag_name(hubbub_tokeniser *tokeniser)
if(tokeniser->content_model == HUBBUB_CONTENT_MODEL_RCDATA ||
tokeniser->content_model == HUBBUB_CONTENT_MODEL_RAWTEXT) {
return emit_current_chars(tokeniser);
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_END_TAG_NAME) {
+ tokeniser->state = STATE_SCRIPT_DATA;
+ return emit_current_chars(tokeniser);
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_END_TAG_NAME) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
+ return emit_current_chars(tokeniser);
} else {
parserutils_inputstream_advance(tokeniser->input,
tokeniser->context.pending);
@@ -1134,7 +1267,13 @@ hubbub_error hubbub_tokeniser_handle_tag_name(hubbub_tokeniser *tokeniser)
/* We should emit "</" here, but instead we leave it in the
* buffer so the data state emits it with any characters
* following it */
- tokeniser->state = STATE_DATA;
+ if(tokeniser->state == STATE_SCRIPT_DATA_END_TAG_NAME) {
+ tokeniser->state = STATE_SCRIPT_DATA;
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_END_TAG_NAME) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
+ } else {
+ tokeniser->state = STATE_DATA;
+ }
return emit_current_chars(tokeniser);
} else {
@@ -1155,6 +1294,12 @@ hubbub_error hubbub_tokeniser_handle_tag_name(hubbub_tokeniser *tokeniser)
tokeniser->content_model == HUBBUB_CONTENT_MODEL_RAWTEXT) {
tokeniser->state = STATE_DATA;
return emit_current_chars(tokeniser);
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_END_TAG_NAME) {
+ tokeniser->state = STATE_SCRIPT_DATA;
+ tokeniser->context.pending += len;
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_END_TAG_NAME) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
+ tokeniser->context.pending += len;
} else {
COLLECT(ctag->name, cptr, len);
tokeniser->context.pending += len;
@@ -1164,6 +1309,238 @@ hubbub_error hubbub_tokeniser_handle_tag_name(hubbub_tokeniser *tokeniser)
return HUBBUB_OK;
}
+hubbub_error hubbub_tokeniser_handle_script_data_escaped_dash(hubbub_tokeniser *tokeniser)
+{
+ size_t len;
+ const uint8_t *cptr;
+ parserutils_error error;
+ uint8_t c;
+
+ error = parserutils_inputstream_peek(tokeniser->input,
+ tokeniser->context.pending, &cptr, &len);
+
+ if (error != PARSERUTILS_OK) {
+ if (error == PARSERUTILS_EOF) {
+ tokeniser->state = STATE_DATA;
+ return emit_current_chars(tokeniser);
+ } else {
+ return hubbub_error_from_parserutils_error(error);
+ }
+ }
+
+ c = *cptr;
+
+ if(c == '-') {
+ if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_DASH) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED_DASH_DASH;
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_DOUBLE_ESCAPED_DASH) {
+ tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH;
+ }
+
+ tokeniser->context.pending += len;
+ } else if(c == '<') {
+ if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_DASH ||
+ tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_DASH_DASH) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED_LESS_THAN;
+ } else {
+ tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN;
+ }
+ tokeniser->context.pending += len;
+ } else if(c == '>' && (tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_DASH_DASH ||
+ tokeniser->state == STATE_SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH)) {
+ tokeniser->state = STATE_SCRIPT_DATA;
+ tokeniser->context.pending += len;
+ return emit_current_chars(tokeniser);
+ } else if(c == '\0') {
+ hubbub_error err = HUBBUB_OK;
+
+ /*emit pending characters before emitting replacement character */
+ if(tokeniser->context.pending > 0)
+ err = emit_current_chars(tokeniser);
+ if(err != HUBBUB_OK)
+ return err;
+
+ tokeniser->context.pending += len;
+
+ parserutils_inputstream_advance(tokeniser->input, len);
+
+ if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_DASH ||
+ tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_DASH_DASH) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
+ } else {
+ tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPED;
+ }
+ return emit_character_token(tokeniser, &u_fffd_str);
+ } else {
+ tokeniser->context.pending += len;
+ if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_DASH ||
+ tokeniser->state == STATE_SCRIPT_DATA_ESCAPED_DASH_DASH) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
+ } else {
+ tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPED;
+ }
+ }
+ return HUBBUB_OK;
+}
+
+hubbub_error hubbub_tokeniser_handle_script_data_escaped_less_than(hubbub_tokeniser *tokeniser)
+{
+ size_t len;
+ const uint8_t *cptr;
+ parserutils_error error;
+ uint8_t c;
+ hubbub_tag *ctag = &tokeniser->context.current_tag;
+
+ error = parserutils_inputstream_peek(tokeniser->input,
+ tokeniser->context.pending, &cptr, &len);
+
+ if(error != PARSERUTILS_OK) {
+ if (error == PARSERUTILS_EOF) {
+ if(tokeniser->state == STATE_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
+ } else {
+ tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPED;
+ }
+ return emit_current_chars(tokeniser);
+ } else {
+ return hubbub_error_from_parserutils_error(error);
+ }
+ }
+
+ c = *cptr;
+
+ if (c == '/') {
+ tokeniser->context.pending += len;
+ if(tokeniser->state == STATE_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN) {
+ tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPE_END;
+ } else {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED_END_TAG_OPEN;
+ }
+ } else if(tokeniser->state == STATE_SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN) {
+ tokeniser->state =
+ STATE_SCRIPT_DATA_DOUBLE_ESCAPED;
+ } else if ('A' <= c && c <= 'Z') {
+ uint8_t lc = (c + 0x20);
+
+ START_BUF(ctag->name, &lc, len);
+ ctag->n_attributes = 0;
+ tokeniser->context.current_tag_type =
+ HUBBUB_TOKEN_START_TAG;
+
+ tokeniser->context.pending += len;
+
+ tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPE_START;
+ } else if ('a' <= c && c <= 'z') {
+ START_BUF(ctag->name, cptr, len);
+ ctag->n_attributes = 0;
+ tokeniser->context.current_tag_type =
+ HUBBUB_TOKEN_START_TAG;
+
+ tokeniser->context.pending += len;
+
+ tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPE_START;
+ } else {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
+ }
+ return HUBBUB_OK;
+}
+
+hubbub_error hubbub_tokeniser_handle_script_data_escape_start(hubbub_tokeniser *tokeniser)
+{
+ size_t len;
+ const uint8_t *cptr;
+ parserutils_error error;
+ uint8_t c;
+
+ error = parserutils_inputstream_peek(tokeniser->input,
+ tokeniser->context.pending, &cptr, &len);
+
+ if (error != PARSERUTILS_OK) {
+ if (error == PARSERUTILS_EOF) {
+ tokeniser->state = STATE_SCRIPT_DATA;
+ return emit_current_chars(tokeniser);
+ } else {
+ return hubbub_error_from_parserutils_error(error);
+ }
+ }
+
+ c = *cptr;
+
+ if (c == '-') {
+ tokeniser->context.pending += len;
+ if(tokeniser->state == STATE_SCRIPT_DATA_ESCAPE_START) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPE_START_DASH;
+ } else {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED_DASH_DASH;
+ }
+ } else {
+ tokeniser->state = STATE_SCRIPT_DATA;
+ }
+ return HUBBUB_OK;
+}
+hubbub_error hubbub_tokeniser_handle_script_data_double_escape_start(hubbub_tokeniser *tokeniser)
+{
+ size_t len;
+ const uint8_t *cptr;
+ parserutils_error error;
+ uint8_t c;
+ bool end = (tokeniser->state == STATE_SCRIPT_DATA_DOUBLE_ESCAPE_END);
+ hubbub_tag *ctag = &tokeniser->context.current_tag;
+
+ error = parserutils_inputstream_peek(tokeniser->input,
+ tokeniser->context.pending, &cptr, &len);
+
+ if (error != PARSERUTILS_OK) {
+ if (error == PARSERUTILS_EOF) {
+ if(end) {
+ tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPED;
+ } else {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
+ }
+ return emit_current_chars(tokeniser);
+ } else {
+ return hubbub_error_from_parserutils_error(error);
+ }
+ }
+
+ c = *cptr;
+
+ if (c == '\t' || c == '\f' || c == '\r' || c == ' ' || c == '/' ||
+ c == '>') {
+ if(hubbub_string_match_ci(ctag->name.ptr,
+ ctag->name.len,
+ S("script"))) {
+ if(end) {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
+ } else {
+ tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPED;
+ }
+ } else {
+ if(end) {
+ tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPED;
+ } else {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
+ }
+ }
+
+ tokeniser->context.pending += len;
+ } else if ('A' <= c && c <= 'Z') {
+ uint8_t lc = (c + 0x20);
+ COLLECT(ctag->name, &lc, len);
+ tokeniser->context.pending += len;
+ } else if('a' <=c && c <= 'z') {
+ COLLECT(ctag->name, &c, len);
+ tokeniser->context.pending += len;
+ } else {
+ if(end) {
+ tokeniser->state = STATE_SCRIPT_DATA_DOUBLE_ESCAPED;
+ } else {
+ tokeniser->state = STATE_SCRIPT_DATA_ESCAPED;
+ }
+ }
+ return HUBBUB_OK;
+}
+
hubbub_error hubbub_tokeniser_handle_before_attribute_name(
hubbub_tokeniser *tokeniser)
{
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=f58ad55ebee65dbfc...
commit f58ad55ebee65dbfc0efe8691e74089fc452d297
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Fixing some steps in table insertion mode, handling input tags
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index c9d1780..69ec3d6 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -12,6 +12,7 @@
#include "treebuilder/internal.h"
#include "treebuilder/treebuilder.h"
#include "utils/utils.h"
+#include "utils/string.h"
#undef DEBUG_IN_BODY
@@ -337,8 +338,27 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
return err;
err = insert_element(treebuilder, &token->data.tag, false);
- if (err == HUBBUB_OK)
+ if (err != HUBBUB_OK)
+ return err;
+
+ size_t i;
+ bool found = 0;
+
+ for (i = 0; i < token->data.tag.n_attributes; i++) {
+ hubbub_attribute *attr = &token->data.tag.attributes[i];
+
+ if (hubbub_string_match_ci(attr->name.ptr, attr->name.len,
+ (uint8_t *) "type", SLEN("type")) &&
+ hubbub_string_match_ci(attr->value.ptr, attr->value.len,
+ (uint8_t *) "hidden", SLEN("hidden"))) {
+ found = 1;
+ break;
+ }
+ }
+
+ if(!found) {
treebuilder->context.frameset_ok = false;
+ }
} else if (type == HR) {
err = process_hr_in_body(treebuilder, token);
} else if (type == IMAGE) {
diff --git a/src/treebuilder/in_table.c b/src/treebuilder/in_table.c
index d86a908..908d5ad 100644
--- a/src/treebuilder/in_table.c
+++ b/src/treebuilder/in_table.c
@@ -51,13 +51,17 @@ static inline hubbub_error process_input_in_table(
for (i = 0; i < token->data.tag.n_attributes; i++) {
hubbub_attribute *attr = &token->data.tag.attributes[i];
- if (!hubbub_string_match_ci(attr->value.ptr, attr->value.len,
- (uint8_t *) "hidden", SLEN("hidden"))) {
+ if (!(hubbub_string_match_ci(attr->name.ptr, attr->name.len,
+ (uint8_t *) "type", SLEN("type")) &&
+ hubbub_string_match_ci(attr->value.ptr, attr->value.len,
+ (uint8_t *) "hidden", SLEN("hidden")))) {
continue;
}
/** \todo parse error */
- err = insert_element(treebuilder, &token->data.tag, true);
+ err = insert_element(treebuilder, &token->data.tag, false);
+ break;
+ /** \todo ack sc */
}
return err;
@@ -192,7 +196,10 @@ hubbub_error handle_in_table(hubbub_treebuilder *treebuilder,
treebuilder->context.mode = IN_TABLE_BODY;
} else if (type == TABLE) {
/** \todo parse error */
-
+ if(!element_in_scope(treebuilder, TABLE, TABLE_SCOPE)) {
+ /** \todo parse error */
+ break;
+ }
/* This should match "</table>" handling */
element_stack_pop_until(treebuilder, TABLE);
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=e9d04c61733b2ae21...
commit e9d04c61733b2ae215623820b9964e80d7a0fac1
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
small fix to handle the param tag open
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index be7071b..c9d1780 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -331,7 +331,7 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
} else if (type == AREA || type == BASEFONT ||
type == BGSOUND || type == BR ||
type == EMBED || type == IMG || type == INPUT ||
- type == PARAM || type == WBR) {
+ type == WBR) {
err = reconstruct_active_formatting_list(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -406,6 +406,9 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
type == TD || type == TFOOT || type == TH ||
type == THEAD || type == TR) {
/** \todo parse error */
+ } else if (type == PARAM) {
+ err = insert_element(treebuilder, &token->data.tag, false);
+ /** \todo ack sc flag */
} else {
err = process_phrasing_in_body(treebuilder, token);
}
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index 643fcc6..cc639b5 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -46,9 +46,9 @@ tests1.dat html5lib treebuilder tests
#tests26.dat NA
#tests2.dat NA
#tests3.dat NA
-tests4.dat NA
-tests5.dat NA
-#tests6.dat NA
+tests4.dat html5lib treebuilder tests
+tests5.dat html5lib treebuilder tests
+tests6.dat html5lib treebuilder tests
#tests7.dat NA
#tests8.dat NA
#tests9.dat NA
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=02ea40191dd1509d8...
commit 02ea40191dd1509d82e55e999031c9b17b4569cc
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
fixed content model switch at a place. Also added another step to handle xmp in body
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index 33ab30a..be7071b 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -307,6 +307,11 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
err = process_applet_marquee_object_in_body(treebuilder,
token, type);
} else if (type == XMP) {
+ if(element_in_scope(treebuilder, P, BUTTON_SCOPE)) {
+ err = close_p_in_body(treebuilder);
+ if(err != HUBBUB_OK)
+ return err;
+ }
err = reconstruct_active_formatting_list(treebuilder);
if (err != HUBBUB_OK)
return err;
diff --git a/src/treebuilder/in_table.c b/src/treebuilder/in_table.c
index b51fbe0..d86a908 100644
--- a/src/treebuilder/in_table.c
+++ b/src/treebuilder/in_table.c
@@ -216,6 +216,10 @@ hubbub_error handle_in_table(hubbub_treebuilder *treebuilder,
if (type == TABLE) {
/** \todo fragment case */
+ if(!element_in_scope(treebuilder, TABLE, TABLE_SCOPE)) {
+ /* todo parse error */
+ break;
+ }
element_stack_pop_until(treebuilder, TABLE);
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index 9e5734b..115e541 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -476,7 +476,7 @@ hubbub_error parse_generic_rcdata(hubbub_treebuilder *treebuilder,
return error;
params.content_model.model = rcdata ? HUBBUB_CONTENT_MODEL_RCDATA
- : HUBBUB_CONTENT_MODEL_CDATA;
+ : HUBBUB_CONTENT_MODEL_RAWTEXT;
error = hubbub_tokeniser_setopt(treebuilder->tokeniser,
HUBBUB_TOKENISER_CONTENT_MODEL, ¶ms);
/* There is no way that setopt can fail. Ensure this. */
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index 7504628..643fcc6 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -46,8 +46,8 @@ tests1.dat html5lib treebuilder tests
#tests26.dat NA
#tests2.dat NA
#tests3.dat NA
-#tests4.dat NA
-#tests5.dat NA
+tests4.dat NA
+tests5.dat NA
#tests6.dat NA
#tests7.dat NA
#tests8.dat NA
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=64523b2243280b0c8...
commit 64523b2243280b0c81e2f84d06fe439ea20d6eb9
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
fixed dd,dt&li handler. Also fixed the scoping lists. Also added a missing summary tag to the start tag processor conditional.
diff --git a/src/treebuilder/after_head.c b/src/treebuilder/after_head.c
index bd6e004..40955a8 100644
--- a/src/treebuilder/after_head.c
+++ b/src/treebuilder/after_head.c
@@ -26,7 +26,6 @@ hubbub_error handle_after_head(hubbub_treebuilder *treebuilder,
{
hubbub_error err = HUBBUB_OK;
bool handled = false;
-
switch (token->type) {
case HUBBUB_TOKEN_CHARACTER:
err = process_characters_expect_whitespace(treebuilder,
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index 3e8650d..33ab30a 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -272,7 +272,7 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
type == FIGURE || type == FOOTER ||
type == HEADER || type == MENU || type == NAV ||
type == OL || type == P || type == SECTION ||
- type == UL) {
+ type == SUMMARY || type == UL) {
err = process_container_in_body(treebuilder, token);
} else if (type == H1 || type == H2 || type == H3 ||
type == H4 || type == H5 || type == H6) {
@@ -565,7 +565,7 @@ hubbub_error process_container_in_body(hubbub_treebuilder *treebuilder,
{
hubbub_error err;
- if (element_in_scope(treebuilder, P, false, true)) {
+ if (element_in_scope(treebuilder, P, BUTTON_SCOPE)) {
err = close_p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -586,8 +586,8 @@ hubbub_error process_hN_in_body(hubbub_treebuilder *treebuilder,
hubbub_error err;
element_type type;
- if (element_in_scope(treebuilder, P, false, false)) {
- 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;
}
@@ -628,7 +628,7 @@ hubbub_error process_form_in_body(hubbub_treebuilder *treebuilder,
if (treebuilder->context.form_element != NULL) {
/** \todo parse error */
} else {
- if (element_in_scope(treebuilder, P, false, false)) {
+ if (element_in_scope(treebuilder, P, NONE)) {
err = process_0p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -669,12 +669,6 @@ hubbub_error process_dd_dt_li_in_body(hubbub_treebuilder *treebuilder,
treebuilder->context.frameset_ok = false;
- if (element_in_scope(treebuilder, P, false, false)) {
- err = process_0p_in_body(treebuilder);
- if (err != HUBBUB_OK)
- return err;
- }
-
/* Find last LI/(DD,DT) on stack, if any */
for (node = treebuilder->context.current_node; node > 0; node--) {
element_type ntype = stack[node].type;
@@ -689,13 +683,16 @@ hubbub_error process_dd_dt_li_in_body(hubbub_treebuilder *treebuilder,
if (!is_formatting_element(ntype) &&
!is_phrasing_element(ntype) &&
ntype != ADDRESS &&
- ntype != DIV)
+ ntype != DIV &&
+ ntype != P)
break;
}
/* If we found one, then pop all nodes up to and including it */
if (stack[node].type == LI || stack[node].type == DD ||
stack[node].type == DT) {
+
+ close_implied_end_tags(treebuilder, type);
/* Check that we're only popping one node
* and emit a parse error if not */
if (treebuilder->context.current_node > node) {
@@ -717,6 +714,11 @@ hubbub_error process_dd_dt_li_in_body(hubbub_treebuilder *treebuilder,
} while (treebuilder->context.current_node >= node);
}
+ if(element_in_scope(treebuilder, P, BUTTON_SCOPE)) {
+ err = close_p_in_body(treebuilder);
+ if(err != HUBBUB_OK)
+ return err;
+ }
return insert_element(treebuilder, &token->data.tag, true);
}
@@ -732,8 +734,8 @@ hubbub_error process_plaintext_in_body(hubbub_treebuilder *treebuilder,
hubbub_error err;
hubbub_tokeniser_optparams params;
- if (element_in_scope(treebuilder, P, false, false)) {
- 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;
}
@@ -920,7 +922,7 @@ hubbub_error process_nobr_in_body(hubbub_treebuilder *treebuilder,
if (err != HUBBUB_OK)
return err;
- if (element_in_scope(treebuilder, NOBR, false, false)) {
+ if (element_in_scope(treebuilder, NOBR, NONE)) {
/** \todo parse error */
/* Act as if </nobr> were seen */
@@ -982,7 +984,7 @@ hubbub_error process_button_in_body(hubbub_treebuilder *treebuilder,
{
hubbub_error err;
- if (element_in_scope(treebuilder, BUTTON, false, false)) {
+ if (element_in_scope(treebuilder, BUTTON, NONE)) {
/** \todo parse error */
/* Act as if </button> has been seen */
@@ -1071,7 +1073,7 @@ hubbub_error process_hr_in_body(hubbub_treebuilder *treebuilder,
{
hubbub_error err;
- if (element_in_scope(treebuilder, P, false, false)) {
+ if (element_in_scope(treebuilder, P, BUTTON_SCOPE)) {
err = process_0p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -1333,7 +1335,7 @@ hubbub_error process_opt_in_body(hubbub_treebuilder *treebuilder,
{
hubbub_error err;
- if (element_in_scope(treebuilder, OPTION, false, false)) {
+ if (element_in_scope(treebuilder, OPTION, NONE)) {
err = process_0generic_in_body(treebuilder, OPTION);
/* Cannot fail */
assert(err == HUBBUB_OK);
@@ -1374,7 +1376,7 @@ hubbub_error process_0body_in_body(hubbub_treebuilder *treebuilder)
{
hubbub_error err = HUBBUB_OK;
- if (!element_in_scope(treebuilder, BODY, false, false)) {
+ if (!element_in_scope(treebuilder, BODY, NONE)) {
/** \todo parse error */
} else {
element_context *stack = treebuilder->context.element_stack;
@@ -1413,7 +1415,7 @@ hubbub_error process_0body_in_body(hubbub_treebuilder *treebuilder)
hubbub_error process_0container_in_body(hubbub_treebuilder *treebuilder,
element_type type)
{
- if (!element_in_scope(treebuilder, type, false, false)) {
+ if (!element_in_scope(treebuilder, type, NONE)) {
/** \todo parse error */
} else {
uint32_t popped = 0;
@@ -1458,7 +1460,7 @@ hubbub_error process_0form_in_body(hubbub_treebuilder *treebuilder)
treebuilder->context.form_element);
treebuilder->context.form_element = NULL;
- idx = element_in_scope(treebuilder, FORM, false, false);
+ idx = element_in_scope(treebuilder, FORM, NONE);
if (idx == 0 || node == NULL ||
treebuilder->context.element_stack[idx].node != node) {
@@ -1550,7 +1552,7 @@ hubbub_error close_p_in_body(hubbub_treebuilder *treebuilder)
hubbub_error process_0p_in_body(hubbub_treebuilder *treebuilder)
{
- if (!element_in_scope(treebuilder, P, false, true)) {
+ if (!element_in_scope(treebuilder, P, BUTTON_SCOPE)) {
/** \todo parse error */
hubbub_tag tag;
@@ -1580,7 +1582,7 @@ hubbub_error process_0p_in_body(hubbub_treebuilder *treebuilder)
hubbub_error process_0dd_dt_li_in_body(hubbub_treebuilder *treebuilder,
element_type type)
{
- if (!element_in_scope(treebuilder, type, false, false)) {
+ if (!element_in_scope(treebuilder, type, LIST_ITEM_SCOPE)) {
/** \todo parse error */
} else {
uint32_t popped = 0;
@@ -1622,12 +1624,12 @@ hubbub_error process_0h_in_body(hubbub_treebuilder *treebuilder,
UNUSED(type);
/** \todo optimise this */
- if (element_in_scope(treebuilder, H1, false, false) ||
- element_in_scope(treebuilder, H2, false, false) ||
- element_in_scope(treebuilder, H3, false, false) ||
- element_in_scope(treebuilder, H4, false, false) ||
- element_in_scope(treebuilder, H5, false, false) ||
- element_in_scope(treebuilder, H6, false, false)) {
+ if (element_in_scope(treebuilder, H1, NONE) ||
+ element_in_scope(treebuilder, H2, NONE) ||
+ element_in_scope(treebuilder, H3, NONE) ||
+ element_in_scope(treebuilder, H4, NONE) ||
+ element_in_scope(treebuilder, H5, NONE) ||
+ element_in_scope(treebuilder, H6, NONE)) {
uint32_t popped = 0;
element_type otype;
@@ -1870,7 +1872,7 @@ hubbub_error aa_find_and_validate_formatting_element(
if (entry->stack_index != 0 &&
element_in_scope(treebuilder, entry->details.type,
- false, false) != entry->stack_index) {
+ NONE) != entry->stack_index) {
/** \todo parse error */
return HUBBUB_OK;
}
@@ -2322,7 +2324,7 @@ hubbub_error aa_insert_into_foster_parent(hubbub_treebuilder *treebuilder,
hubbub_error process_0applet_button_marquee_object_in_body(
hubbub_treebuilder *treebuilder, element_type type)
{
- if (!element_in_scope(treebuilder, type, false, false)) {
+ if (!element_in_scope(treebuilder, type, NONE)) {
/** \todo parse error */
} else {
uint32_t popped = 0;
diff --git a/src/treebuilder/in_cell.c b/src/treebuilder/in_cell.c
index 6787c51..90bdf53 100644
--- a/src/treebuilder/in_cell.c
+++ b/src/treebuilder/in_cell.c
@@ -27,7 +27,7 @@ static inline void close_cell(hubbub_treebuilder *treebuilder)
element_type type;
- if (element_in_scope(treebuilder, TD, true, false)) {
+ if (element_in_scope(treebuilder, TD, TABLE_SCOPE)) {
type = TD;
} else {
type = TH;
@@ -89,7 +89,7 @@ hubbub_error handle_in_cell(hubbub_treebuilder *treebuilder,
&token->data.tag.name);
if (type == TH || type == TD) {
- if (element_in_scope(treebuilder, type, true, false)) {
+ if (element_in_scope(treebuilder, type, TABLE_SCOPE)) {
hubbub_ns ns;
element_type otype = UNKNOWN;
void *node;
@@ -118,7 +118,7 @@ hubbub_error handle_in_cell(hubbub_treebuilder *treebuilder,
/** \todo parse error */
} else if (type == TABLE || type == TBODY || type == TFOOT ||
type == THEAD || type == TR) {
- if (element_in_scope(treebuilder, type, true, false)) {
+ if (element_in_scope(treebuilder, type, TABLE_SCOPE)) {
close_cell(treebuilder);
err = HUBBUB_REPROCESS;
} else {
diff --git a/src/treebuilder/in_select.c b/src/treebuilder/in_select.c
index 9f06b8f..a49b568 100644
--- a/src/treebuilder/in_select.c
+++ b/src/treebuilder/in_select.c
@@ -86,7 +86,7 @@ hubbub_error handle_in_select(hubbub_treebuilder *treebuilder,
} else if (type == SELECT || type == INPUT ||
type == TEXTAREA) {
- if (element_in_scope(treebuilder, SELECT, true, false)) {
+ if (element_in_scope(treebuilder, SELECT, TABLE_SCOPE)) {
element_stack_pop_until(treebuilder,
SELECT);
reset_insertion_mode(treebuilder);
@@ -142,7 +142,7 @@ hubbub_error handle_in_select(hubbub_treebuilder *treebuilder,
/** \todo parse error */
}
} else if (type == SELECT) {
- if (element_in_scope(treebuilder, SELECT, true, false)) {
+ if (element_in_scope(treebuilder, SELECT, TABLE_SCOPE)) {
element_stack_pop_until(treebuilder,
SELECT);
reset_insertion_mode(treebuilder);
diff --git a/src/treebuilder/in_select_in_table.c b/src/treebuilder/in_select_in_table.c
index 69d4203..d6e1b8c 100644
--- a/src/treebuilder/in_select_in_table.c
+++ b/src/treebuilder/in_select_in_table.c
@@ -41,7 +41,7 @@ hubbub_error handle_in_select_in_table(hubbub_treebuilder *treebuilder,
if ((token->type == HUBBUB_TOKEN_END_TAG &&
element_in_scope(treebuilder, type,
- true, false)) ||
+ TABLE_SCOPE)) ||
token->type == HUBBUB_TOKEN_START_TAG) {
/** \todo fragment case */
diff --git a/src/treebuilder/in_table_body.c b/src/treebuilder/in_table_body.c
index 7d4fb0f..c8c26cf 100644
--- a/src/treebuilder/in_table_body.c
+++ b/src/treebuilder/in_table_body.c
@@ -50,9 +50,9 @@ static void table_clear_stack(hubbub_treebuilder *treebuilder)
*/
static hubbub_error table_sub_start_or_table_end(hubbub_treebuilder *treebuilder)
{
- if (element_in_scope(treebuilder, TBODY, true, false) ||
- element_in_scope(treebuilder, THEAD, true, false) ||
- element_in_scope(treebuilder, TFOOT, true, false)) {
+ if (element_in_scope(treebuilder, TBODY, TABLE_SCOPE) ||
+ element_in_scope(treebuilder, THEAD, TABLE_SCOPE) ||
+ element_in_scope(treebuilder, TFOOT, TABLE_SCOPE)) {
hubbub_ns ns;
element_type otype;
void *node;
@@ -140,7 +140,7 @@ hubbub_error handle_in_table_body(hubbub_treebuilder *treebuilder,
&token->data.tag.name);
if (type == TBODY || type == TFOOT || type == THEAD) {
- if (!element_in_scope(treebuilder, type, true, false)) {
+ if (!element_in_scope(treebuilder, type, TABLE_SCOPE)) {
/** \todo parse error */
/* Ignore the token */
} else {
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index d87e89e..ccec4ed 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -36,6 +36,11 @@ typedef enum
UNKNOWN
} element_type;
+typedef enum
+{
+ NONE, LIST_ITEM_SCOPE, BUTTON_SCOPE, TABLE_SCOPE, SELECT_SCOPE
+} element_scope;
+
/**
* Item on the element stack
*/
@@ -137,7 +142,7 @@ hubbub_error parse_generic_rcdata(hubbub_treebuilder *treebuilder,
const hubbub_token *token, bool rcdata);
uint32_t element_in_scope(hubbub_treebuilder *treebuilder,
- element_type type, bool in_table, bool in_button);
+ element_type type, element_scope scope);
hubbub_error reconstruct_active_formatting_list(
hubbub_treebuilder *treebuilder);
void clear_active_formatting_list_to_marker(
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index 45197b1..9e5734b 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -495,12 +495,11 @@ hubbub_error parse_generic_rcdata(hubbub_treebuilder *treebuilder,
*
* \param treebuilder Treebuilder to look in
* \param type Element type to find
- * \param in_table Whether we're looking in table scope
- * \param in_button Whether we're looking in button scope
+ * \param scope The scope we're looking in
* \return Element stack index, or 0 if not in scope
*/
uint32_t element_in_scope(hubbub_treebuilder *treebuilder,
- element_type type, bool in_table, bool in_button)
+ element_type type, element_scope scope)
{
uint32_t node;
@@ -518,17 +517,28 @@ uint32_t element_in_scope(hubbub_treebuilder *treebuilder,
if (node_type == type)
return node;
- if (node_type == TABLE)
+ if (scope == TABLE_SCOPE && (
+ node_type == TABLE ||
+ node_type == HTML ||
+ node_type == TEMPLATE))
break;
- /* The list of element types given in the spec here are the
- * scoping elements excluding TABLE and HTML and BUTTON. TABLE is handled
- * in the previous conditional and HTML should only occur
+ if (scope == SELECT_SCOPE &&
+ node_type != OPTGROUP &&
+ node_type != OPTION)
+ break;
+
+ /* The list of element types of the normal scope given in the spec here are the
+ * scoping elements excluding HTML and BUTTON. HTML should only occur
* as the first node in the stack, which is never processed
* in this loop. */
- if (!in_table && (node_type != BUTTON || (
- in_button && node_type == BUTTON)) &&
- (is_scoping_element(node_type) ||
+ if (scope != TABLE_SCOPE && scope != SELECT_SCOPE &&
+ ((scope == BUTTON_SCOPE &&
+ node_type == BUTTON) ||
+ (scope == LIST_ITEM_SCOPE &&
+ (node_type == OL ||
+ node_type == UL)) ||
+ (node_type != BUTTON && is_scoping_element(node_type)) ||
(node_ns == HUBBUB_NS_SVG && (
node_type == FOREIGNOBJECT ||
node_type == DESC ||
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index 49f0d0c..7504628 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -36,7 +36,7 @@ adoption02.dat html5lib tests for the adoption agency algorithm
#tests17.dat NA
#tests18.dat NA
#tests19.dat NA
-#tests1.dat NA
+tests1.dat html5lib treebuilder tests
#tests20.dat NA
#tests21.dat NA
#tests22.dat NA
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=53e5d831ee49749f1...
commit 53e5d831ee49749f1f920c4812df6c8240d6d0ff
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Fixed The adoption agency & related things
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index e685e0e..3e8650d 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -23,6 +23,7 @@ typedef struct bookmark {
formatting_list_entry *next; /**< Next entry */
} bookmark;
+static hubbub_error close_p_in_body(hubbub_treebuilder *treebuilder);
static hubbub_error process_character(hubbub_treebuilder *treebuilder,
const hubbub_token *token);
static hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
@@ -564,8 +565,8 @@ hubbub_error process_container_in_body(hubbub_treebuilder *treebuilder,
{
hubbub_error err;
- if (element_in_scope(treebuilder, P, false)) {
- err = process_0p_in_body(treebuilder);
+ if (element_in_scope(treebuilder, P, false, true)) {
+ err = close_p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
}
@@ -585,7 +586,7 @@ hubbub_error process_hN_in_body(hubbub_treebuilder *treebuilder,
hubbub_error err;
element_type type;
- if (element_in_scope(treebuilder, P, false)) {
+ if (element_in_scope(treebuilder, P, false, false)) {
err = process_0p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -627,7 +628,7 @@ hubbub_error process_form_in_body(hubbub_treebuilder *treebuilder,
if (treebuilder->context.form_element != NULL) {
/** \todo parse error */
} else {
- if (element_in_scope(treebuilder, P, false)) {
+ if (element_in_scope(treebuilder, P, false, false)) {
err = process_0p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -668,7 +669,7 @@ hubbub_error process_dd_dt_li_in_body(hubbub_treebuilder *treebuilder,
treebuilder->context.frameset_ok = false;
- if (element_in_scope(treebuilder, P, false)) {
+ if (element_in_scope(treebuilder, P, false, false)) {
err = process_0p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -731,7 +732,7 @@ hubbub_error process_plaintext_in_body(hubbub_treebuilder *treebuilder,
hubbub_error err;
hubbub_tokeniser_optparams params;
- if (element_in_scope(treebuilder, P, false)) {
+ if (element_in_scope(treebuilder, P, false, false)) {
err = process_0p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -919,7 +920,7 @@ hubbub_error process_nobr_in_body(hubbub_treebuilder *treebuilder,
if (err != HUBBUB_OK)
return err;
- if (element_in_scope(treebuilder, NOBR, false)) {
+ if (element_in_scope(treebuilder, NOBR, false, false)) {
/** \todo parse error */
/* Act as if </nobr> were seen */
@@ -981,7 +982,7 @@ hubbub_error process_button_in_body(hubbub_treebuilder *treebuilder,
{
hubbub_error err;
- if (element_in_scope(treebuilder, BUTTON, false)) {
+ if (element_in_scope(treebuilder, BUTTON, false, false)) {
/** \todo parse error */
/* Act as if </button> has been seen */
@@ -1070,7 +1071,7 @@ hubbub_error process_hr_in_body(hubbub_treebuilder *treebuilder,
{
hubbub_error err;
- if (element_in_scope(treebuilder, P, false)) {
+ if (element_in_scope(treebuilder, P, false, false)) {
err = process_0p_in_body(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -1332,7 +1333,7 @@ hubbub_error process_opt_in_body(hubbub_treebuilder *treebuilder,
{
hubbub_error err;
- if (element_in_scope(treebuilder, OPTION, false)) {
+ if (element_in_scope(treebuilder, OPTION, false, false)) {
err = process_0generic_in_body(treebuilder, OPTION);
/* Cannot fail */
assert(err == HUBBUB_OK);
@@ -1373,7 +1374,7 @@ hubbub_error process_0body_in_body(hubbub_treebuilder *treebuilder)
{
hubbub_error err = HUBBUB_OK;
- if (!element_in_scope(treebuilder, BODY, false)) {
+ if (!element_in_scope(treebuilder, BODY, false, false)) {
/** \todo parse error */
} else {
element_context *stack = treebuilder->context.element_stack;
@@ -1412,7 +1413,7 @@ hubbub_error process_0body_in_body(hubbub_treebuilder *treebuilder)
hubbub_error process_0container_in_body(hubbub_treebuilder *treebuilder,
element_type type)
{
- if (!element_in_scope(treebuilder, type, false)) {
+ if (!element_in_scope(treebuilder, type, false, false)) {
/** \todo parse error */
} else {
uint32_t popped = 0;
@@ -1457,7 +1458,7 @@ hubbub_error process_0form_in_body(hubbub_treebuilder *treebuilder)
treebuilder->context.form_element);
treebuilder->context.form_element = NULL;
- idx = element_in_scope(treebuilder, FORM, false);
+ idx = element_in_scope(treebuilder, FORM, false, false);
if (idx == 0 || node == NULL ||
treebuilder->context.element_stack[idx].node != node) {
@@ -1486,25 +1487,27 @@ hubbub_error process_0form_in_body(hubbub_treebuilder *treebuilder)
return HUBBUB_OK;
}
-
/**
- * Process a p end tag as if in "in body"
- *
+ * Close a p Element by repeated popping
* \param treebuilder The treebuilder instance
*/
-hubbub_error process_0p_in_body(hubbub_treebuilder *treebuilder)
+hubbub_error close_p_in_body(hubbub_treebuilder *treebuilder)
{
hubbub_error err = HUBBUB_OK;
uint32_t popped = 0;
- if (treebuilder->context.element_stack[
+ close_implied_end_tags(treebuilder, P);
+
+ if(treebuilder->context.element_stack[
treebuilder->context.current_node].type != P) {
- /** \todo parse error */
+ /* todo parse error */
+
}
- while (element_in_scope(treebuilder, P, false)) {
+ element_type type;
+
+ do {
hubbub_ns ns;
- element_type type;
void *node;
err = element_stack_pop(treebuilder, &ns, &type, &node);
@@ -1514,7 +1517,7 @@ hubbub_error process_0p_in_body(hubbub_treebuilder *treebuilder)
treebuilder->tree_handler->ctx, node);
popped++;
- }
+ } while (type != P);
if (popped == 0) {
hubbub_token dummy;
@@ -1536,11 +1539,39 @@ hubbub_error process_0p_in_body(hubbub_treebuilder *treebuilder)
/* Cannot fail */
assert(err == HUBBUB_OK);
}
-
return err;
}
/**
+ * Process a p end tag as if in "in body"
+ *
+ * \param treebuilder The treebuilder instance
+ */
+hubbub_error process_0p_in_body(hubbub_treebuilder *treebuilder)
+{
+
+ if (!element_in_scope(treebuilder, P, false, true)) {
+ /** \todo parse error */
+
+ hubbub_tag tag;
+ hubbub_error err;
+
+ tag.ns = HUBBUB_NS_HTML;
+ tag.name.ptr = (const uint8_t *) "p";
+ tag.name.len = SLEN("p");
+ tag.n_attributes = 0;
+ tag.attributes = NULL;
+
+ err = insert_element(treebuilder, &tag, true);
+ if(err != HUBBUB_OK)
+ return err;
+
+ }
+
+ return close_p_in_body(treebuilder);
+}
+
+/**
* Process a dd, dt, or li end tag as if in "in body"
*
* \param treebuilder The treebuilder instance
@@ -1549,7 +1580,7 @@ hubbub_error process_0p_in_body(hubbub_treebuilder *treebuilder)
hubbub_error process_0dd_dt_li_in_body(hubbub_treebuilder *treebuilder,
element_type type)
{
- if (!element_in_scope(treebuilder, type, false)) {
+ if (!element_in_scope(treebuilder, type, false, false)) {
/** \todo parse error */
} else {
uint32_t popped = 0;
@@ -1591,12 +1622,12 @@ hubbub_error process_0h_in_body(hubbub_treebuilder *treebuilder,
UNUSED(type);
/** \todo optimise this */
- if (element_in_scope(treebuilder, H1, false) ||
- element_in_scope(treebuilder, H2, false) ||
- element_in_scope(treebuilder, H3, false) ||
- element_in_scope(treebuilder, H4, false) ||
- element_in_scope(treebuilder, H5, false) ||
- element_in_scope(treebuilder, H6, false)) {
+ if (element_in_scope(treebuilder, H1, false, false) ||
+ element_in_scope(treebuilder, H2, false, false) ||
+ element_in_scope(treebuilder, H3, false, false) ||
+ element_in_scope(treebuilder, H4, false, false) ||
+ element_in_scope(treebuilder, H5, false, false) ||
+ element_in_scope(treebuilder, H6, false, false)) {
uint32_t popped = 0;
element_type otype;
@@ -1839,7 +1870,7 @@ hubbub_error aa_find_and_validate_formatting_element(
if (entry->stack_index != 0 &&
element_in_scope(treebuilder, entry->details.type,
- false) != entry->stack_index) {
+ false, false) != entry->stack_index) {
/** \todo parse error */
return HUBBUB_OK;
}
@@ -2291,7 +2322,7 @@ hubbub_error aa_insert_into_foster_parent(hubbub_treebuilder *treebuilder,
hubbub_error process_0applet_button_marquee_object_in_body(
hubbub_treebuilder *treebuilder, element_type type)
{
- if (!element_in_scope(treebuilder, type, false)) {
+ if (!element_in_scope(treebuilder, type, false, false)) {
/** \todo parse error */
} else {
uint32_t popped = 0;
diff --git a/src/treebuilder/in_cell.c b/src/treebuilder/in_cell.c
index 416f988..6787c51 100644
--- a/src/treebuilder/in_cell.c
+++ b/src/treebuilder/in_cell.c
@@ -27,7 +27,7 @@ static inline void close_cell(hubbub_treebuilder *treebuilder)
element_type type;
- if (element_in_scope(treebuilder, TD, true)) {
+ if (element_in_scope(treebuilder, TD, true, false)) {
type = TD;
} else {
type = TH;
@@ -89,7 +89,7 @@ hubbub_error handle_in_cell(hubbub_treebuilder *treebuilder,
&token->data.tag.name);
if (type == TH || type == TD) {
- if (element_in_scope(treebuilder, type, true)) {
+ if (element_in_scope(treebuilder, type, true, false)) {
hubbub_ns ns;
element_type otype = UNKNOWN;
void *node;
@@ -118,7 +118,7 @@ hubbub_error handle_in_cell(hubbub_treebuilder *treebuilder,
/** \todo parse error */
} else if (type == TABLE || type == TBODY || type == TFOOT ||
type == THEAD || type == TR) {
- if (element_in_scope(treebuilder, type, true)) {
+ if (element_in_scope(treebuilder, type, true, false)) {
close_cell(treebuilder);
err = HUBBUB_REPROCESS;
} else {
diff --git a/src/treebuilder/in_select.c b/src/treebuilder/in_select.c
index ab40c6c..9f06b8f 100644
--- a/src/treebuilder/in_select.c
+++ b/src/treebuilder/in_select.c
@@ -86,7 +86,7 @@ hubbub_error handle_in_select(hubbub_treebuilder *treebuilder,
} else if (type == SELECT || type == INPUT ||
type == TEXTAREA) {
- if (element_in_scope(treebuilder, SELECT, true)) {
+ if (element_in_scope(treebuilder, SELECT, true, false)) {
element_stack_pop_until(treebuilder,
SELECT);
reset_insertion_mode(treebuilder);
@@ -142,7 +142,7 @@ hubbub_error handle_in_select(hubbub_treebuilder *treebuilder,
/** \todo parse error */
}
} else if (type == SELECT) {
- if (element_in_scope(treebuilder, SELECT, true)) {
+ if (element_in_scope(treebuilder, SELECT, true, false)) {
element_stack_pop_until(treebuilder,
SELECT);
reset_insertion_mode(treebuilder);
diff --git a/src/treebuilder/in_select_in_table.c b/src/treebuilder/in_select_in_table.c
index 7a299b2..69d4203 100644
--- a/src/treebuilder/in_select_in_table.c
+++ b/src/treebuilder/in_select_in_table.c
@@ -41,7 +41,7 @@ hubbub_error handle_in_select_in_table(hubbub_treebuilder *treebuilder,
if ((token->type == HUBBUB_TOKEN_END_TAG &&
element_in_scope(treebuilder, type,
- true)) ||
+ true, false)) ||
token->type == HUBBUB_TOKEN_START_TAG) {
/** \todo fragment case */
diff --git a/src/treebuilder/in_table_body.c b/src/treebuilder/in_table_body.c
index 8d1a6ab..7d4fb0f 100644
--- a/src/treebuilder/in_table_body.c
+++ b/src/treebuilder/in_table_body.c
@@ -50,9 +50,9 @@ static void table_clear_stack(hubbub_treebuilder *treebuilder)
*/
static hubbub_error 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)) {
+ if (element_in_scope(treebuilder, TBODY, true, false) ||
+ element_in_scope(treebuilder, THEAD, true, false) ||
+ element_in_scope(treebuilder, TFOOT, true, false)) {
hubbub_ns ns;
element_type otype;
void *node;
@@ -140,7 +140,7 @@ hubbub_error handle_in_table_body(hubbub_treebuilder *treebuilder,
&token->data.tag.name);
if (type == TBODY || type == TFOOT || type == THEAD) {
- if (!element_in_scope(treebuilder, type, true)) {
+ if (!element_in_scope(treebuilder, type, true, false)) {
/** \todo parse error */
/* Ignore the token */
} else {
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index 1b59267..d87e89e 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -137,7 +137,7 @@ hubbub_error parse_generic_rcdata(hubbub_treebuilder *treebuilder,
const hubbub_token *token, bool rcdata);
uint32_t element_in_scope(hubbub_treebuilder *treebuilder,
- element_type type, bool in_table);
+ element_type type, bool in_table, bool in_button);
hubbub_error reconstruct_active_formatting_list(
hubbub_treebuilder *treebuilder);
void clear_active_formatting_list_to_marker(
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index 2358ff9..45197b1 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -496,10 +496,11 @@ hubbub_error parse_generic_rcdata(hubbub_treebuilder *treebuilder,
* \param treebuilder Treebuilder to look in
* \param type Element type to find
* \param in_table Whether we're looking in table scope
+ * \param in_button Whether we're looking in button scope
* \return Element stack index, or 0 if not in scope
*/
uint32_t element_in_scope(hubbub_treebuilder *treebuilder,
- element_type type, bool in_table)
+ element_type type, bool in_table, bool in_button)
{
uint32_t node;
@@ -525,7 +526,8 @@ uint32_t element_in_scope(hubbub_treebuilder *treebuilder,
* in the previous conditional and HTML should only occur
* as the first node in the stack, which is never processed
* in this loop. */
- if (!in_table && node_type != BUTTON &&
+ if (!in_table && (node_type != BUTTON || (
+ in_button && node_type == BUTTON)) &&
(is_scoping_element(node_type) ||
(node_ns == HUBBUB_NS_SVG && (
node_type == FOREIGNOBJECT ||
@@ -1304,6 +1306,33 @@ hubbub_error formatting_list_append(hubbub_treebuilder *treebuilder,
uint32_t stack_index)
{
formatting_list_entry *entry;
+ uint32_t n_elements = 0;
+ formatting_list_entry *remove_entry;
+ for (entry = treebuilder->context.formatting_list_end;
+ entry != NULL; entry = entry->prev) {
+ /* Assumption: HTML and TABLE elements are not in the list */
+ if (is_scoping_element(entry->details.type))
+ break;
+
+ if(entry->details.type == type &&
+ entry->details.ns == ns)
+ {
+ remove_entry = entry;
+ n_elements += 1;
+ }
+ }
+ if(n_elements == 3) {
+ hubbub_ns ons;
+ element_type otype;
+ void *onode;
+ uint32_t oindex;
+
+ formatting_list_remove(treebuilder, remove_entry,
+ &ons, &otype, &onode, &oindex);
+
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx, onode);
+ }
entry = malloc(sizeof(formatting_list_entry));
if (entry == NULL)
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index 7e7e38b..49f0d0c 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -2,8 +2,8 @@
#
# Test Description
-#adoption01.dat NA
-#adoption02.dat NA
+adoption01.dat html5lib tests for the adoption agency algorithm
+adoption02.dat html5lib tests for the adoption agency algorithm
#after-after-body.dat NA
#after-after-frameset.dat NA
#after-body.dat NA
commitdiff http://git.netsurf-browser.org/libhubbub.git/commit/?id=7f7626bc3e4cf50fa...
commit 7f7626bc3e4cf50fa9db858ee403dba1710ab060
Author: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Commit: Rupinder Singh Khokhar <rsk1coder99(a)gmail.com>
Random rumblings-- unclean commit
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index 5157e66..e685e0e 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -225,7 +225,8 @@ hubbub_error process_character(hubbub_treebuilder *treebuilder,
if (treebuilder->context.frameset_ok) {
for (p = dummy.ptr; p < dummy.ptr + dummy.len; p++) {
if (*p != 0x0009 && *p != 0x000a &&
- *p != 0x000c && *p != 0x0020) {
+ *p != 0x000c && *p != 0x0020 &&
+ *p != 0x000d) {
treebuilder->context.frameset_ok = false;
break;
}
@@ -324,7 +325,7 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder,
} else if (type == AREA || type == BASEFONT ||
type == BGSOUND || type == BR ||
type == EMBED || type == IMG || type == INPUT ||
- type == PARAM || type == SPACER || type == WBR) {
+ type == PARAM || type == WBR) {
err = reconstruct_active_formatting_list(treebuilder);
if (err != HUBBUB_OK)
return err;
@@ -997,36 +998,6 @@ hubbub_error process_button_in_body(hubbub_treebuilder *treebuilder,
if (err != HUBBUB_OK)
return err;
- treebuilder->tree_handler->ref_node(
- treebuilder->tree_handler->ctx,
- treebuilder->context.element_stack[
- treebuilder->context.current_node].node);
-
- err = formatting_list_append(treebuilder, token->data.tag.ns, BUTTON,
- treebuilder->context.element_stack[
- treebuilder->context.current_node].node,
- treebuilder->context.current_node);
- if (err != HUBBUB_OK) {
- hubbub_ns ns;
- element_type type;
- void *node;
-
- remove_node_from_dom(treebuilder,
- treebuilder->context.element_stack[
- treebuilder->context.current_node].node);
-
- element_stack_pop(treebuilder, &ns, &type, &node);
-
- /* Unref twice (once for stack, once for formatting list) */
- treebuilder->tree_handler->unref_node(
- treebuilder->tree_handler->ctx, node);
-
- treebuilder->tree_handler->unref_node(
- treebuilder->tree_handler->ctx, node);
-
- return err;
- }
-
treebuilder->context.frameset_ok = false;
return HUBBUB_OK;
@@ -1668,11 +1639,11 @@ hubbub_error process_0presentational_in_body(hubbub_treebuilder *treebuilder,
hubbub_error err;
/* Welcome to the adoption agency */
-
- while (true) {
+ uint32_t counter = 0;
+ while (counter++ < 8) {
element_context *stack = treebuilder->context.element_stack;
- formatting_list_entry *entry;
+ formatting_list_entry *entry = NULL;
uint32_t formatting_element;
uint32_t common_ancestor;
uint32_t furthest_block;
@@ -1843,6 +1814,7 @@ hubbub_error process_0presentational_in_body(hubbub_treebuilder *treebuilder,
/* 13 */
}
+ return HUBBUB_OK;
}
/**
@@ -1861,10 +1833,13 @@ hubbub_error aa_find_and_validate_formatting_element(
formatting_list_entry *entry;
entry = aa_find_formatting_element(treebuilder, type);
+ if (entry == NULL) {
+ return process_0generic_in_body(treebuilder, type);
+ }
- if (entry == NULL || (entry->stack_index != 0 &&
+ if (entry->stack_index != 0 &&
element_in_scope(treebuilder, entry->details.type,
- false) != entry->stack_index)) {
+ false) != entry->stack_index) {
/** \todo parse error */
return HUBBUB_OK;
}
@@ -2002,7 +1977,7 @@ hubbub_error aa_reparent_node(hubbub_treebuilder *treebuilder, void *node,
}
/**
- * Adoption agency: this is step 6
+ * Adoption agency: this is step 13
*
* \param treebuilder The treebuilder instance
* \param formatting_element The stack index of the formatting element
@@ -2018,7 +1993,7 @@ hubbub_error aa_find_bookmark_location_reparenting_misnested(
{
hubbub_error err;
element_context *stack = treebuilder->context.element_stack;
- uint32_t node, last, fb;
+ uint32_t node, last, fb, counter = 0;
formatting_list_entry *node_entry;
node = last = fb = *furthest_block;
@@ -2026,6 +2001,7 @@ hubbub_error aa_find_bookmark_location_reparenting_misnested(
while (true) {
void *reparented;
+ counter += 1;
/* i */
node--;
@@ -2037,6 +2013,25 @@ hubbub_error aa_find_bookmark_location_reparenting_misnested(
break;
}
+ /* iii */
+ if (node == formatting_element)
+ break;
+
+ if(node_entry != NULL && counter > 3) {
+ hubbub_ns ons;
+ element_type otype;
+ void *onode;
+ uint32_t oindex;
+
+ err = formatting_list_remove(treebuilder, node_entry,
+ &ons, &otype, &onode, &oindex);
+ assert(err == HUBBUB_OK);
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx, onode);
+ node_entry = NULL;
+
+ }
+
/* Node is not in list of active formatting elements */
if (node_entry == NULL) {
err = aa_remove_element_stack_item(treebuilder,
@@ -2055,9 +2050,6 @@ hubbub_error aa_find_bookmark_location_reparenting_misnested(
continue;
}
- /* iii */
- if (node == formatting_element)
- break;
/* iv */
if (last == fb) {
@@ -2375,7 +2367,7 @@ hubbub_error process_0generic_in_body(hubbub_treebuilder *treebuilder,
uint32_t popped = 0;
element_type otype;
- close_implied_end_tags(treebuilder, UNKNOWN);
+ close_implied_end_tags(treebuilder, type);
while (treebuilder->context.current_node >= node) {
hubbub_ns ns;
diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c
index d53be1f..25169ff 100644
--- a/src/treebuilder/in_foreign_content.c
+++ b/src/treebuilder/in_foreign_content.c
@@ -40,8 +40,6 @@ static const case_changes svg_attributes[] = {
{ S("contentstyletype"), "contentStyleType" },
{ S("diffuseconstant"), "diffuseConstant" },
{ S("edgemode"), "edgeMode" },
- { S("externalresourcesrequired"), "externalResourcesRequired" },
- { S("filterres"), "filterRes" },
{ S("filterunits"), "filterUnits" },
{ S("glyphref"), "glyphRef" },
{ S("gradienttransform"), "gradientTransform" },
@@ -110,6 +108,7 @@ static const case_changes svg_tagnames[] = {
{ S("fediffuselighting"), "feDiffuseLighting" },
{ S("fedisplacementmap"), "feDisplacementMap" },
{ S("fedistantlight"), "feDistantLight" },
+ { S("fedropshadow"), "feDropShadow"},
{ S("feflood"), "feFlood" },
{ S("fefunca"), "feFuncA" },
{ S("fefuncb"), "feFuncB" },
@@ -391,9 +390,15 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
const hubbub_token *token)
{
hubbub_error err = HUBBUB_OK;
+ const uint8_t *c;
switch (token->type) {
case HUBBUB_TOKEN_CHARACTER:
+ c = (token->data.character.ptr);
+ if(*c != '\t' && *c != '\r' && *c != ' ' && *c != '\n' && *c != '\f') {
+ treebuilder->context.frameset_ok = false;
+ }
+
err = append_text(treebuilder, &token->data.character);
break;
case HUBBUB_TOKEN_COMMENT:
@@ -472,13 +477,15 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
} else {
hubbub_tag tag = token->data.tag;
- adjust_foreign_attributes(treebuilder, &tag);
-
if (cur_node_ns == HUBBUB_NS_SVG) {
adjust_svg_tagname(treebuilder, &tag);
adjust_svg_attributes(treebuilder, &tag);
+ } else if(cur_node_ns == HUBBUB_NS_MATHML) {
+ adjust_mathml_attributes(treebuilder, &tag);
}
+ adjust_foreign_attributes(treebuilder, &tag);
+
/* Set to the right namespace and insert */
tag.ns = cur_node_ns;
@@ -492,8 +499,29 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder,
}
break;
case HUBBUB_TOKEN_END_TAG:
+ {
+ element_type type = element_type_from_name(treebuilder,
+ &token->data.tag.name);
+ uint32_t node;
+ element_context *stack = treebuilder->context.element_stack;
+
+ for (node = treebuilder->context.current_node; node > 0; node--) {
+ if(stack[node].type == type) {
+ hubbub_ns ns;
+ element_type type;
+ void *node_iterator;
+ while(node_iterator !=stack[node].node) {
+ element_stack_pop(treebuilder, &ns, &type, &node_iterator);
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx,
+ node_iterator);
+ }
+ return HUBBUB_OK;
+ }
+ }
err = process_as_in_secondary(treebuilder, token);
- break;
+ }
+ break;
case HUBBUB_TOKEN_EOF:
foreign_break_out(treebuilder);
err = HUBBUB_REPROCESS;
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index 58c21d6..1b59267 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -16,10 +16,10 @@ typedef enum
ADDRESS, AREA, ARTICLE, ASIDE, BASE, BASEFONT, BGSOUND, BLOCKQUOTE,
BODY, BR, CENTER, COL, COLGROUP, COMMAND, DATAGRID, DD, DETAILS,
DIALOG, DIR, DIV, DL, DT, EMBED, FIELDSET, FIGURE, FOOTER, FORM, FRAME,
- FRAMESET, H1, H2, H3, H4, H5, H6, HEAD, HEADER, HR, IFRAME, IMAGE, IMG,
- INPUT, ISINDEX, LI, LINK, LISTING, MENU, META, NAV, NOEMBED, NOFRAMES,
+ FRAMESET, H1, H2, H3, H4, H5, H6, HEAD, HEADER, HGROUP, HR, IFRAME, IMAGE, IMG,
+ INPUT, ISINDEX, LI, LINK, LISTING, MAIN, MENU, MENUITEM, META, NAV, NOEMBED, NOFRAMES,
NOSCRIPT, OL, OPTGROUP, OPTION, P, PARAM, PLAINTEXT, PRE, SCRIPT,
- SECTION, SELECT, SPACER, STYLE, TBODY, TEXTAREA, TFOOT, THEAD, TITLE,
+ SECTION, SELECT, SPACER, SOURCE, STYLE, SUMMARY, TBODY, TEMPLATE, TEXTAREA, TFOOT, THEAD, TITLE,
TR, UL, WBR,
/* Scoping */
APPLET, BUTTON, CAPTION, HTML, MARQUEE, OBJECT, TABLE, TD, TH,
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index a6a4b43..2358ff9 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -25,10 +25,12 @@ static const struct {
element_type type;
} name_type_map[] = {
{ S("address"), ADDRESS }, { S("area"), AREA },
+ { S("b"), B },
{ S("base"), BASE }, { S("basefont"), BASEFONT },
{ S("bgsound"), BGSOUND }, { S("blockquote"), BLOCKQUOTE },
{ S("body"), BODY }, { S("br"), BR },
{ S("center"), CENTER }, { S("col"), COL },
+ { S("code"), CODE },
{ S("colgroup"), COLGROUP }, { S("dd"), DD },
{ S("dir"), DIR }, { S("div"), DIV },
{ S("dl"), DL }, { S("dt"), DT },
@@ -519,13 +521,22 @@ uint32_t element_in_scope(hubbub_treebuilder *treebuilder,
break;
/* The list of element types given in the spec here are the
- * scoping elements excluding TABLE and HTML. TABLE is handled
+ * scoping elements excluding TABLE and HTML and BUTTON. TABLE is handled
* in the previous conditional and HTML should only occur
* as the first node in the stack, which is never processed
* in this loop. */
- if (!in_table && (is_scoping_element(node_type) ||
- (node_type == FOREIGNOBJECT &&
- node_ns == HUBBUB_NS_SVG))) {
+ if (!in_table && node_type != BUTTON &&
+ (is_scoping_element(node_type) ||
+ (node_ns == HUBBUB_NS_SVG && (
+ node_type == FOREIGNOBJECT ||
+ node_type == DESC ||
+ node_type == TITLE)) ||
+ (node_ns ==HUBBUB_NS_MATHML && (
+ node_type == MI ||
+ node_type == MO ||
+ node_type == MN ||
+ node_type == MS ||
+ node_type == MTEXT)))) {
break;
}
}
@@ -1389,7 +1400,6 @@ hubbub_error formatting_list_remove(hubbub_treebuilder *treebuilder,
*type = entry->details.type;
*node = entry->details.node;
*stack_index = entry->stack_index;
-
if (entry->prev == NULL)
treebuilder->context.formatting_list = entry->next;
else
diff --git a/src/utils/string.c b/src/utils/string.c
index ce4f6a6..0ff069d 100644
--- a/src/utils/string.c
+++ b/src/utils/string.c
@@ -56,3 +56,4 @@ bool hubbub_string_match_ci(const uint8_t *a, size_t a_len,
return true;
}
+
diff --git a/test/data/tree-construction/tests1.dat b/test/data/tree-construction/tests1.dat
index f12e871..29508e5 100644
--- a/test/data/tree-construction/tests1.dat
+++ b/test/data/tree-construction/tests1.dat
@@ -1225,24 +1225,6 @@ Line1<br>Line2<br>Line3<br>Line4
| "aa"
#data
-<wbr><strike><code></strike><code><strike></code>
-#errors
-(1,5): expected-doctype-but-got-start-tag
-(1,28): adoption-agency-1.3
-(1,49): adoption-agency-1.3
-(1,49): expected-closing-tag-but-got-eof
-#document
-| <html>
-| <head>
-| <body>
-| <wbr>
-| <strike>
-| <code>
-| <code>
-| <code>
-| <strike>
-
-#data
<!DOCTYPE html><spacer>foo
#errors
(1,26): expected-closing-tag-but-got-eof
-----------------------------------------------------------------------
Summary of changes:
src/treebuilder/in_body.c | 2 +-
src/treebuilder/in_head.c | 18 +++++++++++++++++-
src/treebuilder/in_head_noscript.c | 3 ++-
src/utils/string.c | 17 -----------------
src/utils/string.h | 4 ----
test/data/tree-construction/INDEX | 2 +-
6 files changed, 21 insertions(+), 25 deletions(-)
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c
index edfc73b..5359364 100644
--- a/src/treebuilder/in_body.c
+++ b/src/treebuilder/in_body.c
@@ -1853,7 +1853,7 @@ hubbub_error process_0presentational_in_body(hubbub_treebuilder *treebuilder,
uint32_t common_ancestor;
uint32_t furthest_block;
bookmark bookmark;
- uint32_t last_node;
+ uint32_t last_node = 0;
void *reparented;
void *fe_clone = NULL;
void *clone_appended = NULL;
diff --git a/src/treebuilder/in_head.c b/src/treebuilder/in_head.c
index a10ba23..9429058 100644
--- a/src/treebuilder/in_head.c
+++ b/src/treebuilder/in_head.c
@@ -33,6 +33,7 @@ static hubbub_error process_meta_in_head(hubbub_treebuilder *treebuilder,
uint16_t content_type_enc = 0;
size_t i;
hubbub_error err = HUBBUB_OK;
+ bool http_equiv = false;
err = insert_element(treebuilder, &token->data.tag, false);
if (err != HUBBUB_OK)
@@ -57,6 +58,20 @@ static hubbub_error process_meta_in_head(hubbub_treebuilder *treebuilder,
for (i = 0; i < token->data.tag.n_attributes; i++) {
hubbub_attribute *attr = &token->data.tag.attributes[i];
+ if (hubbub_string_match_ci(attr->name.ptr, attr->name.len,
+ (const uint8_t *) "http-equiv",
+ SLEN("http-equiv")) == true &&
+ hubbub_string_match_ci(attr->value.ptr, attr->value.len,
+ (const uint8_t *) "content-type",
+ SLEN("content-type")) == true
+ ) {
+ http_equiv = true;
+ }
+ }
+
+ for (i = 0; i < token->data.tag.n_attributes; i++) {
+ hubbub_attribute *attr = &token->data.tag.attributes[i];
+
if (hubbub_string_match(attr->name.ptr, attr->name.len,
(const uint8_t *) "charset",
SLEN("charset")) == true) {
@@ -66,7 +81,8 @@ static hubbub_error process_meta_in_head(hubbub_treebuilder *treebuilder,
attr->value.len);
} else if (hubbub_string_match(attr->name.ptr, attr->name.len,
(const uint8_t *) "content",
- SLEN("content")) == true) {
+ SLEN("content")) == true &&
+ http_equiv == true) {
/* Extract charset from Content-Type */
content_type_enc = hubbub_charset_parse_content(
attr->value.ptr, attr->value.len);
diff --git a/src/treebuilder/in_head_noscript.c b/src/treebuilder/in_head_noscript.c
index d13ca30..9f3338a 100644
--- a/src/treebuilder/in_head_noscript.c
+++ b/src/treebuilder/in_head_noscript.c
@@ -48,7 +48,8 @@ hubbub_error handle_in_head_noscript(hubbub_treebuilder *treebuilder,
err = handle_in_body(treebuilder, token);
} else if (type == NOSCRIPT) {
handled = true;
- } else if (type == LINK || type == META || type == NOFRAMES ||
+ } else if (type == BASEFONT || type == BGSOUND ||
+ type == LINK || type == META || type == NOFRAMES ||
type == STYLE) {
/* Process as "in head" */
err = handle_in_head(treebuilder, token);
diff --git a/src/utils/string.c b/src/utils/string.c
index 95e6232..0ff069d 100644
--- a/src/utils/string.c
+++ b/src/utils/string.c
@@ -57,20 +57,3 @@ bool hubbub_string_match_ci(const uint8_t *a, size_t a_len,
return true;
}
-/**
- * Convert the string to lowercase
- *
- * \param str String to lower
- * \param str_len Length of string
- * \param ret Location to recieve the result
- */
-void hubbub_string_lower(const uint8_t *str, size_t str_len,
- uint8_t *ret, size_t *ret_len)
-{
- while (str_len-- > 0) {
- *(ret++) = *(str++);
- *ret = *ret | 0x20;
- }
- *ret_len = str_len;
- return;
-}
diff --git a/src/utils/string.h b/src/utils/string.h
index c8e444d..2487428 100644
--- a/src/utils/string.h
+++ b/src/utils/string.h
@@ -16,8 +16,4 @@ bool hubbub_string_match(const uint8_t *a, size_t a_len,
bool hubbub_string_match_ci(const uint8_t *a, size_t a_len,
const uint8_t *b, size_t b_len);
-/** Convert string to all lowercase */
-void hubbub_string_lower(const uint8_t *str, size_t str_len,
- uint8_t *ret, size_t *ret_len);
-
#endif
diff --git a/test/data/tree-construction/INDEX b/test/data/tree-construction/INDEX
index 43d0a30..3ae35b4 100644
--- a/test/data/tree-construction/INDEX
+++ b/test/data/tree-construction/INDEX
@@ -1,4 +1,4 @@
-# Index file for tokeniser tests
+# Index file for treebuilder tests
#
# Test Description
--
HTML5 parser library
9 years, 1 month