mirror of
https://github.com/rkd77/elinks.git
synced 2024-12-04 14:46:47 -05:00
e27596c5dc
|callback| will be applied to the cache object when the download of |uri| completes.
106 lines
2.1 KiB
C
106 lines
2.1 KiB
C
/* ECMAScript browser scripting module */
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include "elinks.h"
|
|
|
|
#include "ecmascript/spidermonkey/util.h"
|
|
#include "network/connection.h"
|
|
#include "protocol/uri.h"
|
|
#include "scripting/smjs/core.h"
|
|
#include "scripting/smjs/cache_object.h"
|
|
#include "scripting/smjs/elinks_object.h"
|
|
#include "session/download.h"
|
|
|
|
|
|
struct smjs_load_uri_hop {
|
|
struct session *ses;
|
|
JSFunction *callback;
|
|
};
|
|
|
|
static void
|
|
smjs_loading_callback(struct download *download, void *data)
|
|
{
|
|
struct session *saved_smjs_ses = smjs_ses;
|
|
struct smjs_load_uri_hop *hop = data;
|
|
jsval args[1], rval;
|
|
JSObject *cache_entry_object;
|
|
|
|
if (is_in_progress_state(download->state)) return;
|
|
|
|
if (!download->cached) goto end;
|
|
|
|
assert(hop->callback);
|
|
|
|
smjs_ses = hop->ses;
|
|
|
|
cache_entry_object = smjs_get_cache_entry_object(download->cached);
|
|
if (!cache_entry_object) goto end;
|
|
|
|
args[0] = OBJECT_TO_JSVAL(cache_entry_object);
|
|
|
|
JS_CallFunction(smjs_ctx, NULL, hop->callback, 1, args, &rval);
|
|
|
|
end:
|
|
mem_free(download->data);
|
|
mem_free(download);
|
|
|
|
smjs_ses = saved_smjs_ses;
|
|
}
|
|
|
|
static JSBool
|
|
smjs_load_uri(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv,
|
|
jsval *rval)
|
|
{
|
|
struct smjs_load_uri_hop *hop;
|
|
struct download *download;
|
|
JSString *jsstr;
|
|
unsigned char *uri_string;
|
|
struct uri *uri;
|
|
|
|
if (argc < 2) return JS_FALSE;
|
|
|
|
jsstr = JS_ValueToString(smjs_ctx, argv[0]);
|
|
uri_string = JS_GetStringBytes(jsstr);
|
|
|
|
uri = get_uri(uri_string, 0);
|
|
if (!uri) return JS_FALSE;
|
|
|
|
download = mem_alloc(sizeof(*download));
|
|
if (!download) {
|
|
done_uri(uri);
|
|
return JS_FALSE;
|
|
}
|
|
|
|
hop = mem_alloc(sizeof(*hop));
|
|
if (!hop) {
|
|
done_uri(uri);
|
|
mem_free(download);
|
|
return JS_FALSE;
|
|
}
|
|
|
|
hop->callback = JS_ValueToFunction(smjs_ctx, argv[1]);
|
|
hop->ses = smjs_ses;
|
|
|
|
download->data = hop;
|
|
download->callback = (download_callback_T *) smjs_loading_callback;
|
|
|
|
load_uri(uri, NULL, download, PRI_MAIN, CACHE_MODE_NORMAL, -1);
|
|
|
|
done_uri(uri);
|
|
|
|
return JS_TRUE;
|
|
}
|
|
|
|
void
|
|
smjs_init_load_uri_interface(void)
|
|
{
|
|
if (!smjs_ctx || !smjs_elinks_object)
|
|
return;
|
|
|
|
JS_DefineFunction(smjs_ctx, smjs_elinks_object, "load_uri",
|
|
&smjs_load_uri, 2, 0);
|
|
}
|