summaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2011-10-03 15:56:47 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2011-10-03 15:56:47 +0000
commit36eff6da2bfe5b183c2b4876bb2afe9dedec9b39 (patch)
tree6cc96c71499d22745947113db5c6fc118c286d1f /render
parenta595d7c4bbe44f7de6c565a4fbbdcff735f0ce99 (diff)
downloadnetsurf-36eff6da2bfe5b183c2b4876bb2afe9dedec9b39.tar.gz
netsurf-36eff6da2bfe5b183c2b4876bb2afe9dedec9b39.tar.bz2
Port more internals to nsurl. Front ends may need updating.
svn path=/trunk/netsurf/; revision=12926
Diffstat (limited to 'render')
-rw-r--r--render/box.c16
-rw-r--r--render/box_construct.c44
-rw-r--r--render/form.c7
-rw-r--r--render/html.c176
-rw-r--r--render/html.h4
-rw-r--r--render/html_interaction.c5
-rw-r--r--render/html_internal.h2
-rw-r--r--render/imagemap.c7
8 files changed, 143 insertions, 118 deletions
diff --git a/render/box.c b/render/box.c
index 87f1134cf..00ba0852d 100644
--- a/render/box.c
+++ b/render/box.c
@@ -72,11 +72,10 @@ void *box_style_alloc(void *ptr, size_t len, void *pw)
/**
* Destructor for box nodes which own styles
*
- * @param b The box being destroyed.
- * @return 0 to allow talloc to continue destroying the tree.
+ * \param b The box being destroyed.
+ * \return 0 to allow talloc to continue destroying the tree.
*/
-static int
-free_box_style(struct box *b)
+static int box_talloc_destructor(struct box *b)
{
if ((b->flags & STYLE_OWNED) && b->style != NULL) {
css_computed_style_destroy(b->style);
@@ -119,10 +118,9 @@ struct box * box_create(css_select_results *styles, css_computed_style *style,
if (!box) {
return 0;
}
-
- if (style_owned == true || styles != NULL)
- talloc_set_destructor(box, free_box_style);
-
+
+ talloc_set_destructor(box, box_talloc_destructor);
+
box->type = BOX_INLINE;
box->flags = 0;
box->flags = style_owned ? (box->flags | STYLE_OWNED) : box->flags;
@@ -935,7 +933,7 @@ void box_dump(FILE *stream, struct box *box, unsigned int depth)
fprintf(stream, "space ");
if (box->object) {
fprintf(stream, "(object '%s') ",
- content_get_url(box->object));
+ nsurl_access(content_get_url(box->object)));
}
if (box->iframe) {
fprintf(stream, "(iframe) ");
diff --git a/render/box_construct.c b/render/box_construct.c
index 997e78d79..6345b1d5d 100644
--- a/render/box_construct.c
+++ b/render/box_construct.c
@@ -1049,7 +1049,8 @@ css_select_results *box_get_style(html_content *c,
if ((s = (char *) xmlGetProp(n, (const xmlChar *) "style"))) {
inline_style = nscss_create_inline_style(
(uint8_t *) s, strlen(s),
- c->encoding, content__get_url(&c->base),
+ c->encoding,
+ nsurl_access(content__get_url(&c->base)),
c->quirks != BINDING_QUIRKS_MODE_NONE,
box_style_alloc, NULL);
@@ -1232,7 +1233,7 @@ bool box_a(BOX_SPECIAL_PARAMS)
if ((s = xmlGetProp(n, (const xmlChar *) "href"))) {
ok = box_extract_link((const char *) s,
- content->base_url, &url);
+ nsurl_access(content->base_url), &url);
xmlFree(s);
if (!ok)
return false;
@@ -1317,7 +1318,8 @@ bool box_image(BOX_SPECIAL_PARAMS)
/* get image URL */
if (!(src = xmlGetProp(n, (const xmlChar *) "src")))
return true;
- if (!box_extract_link((char *) src, content->base_url, &url))
+ if (!box_extract_link((char *) src, nsurl_access(content->base_url),
+ &url))
return false;
xmlFree(src);
if (!url)
@@ -1376,13 +1378,16 @@ bool box_object(BOX_SPECIAL_PARAMS)
* (codebase is the base for the other two) */
if ((codebase = xmlGetProp(n, (const xmlChar *) "codebase"))) {
if (!box_extract_link((char *) codebase,
- content->base_url,
+ nsurl_access(content->base_url),
&params->codebase))
return false;
xmlFree(codebase);
}
if (!params->codebase)
- params->codebase = content->base_url;
+ params->codebase = strdup(nsurl_access(content->base_url));
+
+ if (!params->codebase)
+ return false;
if ((classid = xmlGetProp(n, (const xmlChar *) "classid"))) {
if (!box_extract_link((char *) classid, params->codebase,
@@ -1403,10 +1408,12 @@ bool box_object(BOX_SPECIAL_PARAMS)
return true;
/* Don't include ourself */
- if (params->classid && strcmp(content->base_url, params->classid) == 0)
+ if (params->classid && strcmp(nsurl_access(content->base_url),
+ params->classid) == 0)
return true;
- if (params->data && strcmp(content->base_url, params->data) == 0)
+ if (params->data && strcmp(nsurl_access(content->base_url),
+ params->data) == 0)
return true;
/* codetype and type are MIME types */
@@ -1658,14 +1665,17 @@ bool box_create_frameset(struct content_html_frames *f, xmlNode *n,
url = NULL;
if ((s = (char *) xmlGetProp(c,
(const xmlChar *) "src"))) {
- box_extract_link(s, content->base_url, &url);
+ box_extract_link(s,
+ nsurl_access(content->base_url),
+ &url);
xmlFree(s);
}
/* copy url */
if (url) {
/* no self-references */
- if (strcmp(content->base_url, url))
+ if (strcmp(nsurl_access(content->base_url),
+ url))
frame->url = talloc_strdup(content,
url);
free(url);
@@ -1750,7 +1760,7 @@ bool box_iframe(BOX_SPECIAL_PARAMS)
if (!(s = (char *) xmlGetProp(n,
(const xmlChar *) "src")))
return true;
- if (!box_extract_link(s, content->base_url, &url)) {
+ if (!box_extract_link(s, nsurl_access(content->base_url), &url)) {
xmlFree(s);
return false;
}
@@ -1759,7 +1769,7 @@ bool box_iframe(BOX_SPECIAL_PARAMS)
return true;
/* don't include ourself */
- if (strcmp(content->base_url, url) == 0) {
+ if (strcmp(nsurl_access(content->base_url), url) == 0) {
free(url);
return true;
}
@@ -1907,7 +1917,9 @@ bool box_input(BOX_SPECIAL_PARAMS)
n->parent == NULL) != CSS_DISPLAY_NONE) {
if ((s = (char *) xmlGetProp(n,
(const xmlChar*) "src"))) {
- res = url_join(s, content->base_url, &url);
+ res = url_join(s,
+ nsurl_access(content->base_url),
+ &url);
xmlFree(s);
/* if url is equivalent to the parent's url,
* we've got infinite inclusion. stop it here
@@ -1915,7 +1927,8 @@ bool box_input(BOX_SPECIAL_PARAMS)
*/
if (res == URL_FUNC_OK &&
strcasecmp(url,
- content->base_url) != 0) {
+ nsurl_access(
+ content->base_url)) != 0) {
if (!html_fetch_object(content, url,
box, image_types,
content->base.
@@ -2302,14 +2315,15 @@ bool box_embed(BOX_SPECIAL_PARAMS)
/* src is a URL */
if (!(src = xmlGetProp(n, (const xmlChar *) "src")))
return true;
- if (!box_extract_link((char *) src, content->base_url, &params->data))
+ if (!box_extract_link((char *) src, nsurl_access(content->base_url),
+ &params->data))
return false;
xmlFree(src);
if (!params->data)
return true;
/* Don't include ourself */
- if (strcmp(content->base_url, params->data) == 0)
+ if (strcmp(nsurl_access(content->base_url), params->data) == 0)
return true;
/* add attributes as parameters to linked list */
diff --git a/render/form.c b/render/form.c
index b47d39a22..ac5dbe9cc 100644
--- a/render/form.c
+++ b/render/form.c
@@ -1500,7 +1500,8 @@ void form_submit(hlcache_handle *h, struct browser_window *target,
url_destroy_components(&components);
- browser_window_go(target, url, content_get_url(h), true);
+ browser_window_go(target, url, nsurl_access(content_get_url(h)),
+ true);
break;
case method_POST_URLENC:
@@ -1512,13 +1513,13 @@ void form_submit(hlcache_handle *h, struct browser_window *target,
}
browser_window_go_post(target, form->action, data, 0,
- true, content_get_url(h),
+ true, nsurl_access(content_get_url(h)),
false, true, 0);
break;
case method_POST_MULTIPART:
browser_window_go_post(target, form->action, 0,
- success, true, content_get_url(h),
+ success, true, nsurl_access(content_get_url(h)),
false, true, 0);
break;
}
diff --git a/render/html.c b/render/html.c
index cb38ac2f9..0c809adfb 100644
--- a/render/html.c
+++ b/render/html.c
@@ -94,7 +94,7 @@ static bool html_process_style_element(html_content *c, unsigned int *index,
static void html_inline_style_done(struct content_css_data *css, void *pw);
static bool html_fetch_objects(html_content *c);
static bool html_replace_object(struct content_html_object *object,
- const char *url);
+ nsurl *url);
static nserror html_object_callback(hlcache_handle *object,
const hlcache_event *event, void *pw);
static void html_object_done(struct box *box, hlcache_handle *object,
@@ -233,7 +233,7 @@ nserror html_create_html_data(html_content *c, const http_parameter *params)
c->document = NULL;
c->quirks = BINDING_QUIRKS_MODE_NONE;
c->encoding = NULL;
- c->base_url = (char *) content__get_url(&c->base);
+ c->base_url = nsurl_ref(content__get_url(&c->base));
c->base_target = NULL;
c->aborted = false;
c->layout = NULL;
@@ -527,10 +527,11 @@ bool html_convert(struct content *c)
/* Make all actions absolute */
if (f->action == NULL || f->action[0] == '\0') {
/* HTML5 4.10.22.3 step 11 */
- res = url_join(content__get_url(c),
- htmlc->base_url, &action);
+ res = url_join(nsurl_access(content__get_url(c)),
+ nsurl_access(htmlc->base_url), &action);
} else {
- res = url_join(f->action, htmlc->base_url, &action);
+ res = url_join(f->action, nsurl_access(htmlc->base_url),
+ &action);
}
if (res != URL_FUNC_OK) {
@@ -749,12 +750,13 @@ bool html_head(html_content *c, xmlNode *head)
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) {
- c->base_url = talloc_strdup(c, url);
- free(url);
+ nsurl *url;
+ nserror error;
+ error = nsurl_create(href, &url);
+ if (error == NSERROR_OK) {
+ if (c->base_url != NULL)
+ nsurl_unref(c->base_url);
+ c->base_url = url;
}
xmlFree(href);
}
@@ -800,7 +802,8 @@ bool html_meta_refresh(html_content *c, xmlNode *head)
xmlChar *equiv, *content;
union content_msg_data msg_data;
char *url, *end, *refresh = NULL, quote = 0;
- url_func_result res;
+ nsurl *nsurl;
+ nserror error;
for (n = head == 0 ? 0 : head->children; n; n = n->next) {
if (n->type != XML_ELEMENT_NODE)
@@ -881,14 +884,8 @@ bool html_meta_refresh(html_content *c, xmlNode *head)
/* Just delay specified, so refresh current page */
xmlFree(content);
- c->base.refresh = talloc_strdup(c,
+ c->base.refresh = nsurl_ref(
content__get_url(&c->base));
- if (!c->base.refresh) {
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base,
- CONTENT_MSG_ERROR, msg_data);
- return false;
- }
content_broadcast(&c->base, CONTENT_MSG_REFRESH,
msg_data);
@@ -954,30 +951,17 @@ bool html_meta_refresh(html_content *c, xmlNode *head)
if (url < end)
*url = '\0';
- res = url_join(refresh, c->base_url, &refresh);
-
- xmlFree(content);
-
- if (res == URL_FUNC_NOMEM) {
+ error = nsurl_join(c->base_url, refresh, &nsurl);
+ if (error != NSERROR_OK) {
msg_data.error = messages_get("NoMemory");
content_broadcast(&c->base, CONTENT_MSG_ERROR,
msg_data);
return false;
- } else if (res == URL_FUNC_FAILED) {
- /* This isn't fatal so carry on looking */
- continue;
}
- c->base.refresh = talloc_strdup(c, refresh);
-
- free(refresh);
+ xmlFree(content);
- if (!c->base.refresh) {
- msg_data.error = messages_get("NoMemory");
- content_broadcast(&c->base, CONTENT_MSG_ERROR,
- msg_data);
- return false;
- }
+ c->base.refresh = nsurl;
content_broadcast(&c->base, CONTENT_MSG_REFRESH, msg_data);
}
@@ -1000,14 +984,19 @@ bool html_find_stylesheets(html_content *c, xmlNode *html)
{
content_type accept = CONTENT_CSS;
xmlNode *node;
- char *rel, *type, *media, *href, *url, *url2;
+ char *rel, *type, *media, *href;
unsigned int i = STYLESHEET_START;
union content_msg_data msg_data;
- url_func_result res;
struct html_stylesheet *stylesheets;
hlcache_child_context child;
nserror ns_error;
+ nsurl *html_default_css = NULL;
+ nsurl *html_quirks_css = NULL;
+ nsurl *html_adblock_css = NULL;
+
+ nsurl *joined;
+
child.charset = c->encoding;
child.quirks = c->base.quirks;
@@ -1028,7 +1017,11 @@ bool html_find_stylesheets(html_content *c, xmlNode *html)
c->base.active = 0;
- ns_error = hlcache_handle_retrieve(default_stylesheet_url, 0,
+ ns_error = nsurl_create(default_stylesheet_url, &html_default_css);
+ if (ns_error != NSERROR_OK)
+ goto no_memory;
+
+ ns_error = hlcache_handle_retrieve(html_default_css, 0,
content__get_url(&c->base), NULL,
html_convert_css_callback, c, &child, accept,
&c->stylesheets[STYLESHEET_BASE].data.external);
@@ -1038,7 +1031,12 @@ bool html_find_stylesheets(html_content *c, xmlNode *html)
c->base.active++;
if (c->quirks == BINDING_QUIRKS_MODE_FULL) {
- ns_error = hlcache_handle_retrieve(quirks_stylesheet_url, 0,
+
+ ns_error = nsurl_create(quirks_stylesheet_url, &html_quirks_css);
+ if (ns_error != NSERROR_OK)
+ goto no_memory;
+
+ ns_error = hlcache_handle_retrieve(html_quirks_css, 0,
content__get_url(&c->base), NULL,
html_convert_css_callback, c, &child, accept,
&c->stylesheets[STYLESHEET_QUIRKS].
@@ -1050,7 +1048,12 @@ bool html_find_stylesheets(html_content *c, xmlNode *html)
}
if (option_block_ads) {
- ns_error = hlcache_handle_retrieve(adblock_stylesheet_url, 0,
+
+ ns_error = nsurl_create(adblock_stylesheet_url, &html_adblock_css);
+ if (ns_error != NSERROR_OK)
+ goto no_memory;
+
+ ns_error = hlcache_handle_retrieve(html_adblock_css, 0,
content__get_url(&c->base), NULL,
html_convert_css_callback, c, &child, accept,
&c->stylesheets[STYLESHEET_ADBLOCK].
@@ -1061,6 +1064,13 @@ bool html_find_stylesheets(html_content *c, xmlNode *html)
c->base.active++;
}
+ if (html_default_css != NULL)
+ nsurl_unref(html_default_css);
+ if (html_adblock_css != NULL)
+ nsurl_unref(html_adblock_css);
+ if (html_quirks_css != NULL)
+ nsurl_unref(html_quirks_css);
+
node = html;
/* depth-first search the tree for link elements */
@@ -1128,42 +1138,35 @@ bool html_find_stylesheets(html_content *c, xmlNode *html)
* those with a title attribute) should be loaded
* (see HTML4 14.3) */
- res = url_join(href, c->base_url, &url);
+ ns_error = nsurl_join(c->base_url, href, &joined);
+ if (ns_error != NSERROR_OK) {
+ xmlFree(href);
+ goto no_memory;
+ }
xmlFree(href);
- if (res != URL_FUNC_OK)
- continue;
-
- LOG(("linked stylesheet %i '%s'", i, url));
-
- res = url_normalize(url, &url2);
-
- free(url);
- if (res != URL_FUNC_OK) {
- if (res == URL_FUNC_NOMEM)
- goto no_memory;
- continue;
- }
+ LOG(("linked stylesheet %i '%s'", i,
+ nsurl_access(joined)));
/* start fetch */
stylesheets = talloc_realloc(c,
c->stylesheets,
struct html_stylesheet, i + 1);
if (stylesheets == NULL) {
- free(url2);
+ nsurl_unref(joined);
goto no_memory;
}
c->stylesheets = stylesheets;
c->stylesheet_count++;
c->stylesheets[i].type = HTML_STYLESHEET_EXTERNAL;
- ns_error = hlcache_handle_retrieve(url2, 0,
+ ns_error = hlcache_handle_retrieve(joined, 0,
content__get_url(&c->base), NULL,
html_convert_css_callback, c, &child,
accept,
&c->stylesheets[i].data.external);
- free(url2);
+ nsurl_unref(joined);
if (ns_error != NSERROR_OK)
goto no_memory;
@@ -1182,6 +1185,13 @@ bool html_find_stylesheets(html_content *c, xmlNode *html)
return true;
no_memory:
+ if (html_default_css != NULL)
+ nsurl_unref(html_default_css);
+ if (html_adblock_css != NULL)
+ nsurl_unref(html_adblock_css);
+ if (html_quirks_css != NULL)
+ nsurl_unref(html_quirks_css);
+
msg_data.error = messages_get("NoMemory");
content_broadcast(&c->base, CONTENT_MSG_ERROR, msg_data);
return false;
@@ -1247,7 +1257,7 @@ bool html_process_style_element(html_content *c, unsigned int *index,
}
error = nscss_create_css_data(sheet,
- c->base_url, NULL, c->quirks,
+ nsurl_access(c->base_url), NULL, c->quirks,
html_inline_style_done, c);
if (error != NSERROR_OK) {
c->stylesheet_count--;
@@ -1338,13 +1348,14 @@ nserror html_convert_css_callback(hlcache_handle *css,
break;
case CONTENT_MSG_DONE:
- LOG(("got stylesheet '%s'", content_get_url(css)));
+ LOG(("got stylesheet '%s'", nsurl_access(content_get_url(css))));
parent->base.active--;
break;
case CONTENT_MSG_ERROR:
- LOG(("stylesheet %s failed: %s",
- content_get_url(css), event->data.error));
+ LOG(("stylesheet %s failed: %s",
+ nsurl_access(content_get_url(css)),
+ event->data.error));
hlcache_handle_release(css);
s->data.external = NULL;
parent->base.active--;
@@ -1387,24 +1398,23 @@ bool html_fetch_object(html_content *c, const char *url, struct box *box,
bool background)
{
struct content_html_object *object;
+ nserror error;
+ nsurl *object_url;
struct content_html_object *ins_object; /* the object to insert after */
- char *url2;
- url_func_result res;
/* If we've already been aborted, don't bother attempting the fetch */
if (c->aborted)
return true;
- /* Normalize the URL */
- res = url_normalize(url, &url2);
- if (res != URL_FUNC_OK) {
+ error = nsurl_create(url, &object_url);
+ if (error != NSERROR_OK) {
LOG(("failed to normalize url '%s'", url));
- return res != URL_FUNC_NOMEM;
+ return false;
}
object = talloc(c, struct content_html_object);
if (object == NULL) {
- free(url2);
+ nsurl_unref(object_url);
return false;
}
@@ -1414,7 +1424,7 @@ bool html_fetch_object(html_content *c, const char *url, struct box *box,
object->box = box;
object->permitted_types = permitted_types;
object->background = background;
- object->url = url2;
+ object->url = object_url;
/* add to content object list, this list determines fetch order */
if (c->object_list == NULL) {
@@ -1451,11 +1461,13 @@ bool html_fetch_objects(html_content *c)
child.quirks = c->base.quirks;
for (object = c->object_list; object != NULL; object = object->next) {
+
error = hlcache_handle_retrieve(object->url,
HLCACHE_RETRIEVE_SNIFF_TYPE,
content__get_url(&c->base), NULL,
html_object_callback, object, &child,
object->permitted_types, &object->content);
+
if (error == NSERROR_OK)
c->base.active++;
}
@@ -1472,13 +1484,11 @@ bool html_fetch_objects(html_content *c)
* \return true on success, false on memory exhaustion
*/
-bool html_replace_object(struct content_html_object *object, const char *url)
+bool html_replace_object(struct content_html_object *object, nsurl *url)
{
html_content *c;
hlcache_child_context child;
html_content *page;
- char *url2;
- url_func_result res;
nserror error;
assert(object != NULL);
@@ -1499,19 +1509,13 @@ bool html_replace_object(struct content_html_object *object, const char *url)
object->box->object = NULL;
}
- res = url_normalize(url, &url2);
- if (res != URL_FUNC_OK)
- return res != URL_FUNC_NOMEM;
-
/* initialise fetch */
- error = hlcache_handle_retrieve(url2, HLCACHE_RETRIEVE_SNIFF_TYPE,
+ error = hlcache_handle_retrieve(url, HLCACHE_RETRIEVE_SNIFF_TYPE,
content__get_url(&c->base), NULL,
html_object_callback, object, &child,
object->permitted_types,
&object->content);
- free(url2);
-
if (error != NSERROR_OK)
return false;
@@ -1737,7 +1741,7 @@ void html_object_failed(struct box *box, html_content *content,
void html_object_refresh(void *p)
{
struct content_html_object *object = p;
- const char *refresh_url;
+ nsurl *refresh_url;
assert(content_get_type(object->content) == CONTENT_HTML);
@@ -1909,6 +1913,12 @@ void html_destroy(struct content *c)
imagemap_destroy(html);
+ if (c->refresh)
+ nsurl_unref(c->refresh);
+
+ if (html->base_url)
+ nsurl_unref(html->base_url);
+
if (html->parser_binding != NULL)
binding_destroy_tree(html->parser_binding);
@@ -1972,7 +1982,7 @@ void html_destroy_objects(html_content *html)
hlcache_handle_release(victim->content);
}
- free(victim->url);
+ nsurl_unref(victim->url);
html->object_list = victim->next;
talloc_free(victim);
@@ -2352,7 +2362,7 @@ struct content_html_iframe *html_get_iframe(hlcache_handle *h)
* \param h Content to retrieve base target from
* \return Pointer to URL
*/
-const char *html_get_base_url(hlcache_handle *h)
+nsurl *html_get_base_url(hlcache_handle *h)
{
html_content *c = (html_content *) hlcache_handle_get_content(h);
diff --git a/render/html.h b/render/html.h
index 1c530ec51..4d4c8cefd 100644
--- a/render/html.h
+++ b/render/html.h
@@ -78,7 +78,7 @@ struct content_html_object {
struct content *parent; /**< Parent document */
struct content_html_object *next; /**< Next in chain */
- char *url; /**< URL of content */
+ nsurl *url; /**< URL of content */
struct hlcache_handle *content; /**< Content, or 0. */
struct box *box; /**< Node in box tree containing it. */
/** Bitmap of acceptable content types */
@@ -168,7 +168,7 @@ const char *html_get_encoding(struct hlcache_handle *h);
binding_encoding_source html_get_encoding_source(struct hlcache_handle *h);
struct content_html_frames *html_get_frameset(struct hlcache_handle *h);
struct content_html_iframe *html_get_iframe(struct hlcache_handle *h);
-const char *html_get_base_url(struct hlcache_handle *h);
+nsurl *html_get_base_url(struct hlcache_handle *h);
const char *html_get_base_target(struct hlcache_handle *h);
struct html_stylesheet *html_get_stylesheets(struct hlcache_handle *h,
unsigned int *n);
diff --git a/render/html_interaction.c b/render/html_interaction.c
index 51e251698..abe7d20f3 100644
--- a/render/html_interaction.c
+++ b/render/html_interaction.c
@@ -554,7 +554,8 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
mouse & BROWSER_MOUSE_MOD_1) {
/* force download of link */
browser_window_go_post(bw, url, 0, 0, false,
- content_get_url(h), true, true, 0);
+ nsurl_access(content_get_url(h)),
+ true, true, 0);
} else if (mouse & BROWSER_MOUSE_CLICK_2 &&
mouse & BROWSER_MOUSE_MOD_1) {
gui_window_save_link(bw->window, url, title);
@@ -689,7 +690,7 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
break;
case ACTION_GO:
browser_window_go(browser_window_find_target(bw, target, mouse),
- url, content_get_url(h), true);
+ url, nsurl_access(content_get_url(h)), true);
break;
case ACTION_NONE:
break;
diff --git a/render/html_internal.h b/render/html_internal.h
index 5856962de..0c0b5fee5 100644
--- a/render/html_internal.h
+++ b/render/html_internal.h
@@ -44,7 +44,7 @@ typedef struct html_content {
binding_encoding_source encoding_source;
/** Base URL (may be a copy of content->url). */
- char *base_url;
+ nsurl *base_url;
/** Base target */
char *base_target;
diff --git a/render/imagemap.c b/render/imagemap.c
index 7632b458c..87002fd3d 100644
--- a/render/imagemap.c
+++ b/render/imagemap.c
@@ -77,7 +77,7 @@ static bool imagemap_add(html_content *c, const char *key,
static bool imagemap_create(html_content *c);
static bool imagemap_extract_map(xmlNode *node, html_content *c,
struct mapentry **entry);
-static bool imagemap_addtolist(xmlNode *n, char *base_url,
+static bool imagemap_addtolist(xmlNode *n, const char *base_url,
struct mapentry **entry);
static void imagemap_freelist(struct mapentry *list);
static unsigned int imagemap_hash(const char *key);
@@ -316,7 +316,7 @@ bool imagemap_extract_map(xmlNode *node, html_content *c,
*/
if (strcmp((const char *) node->name, "area") == 0 ||
strcmp((const char *) node->name, "a") == 0) {
- if (imagemap_addtolist(node, c->base_url,
+ if (imagemap_addtolist(node, nsurl_access(c->base_url),
entry) == false)
return false;
}
@@ -341,7 +341,8 @@ bool imagemap_extract_map(xmlNode *node, html_content *c,
* \param entry Pointer to list of entries
* \return false on memory exhaustion, true otherwise
*/
-bool imagemap_addtolist(xmlNode *n, char *base_url, struct mapentry **entry)
+bool imagemap_addtolist(xmlNode *n, const char *base_url,
+ struct mapentry **entry)
{
char *shape, *coords = NULL, *href, *target = NULL;
struct mapentry *new_map, *temp;