From 18cfe064beb1bd1d0d5d4be12554a2933c009472 Mon Sep 17 00:00:00 2001 From: James Bursa Date: Fri, 2 Apr 2004 18:13:23 +0000 Subject: [project @ 2004-04-02 18:13:23 by bursa] Experimental work on frames. svn path=/import/netsurf/; revision=703 --- !NetSurf/Resources/CSS,f79 | 8 +-- render/box.c | 129 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 114 insertions(+), 23 deletions(-) diff --git a/!NetSurf/Resources/CSS,f79 b/!NetSurf/Resources/CSS,f79 index 76dcec9cf..51bd3f80f 100644 --- a/!NetSurf/Resources/CSS,f79 +++ b/!NetSurf/Resources/CSS,f79 @@ -7,7 +7,7 @@ hr, menu, pre { display: block } em, i, q, s, strong, u, font, span, var { display: inline } */ li { display: /* list-item */ block } -head { display: none } +head, noframes { display: none } table { display: table } tr { display: table-row } thead { display: table-header-group } @@ -47,12 +47,12 @@ center { text-align: center; } small { font-size: smaller; } big { font-size: larger; } input { background-color: #fff; color: #000; width: 10em; - height: 1.5em; text-align: left; border-width: 1px; + height: 1.5em; text-align: left; border-width: 1px; border-color: #000; border-style: solid; } select { background-color: #ddd; color: #000; width: 10em; - height: 1.5em; text-align: left; border-width: medium; + height: 1.5em; text-align: left; border-width: medium; border-color: #aaa #eee #eee #aaa; border-style: inset; } -textarea { background-color: #fff; color: #000; text-align: left; +textarea { background-color: #fff; color: #000; text-align: left; border-width: 1px; border-color: #000; border-style: solid; } input[type=button], input[type=reset], input[type=submit], button { background-color: #ddd; color: #000; width: auto; diff --git a/render/box.c b/render/box.c index 579a0de65..6550d761c 100644 --- a/render/box.c +++ b/render/box.c @@ -77,6 +77,8 @@ static struct box *box_input_text(xmlNode *n, struct status *status, struct css_style *style, bool password, bool file); static struct result box_button(xmlNode *n, struct status *status, struct css_style *style); +static struct result box_frameset(xmlNode *n, struct status *status, + struct css_style *style); static void add_option(xmlNode* n, struct form_control* current_select, char *text); static void box_normalise_block(struct box *block, pool box_pool); static void box_normalise_table(struct box *table, pool box_pool); @@ -89,22 +91,16 @@ void box_normalise_table_row(struct box *row, static void box_normalise_inline_container(struct box *cont, pool box_pool); static void gadget_free(struct form_control* g); static void box_free_box(struct box *box); -#ifdef WITH_PLUGIN static struct result box_object(xmlNode *n, struct status *status, struct css_style *style); static struct result box_embed(xmlNode *n, struct status *status, struct css_style *style); static struct result box_applet(xmlNode *n, struct status *status, struct css_style *style); -#endif -#if defined(WITH_PLUGIN) static struct result box_iframe(xmlNode *n, struct status *status, struct css_style *style); -#endif -#ifdef WITH_PLUGIN static bool plugin_decode(struct content* content, char* url, struct box* box, struct object_params* po); -#endif /* element_table must be sorted by name */ struct element_entry { @@ -114,23 +110,16 @@ struct element_entry { }; static const struct element_entry element_table[] = { {"a", box_a}, -#ifdef WITH_PLUGIN {"applet", box_applet}, -#endif {"body", box_body}, {"button", box_button}, -#ifdef WITH_PLUGIN {"embed", box_embed}, -#endif {"form", box_form}, -#if defined(WITH_PLUGIN) + {"frameset", box_frameset}, {"iframe", box_iframe}, -#endif {"img", box_image}, {"input", box_input}, -#ifdef WITH_PLUGIN {"object", box_object}, -#endif {"select", box_select}, {"textarea", box_textarea} }; @@ -192,10 +181,8 @@ struct box * box_create(struct css_style * style, box->gadget = 0; box->usemap = 0; box->object = 0; -#ifdef WITH_PLUGIN box->object_params = 0; box->object_state = 0; -#endif box->x = box->y = 0; box->height = 0; for (i = 0; i != 4; i++) @@ -806,8 +793,10 @@ struct result box_image(xmlNode *n, struct status *status, s1 = strip(s); url = url_join(s1, status->content->data.html.base_url); - if (!url) + if (!url) { + xmlFree(s); return (struct result) {box, 0}; + } LOG(("image '%s'", url)); xmlFree(s); @@ -1784,7 +1773,6 @@ void box_free_box(struct box *box) } -#ifdef WITH_PLUGIN /** * add an object to the box tree */ @@ -2251,7 +2239,7 @@ bool plugin_decode(struct content* content, char* url, struct box* box, return true; } -#endif + /** * Find the absolute coordinates of a box. @@ -2268,3 +2256,106 @@ void box_coords(struct box *box, unsigned long *x, unsigned long *y) } } + +struct result box_frameset(xmlNode *n, struct status *status, + struct css_style *style) +{ + unsigned int i; + unsigned int row, col; + unsigned int rows = 1, cols = 1; + char *s, *s1, *url; + struct box *box; + struct box *row_box; + struct box *cell_box; + struct css_style *row_style; + struct css_style *cell_style; + struct result r; + xmlNode *c; + + box = box_create(style, 0, status->title, + status->content->data.html.box_pool); + box->type = BOX_TABLE; + style->display = CSS_DISPLAY_TABLE; + + /* count rows and columns */ + if ((s = (char *) xmlGetProp(n, (const xmlChar *) "rows"))) { + for (i = 0; s[i]; i++) + if (s[i] == ',') + rows++; + free(s); + } + + if ((s = (char *) xmlGetProp(n, (const xmlChar *) "cols"))) { + for (i = 0; s[i]; i++) + if (s[i] == ',') + cols++; + free(s); + } + + LOG(("rows %u, cols %u", rows, cols)); + + /* create the frameset table */ + c = n->children; + for (row = 0; c && row != rows; row++) { + row_style = malloc(sizeof (struct css_style)); + if (!row_style) + return (struct result) {box, 0}; + memcpy(row_style, style, sizeof (struct css_style)); + row_box = box_create(row_style, 0, 0, + status->content->data.html.box_pool); + row_box->type = BOX_TABLE_ROW; + box_add_child(box, row_box); + + for (col = 0; c && col != cols; col++) { + while (c && !(c->type == XML_ELEMENT_NODE && ( + strcmp((const char *) c->name, "frame") == 0 || + strcmp((const char *) c->name, "frameset") == 0 + ))) + c = c->next; + if (!c) + break; + + cell_style = malloc(sizeof (struct css_style)); + if (!cell_style) + return (struct result) {box, 0}; + memcpy(cell_style, style, sizeof (struct css_style)); + cell_box = box_create(cell_style, 0, 0, + status->content->data.html.box_pool); + cell_box->type = BOX_TABLE_CELL; + box_add_child(row_box, cell_box); + + if (strcmp((const char *) c->name, "frameset") == 0) { + LOG(("frameset")); + r = box_frameset(c, status, style); + box_add_child(cell_box, r.box); + + c = c->next; + continue; + } + + if (!(s = (char *) xmlGetProp(c, + (const xmlChar *) "src"))) { + c = c->next; + continue; + } + + s1 = strip(s); + url = url_join(s1, status->content->data.html.base_url); + if (!url) { + xmlFree(s); + c = c->next; + continue; + } + + LOG(("frame, url '%s'", url)); + + html_fetch_object(status->content, url, cell_box, 0); + xmlFree(s); + free(url); + + c = c->next; + } + } + + return (struct result) {box, 0}; +} -- cgit v1.2.3