[project @ 2003-04-09 21:57:09 by bursa]

Table layout fixes, allowed type list.

svn path=/import/netsurf/; revision=119
This commit is contained in:
James Bursa 2003-04-09 21:57:09 +00:00
parent c62f1a55e6
commit 230cb5f01f
11 changed files with 127 additions and 55 deletions

View File

@ -3,6 +3,7 @@
Set NetSurf$Dir <Obey$Dir>
IconSprites <NetSurf$Dir>.!Sprites
Set File$Type_F79 CSS
RMensure WindowManager 3.80 Error 0 NetSurf requires the Nested Window Manager.
RMEnsure UtilityModule 3.70 RMensure CallASWI 0.00 RMload <NetSurf$Dir>.CallASWI

View File

@ -1,5 +1,5 @@
/**
* $Id: content.h,v 1.5 2003/04/06 18:09:34 bursa Exp $
* $Id: content.h,v 1.6 2003/04/09 21:57:09 bursa Exp $
*/
#ifndef _NETSURF_DESKTOP_CONTENT_H_
@ -26,8 +26,14 @@
* the content may be removed from the memory cache.
*/
typedef enum {CONTENT_HTML, CONTENT_TEXTPLAIN, CONTENT_JPEG, CONTENT_CSS,
CONTENT_PNG, CONTENT_OTHER} content_type;
typedef enum {
CONTENT_HTML,
CONTENT_TEXTPLAIN,
CONTENT_JPEG,
CONTENT_CSS,
CONTENT_PNG,
CONTENT_OTHER
} content_type;
struct box_position
{
@ -72,6 +78,7 @@ struct content
{
struct css_stylesheet *css;
unsigned int import_count;
char **import_url;
struct content **import_content;
} css;

View File

@ -1,5 +1,5 @@
/**
* $Id: fetch.c,v 1.3 2003/03/15 15:53:20 bursa Exp $
* $Id: fetch.c,v 1.4 2003/04/09 21:57:09 bursa Exp $
*/
#include <assert.h>
@ -21,12 +21,14 @@ struct fetch
char *url;
char error_buffer[CURL_ERROR_SIZE];
void *p;
struct curl_slist *headers;
};
static const char * const user_agent = "NetSurf";
static CURLM * curl_multi;
static size_t fetch_curl_data(void * data, size_t size, size_t nmemb, struct fetch *f);
static size_t fetch_curl_header(void *data, size_t size, size_t nmemb, struct fetch *f);
/**
@ -102,12 +104,24 @@ struct fetch * fetch_start(char *url, char *referer,
assert(code == CURLE_OK);
code = curl_easy_setopt(fetch->curl_handle, CURLOPT_WRITEDATA, fetch);
assert(code == CURLE_OK);
/* code = curl_easy_setopt(fetch->curl_handle, CURLOPT_HEADERFUNCTION, fetch_curl_header);
assert(code == CURLE_OK);
code = curl_easy_setopt(fetch->curl_handle, CURLOPT_WRITEHEADER, fetch);
assert(code == CURLE_OK);*/
code = curl_easy_setopt(fetch->curl_handle, CURLOPT_USERAGENT, user_agent);
assert(code == CURLE_OK);
if (referer != 0) {
code = curl_easy_setopt(fetch->curl_handle, CURLOPT_REFERER, referer);
assert(code == CURLE_OK);
}
}
/* custom request headers */
fetch->headers = 0;
/* remove curl default headers */
fetch->headers = curl_slist_append(fetch->headers, "Accept:");
fetch->headers = curl_slist_append(fetch->headers, "Pragma:");
code = curl_easy_setopt(fetch->curl_handle, CURLOPT_HTTPHEADER, fetch->headers);
assert(code == CURLE_OK);
/* add to the global curl multi handle */
codem = curl_multi_add_handle(curl_multi, fetch->curl_handle);
@ -138,6 +152,7 @@ void fetch_abort(struct fetch *f)
codem = curl_multi_remove_handle(curl_multi, f->curl_handle);
assert(codem == CURLM_OK);
curl_easy_cleanup(f->curl_handle);
curl_slist_free_all(f->headers);
xfree(f->url);
xfree(f);
@ -241,6 +256,18 @@ size_t fetch_curl_data(void * data, size_t size, size_t nmemb, struct fetch *f)
}
/**
* fetch_curl_header -- callback function for headers
*/
size_t fetch_curl_header(void *data, size_t size, size_t nmemb, struct fetch *f)
{
LOG(("header '%*s'", size * nmemb, data));
return size * nmemb;
}
/**
* testing framework
*/

View File

@ -1,5 +1,5 @@
/**
* $Id: fetchcache.c,v 1.6 2003/04/06 18:09:34 bursa Exp $
* $Id: fetchcache.c,v 1.7 2003/04/09 21:57:09 bursa Exp $
*/
#include <assert.h>
@ -19,6 +19,7 @@ struct fetchcache {
struct content *c;
unsigned long width, height;
unsigned long size;
content_type allowed;
};
@ -29,16 +30,22 @@ static void status_callback(void *p, const char *status);
void fetchcache(const char *url, char *referer,
void (*callback)(fetchcache_msg msg, struct content *c, void *p, const char *error),
void *p, unsigned long width, unsigned long height)
void *p, unsigned long width, unsigned long height, content_type allowed)
{
struct content *c;
struct fetchcache *fc;
c = cache_get(url);
if (c != 0) {
callback(FETCHCACHE_STATUS, c, p, "Found in cache");
content_revive(c, width, height);
callback(FETCHCACHE_OK, c, p, 0);
/* check type is allowed */
if ((1 << c->type) & allowed) {
callback(FETCHCACHE_STATUS, c, p, "Found in cache");
content_revive(c, width, height);
callback(FETCHCACHE_OK, c, p, 0);
} else {
callback(FETCHCACHE_BADTYPE, 0, p, "");
cache_free(c);
}
return;
}
@ -51,6 +58,7 @@ void fetchcache(const char *url, char *referer,
fc->width = width;
fc->height = height;
fc->size = 0;
fc->allowed = allowed;
fc->f = fetch_start(fc->url, referer, fetchcache_callback, fc);
}
@ -76,14 +84,14 @@ void fetchcache_callback(fetch_msg msg, void *p, char *data, unsigned long size)
*semic = 0; /* remove "; charset=..." */
type = content_lookup(mime_type);
LOG(("FETCH_TYPE, type %u", type));
if (type == CONTENT_OTHER) {
fetch_abort(fc->f);
fc->callback(FETCHCACHE_BADTYPE, 0, fc->p, mime_type);
free(fc);
} else {
if ((1 << type) & fc->allowed) {
fc->c = content_create(type, fc->url);
fc->c->status_callback = status_callback;
fc->c->status_p = fc;
} else {
fetch_abort(fc->f);
fc->callback(FETCHCACHE_BADTYPE, 0, fc->p, mime_type);
free(fc);
}
free(mime_type);
break;

View File

@ -1,5 +1,5 @@
/**
* $Id: fetchcache.h,v 1.3 2003/03/04 11:59:35 bursa Exp $
* $Id: fetchcache.h,v 1.4 2003/04/09 21:57:09 bursa Exp $
*/
#ifndef _NETSURF_DESKTOP_FETCHCACHE_H_
@ -11,6 +11,6 @@ typedef enum {FETCHCACHE_OK, FETCHCACHE_BADTYPE, FETCHCACHE_ERROR, FETCHCACHE_ST
void fetchcache(const char *url, char *referer,
void (*callback)(fetchcache_msg msg, struct content *c, void *p, const char *error),
void *p, unsigned long width, unsigned long height);
void *p, unsigned long width, unsigned long height, content_type allowed);
#endif

View File

@ -1,5 +1,5 @@
/**
* $Id: css.c,v 1.5 2003/04/06 18:09:34 bursa Exp $
* $Id: css.c,v 1.6 2003/04/09 21:57:09 bursa Exp $
*/
#include <assert.h>
@ -94,6 +94,7 @@ void css_create(struct content *c)
for (i = 0; i != HASH_SIZE; i++)
c->data.css.css->rule[i] = 0;
c->data.css.import_count = 0;
c->data.css.import_url = xcalloc(0, sizeof(*c->data.css.import_url));
c->data.css.import_content = xcalloc(0, sizeof(*c->data.css.import_content));
c->active = 0;
}
@ -140,6 +141,21 @@ int css_convert(struct content *c, unsigned int width, unsigned int height)
void css_revive(struct content *c, unsigned int width, unsigned int height)
{
unsigned int i;
struct fetch_data *fetch_data;
/* imported stylesheets */
for (i = 0; i != c->data.css.import_count; i++) {
fetch_data = xcalloc(1, sizeof(*fetch_data));
fetch_data->c = c;
fetch_data->i = i;
c->active++;
fetchcache(c->data.css.import_url[i], c->url, css_atimport_callback,
fetch_data, c->width, c->height, 1 << CONTENT_CSS);
}
while (c->active != 0) {
fetch_poll();
gui_multitask();
}
}
@ -162,8 +178,11 @@ void css_destroy(struct content *c)
/* imported stylesheets */
for (i = 0; i != c->data.css.import_count; i++)
if (c->data.css.import_content[i] != 0)
if (c->data.css.import_content[i] != 0) {
free(c->data.css.import_url[i]);
cache_free(c->data.css.import_content[i]);
}
xfree(c->data.css.import_url);
xfree(c->data.css.import_content);
}
@ -268,15 +287,18 @@ void css_atimport(struct content *c, struct node *node)
/* start the fetch */
c->data.css.import_count++;
c->data.css.import_url = xrealloc(c->data.css.import_url,
c->data.css.import_count * sizeof(*c->data.css.import_url));
c->data.css.import_content = xrealloc(c->data.css.import_content,
c->data.css.import_count * sizeof(*c->data.css.import_content));
fetch_data = xcalloc(1, sizeof(*fetch_data));
fetch_data->c = c;
fetch_data->i = c->data.css.import_count - 1;
c->data.css.import_url[fetch_data->i] = url_join(url, c->url);
c->active++;
fetchcache(url_join(url, c->url), c->url, css_atimport_callback,
fetch_data, c->width, c->height);
fetchcache(c->data.css.import_url[fetch_data->i], c->url, css_atimport_callback,
fetch_data, c->width, c->height, 1 << CONTENT_CSS);
free(url);
}

View File

@ -1,5 +1,5 @@
/**
* $Id: browser.c,v 1.31 2003/04/05 21:38:06 bursa Exp $
* $Id: browser.c,v 1.32 2003/04/09 21:57:09 bursa Exp $
*/
#include "netsurf/content/cache.h"
@ -215,7 +215,9 @@ void browser_window_open_location_historical(struct browser_window* bw, const ch
browser_window_set_status(bw, "Opening page...");
bw->time0 = clock();
fetchcache(url, 0, browser_window_callback, bw, gui_window_get_width(bw->window), 0);
fetchcache(url, 0, browser_window_callback, bw,
gui_window_get_width(bw->window), 0,
(1 << CONTENT_HTML) | (1 << CONTENT_TEXTPLAIN) | (1 << CONTENT_JPEG));
LOG(("end"));
}

View File

@ -1,5 +1,5 @@
/**
* $Id: html.c,v 1.10 2003/04/06 20:56:40 bursa Exp $
* $Id: html.c,v 1.11 2003/04/09 21:57:09 bursa Exp $
*/
#include <assert.h>
@ -96,8 +96,9 @@ int html_convert(struct content *c, unsigned int width, unsigned int height)
fetch_data->c = c;
fetch_data->i = i;
c->active++;
fetchcache(c->data.html.stylesheet_url[i], c->url, html_convert_css_callback,
fetch_data, width, height);
fetchcache(c->data.html.stylesheet_url[i], c->url,
html_convert_css_callback,
fetch_data, width, height, 1 << CONTENT_CSS);
}
while (c->active != 0) {

View File

@ -1,5 +1,5 @@
/**
* $Id: layout.c,v 1.37 2003/04/04 15:19:31 bursa Exp $
* $Id: layout.c,v 1.38 2003/04/09 21:57:09 bursa Exp $
*/
#include <assert.h>
@ -845,9 +845,37 @@ void calculate_table_widths(struct box *table)
for (j = 0; j != cell->columns; j++) {
min += col[i + j].min;
max += col[i + j].max;
}
/* use specified width if colspan == 1 */
if (col[i].type != COLUMN_WIDTH_FIXED &&
cell->style->width.width == CSS_WIDTH_LENGTH &&
cell->columns == 1) {
width = len(&cell->style->width.value.length,
cell->style);
col[i].type = COLUMN_WIDTH_FIXED;
if (min < width)
/* specified width greater than min => use it */
col[i].width = col[i].max = max = col[i].min = min = width;
else
/* specified width not big enough => use min */
col[i].width = col[i].max = max = min;
}
else if (col[i].type == COLUMN_WIDTH_UNKNOWN) {
if (cell->style->width.width == CSS_WIDTH_PERCENT) {
col[i].type = COLUMN_WIDTH_PERCENT;
col[i].width = cell->style->width.value.percent;
} else if (cell->style->width.width == CSS_WIDTH_AUTO) {
col[i].type = COLUMN_WIDTH_AUTO;
}
}
for (j = 0; j != cell->columns; j++) {
if (col[i + j].type != COLUMN_WIDTH_FIXED)
flexible_columns++;
}
/* distribute extra width to spanned columns */
if (min < cell->min_width) {
if (flexible_columns == 0) {
@ -888,40 +916,16 @@ void calculate_table_widths(struct box *table)
col[i + j].max += extra;
}
}
/* use specified width if colspan == 1 */
if (col[i].type != COLUMN_WIDTH_FIXED &&
cell->style->width.width == CSS_WIDTH_LENGTH &&
cell->columns == 1) {
width = len(&cell->style->width.value.length,
cell->style);
col[i].type = COLUMN_WIDTH_FIXED;
if (min < width)
/* specified width greater than min => use it */
col[i].width = col[i].max = col[i].min = width;
else
/* specified width not big enough => use min */
col[i].width = col[i].max = min;
}
else if (col[i].type == COLUMN_WIDTH_UNKNOWN) {
if (cell->style->width.width == CSS_WIDTH_PERCENT) {
col[i].type = COLUMN_WIDTH_PERCENT;
col[i].width = cell->style->width.value.percent;
} else if (cell->style->width.width == CSS_WIDTH_AUTO) {
col[i].type = COLUMN_WIDTH_AUTO;
}
}
}
}
}
for (i = 0; i < table->columns; i++) {
LOG(("col %u, type %i, min %lu, max %lu, width %lu",
i, col[i].type, col[i].min, col[i].max, col[i].width));
assert(col[i].min <= col[i].max);
min_width += col[i].min;
max_width += col[i].max;
LOG(("col %u, type %i, min %lu, max %lu, width %lu",
i, col[i].type, col[i].min, col[i].max, col[i].width));
}
table->min_width = min_width;
table->max_width = max_width;

View File

@ -1,5 +1,5 @@
/**
* $Id: filetype.c,v 1.2 2003/04/04 15:19:31 bursa Exp $
* $Id: filetype.c,v 1.3 2003/04/09 21:57:09 bursa Exp $
*/
#include <stdlib.h>
@ -15,8 +15,8 @@ struct type_entry {
char mime_type[16];
};
static const struct type_entry type_map[] = {
{0x0cc, "text/css"},
{0xc85, "image/jpeg"},
{0xf79, "text/css"},
{0xfaf, "text/html"},
{0xfff, "text/plain"},
};