mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-12-23 12:36:51 +03:00
[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:
parent
8728712699
commit
2920bca14a
34
css/css.c
34
css/css.c
@ -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)
|
||||
|
11
css/css.h
11
css/css.h
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
59
render/box.c
59
render/box.c
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
@ -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:
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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. */
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
113
render/layout.c
113
render/layout.c
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user