summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/content.c5
-rw-r--r--content/content.h6
-rw-r--r--content/hlcache.c11
-rw-r--r--content/llcache.c15
-rw-r--r--content/llcache.h6
-rw-r--r--desktop/browser.c5
-rw-r--r--desktop/download.c3
-rw-r--r--render/html_css.c3
-rw-r--r--render/html_object.c1
9 files changed, 53 insertions, 2 deletions
diff --git a/content/content.c b/content/content.c
index 9bf4312ef..1825bdf10 100644
--- a/content/content.c
+++ b/content/content.c
@@ -188,6 +188,11 @@ nserror content_llcache_callback(llcache_handle *llcache,
msg_data.explicit_status_text = NULL;
content_broadcast(c, CONTENT_MSG_STATUS, msg_data);
break;
+ case LLCACHE_EVENT_REDIRECT:
+ msg_data.redirect.from = event->data.redirect.from;
+ msg_data.redirect.to = event->data.redirect.to;
+ content_broadcast(c, CONTENT_MSG_REDIRECT, msg_data);
+ break;
}
return error;
diff --git a/content/content.h b/content/content.h
index 3e5588815..467fa6055 100644
--- a/content/content.h
+++ b/content/content.h
@@ -69,6 +69,7 @@ typedef enum {
CONTENT_MSG_DONE, /**< finished */
CONTENT_MSG_ERROR, /**< error occurred */
CONTENT_MSG_ERRORCODE, /**< error occurred return nserror */
+ CONTENT_MSG_REDIRECT, /**< fetch url redirect occured */
CONTENT_MSG_STATUS, /**< new status string */
CONTENT_MSG_REFORMAT, /**< content_reformat done */
CONTENT_MSG_REDRAW, /**< needs redraw (eg. new animation frame) */
@@ -103,6 +104,11 @@ union content_msg_data {
const char *error;
/** CONTENT_MSG_ERRORCODE - Error code */
nserror errorcode;
+ /** CONTENT_MSG_REDIRECT - Redirect info */
+ struct {
+ nsurl *from; /**< Redirect origin */
+ nsurl *to; /**< Redirect target */
+ } redirect; /**< Fetch URL redirect occured */
/** CONTENT_MSG_REDRAW - Area of content which needs redrawing */
struct {
int x, y, width, height;
diff --git a/content/hlcache.c b/content/hlcache.c
index e99f238ad..6c84d1671 100644
--- a/content/hlcache.c
+++ b/content/hlcache.c
@@ -593,6 +593,17 @@ nserror hlcache_llcache_callback(llcache_handle *handle,
break;
case LLCACHE_EVENT_PROGRESS:
break;
+ case LLCACHE_EVENT_REDIRECT:
+ if (ctx->handle->cb != NULL) {
+ hlcache_event hlevent;
+
+ hlevent.type = CONTENT_MSG_REDIRECT;
+ hlevent.data.redirect.from = event->data.redirect.from;
+ hlevent.data.redirect.to = event->data.redirect.to;
+
+ ctx->handle->cb(ctx->handle, &hlevent, ctx->handle->pw);
+ }
+ break;
}
return NSERROR_OK;
diff --git a/content/llcache.c b/content/llcache.c
index 938f1e8f6..f2e519f49 100644
--- a/content/llcache.c
+++ b/content/llcache.c
@@ -1224,6 +1224,7 @@ static nserror llcache_fetch_redirect(llcache_object *object, const char *target
bool match;
/* Extract HTTP response code from the fetch object */
long http_code = fetch_http_code(object->fetch.fetch);
+ llcache_event event;
/* Abort fetch for this object */
fetch_abort(object->fetch.fetch);
@@ -1238,8 +1239,6 @@ static nserror llcache_fetch_redirect(llcache_object *object, const char *target
/* Forcibly stop redirecting if we've followed too many redirects */
#define REDIRECT_LIMIT 10
if (object->fetch.redirect_count > REDIRECT_LIMIT) {
- llcache_event event;
-
LOG(("Too many nested redirects"));
event.type = LLCACHE_EVENT_ERROR;
@@ -1254,6 +1253,18 @@ static nserror llcache_fetch_redirect(llcache_object *object, const char *target
if (error != NSERROR_OK)
return error;
+ /* Inform users of redirect */
+ event.type = LLCACHE_EVENT_REDIRECT;
+ event.data.redirect.from = object->url;
+ event.data.redirect.to = url;
+
+ error = llcache_send_event_to_users(object, &event);
+
+ if (error != NSERROR_OK) {
+ nsurl_unref(url);
+ return error;
+ }
+
/* Reject attempts to redirect from unvalidated to validated schemes
* A "validated" scheme is one over which we have some guarantee that
* the source is trustworthy. */
diff --git a/content/llcache.h b/content/llcache.h
index b596310e9..3d8232cae 100644
--- a/content/llcache.h
+++ b/content/llcache.h
@@ -56,6 +56,8 @@ typedef enum {
LLCACHE_EVENT_ERROR, /**< An error occurred during fetch */
LLCACHE_EVENT_PROGRESS, /**< Fetch progress update */
+
+ LLCACHE_EVENT_REDIRECT /**< Fetch URL redirect occured */
} llcache_event_type;
/** Low-level cache events */
@@ -67,6 +69,10 @@ typedef struct {
size_t len; /**< Length of buffer, in bytes */
} data; /**< Received data */
const char *msg; /**< Error or progress message */
+ struct {
+ nsurl *from; /**< Redirect origin */
+ nsurl *to; /**< Redirect target */
+ } redirect; /**< Fetch URL redirect occured */
} data; /**< Event data */
} llcache_event;
diff --git a/desktop/browser.c b/desktop/browser.c
index ac8c6991c..2693a1871 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -1355,6 +1355,11 @@ nserror browser_window_callback(hlcache_handle *c,
browser_window_stop_throbber(bw);
break;
+ case CONTENT_MSG_REDIRECT:
+ if (urldb_add_url(event->data.redirect.from))
+ urldb_update_url_visit_data(event->data.redirect.from);
+ break;
+
case CONTENT_MSG_STATUS:
if (event->data.explicit_status_text == NULL) {
/* Object content's status text updated */
diff --git a/desktop/download.c b/desktop/download.c
index f4bedc8e9..b775eb18e 100644
--- a/desktop/download.c
+++ b/desktop/download.c
@@ -238,6 +238,9 @@ static nserror download_callback(llcache_handle *handle,
case LLCACHE_EVENT_PROGRESS:
break;
+
+ case LLCACHE_EVENT_REDIRECT:
+ break;
}
return error;
diff --git a/render/html_css.c b/render/html_css.c
index 7c0962070..a5c63554f 100644
--- a/render/html_css.c
+++ b/render/html_css.c
@@ -103,6 +103,9 @@ html_convert_css_callback(hlcache_handle *css,
case CONTENT_MSG_READY:
break;
+ case CONTENT_MSG_REDIRECT:
+ break;
+
case CONTENT_MSG_DONE:
LOG(("done stylesheet slot %d '%s'", i,
nsurl_access(hlcache_handle_get_url(css))));
diff --git a/render/html_object.c b/render/html_object.c
index d4d0ff9d2..b8f95dbab 100644
--- a/render/html_object.c
+++ b/render/html_object.c
@@ -203,6 +203,7 @@ html_object_callback(hlcache_handle *object,
break;
case CONTENT_MSG_REFORMAT:
+ case CONTENT_MSG_REDIRECT:
break;
case CONTENT_MSG_REDRAW: