summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--render/box_normalise.c54
1 files changed, 52 insertions, 2 deletions
diff --git a/render/box_normalise.c b/render/box_normalise.c
index 3e1b01468..861ad741e 100644
--- a/render/box_normalise.c
+++ b/render/box_normalise.c
@@ -102,6 +102,9 @@ bool box_normalise_block(struct box *block, html_content *c)
{
struct box *child;
struct box *next_child;
+ struct box *table;
+ css_computed_style *style;
+ nscss_select_ctx ctx;
assert(block != NULL);
@@ -147,8 +150,55 @@ bool box_normalise_block(struct box *block, html_content *c)
case BOX_TABLE_ROW_GROUP:
case BOX_TABLE_ROW:
case BOX_TABLE_CELL:
- /* DOM should not have these outside a table. */
- assert(0);
+ /* insert implied table */
+ assert(block->style != NULL);
+
+ ctx.ctx = c->select_ctx;
+ ctx.quirks = (c->quirks == DOM_DOCUMENT_QUIRKS_MODE_FULL);
+ ctx.base_url = c->base_url;
+ ctx.universal = c->universal;
+
+ style = nscss_get_blank_style(&ctx, block->style);
+ if (style == NULL)
+ return false;
+
+ table = box_create(NULL, style, true, block->href,
+ block->target, NULL, NULL, c->bctx);
+ if (table == NULL) {
+ css_computed_style_destroy(style);
+ return false;
+ }
+ table->type = BOX_TABLE;
+
+ if (child->prev == NULL)
+ block->children = table;
+ else
+ child->prev->next = table;
+
+ table->prev = child->prev;
+
+ while (child != NULL && (
+ child->type == BOX_TABLE_ROW_GROUP ||
+ child->type == BOX_TABLE_ROW ||
+ child->type == BOX_TABLE_CELL)) {
+ box_add_child(table, child);
+
+ next_child = child->next;
+ child->next = NULL;
+ child = next_child;
+ }
+
+ table->last->next = NULL;
+ table->next = next_child = child;
+ if (table->next != NULL)
+ table->next->prev = table;
+ else
+ block->last = table;
+ table->parent = block;
+
+ if (box_normalise_table(table, c) == false)
+ return false;
+ break;
default:
assert(0);
}