[project @ 2004-01-24 17:08:15 by bursa]

Add permitted_types to html_fetch_object().

svn path=/import/netsurf/; revision=500
This commit is contained in:
James Bursa 2004-01-24 17:08:16 +00:00
parent b116f20cd4
commit 1bdcb44639
6 changed files with 112 additions and 50 deletions

View File

@ -109,15 +109,13 @@ static const struct handler_entry handler_map[] = {
html_add_instance, html_remove_instance, html_reshape_instance},
{textplain_create, textplain_process_data, textplain_convert,
textplain_revive, textplain_reformat, textplain_destroy, 0, 0, 0, 0},
{css_create, css_process_data, css_convert, css_revive,
css_reformat, css_destroy, 0, 0, 0, 0},
#ifdef riscos
#ifdef WITH_JPEG
{jpeg_create, jpeg_process_data, jpeg_convert, jpeg_revive,
jpeg_reformat, jpeg_destroy, jpeg_redraw, 0, 0, 0},
#endif
#endif
{css_create, css_process_data, css_convert, css_revive,
css_reformat, css_destroy, 0, 0, 0, 0},
#ifdef riscos
#ifdef WITH_PNG
{nspng_create, nspng_process_data, nspng_convert, nspng_revive,
nspng_reformat, nspng_destroy, nspng_redraw, 0, 0, 0},

View File

@ -28,6 +28,7 @@
#include "libxml/HTMLparser.h"
#include "netsurf/utils/config.h"
#include "netsurf/content/cache.h"
#include "netsurf/content/content_type.h"
#include "netsurf/content/fetch.h"
#include "netsurf/content/other.h"
#include "netsurf/css/css.h"
@ -56,38 +57,6 @@
#endif
/** The type of a content. */
typedef enum {
CONTENT_HTML,
CONTENT_TEXTPLAIN,
#ifdef riscos
#ifdef WITH_JPEG
CONTENT_JPEG,
#endif
#endif
CONTENT_CSS,
#ifdef riscos
#ifdef WITH_PNG
CONTENT_PNG,
#endif
#ifdef WITH_GIF
CONTENT_GIF,
#endif
#ifdef WITH_SPRITE
CONTENT_SPRITE,
#endif
#ifdef WITH_DRAW
CONTENT_DRAW,
#endif
#ifdef WITH_PLUGIN
CONTENT_PLUGIN,
#endif
#endif
CONTENT_OTHER,
CONTENT_UNKNOWN /**< content-type not received yet */
} content_type;
/** Used in callbacks to indicate what has occurred. */
typedef enum {
CONTENT_MSG_LOADING, /**< fetching or converting */

51
content/content_type.h Normal file
View File

@ -0,0 +1,51 @@
/*
* This file is part of NetSurf, http://netsurf.sourceforge.net/
* Licensed under the GNU General Public License,
* http://www.opensource.org/licenses/gpl-license
* Copyright 2003 James Bursa <bursa@users.sourceforge.net>
*/
/** \file
* Declaration of content_type enum.
*
* The content_type enum is defined here to prevent cyclic dependencies.
*/
#ifndef _NETSURF_DESKTOP_CONTENT_TYPE_H_
#define _NETSURF_DESKTOP_CONTENT_TYPE_H_
#include "netsurf/utils/config.h"
/** The type of a content. */
typedef enum {
CONTENT_HTML,
CONTENT_TEXTPLAIN,
CONTENT_CSS,
#ifdef riscos
#ifdef WITH_JPEG
CONTENT_JPEG,
#endif
#ifdef WITH_PNG
CONTENT_PNG,
#endif
#ifdef WITH_GIF
CONTENT_GIF,
#endif
#ifdef WITH_SPRITE
CONTENT_SPRITE,
#endif
#ifdef WITH_DRAW
CONTENT_DRAW,
#endif
#ifdef WITH_PLUGIN
CONTENT_PLUGIN,
#endif
#endif
/* these must be the last two */
CONTENT_OTHER,
CONTENT_UNKNOWN /**< content-type not received yet */
} content_type;
#endif

View File

@ -676,7 +676,7 @@ struct css_style * box_get_style(struct content ** stylesheet,
}
/**
/*
* Special case elements
*
* These functions are called by convert_xml_to_box when an element is being
@ -714,6 +714,12 @@ struct result box_body(xmlNode *n, struct status *status,
return (struct result) {box, 1};
}
static const content_type image_types[] = {
#ifdef riscos
CONTENT_JPEG, CONTENT_PNG, CONTENT_GIF, CONTENT_SPRITE, CONTENT_DRAW,
#endif
CONTENT_UNKNOWN };
struct result box_image(xmlNode *n, struct status *status,
struct css_style *style)
{
@ -747,7 +753,7 @@ struct result box_image(xmlNode *n, struct status *status,
xmlFree(s);
/* start fetch */
html_fetch_object(status->content, url, box);
html_fetch_object(status->content, url, box, image_types);
return (struct result) {box, 0};
}
@ -1062,7 +1068,8 @@ struct result box_input(xmlNode *n, struct status *status,
if ((s = (char *) xmlGetProp(n, (const xmlChar*) "src"))) {
url = url_join(s, status->content->data.html.base_url);
if (url)
html_fetch_object(status->content, url, box);
html_fetch_object(status->content, url, box,
image_types);
xmlFree(s);
}
}
@ -2158,7 +2165,7 @@ bool plugin_decode(struct content* content, char* url, struct box* box,
* when we fetch it (if the type was not specified or is different to that
* given in the attributes).
*/
html_fetch_object(content, url, box);
html_fetch_object(content, url, box, 0);
return true;
}

View File

@ -28,6 +28,8 @@ static void html_head(struct content *c, xmlNode *head);
static void html_find_stylesheets(struct content *c, xmlNode *head);
static void html_object_callback(content_msg msg, struct content *object,
void *p1, void *p2, const char *error);
static bool html_object_type_permitted(const content_type type,
const content_type *permitted_types);
void html_create(struct content *c, const char *params[])
@ -427,7 +429,8 @@ void html_find_stylesheets(struct content *c, xmlNode *head)
}
void html_fetch_object(struct content *c, char *url, struct box *box)
void html_fetch_object(struct content *c, char *url, struct box *box,
const content_type *permitted_types)
{
unsigned int i = c->data.html.object_count;
@ -436,6 +439,7 @@ void html_fetch_object(struct content *c, char *url, struct box *box)
(i + 1) * sizeof(*c->data.html.object));
c->data.html.object[i].url = url;
c->data.html.object[i].box = box;
c->data.html.object[i].permitted_types = permitted_types;
/* start fetch */
c->data.html.object[i].content = fetchcache(url, c->url,
@ -467,16 +471,21 @@ void html_object_callback(content_msg msg, struct content *object,
struct content *c = p1;
unsigned int i = (unsigned int) p2;
struct box *box = c->data.html.object[i].box;
switch (msg) {
case CONTENT_MSG_LOADING:
if (CONTENT_OTHER <= c->type) {
c->data.html.object[i].content = 0;
c->active--;
c->error = 1;
sprintf(c->status_message, "Warning: bad object type");
content_broadcast(c, CONTENT_MSG_STATUS, 0);
content_remove_user(object, html_object_callback, c, (void*)i);
}
/* check if the type is acceptable for this object */
if (html_object_type_permitted(object->type,
c->data.html.object[i].permitted_types))
break;
/* not acceptable */
c->data.html.object[i].content = 0;
c->active--;
c->error = 1;
sprintf(c->status_message, "Warning: bad object type");
content_broadcast(c, CONTENT_MSG_STATUS, 0);
content_remove_user(object, html_object_callback, c, (void*)i);
break;
case CONTENT_MSG_READY:
@ -582,6 +591,29 @@ void html_object_callback(content_msg msg, struct content *object,
}
/**
* Check if a type is in a list.
*
* \param type the content_type to search for
* \param permitted_types array of types, terminated by CONTENT_UNKNOWN,
* or 0 if all types except OTHER and UNKNOWN acceptable
* \return the type is in the list or acceptable
*/
bool html_object_type_permitted(const content_type type,
const content_type *permitted_types)
{
if (permitted_types) {
for (; *permitted_types != CONTENT_UNKNOWN; permitted_types++)
if (*permitted_types == type)
return true;
} else if (type < CONTENT_OTHER) {
return true;
}
return false;
}
void html_revive(struct content *c, unsigned int width, unsigned int height)
{
unsigned int i;

View File

@ -8,6 +8,7 @@
#ifndef _NETSURF_RENDER_HTML_H_
#define _NETSURF_RENDER_HTML_H_
#include "netsurf/content/content_type.h"
#include "netsurf/css/css.h"
#include "netsurf/render/box.h"
#include "netsurf/utils/pool.h"
@ -49,6 +50,9 @@ struct content_html_data {
char *url;
struct content *content;
struct box *box;
/** Pointer to array of permitted content_type, terminated by
* CONTENT_UNKNOWN, or 0 if any type is acceptable. */
const content_type *permitted_types;
} *object;
pool box_pool; /**< Memory pool for box tree. */
pool string_pool; /**< Memory pool for strings. */
@ -60,7 +64,8 @@ int html_convert(struct content *c, unsigned int width, unsigned int height);
void html_revive(struct content *c, unsigned int width, unsigned int height);
void html_reformat(struct content *c, unsigned int width, unsigned int height);
void html_destroy(struct content *c);
void html_fetch_object(struct content *c, char *url, struct box *box);
void html_fetch_object(struct content *c, char *url, struct box *box,
const content_type *permitted_types);
/* in riscos/htmlinstance.c */
void html_add_instance(struct content *c, struct browser_window *bw,