summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--!NetSurf/Resources/CSS,f798
-rw-r--r--render/box.c129
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};
+}