[project @ 2005-04-09 09:47:36 by bursa]

Move HTML contents almost fully over to talloc(), simplifying code. Improvements to title attributes, broken forms, cellpadding. Reorder functions in box_construct.c.

svn path=/import/netsurf/; revision=1608
This commit is contained in:
James Bursa 2005-04-09 09:47:37 +00:00
parent 8728712699
commit 2920bca14a
16 changed files with 1430 additions and 1616 deletions

View File

@ -110,7 +110,6 @@ static void css_dump_selector(const struct css_selector *r);
/** Default style for a document. These are the 'Initial values' from the
* spec. */
const struct css_style css_base_style = {
{ {CSS_CELLPADDING_VALUE, 1} },
CSS_BACKGROUND_ATTACHMENT_SCROLL,
0xffffff,
{ CSS_BACKGROUND_IMAGE_NONE, 0 },
@ -167,10 +166,10 @@ const struct css_style css_base_style = {
{ CSS_BORDER_WIDTH_LENGTH, { 2, CSS_UNIT_PX } },
CSS_BORDER_STYLE_NONE },
CSS_OVERFLOW_VISIBLE,
{ { CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } }, false },
{ CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } }, false },
{ CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } }, false },
{ CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } }, false }, },
{ { CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } } },
{ CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } } },
{ CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } } },
{ CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } } } },
CSS_PAGE_BREAK_AFTER_AUTO,
CSS_PAGE_BREAK_BEFORE_AUTO,
CSS_PAGE_BREAK_INSIDE_AUTO,
@ -196,7 +195,6 @@ const struct css_style css_base_style = {
/** Style with no values set. */
const struct css_style css_empty_style = {
{ { CSS_CELLPADDING_NOT_SET, 0 } },
CSS_BACKGROUND_ATTACHMENT_NOT_SET,
CSS_COLOR_NOT_SET,
{ CSS_BACKGROUND_IMAGE_NOT_SET, 0 },
@ -253,10 +251,10 @@ const struct css_style css_empty_style = {
{ CSS_BORDER_WIDTH_NOT_SET, { 0, CSS_UNIT_PX } },
CSS_BORDER_STYLE_NOT_SET },
CSS_OVERFLOW_NOT_SET,
{ { CSS_PADDING_NOT_SET, { { 0, CSS_UNIT_PX } }, false },
{ CSS_PADDING_NOT_SET, { { 0, CSS_UNIT_PX } }, false },
{ CSS_PADDING_NOT_SET, { { 0, CSS_UNIT_PX } }, false },
{ CSS_PADDING_NOT_SET, { { 0, CSS_UNIT_PX } }, false }, },
{ { CSS_PADDING_NOT_SET, { { 0, CSS_UNIT_PX } } },
{ CSS_PADDING_NOT_SET, { { 0, CSS_UNIT_PX } } },
{ CSS_PADDING_NOT_SET, { { 0, CSS_UNIT_PX } } },
{ CSS_PADDING_NOT_SET, { { 0, CSS_UNIT_PX } } } },
CSS_PAGE_BREAK_AFTER_NOT_SET,
CSS_PAGE_BREAK_BEFORE_NOT_SET,
CSS_PAGE_BREAK_INSIDE_NOT_SET,
@ -283,7 +281,6 @@ const struct css_style css_empty_style = {
/** Default style for an element. These should be INHERIT if 'Inherited' is yes,
* and the 'Initial value' otherwise. */
const struct css_style css_blank_style = {
{ { CSS_CELLPADDING_INHERIT, 0 } },
CSS_BACKGROUND_ATTACHMENT_SCROLL,
TRANSPARENT,
{ CSS_BACKGROUND_IMAGE_NONE, 0 },
@ -340,10 +337,10 @@ const struct css_style css_blank_style = {
{ CSS_BORDER_WIDTH_LENGTH, { 2, CSS_UNIT_PX } },
CSS_BORDER_STYLE_NONE },
CSS_OVERFLOW_VISIBLE,
{ { CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } }, false },
{ CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } }, false },
{ CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } }, false },
{ CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } }, false }, },
{ { CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } } },
{ CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } } },
{ CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } } },
{ CSS_PADDING_LENGTH, { { 0, CSS_UNIT_PX } } } },
CSS_PAGE_BREAK_AFTER_AUTO,
CSS_PAGE_BREAK_BEFORE_AUTO,
CSS_PAGE_BREAK_INSIDE_INHERIT,
@ -2383,11 +2380,6 @@ void css_cascade(struct css_style * const style,
unsigned int i;
float f;
if (apply->html_style.cellpadding.type !=
CSS_CELLPADDING_INHERIT &&
apply->html_style.cellpadding.type !=
CSS_CELLPADDING_NOT_SET)
style->html_style.cellpadding = apply->html_style.cellpadding;
if (apply->background_attachment !=
CSS_BACKGROUND_ATTACHMENT_INHERIT &&
apply->background_attachment !=
@ -2678,8 +2670,6 @@ void css_merge(struct css_style * const style,
{
unsigned int i;
if (apply->html_style.cellpadding.type != CSS_CELLPADDING_NOT_SET)
style->html_style.cellpadding = apply->html_style.cellpadding;
if (apply->background_attachment != CSS_BACKGROUND_ATTACHMENT_NOT_SET)
style->background_attachment = apply->background_attachment;
if (apply->background_color != CSS_COLOR_NOT_SET)

View File

@ -149,16 +149,6 @@ struct css_content {
/** Representation of a complete CSS 2 style. */
struct css_style {
/* html styles that don't translate directly to CSS */
struct {
struct {
enum { CSS_CELLPADDING_INHERIT,
CSS_CELLPADDING_VALUE,
CSS_CELLPADDING_NOT_SET } type;
int value;
} cellpadding;
} html_style;
/* background properties */
css_background_attachment background_attachment;
colour background_color;
@ -378,7 +368,6 @@ struct css_style {
struct css_length length;
float percent;
} value;
bool override_cellpadding; /* override HTML setting */
} padding[4]; /**< top, right, bottom, left */
css_page_break_after page_break_after;

View File

@ -1153,7 +1153,7 @@ bool css_background_position_parse(const struct css_node **node,
*node = w->next;
return true;
}
/* reverse specifiers such that idents are places in h, v order */
if ((v->type == CSS_NODE_IDENT && bg && bg->vertical) ||
(w->type == CSS_NODE_IDENT && bg2 && bg2->horizontal)) {
@ -1651,7 +1651,7 @@ void parse_content(struct css_style * const s, const struct css_node * v)
struct css_content *content;
struct css_node *t;
bool first = true;
for (; v; v = v->next) {
switch (v->type) {
case CSS_NODE_STRING:
@ -1746,18 +1746,18 @@ void parse_content(struct css_style * const s, const struct css_node * v)
}
first = false;
}
if (new_content) {
css_deep_free_content(s->content.content);
s->content.type = CSS_CONTENT_INTERPRET;
s->content.content = new_content;
s->content.content = new_content;
}
}
struct css_content *parse_content_new(struct css_content **current, css_content_type_generated generated) {
struct css_content *content;
struct css_content *link;
content = (struct css_content *)calloc(1, sizeof(struct css_content));
if (!content) {
css_deep_free_content(*current);
@ -1777,15 +1777,15 @@ struct css_content *parse_content_new(struct css_content **current, css_content_
bool parse_content_counter(struct css_content **current, struct css_node *t, bool counters) {
struct css_content *content;
css_list_style_type z;
content = parse_content_new(current, CSS_CONTENT_COUNTER);
if ((!content) || (t->type != CSS_NODE_IDENT))
return false;
content->data.counter.name = strndup(t->data, t->data_length);
content->data.counter.style = CSS_LIST_STYLE_TYPE_DECIMAL;
t = t->next;
if (counters) {
if ((!t) || (t->type != CSS_NODE_STRING)) {
css_deep_free_content(*current);
@ -1794,7 +1794,7 @@ bool parse_content_counter(struct css_content **current, struct css_node *t, boo
content->data.counter.separator = strndup(t->data, t->data_length);
t = t->next;
}
if (!t)
return true;
@ -1818,7 +1818,7 @@ void parse_counter_reset(struct css_style * const s, const struct css_node * v)
css_deep_free_counter_control(s->counter_reset.data);
s->counter_reset.type = CSS_COUNTER_RESET_INTERPRET;
s->counter_reset.data = counter;
}
}
}
void parse_counter_increment(struct css_style * const s, const struct css_node * v) {
@ -1836,7 +1836,7 @@ void parse_counter_increment(struct css_style * const s, const struct css_node *
bool parse_counter_control_data(struct css_counter_control **current, const struct css_node * v, int empty) {
struct css_counter_control *open = NULL;
for (; v; v = v->next) {
switch (v->type) {
case CSS_NODE_IDENT:
@ -1869,7 +1869,7 @@ bool parse_counter_control_data(struct css_counter_control **current, const stru
struct css_counter_control *parse_counter_control_new(struct css_counter_control **current) {
struct css_counter_control *counter;
struct css_counter_control *link;
counter = (struct css_counter_control *)calloc(1, sizeof(struct css_counter_control));
if (!counter) {
css_deep_free_counter_control(*current);
@ -2683,15 +2683,12 @@ void parse_padding_side(struct css_style * const s, const struct css_node * cons
if (v->type == CSS_NODE_IDENT && v->data_length == 7 &&
strncasecmp(v->data, "inherit", 7) == 0) {
s->padding[i].padding = CSS_PADDING_INHERIT;
s->padding[i].override_cellpadding = true;
} else if (v->type == CSS_NODE_PERCENTAGE) {
s->padding[i].padding = CSS_PADDING_PERCENT;
s->padding[i].value.percent = atof(v->data);
s->padding[i].override_cellpadding = true;
} else if ((v->type == CSS_NODE_DIMENSION || v->type == CSS_NODE_NUMBER) &&
parse_length(&s->padding[i].value.length, v, true) == 0) {
s->padding[i].padding = CSS_PADDING_LENGTH;
s->padding[i].override_cellpadding = true;
}
}

View File

@ -37,6 +37,7 @@
#include "netsurf/render/layout.h"
#include "netsurf/utils/log.h"
#include "netsurf/utils/messages.h"
#include "netsurf/utils/talloc.h"
#include "netsurf/utils/url.h"
#include "netsurf/utils/utils.h"
@ -330,7 +331,7 @@ void browser_window_callback(content_msg msg, struct content *c,
browser_window_stop_throbber(bw);
history_update(bw->history, c);
hotlist_visited(c);
free (bw->referer);
free(bw->referer);
bw->referer = 0;
break;
@ -388,7 +389,7 @@ void browser_window_callback(content_msg msg, struct content *c,
bw->scrolling_box = NULL;
}
browser_window_stop_throbber(bw);
free (bw->referer);
free(bw->referer);
bw->referer = 0;
break;
#endif
@ -1279,7 +1280,8 @@ void browser_window_textarea_callback(struct browser_window *bw,
utf8[0] = key;
utf8_len = 1;
text = realloc(text_box->text, text_box->length + 8);
text = talloc_realloc(bw->current_content, text_box->text,
char, text_box->length + 8);
if (!text) {
warn_user("NoMemory", 0);
return;
@ -1299,16 +1301,16 @@ void browser_window_textarea_callback(struct browser_window *bw,
} else if (key == 10 || key == 13) {
/* paragraph break */
text = malloc(text_box->length + 1);
text = talloc_array(bw->current_content, char,
text_box->length + 1);
if (!text) {
warn_user("NoMemory", 0);
return;
}
new_br = box_create(text_box->style, 0, 0, 0,
bw->current_content->data.html.box_pool);
new_text = pool_alloc(bw->current_content->data.html.box_pool,
sizeof (struct box));
new_br = box_create(text_box->style, 0, text_box->title, 0,
bw->current_content);
new_text = talloc(bw->current_content, struct box);
if (!new_text) {
warn_user("NoMemory", 0);
return;
@ -1353,7 +1355,8 @@ void browser_window_textarea_callback(struct browser_window *bw,
/* delete space by merging with previous text box */
prev = text_box->prev;
assert(prev->text);
text = realloc(prev->text,
text = talloc_realloc(bw->current_content, prev->text,
char,
prev->length + text_box->length + 1);
if (!text) {
warn_user("NoMemory", 0);
@ -1469,7 +1472,7 @@ void browser_window_textarea_callback(struct browser_window *bw,
height = textarea->height;
if (!layout_inline_container(inline_container, width,
textarea, 0, 0,
bw->current_content->data.html.box_pool))
bw->current_content))
warn_user("NoMemory", 0);
textarea->width = width;
textarea->height = height;
@ -1627,7 +1630,8 @@ void browser_window_input_callback(struct browser_window *bw,
return;
utf8keySize = strlen(utf8key);
value = realloc(input->gadget->value, input->gadget->length + utf8keySize + 1);
value = realloc(input->gadget->value,
input->gadget->length + utf8keySize + 1);
if (!value) {
free(utf8key);
warn_user("NoMemory", 0);
@ -1651,7 +1655,8 @@ void browser_window_input_callback(struct browser_window *bw,
return;
utf8keySize = strlen(utf8key);
value = realloc(text_box->text, text_box->length + utf8keySize + 1);
value = talloc_realloc(bw->current_content, text_box->text,
char, text_box->length + utf8keySize + 1);
if (!value) {
free(utf8key);
warn_user("NoMemory", 0);
@ -1910,14 +1915,17 @@ void browser_window_form_select(struct browser_window *bw,
control->data.select.current = o;
}
free(inline_box->text);
talloc_free(inline_box->text);
inline_box->text = 0;
if (control->data.select.num_selected == 0)
inline_box->text = strdup(messages_get("Form_None"));
inline_box->text = talloc_strdup(bw->current_content,
messages_get("Form_None"));
else if (control->data.select.num_selected == 1)
inline_box->text = strdup(control->data.select.current->text);
inline_box->text = talloc_strdup(bw->current_content,
control->data.select.current->text);
else
inline_box->text = strdup(messages_get("Form_Many"));
inline_box->text = talloc_strdup(bw->current_content,
messages_get("Form_Many"));
if (!inline_box->text) {
warn_user("NoMemory", 0);
inline_box->length = 0;

View File

@ -18,7 +18,7 @@
#include "netsurf/css/css.h"
#include "netsurf/render/box.h"
#include "netsurf/render/form.h"
#include "netsurf/utils/pool.h"
#include "netsurf/utils/talloc.h"
static bool box_contains_point(struct box *box, int x, int y);
@ -31,43 +31,23 @@ static bool box_contains_point(struct box *box, int x, int y);
* Create a box tree node.
*
* \param style style for the box (not copied)
* \param href href for the box (copied), or 0
* \param title title for the box (copied), or 0
* \param id id for the box (copied), or 0
* \param box_pool pool to allocate box from
* \param href href for the box (not copied), or 0
* \param title title for the box (not copied), or 0
* \param id id for the box (not copied), or 0
* \param context context for allocations
* \return allocated and initialised box, or 0 on memory exhaustion
*/
struct box * box_create(struct css_style *style,
const char *href, const char *title, const char *id,
pool box_pool)
char *href, char *title, char *id,
void *context)
{
unsigned int i;
struct box *box;
char *href1 = 0;
char *title1 = 0;
char *id1 = 0;
if (href)
href1 = strdup(href);
if (title)
title1 = strdup(title);
if (id)
id1 = strdup(id);
if ((href && !href1) || (title && !title1) || (id && !id1)) {
free(href1);
free(title1);
free(id1);
box = talloc(context, struct box);
if (!box)
return 0;
}
box = pool_alloc(box_pool, sizeof (struct box));
if (!box) {
free(href1);
free(title1);
free(id1);
return 0;
}
box->type = BOX_INLINE;
box->style = style;
@ -86,8 +66,8 @@ struct box * box_create(struct css_style *style,
box->space = 0;
box->clone = 0;
box->style_clone = 0;
box->href = href1;
box->title = title1;
box->href = href;
box->title = title;
box->columns = 1;
box->rows = 1;
box->start_column = 0;
@ -101,7 +81,7 @@ struct box * box_create(struct css_style *style,
box->col = NULL;
box->gadget = NULL;
box->usemap = NULL;
box->id = id1;
box->id = id;
box->background = NULL;
box->object = NULL;
box->object_params = NULL;
@ -153,12 +133,11 @@ void box_insert_sibling(struct box *box, struct box *new_box)
/**
* Free the data in a box tree recursively.
* Free the a box tree recursively.
*
* \param box box to free recursively
*
* The data in box and all its children is freed. The actual box structures are
* not freed, only the data (since they will be in a pool).
* The box and all its children is freed.
*/
void box_free(struct box *box)
@ -187,17 +166,11 @@ void box_free_box(struct box *box)
if (!box->clone) {
if (box->gadget)
form_free_control(box->gadget);
free(box->href);
free(box->title);
free(box->col);
if (!box->style_clone && box->style)
css_free_style(box->style);
}
free(box->usemap);
free(box->text);
free(box->id);
box_free_object_params(box->object_params);
talloc_free(box);
}

View File

@ -76,7 +76,6 @@
#include <limits.h>
#include <stdbool.h>
#include "libxml/HTMLparser.h"
#include "netsurf/utils/pool.h"
struct box;
@ -90,7 +89,7 @@ typedef enum {
BOX_TABLE, BOX_TABLE_ROW, BOX_TABLE_CELL,
BOX_TABLE_ROW_GROUP,
BOX_FLOAT_LEFT, BOX_FLOAT_RIGHT,
BOX_INLINE_BLOCK, BOX_BR
BOX_INLINE_BLOCK, BOX_BR, BOX_TEXT
} box_type;
/* parameters for <object> and related elements */
@ -232,8 +231,8 @@ struct column {
struct box * box_create(struct css_style *style,
const char *href, const char *title,
const char *id, pool box_pool);
char *href, char *title,
char *id, void *context);
void box_add_child(struct box *parent, struct box *child);
void box_insert_sibling(struct box *box, struct box *new_box);
void box_free(struct box *box);
@ -259,6 +258,6 @@ void box_scrollbar_dimensions(const struct box *box,
bool xml_to_box(xmlNode *n, struct content *c);
bool box_normalise_block(struct box *block, pool box_pool);
bool box_normalise_block(struct box *block, struct content *c);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -21,7 +21,6 @@
#endif
#define NDEBUG
#include "netsurf/utils/log.h"
#include "netsurf/utils/pool.h"
struct span_info {
@ -45,18 +44,18 @@ struct columns {
};
static bool box_normalise_table(struct box *table, pool box_pool);
static bool box_normalise_table(struct box *table, struct content *c);
static void box_normalise_table_spans(struct box *table);
static bool box_normalise_table_row_group(struct box *row_group,
struct columns *col_info,
pool box_pool);
struct content *c);
static bool box_normalise_table_row(struct box *row,
struct columns *col_info,
pool box_pool);
struct content *c);
static bool calculate_table_row(struct columns *col_info,
unsigned int col_span, unsigned int row_span,
unsigned int *start_column);
static bool box_normalise_inline_container(struct box *cont, pool box_pool);
static bool box_normalise_inline_container(struct box *cont, struct content *c);
/**
@ -79,7 +78,7 @@ static bool box_normalise_inline_container(struct box *cont, pool box_pool);
* FLOAT_(LEFT|RIGHT) exactly 1 BLOCK or TABLE \endcode
*/
bool box_normalise_block(struct box *block, pool box_pool)
bool box_normalise_block(struct box *block, struct content *c)
{
struct box *child;
struct box *next_child;
@ -98,16 +97,16 @@ bool box_normalise_block(struct box *block, pool box_pool)
switch (child->type) {
case BOX_BLOCK:
/* ok */
if (!box_normalise_block(child, box_pool))
if (!box_normalise_block(child, c))
return false;
break;
case BOX_INLINE_CONTAINER:
if (!box_normalise_inline_container(child,
box_pool))
c))
return false;
break;
case BOX_TABLE:
if (!box_normalise_table(child, box_pool))
if (!box_normalise_table(child, c))
return false;
break;
case BOX_INLINE:
@ -127,7 +126,7 @@ bool box_normalise_block(struct box *block, pool box_pool)
if (!style)
return false;
css_cascade(style, &css_blank_style);
table = box_create(style, block->href, 0, 0, box_pool);
table = box_create(style, block->href, 0, 0, c);
if (!table) {
css_free_style(style);
return false;
@ -152,7 +151,7 @@ bool box_normalise_block(struct box *block, pool box_pool)
if (table->next)
table->next->prev = table;
table->parent = block;
if (!box_normalise_table(table, box_pool))
if (!box_normalise_table(table, c))
return false;
break;
default:
@ -164,7 +163,7 @@ bool box_normalise_block(struct box *block, pool box_pool)
}
bool box_normalise_table(struct box *table, pool box_pool)
bool box_normalise_table(struct box *table, struct content * c)
{
struct box *child;
struct box *next_child;
@ -192,7 +191,7 @@ bool box_normalise_table(struct box *table, pool box_pool)
case BOX_TABLE_ROW_GROUP:
/* ok */
if (!box_normalise_table_row_group(child,
&col_info, box_pool)) {
&col_info, c)) {
free(col_info.spans);
return false;
}
@ -211,7 +210,7 @@ bool box_normalise_table(struct box *table, pool box_pool)
}
css_cascade(style, &css_blank_style);
row_group = box_create(style, table->href, 0,
0, box_pool);
0, c);
if (!row_group) {
free(col_info.spans);
css_free_style(style);
@ -240,7 +239,7 @@ bool box_normalise_table(struct box *table, pool box_pool)
row_group->next->prev = row_group;
row_group->parent = table;
if (!box_normalise_table_row_group(row_group,
&col_info, box_pool)) {
&col_info, c)) {
free(col_info.spans);
return false;
}
@ -344,7 +343,7 @@ void box_normalise_table_spans(struct box *table)
bool box_normalise_table_row_group(struct box *row_group,
struct columns *col_info,
pool box_pool)
struct content * c)
{
struct box *child;
struct box *next_child;
@ -361,7 +360,7 @@ bool box_normalise_table_row_group(struct box *row_group,
case BOX_TABLE_ROW:
/* ok */
if (!box_normalise_table_row(child, col_info,
box_pool))
c))
return false;
break;
case BOX_BLOCK:
@ -376,7 +375,7 @@ bool box_normalise_table_row_group(struct box *row_group,
return false;
css_cascade(style, &css_blank_style);
row = box_create(style, row_group->href, 0,
0, box_pool);
0, c);
if (!row) {
css_free_style(style);
return false;
@ -404,7 +403,7 @@ bool box_normalise_table_row_group(struct box *row_group,
row->next->prev = row;
row->parent = row_group;
if (!box_normalise_table_row(row, col_info,
box_pool))
c))
return false;
break;
case BOX_INLINE:
@ -440,7 +439,7 @@ bool box_normalise_table_row_group(struct box *row_group,
bool box_normalise_table_row(struct box *row,
struct columns *col_info,
pool box_pool)
struct content * c)
{
struct box *child;
struct box *next_child;
@ -457,7 +456,7 @@ bool box_normalise_table_row(struct box *row,
switch (child->type) {
case BOX_TABLE_CELL:
/* ok */
if (!box_normalise_block(child, box_pool))
if (!box_normalise_block(child, c))
return false;
cell = child;
break;
@ -473,7 +472,7 @@ bool box_normalise_table_row(struct box *row,
return false;
css_cascade(style, &css_blank_style);
cell = box_create(style, row->href, 0, 0,
box_pool);
c);
if (!cell) {
css_free_style(style);
return false;
@ -500,7 +499,7 @@ bool box_normalise_table_row(struct box *row,
if (cell->next)
cell->next->prev = cell;
cell->parent = row;
if (!box_normalise_block(cell, box_pool))
if (!box_normalise_block(cell, c))
return false;
break;
case BOX_INLINE:
@ -627,7 +626,7 @@ bool calculate_table_row(struct columns *col_info,
}
bool box_normalise_inline_container(struct box *cont, pool box_pool)
bool box_normalise_inline_container(struct box *cont, struct content * c)
{
struct box *child;
struct box *next_child;
@ -645,7 +644,7 @@ bool box_normalise_inline_container(struct box *cont, pool box_pool)
break;
case BOX_INLINE_BLOCK:
/* ok */
if (!box_normalise_block(child, box_pool))
if (!box_normalise_block(child, c))
return false;
break;
case BOX_FLOAT_LEFT:
@ -656,13 +655,13 @@ bool box_normalise_inline_container(struct box *cont, pool box_pool)
case BOX_BLOCK:
if (!box_normalise_block(
child->children,
box_pool))
c))
return false;
break;
case BOX_TABLE:
if (!box_normalise_table(
child->children,
box_pool))
c))
return false;
break;
default:

View File

@ -42,6 +42,7 @@ struct form *form_new(char *action, form_method method)
form->method = method;
form->controls = 0;
form->last_control = 0;
form->prev = 0;
return form;
}

View File

@ -33,6 +33,7 @@ struct form {
form_method method; /**< Method and enctype. */
struct form_control *controls; /**< Linked list of controls. */
struct form_control *last_control; /**< Last control in list. */
struct form *prev; /**< Previous form in doc. */
};
/** Type of a struct form_control. */

View File

@ -28,6 +28,7 @@
#include "netsurf/render/layout.h"
#include "netsurf/utils/log.h"
#include "netsurf/utils/messages.h"
#include "netsurf/utils/talloc.h"
#include "netsurf/utils/url.h"
#include "netsurf/utils/utils.h"
@ -65,7 +66,7 @@ bool html_create(struct content *c, const char *params[])
html->encoding_handler = 0;
html->encoding = 0;
html->getenc = true;
html->base_url = strdup(c->url);
html->base_url = c->url;
html->layout = 0;
html->background_colour = TRANSPARENT;
html->stylesheet_count = 0;
@ -73,17 +74,13 @@ bool html_create(struct content *c, const char *params[])
html->style = 0;
html->object_count = 0;
html->object = 0;
html->forms = 0;
html->imagemaps = 0;
html->box_pool = pool_create(sizeof (struct box) * 100);
html->string_pool = pool_create(8000);
html->bw = 0;
if (!html->base_url || !html->string_pool || !html->box_pool)
goto no_memory;
for (i = 0; params[i]; i += 2) {
if (strcasecmp(params[i], "charset") == 0) {
html->encoding = strdup(params[i + 1]);
html->encoding = talloc_strdup(c, params[i + 1]);
if (!html->encoding)
goto no_memory;
html->encoding_source = ENCODING_SOURCE_HEADER;
@ -135,7 +132,7 @@ bool html_process_data(struct content *c, char *data, unsigned int size)
if (encoding) {
if (!html_set_parser_encoding(c, encoding))
return false;
c->data.html.encoding = strdup(encoding);
c->data.html.encoding = talloc_strdup(c, encoding);
if (!c->data.html.encoding)
return false;
c->data.html.encoding_source =
@ -266,7 +263,7 @@ bool html_convert(struct content *c, int width, int height)
/* The encoding was not in headers or detected, and the parser
* found a <meta http-equiv="content-type"
* content="text/html; charset=...">. */
c->data.html.encoding = strdup(document->encoding);
c->data.html.encoding = talloc_strdup(c, document->encoding);
if (!c->data.html.encoding) {
msg_data.error = messages_get("NoMemory");
content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
@ -338,12 +335,13 @@ bool html_convert(struct content *c, int width, int height)
content_set_status(c, messages_get("Formatting"));
content_broadcast(c, CONTENT_MSG_STATUS, msg_data);
LOG(("Layout document"));
layout_document(c->data.html.layout, width,
c->data.html.box_pool);
layout_document(c, width);
/*box_dump(c->data.html.layout->children, 0);*/
c->width = c->data.html.layout->descendant_x1;
c->height = c->data.html.layout->descendant_y1;
c->size = talloc_total_size(c);
if (c->active == 0) {
c->status = CONTENT_STATUS_DONE;
content_set_status(c, messages_get("Done"));
@ -380,20 +378,26 @@ bool html_head(struct content *c, xmlNode *head)
xmlChar *title = xmlNodeGetContent(node);
if (!title)
return false;
c->title = squash_whitespace(title);
char *title2 = squash_whitespace(title);
xmlFree(title);
if (!title2)
return false;
c->title = talloc_strdup(c, title2);
free(title2);
if (!c->title)
return false;
xmlFree(title);
} else if (strcmp(node->name, "base") == 0) {
char *href = (char *) xmlGetProp(node, (const xmlChar *) "href");
char *href = (char *) xmlGetProp(node,
(const xmlChar *) "href");
if (href) {
char *url;
url_func_result res;
res = url_normalize(href, &url);
if (res == URL_FUNC_OK) {
free(c->data.html.base_url);
c->data.html.base_url = url;
c->data.html.base_url =
talloc_strdup(c, url);
free(url);
}
xmlFree(href);
}
@ -424,8 +428,8 @@ bool html_find_stylesheets(struct content *c, xmlNode *head)
/* stylesheet 0 is the base style sheet,
* stylesheet 1 is the adblocking stylesheet,
* stylesheet 2 is any <style> elements */
c->data.html.stylesheet_content = malloc(STYLESHEET_START *
sizeof *c->data.html.stylesheet_content);
c->data.html.stylesheet_content = talloc_array(c, struct content *,
STYLESHEET_START);
if (!c->data.html.stylesheet_content)
return false;
c->data.html.stylesheet_content[STYLESHEET_ADBLOCK] = 0;
@ -511,10 +515,9 @@ bool html_find_stylesheets(struct content *c, xmlNode *head)
LOG(("linked stylesheet %i '%s'", i, url));
/* start fetch */
stylesheet_content = realloc(
stylesheet_content = talloc_realloc(c,
c->data.html.stylesheet_content,
(i + 1) * sizeof
*c->data.html.stylesheet_content);
struct content *, i + 1);
if (!stylesheet_content)
return false;
c->data.html.stylesheet_content = stylesheet_content;
@ -709,7 +712,7 @@ void html_convert_css_callback(content_msg msg, struct content *css,
* Start a fetch for an object required by a page.
*
* \param c content structure
* \param url URL of object to fetch (not copied, must be on heap)
* \param url URL of object to fetch (copied)
* \param box box that will contain the object
* \param permitted_types array of types, terminated by CONTENT_UNKNOWN,
* or 0 if all types except OTHER and UNKNOWN acceptable
@ -727,7 +730,7 @@ bool html_fetch_object(struct content *c, char *url, struct box *box,
unsigned int i = c->data.html.object_count;
struct content_html_object *object;
struct content *c_fetch;
/* initialise fetch */
c_fetch = fetchcache(url, html_object_callback,
c, (void *) i, available_width, available_height,
@ -736,14 +739,18 @@ bool html_fetch_object(struct content *c, char *url, struct box *box,
return false;
/* add to object list */
object = realloc(c->data.html.object,
(i + 1) * sizeof *c->data.html.object);
object = talloc_realloc(c, c->data.html.object,
struct content_html_object, i + 1);
if (!object) {
content_remove_user(c_fetch, html_object_callback, c, (void*)i);
return false;
}
c->data.html.object = object;
c->data.html.object[i].url = url;
c->data.html.object[i].url = talloc_strdup(c, url);
if (!c->data.html.object[i].url) {
content_remove_user(c_fetch, html_object_callback, c, (void*)i);
return false;
}
c->data.html.object[i].box = box;
c->data.html.object[i].permitted_types = permitted_types;
c->data.html.object[i].background = background;
@ -829,8 +836,9 @@ void html_object_callback(content_msg msg, struct content *object,
case CONTENT_MSG_REDIRECT:
c->active--;
free(c->data.html.object[i].url);
c->data.html.object[i].url = strdup(data.redirect);
talloc_free(c->data.html.object[i].url);
c->data.html.object[i].url = talloc_strdup(c,
data.redirect);
if (!c->data.html.object[i].url) {
/** \todo report oom */
} else {
@ -1003,8 +1011,7 @@ void html_stop(struct content *c)
void html_reformat(struct content *c, int width, int height)
{
layout_document(c->data.html.layout, width,
c->data.html.box_pool);
layout_document(c, width);
c->width = c->data.html.layout->descendant_x1;
c->height = c->data.html.layout->descendant_y1;
}
@ -1019,20 +1026,11 @@ void html_destroy(struct content *c)
unsigned int i;
LOG(("content %p", c));
free(c->title);
imagemap_destroy(c);
if (c->data.html.parser)
htmlFreeParserCtxt(c->data.html.parser);
free(c->data.html.encoding);
free(c->data.html.base_url);
if (c->data.html.layout)
box_free(c->data.html.layout);
/* Free stylesheets */
if (c->data.html.stylesheet_count) {
for (i = 0; i != c->data.html.stylesheet_count; i++) {
@ -1043,10 +1041,9 @@ void html_destroy(struct content *c)
c, (void *) i);
}
}
free(c->data.html.stylesheet_content);
if (c->data.html.style)
css_free_style(c->data.html.style);
/*if (c->data.html.style)
css_free_style(c->data.html.style);*/
/* Free objects */
for (i = 0; i != c->data.html.object_count; i++) {
@ -1054,12 +1051,7 @@ void html_destroy(struct content *c)
if (c->data.html.object[i].content)
content_remove_user(c->data.html.object[i].content,
html_object_callback, c, (void*)i);
free(c->data.html.object[i].url);
}
free(c->data.html.object);
pool_destroy(c->data.html.string_pool);
pool_destroy(c->data.html.box_pool);
}

View File

@ -18,7 +18,6 @@
#include "libxml/HTMLparser.h"
#include "netsurf/content/content_type.h"
#include "netsurf/css/css.h"
#include "netsurf/utils/pool.h"
struct box;
struct browser_window;
@ -75,11 +74,10 @@ struct content_html_data {
unsigned int object_count;
/** Objects. Each may be 0. */
struct content_html_object *object;
struct imagemap **imagemaps; /**< Hashtable of imagemaps */
pool box_pool; /**< Memory pool for box tree. */
pool string_pool; /**< Memory pool for strings. */
/** Forms, in reverse order to document. */
struct form *forms;
/** Hash table of imagemaps */
struct imagemap **imagemaps;
/**< Browser window containing this document, or 0 if not open. */
struct browser_window *bw;

View File

@ -15,7 +15,6 @@
*/
#define _GNU_SOURCE /* for strndup */
#include <alloca.h>
#include <assert.h>
#include <ctype.h>
#include <limits.h>
@ -34,7 +33,7 @@
#include "netsurf/render/layout.h"
#define NDEBUG
#include "netsurf/utils/log.h"
#include "netsurf/utils/pool.h"
#include "netsurf/utils/talloc.h"
#include "netsurf/utils/utils.h"
@ -55,12 +54,13 @@ static void find_sides(struct box *fl, int y0, int y1,
static int line_height(struct css_style *style);
static bool layout_line(struct box *first, int width, int *y,
int cx, int cy, struct box *cont, bool indent,
pool box_pool, struct box **next_box);
struct content *content, struct box **next_box);
static int layout_text_indent(struct css_style *style, int width);
static bool layout_float(struct box *b, int width, pool box_pool);
static bool layout_float(struct box *b, int width, struct content *content);
static void place_float_below(struct box *c, int width, int cx, int y,
struct box *cont);
static bool layout_table(struct box *box, int available_width, pool box_pool);
static bool layout_table(struct box *box, int available_width,
struct content *content);
static void layout_move_children(struct box *box, int x, int y);
static bool calculate_widths(struct box *box);
static bool calculate_block_widths(struct box *box, int *min, int *max,
@ -75,15 +75,17 @@ static bool calculate_table_widths(struct box *table);
/**
* Calculate positions of boxes in a document.
*
* \param doc root of document box tree
* \param doc content of type CONTENT_HTML
* \param width available page width
* \param box_pool memory pool for any new boxes
* \return true on success, false on memory exhaustion
*/
bool layout_document(struct box *doc, int width, pool box_pool)
bool layout_document(struct content *content, int width)
{
bool ret;
struct box *doc = content->data.html.layout;
assert(content->type == CONTENT_HTML);
doc->float_children = 0;
@ -97,7 +99,7 @@ bool layout_document(struct box *doc, int width, pool box_pool)
doc->border[RIGHT] + doc->margin[RIGHT];
doc->width = width;
ret = layout_block_context(doc, box_pool);
ret = layout_block_context(doc, content);
layout_calculate_descendant_bboxes(doc);
@ -109,14 +111,14 @@ bool layout_document(struct box *doc, int width, pool box_pool)
* Layout a block formatting context.
*
* \param block BLOCK, INLINE_BLOCK, or TABLE_CELL to layout.
* \param box_pool memory pool for any new boxes
* \param content memory pool for any new boxes
* \return true on success, false on memory exhaustion
*
* This function carries out layout of a block and its children, as described
* in CSS 2.1 9.4.1.
*/
bool layout_block_context(struct box *block, pool box_pool)
bool layout_block_context(struct box *block, struct content *content)
{
struct box *box;
int cx;
@ -154,7 +156,7 @@ bool layout_block_context(struct box *block, pool box_pool)
if (box->type == BOX_BLOCK)
layout_block_find_dimensions(box->parent->width, box);
else if (box->type == BOX_TABLE) {
if (!layout_table(box, box->parent->width, box_pool))
if (!layout_table(box, box->parent->width, content))
return false;
layout_solve_width(box->parent->width, box->width,
box->margin, box->padding, box->border);
@ -195,7 +197,7 @@ bool layout_block_context(struct box *block, pool box_pool)
if (box->type == BOX_INLINE_CONTAINER) {
box->width = box->parent->width;
if (!layout_inline_container(box, box->width, block,
cx, cy, box_pool))
cx, cy, content))
return false;
} else if (box->type == BOX_TABLE) {
/* Move down to avoid floats if necessary. */
@ -634,12 +636,12 @@ void find_sides(struct box *fl, int y0, int y1,
* \param cont ancestor box which defines horizontal space, for floats
* \param cx box position relative to cont
* \param cy box position relative to cont
* \param box_pool memory pool for any new boxes
* \param content memory pool for any new boxes
* \return true on success, false on memory exhaustion
*/
bool layout_inline_container(struct box *box, int width,
struct box *cont, int cx, int cy, pool box_pool)
struct box *cont, int cx, int cy, struct content *content)
{
bool first_line = true;
struct box *c, *next;
@ -653,7 +655,7 @@ bool layout_inline_container(struct box *box, int width,
for (c = box->children; c; ) {
LOG(("c %p", c));
if (!layout_line(c, width, &y, cx, cy + y, cont, first_line,
box_pool, &next))
content, &next))
return false;
c = next;
first_line = false;
@ -710,13 +712,13 @@ int line_height(struct css_style *style)
* \param cont ancestor box which defines horizontal space, for floats
* \param indent apply any first-line indent
* \param next_box updated to first box for next line, or 0 at end
* \param box_pool memory pool for any new boxes
* \param content memory pool for any new boxes
* \return true on success, false on memory exhaustion
*/
bool layout_line(struct box *first, int width, int *y,
int cx, int cy, struct box *cont, bool indent,
pool box_pool, struct box **next_box)
struct content *content, struct box **next_box)
{
int height, used_height;
int x0 = 0;
@ -759,7 +761,7 @@ bool layout_line(struct box *first, int width, int *y,
if (b->type == BOX_INLINE_BLOCK) {
if (b->width == UNKNOWN_WIDTH)
if (!layout_float(b, width, box_pool))
if (!layout_float(b, width, content))
return false;
/** \todo should margin be included? spec unclear */
h = b->border[TOP] + b->padding[TOP] + b->height +
@ -943,7 +945,7 @@ bool layout_line(struct box *first, int width, int *y,
d->float_children = 0;
/* css_dump_style(b->style); */
if (!layout_float(d, width, box_pool))
if (!layout_float(d, width, content))
return false;
d->x = d->margin[LEFT] + d->border[LEFT];
d->y = d->margin[TOP] + d->border[TOP];
@ -1022,13 +1024,14 @@ bool layout_line(struct box *first, int width, int *y,
b = split_box->next;
} else {
/* cut off first word for this line */
/* \todo allocate from box_pool */
c2 = pool_alloc(box_pool, sizeof *c2);
/* \todo allocate from content */
c2 = talloc_memdup(content, split_box,
sizeof *c2);
if (!c2)
return false;
memcpy(c2, split_box, sizeof *c2);
c2->text = strndup(split_box->text + space + 1,
split_box->length - (space + 1));
c2->text = talloc_strndup(content,
split_box->text + space + 1,
split_box->length -(space + 1));
if (!c2->text)
return false;
c2->length = split_box->length - (space + 1);
@ -1066,12 +1069,13 @@ bool layout_line(struct box *first, int width, int *y,
if (space == 0)
space = 1;
if (space != split_box->length) {
c2 = pool_alloc(box_pool, sizeof *c2);
c2 = talloc_memdup(content, split_box,
sizeof *c2);
if (!c2)
return false;
memcpy(c2, split_box, sizeof *c2);
c2->text = strndup(split_box->text + space + 1,
split_box->length - (space + 1));
c2->text = talloc_strndup(content,
split_box->text + space + 1,
split_box->length -(space + 1));
if (!c2->text)
return false;
c2->length = split_box->length - (space + 1);
@ -1147,22 +1151,22 @@ int layout_text_indent(struct css_style *style, int width)
*
* \param b float or inline block box
* \param width available width
* \param box_pool memory pool for any new boxes
* \param content memory pool for any new boxes
* \return true on success, false on memory exhaustion
*/
bool layout_float(struct box *b, int width, pool box_pool)
bool layout_float(struct box *b, int width, struct content *content)
{
layout_float_find_dimensions(width, b->style, b);
if (b->type == BOX_TABLE) {
if (!layout_table(b, width, box_pool))
if (!layout_table(b, width, content))
return false;
if (b->margin[LEFT] == AUTO)
b->margin[LEFT] = 0;
if (b->margin[RIGHT] == AUTO)
b->margin[RIGHT] = 0;
} else
return layout_block_context(b, box_pool);
return layout_block_context(b, content);
return true;
}
@ -1212,12 +1216,12 @@ void place_float_below(struct box *c, int width, int cx, int y,
*
* \param table table to layout
* \param available_width width of containing block
* \param box_pool memory pool for any new boxes
* \param content memory pool for any new boxes
* \return true on success, false on memory exhaustion
*/
bool layout_table(struct box *table, int available_width,
pool box_pool)
struct content *content)
{
unsigned int columns = table->columns; /* total columns */
unsigned int i;
@ -1225,7 +1229,7 @@ bool layout_table(struct box *table, int available_width,
int *excess_y;
int table_width, min_width = 0, max_width = 0;
int required_width = 0;
int x, cp, remainder = 0, count = 0;
int x, remainder = 0, count = 0;
int table_height = 0;
int *xs; /* array of column x positions */
int auto_width;
@ -1273,11 +1277,6 @@ bool layout_table(struct box *table, int available_width,
layout_find_dimensions(available_width,
c->style, 0,
c->padding, c->border);
if (c->style->html_style.cellpadding.type == CSS_CELLPADDING_VALUE)
for (cp = 0; cp < 4; cp++)
if (!c->style->padding[cp].override_cellpadding)
c->padding[cp] =
c->style->html_style.cellpadding.value;
if (c->style->overflow ==
CSS_OVERFLOW_SCROLL ||
c->style->overflow ==
@ -1489,7 +1488,7 @@ bool layout_table(struct box *table, int available_width,
c->float_children = 0;
c->height = AUTO;
if (!layout_block_context(c, box_pool)) {
if (!layout_block_context(c, content)) {
free(col);
free(excess_y);
free(row_span);
@ -1692,25 +1691,25 @@ bool calculate_widths(struct box *box)
/* add margins, border, padding to min, max widths */
if (style) {
for (side = 1; side != 5; side += 2) { /* RIGHT, LEFT */
if ((box->type == BOX_TABLE_CELL) &&
(style->html_style.cellpadding.type == CSS_CELLPADDING_VALUE) &&
(!style->padding[side].override_cellpadding))
extra_fixed += style->html_style.cellpadding.value;
else if (style->padding[side].padding == CSS_PADDING_LENGTH)
extra_fixed += (int)css_len2px(&style->padding[side].value.length,
style);
else if (style->padding[side].padding == CSS_PADDING_PERCENT)
extra_frac += style->padding[side].value.percent * 0.01;
if (style->padding[side].padding == CSS_PADDING_LENGTH)
extra_fixed += css_len2px(&style->padding[side].
value.length, style);
else if (style->padding[side].padding ==
CSS_PADDING_PERCENT)
extra_frac += style->padding[side].value.
percent * 0.01;
if (style->border[side].style != CSS_BORDER_STYLE_NONE)
extra_fixed += (int)css_len2px(&style->border[side].width.value,
style);
extra_fixed += css_len2px(&style->border[side].
width.value, style);
if (style->margin[side].margin == CSS_MARGIN_LENGTH)
extra_fixed += (int)css_len2px(&style->margin[side].value.length,
style);
else if (style->margin[side].margin == CSS_MARGIN_PERCENT)
extra_frac += style->margin[side].value.percent * 0.01;
extra_fixed += css_len2px(&style->margin[side].
value.length, style);
else if (style->margin[side].margin ==
CSS_MARGIN_PERCENT)
extra_frac += style->margin[side].value.
percent * 0.01;
}
}

View File

@ -16,16 +16,14 @@
#ifndef _NETSURF_RENDER_LAYOUT_H_
#define _NETSURF_RENDER_LAYOUT_H_
#include "netsurf/utils/pool.h"
#define SCROLLBAR_WIDTH 16
struct box;
bool layout_document(struct box *box, int width, pool box_pool);
bool layout_block_context(struct box *block, pool box_pool);
bool layout_document(struct content *content, int width);
bool layout_block_context(struct box *block, struct content *content);
bool layout_inline_container(struct box *box, int width,
struct box *cont, int cx, int cy, pool box_pool);
struct box *cont, int cx, int cy, struct content *content);
void layout_calculate_descendant_bboxes(struct box *box);
#endif

View File

@ -471,7 +471,6 @@ bool print_document(struct gui_window *g, const char *filename)
int left, right, top, bottom, width, height;
int saved_width;
int yscroll = 0, sheets = print_max_sheets;
struct box *box = 0;
struct content *c = g->bw->current_content;
const char *error_message;
pdriver_features features;
@ -484,9 +483,6 @@ bool print_document(struct gui_window *g, const char *filename)
return false;
}
if (c->type == CONTENT_HTML)
box = c->data.html.layout;
/* read printer driver features */
error = xpdriver_info(0, 0, 0, &features, 0, 0, 0, 0);
if (error) {
@ -511,7 +507,7 @@ bool print_document(struct gui_window *g, const char *filename)
/* layout the document to the correct width */
saved_width = c->width;
if (c->type == CONTENT_HTML)
layout_document(box, width, c->data.html.box_pool);
layout_document(c, width);
/* open printer file */
error = xosfind_openoutw(osfind_NO_PATH | osfind_ERROR_IF_DIR |
@ -648,7 +644,7 @@ bool print_document(struct gui_window *g, const char *filename)
/* restore document layout */
if (c->type == CONTENT_HTML)
layout_document(box, saved_width, c->data.html.box_pool);
layout_document(c, saved_width);
return true;
@ -666,7 +662,7 @@ error:
/* restore document layout */
if (c->type == CONTENT_HTML)
layout_document(box, saved_width, c->data.html.box_pool);
layout_document(c, saved_width);
return false;
}

View File

@ -146,7 +146,7 @@ bool save_as_draw(struct content *c, const char *path)
memcpy(diagram->source, "NetSurf ", 12);
/* recalculate box widths for an A4 page */
if (!layout_document(box, A4PAGEWIDTH, c->data.html.box_pool)) {
if (!layout_document(c, A4PAGEWIDTH)) {
warn_user("NoMemory", 0);
goto draw_save_error;
}
@ -183,7 +183,7 @@ bool save_as_draw(struct content *c, const char *path)
drawbuf_free();
/* reset layout to current window width */
if (!layout_document(box, current_width, c->data.html.box_pool)) {
if (!layout_document(c, current_width)) {
warn_user("NoMemory", 0);
return false;
}
@ -193,7 +193,7 @@ bool save_as_draw(struct content *c, const char *path)
draw_save_error:
drawbuf_free();
/* attempt to reflow back on failure */
(void)layout_document(box, current_width, c->data.html.box_pool);
(void)layout_document(c, current_width);
return false;
}