From ca24054cc6920b475d56280abcb306f44d256bd2 Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Mon, 12 Oct 2020 18:43:56 +0200 Subject: [PATCH] [mozjs31] scripting smjs It was not heavily tested. --- src/scripting/smjs/action_object.c | 66 +- src/scripting/smjs/bookmarks.c | 203 ++--- src/scripting/smjs/cache_object.c | 211 +++--- src/scripting/smjs/core.c | 25 +- src/scripting/smjs/elinks_object.c | 214 +++--- src/scripting/smjs/elinks_object.h | 3 +- src/scripting/smjs/global_object.c | 2 +- src/scripting/smjs/globhist.c | 236 +++--- src/scripting/smjs/hooks.c | 27 +- src/scripting/smjs/keybinding.c | 108 +-- src/scripting/smjs/load_uri.c | 45 +- src/scripting/smjs/session_object.c | 976 +++++++++++++++++++++---- src/scripting/smjs/terminal_object.c | 59 +- src/scripting/smjs/view_state_object.c | 94 +-- 14 files changed, 1492 insertions(+), 777 deletions(-) diff --git a/src/scripting/smjs/action_object.c b/src/scripting/smjs/action_object.c index 219e46b4..5af6a213 100644 --- a/src/scripting/smjs/action_object.c +++ b/src/scripting/smjs/action_object.c @@ -24,7 +24,7 @@ struct smjs_action_fn_callback_hop { }; static void smjs_action_fn_finalize(JSFreeOp *op, JSObject *obj); -static JSBool smjs_action_fn_callback(JSContext *ctx, unsigned int argc, jsval *rval); +static bool smjs_action_fn_callback(JSContext *ctx, unsigned int argc, jsval *rval); static const JSClass action_fn_class = { "action_fn", @@ -57,31 +57,31 @@ smjs_action_fn_finalize(JSFreeOp *op, JSObject *obj) } /* @action_fn_class.call */ -static JSBool +static bool smjs_action_fn_callback(JSContext *ctx, unsigned int argc, jsval *rval) { jsval value; - jsval *argv = JS_ARGV(ctx, rval); + JS::CallArgs args = CallArgsFromVp(argc, rval); + struct smjs_action_fn_callback_hop *hop; - JSObject *fn_obj; + JS::RootedObject fn_obj(ctx); assert(smjs_ctx); - if_assert_failed return JS_FALSE; + if_assert_failed return false; - value = JSVAL_FALSE; - - if (JS_TRUE != JS_ValueToObject(ctx, JS_CALLEE(ctx, rval), &fn_obj)) { - JS_SET_RVAL(ctx, rval, value); - return JS_TRUE; +// if (true != JS_ValueToObject(ctx, JS_CALLEE(ctx, rval), &fn_obj)) { + if (true != JS_ValueToObject(ctx, args[0], &fn_obj)) { + args.rval().setBoolean(false); + return true; } assert(JS_InstanceOf(ctx, fn_obj, (JSClass *) &action_fn_class, NULL)); - if_assert_failed return JS_FALSE; + if_assert_failed return false; hop = JS_GetInstancePrivate(ctx, fn_obj, (JSClass *) &action_fn_class, NULL); if (!hop) { - JS_SET_RVAL(ctx, rval, value); - return JS_TRUE; + args.rval().setBoolean(false); + return true; } if (!would_window_receive_keypresses(hop->ses->tab)) { @@ -107,23 +107,21 @@ smjs_action_fn_callback(JSContext *ctx, unsigned int argc, jsval *rval) JS_ReportError(ctx, "%s", _("Cannot run actions in a tab that doesn't " "have the focus", hop->ses->tab->term)); - return JS_FALSE; /* make JS propagate the exception */ + return false; /* make JS propagate the exception */ } if (argc >= 1) { int32_t val; - if (JS_TRUE == JS_ValueToInt32(smjs_ctx, argv[0], &val)) { + if (true == JS::ToInt32(smjs_ctx, args[0], &val)) { set_kbd_repeat_count(hop->ses, val); } } do_action(hop->ses, hop->action_id, 1); + args.rval().setBoolean(true); - value = JSVAL_TRUE; - JS_SET_RVAL(ctx, rval, value); - - return JS_TRUE; + return true; } @@ -136,7 +134,7 @@ smjs_get_action_fn_object(unsigned char *action_str) if (!smjs_ses) return NULL; - obj = JS_NewObject(smjs_ctx, (JSClass *) &action_fn_class, NULL, NULL); + obj = JS_NewObject(smjs_ctx, (JSClass *) &action_fn_class, JS::NullPtr(), JS::NullPtr()); if (!obj) return NULL; hop = mem_alloc(sizeof(*hop)); @@ -164,29 +162,28 @@ smjs_get_action_fn_object(unsigned char *action_str) /*** elinks.action object ***/ /* @action_class.getProperty */ -static JSBool +static bool action_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); - (void)obj; jsval val; + JS::RootedValue rval(ctx, val); JSObject *action_fn; unsigned char *action_str; - *vp = JSVAL_NULL; + hvp.setNull(); - JS_IdToValue(ctx, id, &val); - action_str = JS_EncodeString(ctx, JS_ValueToString(ctx, val)); - if (!action_str) return JS_TRUE; + JS_IdToValue(ctx, id, &rval); + action_str = JS_EncodeString(ctx, JS::ToString(ctx, rval)); + if (!action_str) return true; action_fn = smjs_get_action_fn_object(action_str); - if (!action_fn) return JS_TRUE; + if (!action_fn) return true; - *vp = OBJECT_TO_JSVAL(action_fn); + hvp.setObject(*action_fn); - return JS_TRUE; + return true; } static const JSClass action_class = { @@ -204,7 +201,7 @@ smjs_get_action_object(void) assert(smjs_ctx); - obj = JS_NewObject(smjs_ctx, (JSClass *) &action_class, NULL, NULL); + obj = JS_NewObject(smjs_ctx, (JSClass *) &action_class, JS::NullPtr(), JS::NullPtr()); return obj; } @@ -221,7 +218,10 @@ smjs_init_action_interface(void) action_object = smjs_get_action_object(); if (!action_object) return; - val = OBJECT_TO_JSVAL(action_object); + JS::RootedObject r_smjs_elinks_object(smjs_ctx, smjs_elinks_object); - JS_SetProperty(smjs_ctx, smjs_elinks_object, "action", &val); + JS::RootedValue r_val(smjs_ctx, val); + r_val.setObject(*r_smjs_elinks_object); + + JS_SetProperty(smjs_ctx, r_smjs_elinks_object, "action", r_val); } diff --git a/src/scripting/smjs/bookmarks.c b/src/scripting/smjs/bookmarks.c index c1e0087c..8d1d3f43 100644 --- a/src/scripting/smjs/bookmarks.c +++ b/src/scripting/smjs/bookmarks.c @@ -18,7 +18,7 @@ /*** common code ***/ static void bookmark_finalize(JSFreeOp *op, JSObject *obj); -static JSBool bookmark_folder_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); +static bool bookmark_folder_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); static const JSClass bookmark_class = { "bookmark", @@ -44,7 +44,7 @@ smjs_get_bookmark_generic_object(struct bookmark *bookmark, JSClass *clasp) assert(clasp == &bookmark_class || clasp == &bookmark_folder_class); if_assert_failed return NULL; - jsobj = JS_NewObject(smjs_ctx, clasp, NULL, NULL); + jsobj = JS_NewObject(smjs_ctx, clasp, JS::NullPtr(), JS::NullPtr()); if (!jsobj) return NULL; if (!bookmark) return jsobj; @@ -84,16 +84,16 @@ enum bookmark_prop { BOOKMARK_CHILDREN = -3, }; -static JSBool bookmark_get_property_title(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool bookmark_set_property_title(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp); -static JSBool bookmark_get_property_url(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool bookmark_set_property_url(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp); -static JSBool bookmark_get_property_children(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); +static bool bookmark_get_property_title(JSContext *ctx, unsigned int argc, jsval *vp); +static bool bookmark_set_property_title(JSContext *ctx, unsigned int argc, jsval *vp); +static bool bookmark_get_property_url(JSContext *ctx, unsigned int argc, jsval *vp); +static bool bookmark_set_property_url(JSContext *ctx, unsigned int argc, jsval *vp); +static bool bookmark_get_property_children(JSContext *ctx, unsigned int argc, jsval *vp); static const JSPropertySpec bookmark_props[] = { - { "title", 0, JSPROP_ENUMERATE, JSOP_WRAPPER(bookmark_get_property_title), JSOP_WRAPPER(bookmark_set_property_title) }, - { "url", 0, JSPROP_ENUMERATE, JSOP_WRAPPER(bookmark_get_property_url), JSOP_WRAPPER(bookmark_set_property_url) }, - { "children", 0, JSPROP_ENUMERATE | JSPROP_READONLY, JSOP_WRAPPER(bookmark_get_property_children), JSOP_NULLWRAPPER }, + JS_PSGS("title", bookmark_get_property_title, bookmark_set_property_title, JSPROP_ENUMERATE), + JS_PSGS( "url", bookmark_get_property_url, bookmark_set_property_url, JSPROP_ENUMERATE), + JS_PSG("children", bookmark_get_property_children, JSPROP_ENUMERATE), { NULL } }; @@ -101,17 +101,17 @@ static JSObject *smjs_get_bookmark_folder_object(struct bookmark *bookmark); /** Convert a string retrieved from struct bookmark to a jsval. * - * @return JS_TRUE if successful. On error, report the error and - * return JS_FALSE. */ -static JSBool + * @return true if successful. On error, report the error and + * return false. */ +static bool bookmark_string_to_jsval(JSContext *ctx, const unsigned char *str, jsval *vp) { JSString *jsstr = utf8_to_jsstring(ctx, str, -1); if (jsstr == NULL) - return JS_FALSE; + return false; *vp = STRING_TO_JSVAL(jsstr); - return JS_TRUE; + return true; } /** Convert a jsval to a string and store it in struct bookmark. @@ -124,72 +124,61 @@ bookmark_string_to_jsval(JSContext *ctx, const unsigned char *str, jsval *vp) * A string allocated with mem_alloc(). * On success, this function frees the original string, if any. * - * @return JS_TRUE if successful. On error, report the error to - * SpiderMonkey and return JS_FALSE. */ -static JSBool -jsval_to_bookmark_string(JSContext *ctx, jsval val, unsigned char **result) + * @return true if successful. On error, report the error to + * SpiderMonkey and return false. */ +static bool +jsval_to_bookmark_string(JSContext *ctx, JS::HandleValue val, unsigned char **result) { - JSString *jsstr = NULL; unsigned char *str; - /* JS_ValueToString constructs a new string if val is not - * already a string. Protect the new string from the garbage - * collector, which jsstring_to_utf8() may trigger. - * - * Actually, SpiderMonkey 1.8.5 does not require this - * JS_AddNamedStringRoot call because it conservatively scans - * the C stack for GC roots. Do the call anyway, because: - * 1. Omitting the call would require somehow ensuring that the - * C compiler won't reuse the stack location too early. - * (See template class js::Anchor in .) - * 2. Later versions of SpiderMonkey are switching back to - * precise GC rooting, with a C++-only API. - * 3. jsval_to_bookmark_string() does not seem speed-critical. */ - if (!JS_AddNamedStringRoot(ctx, &jsstr, "jsval_to_bookmark_string")) - return JS_FALSE; + JSString *jsstr = JS::ToString(ctx, val); - jsstr = JS_ValueToString(ctx, val); if (jsstr == NULL) { - JS_RemoveStringRoot(ctx, &jsstr); - return JS_FALSE; + return false; } str = jsstring_to_utf8(ctx, jsstr, NULL); if (str == NULL) { - JS_RemoveStringRoot(ctx, &jsstr); - return JS_FALSE; + return false; } - JS_RemoveStringRoot(ctx, &jsstr); mem_free_set(result, str); - return JS_TRUE; + return true; } -static JSBool -bookmark_get_property_title(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) +static bool +bookmark_get_property_title(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct bookmark *bookmark; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &bookmark_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &bookmark_class, NULL)) + return false; - bookmark = JS_GetInstancePrivate(ctx, obj, + bookmark = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &bookmark_class, NULL); - if (!bookmark) return JS_FALSE; + if (!bookmark) return false; - return bookmark_string_to_jsval(ctx, bookmark->title, vp); + JSString *jsstr = utf8_to_jsstring(ctx, bookmark->title, -1); + + if (!jsstr) { + return false; + } + args.rval().setString(jsstr); + return true; } -static JSBool -bookmark_set_property_title(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp) +static bool +bookmark_set_property_title(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct bookmark *bookmark; unsigned char *title = NULL; @@ -199,48 +188,56 @@ bookmark_set_property_title(JSContext *ctx, JS::HandleObject hobj, JS::HandleId /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &bookmark_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &bookmark_class, NULL)) + return false; - bookmark = JS_GetInstancePrivate(ctx, obj, + bookmark = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &bookmark_class, NULL); - if (!bookmark) return JS_FALSE; + if (!bookmark) return false; - if (!jsval_to_bookmark_string(ctx, *vp, &title)) - return JS_FALSE; + if (!jsval_to_bookmark_string(ctx, args[0], &title)) + return false; ok = update_bookmark(bookmark, get_cp_index("UTF-8"), title, url); mem_free_if(title); mem_free_if(url); - return ok ? JS_TRUE : JS_FALSE; + return ok ? true : false; } -static JSBool -bookmark_get_property_url(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) +static bool +bookmark_get_property_url(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct bookmark *bookmark; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &bookmark_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &bookmark_class, NULL)) + return false; - bookmark = JS_GetInstancePrivate(ctx, obj, + bookmark = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &bookmark_class, NULL); - if (!bookmark) return JS_FALSE; + if (!bookmark) return false; - return bookmark_string_to_jsval(ctx, bookmark->url, vp); + JSString *jsstr = utf8_to_jsstring(ctx, bookmark->url, -1); + + if (!jsstr) { + return false; + } + args.rval().setString(jsstr); + return true; } -static JSBool -bookmark_set_property_url(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp) +static bool +bookmark_set_property_url(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct bookmark *bookmark; unsigned char *title = NULL; @@ -250,44 +247,45 @@ bookmark_set_property_url(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hi /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &bookmark_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &bookmark_class, NULL)) + return false; - bookmark = JS_GetInstancePrivate(ctx, obj, + bookmark = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &bookmark_class, NULL); - if (!bookmark) return JS_FALSE; + if (!bookmark) return false; - if (!jsval_to_bookmark_string(ctx, *vp, &url)) - return JS_FALSE; + if (!jsval_to_bookmark_string(ctx, args[0], &url)) + return false; ok = update_bookmark(bookmark, get_cp_index("UTF-8"), title, url); mem_free_if(title); mem_free_if(url); - return ok ? JS_TRUE : JS_FALSE; + return ok ? true : false; } -static JSBool -bookmark_get_property_children(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) +static bool +bookmark_get_property_children(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct bookmark *bookmark; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &bookmark_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &bookmark_class, NULL)) + return false; - bookmark = JS_GetInstancePrivate(ctx, obj, + bookmark = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &bookmark_class, NULL); - if (!bookmark) return JS_FALSE; + if (!bookmark) return false; - *vp = OBJECT_TO_JSVAL(smjs_get_bookmark_folder_object(bookmark)); + args.rval().setObject(*smjs_get_bookmark_folder_object(bookmark)); - return JS_TRUE; + return true; } @@ -299,8 +297,9 @@ smjs_get_bookmark_object(struct bookmark *bookmark) jsobj = smjs_get_bookmark_generic_object(bookmark, (JSClass *) &bookmark_class); + JS::RootedObject r_jsobj(smjs_ctx, jsobj); if (jsobj - && JS_TRUE == JS_DefineProperties(smjs_ctx, jsobj, + && true == JS_DefineProperties(smjs_ctx, r_jsobj, (JSPropertySpec *) bookmark_props)) return jsobj; @@ -311,41 +310,41 @@ smjs_get_bookmark_object(struct bookmark *bookmark) /*** bookmark folder object ***/ /* @bookmark_folder_class.getProperty */ -static JSBool +static bool bookmark_folder_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); struct bookmark *bookmark; struct bookmark *folder; - jsval title_jsval = JSVAL_VOID; + jsval val; + JS::RootedValue title_jsval(ctx, val); unsigned char *title = NULL; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &bookmark_folder_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &bookmark_folder_class, NULL)) + return false; - folder = JS_GetInstancePrivate(ctx, obj, + folder = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &bookmark_folder_class, NULL); - *vp = JSVAL_NULL; + hvp.setNull(); if (!JS_IdToValue(ctx, id, &title_jsval)) - return JS_FALSE; + return false; if (!jsval_to_bookmark_string(ctx, title_jsval, &title)) - return JS_FALSE; + return false; bookmark = get_bookmark_by_name(folder, title); if (bookmark) { - *vp = OBJECT_TO_JSVAL(smjs_get_bookmark_object(bookmark)); + hvp.setObject(*smjs_get_bookmark_object(bookmark)); } mem_free(title); - return JS_TRUE; + return true; } @@ -368,7 +367,9 @@ smjs_init_bookmarks_interface(void) bookmarks_object = smjs_get_bookmark_folder_object(NULL); if (!bookmarks_object) return; - val = OBJECT_TO_JSVAL(bookmarks_object); + JS::RootedValue rval(smjs_ctx, val); + rval.setObject(*bookmarks_object); + JS::RootedObject r_smjs_elinks_object(smjs_ctx, smjs_elinks_object); - JS_SetProperty(smjs_ctx, smjs_elinks_object, "bookmarks", &val); + JS_SetProperty(smjs_ctx, r_smjs_elinks_object, "bookmarks", rval); } diff --git a/src/scripting/smjs/cache_object.c b/src/scripting/smjs/cache_object.c index 21fc4473..b7edcf1e 100644 --- a/src/scripting/smjs/cache_object.c +++ b/src/scripting/smjs/cache_object.c @@ -37,45 +37,46 @@ enum cache_entry_prop { CACHE_ENTRY_URI = -5, }; -static JSBool cache_entry_get_property_content(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool cache_entry_set_property_content(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp); -static JSBool cache_entry_get_property_type(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool cache_entry_set_property_type(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp); -static JSBool cache_entry_get_property_length(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool cache_entry_get_property_head(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool cache_entry_set_property_head(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp); -static JSBool cache_entry_get_property_uri(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); +static bool cache_entry_get_property_content(JSContext *ctx, unsigned int argc, jsval *vp); +static bool cache_entry_set_property_content(JSContext *ctx, unsigned int argc, jsval *vp); +static bool cache_entry_get_property_type(JSContext *ctx, unsigned int argc, jsval *vp); +static bool cache_entry_set_property_type(JSContext *ctx, unsigned int argc, jsval *vp); +static bool cache_entry_get_property_length(JSContext *ctx, unsigned int argc, jsval *vp); +static bool cache_entry_get_property_head(JSContext *ctx, unsigned int argc, jsval *vp); +static bool cache_entry_set_property_head(JSContext *ctx, unsigned int argc, jsval *vp); +static bool cache_entry_get_property_uri(JSContext *ctx, unsigned int argc, jsval *vp); static const JSPropertySpec cache_entry_props[] = { - { "content", 0, JSPROP_ENUMERATE, JSOP_WRAPPER(cache_entry_get_property_content), JSOP_WRAPPER(cache_entry_set_property_content) }, - { "type", 0, JSPROP_ENUMERATE, JSOP_WRAPPER(cache_entry_get_property_type), JSOP_WRAPPER(cache_entry_set_property_type)}, - { "length", 0, JSPROP_ENUMERATE | JSPROP_READONLY, JSOP_WRAPPER(cache_entry_get_property_length), JSOP_NULLWRAPPER }, - { "head", 0, JSPROP_ENUMERATE, JSOP_WRAPPER(cache_entry_get_property_head), JSOP_WRAPPER(cache_entry_set_property_head) }, - { "uri", 0, JSPROP_ENUMERATE | JSPROP_READONLY, JSOP_WRAPPER(cache_entry_get_property_uri), JSOP_NULLWRAPPER }, + JS_PSGS("content", cache_entry_get_property_content, cache_entry_set_property_content, JSPROP_ENUMERATE), + JS_PSGS("type", cache_entry_get_property_type, cache_entry_set_property_type, JSPROP_ENUMERATE), + JS_PSG("length", cache_entry_get_property_length, JSPROP_ENUMERATE), + JS_PSGS("head", cache_entry_get_property_head, cache_entry_set_property_head, JSPROP_ENUMERATE), + JS_PSG("uri", cache_entry_get_property_uri, JSPROP_ENUMERATE), { NULL } }; -static JSBool -cache_entry_get_property_content(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) +static bool +cache_entry_get_property_content(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct cache_entry *cached; struct fragment *fragment; - JSBool ret; + bool ret; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &cache_entry_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &cache_entry_class, NULL)) + return false; - cached = JS_GetInstancePrivate(ctx, obj, + cached = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &cache_entry_class, NULL); - if (!cached) return JS_FALSE; /* already detached */ + if (!cached) return false; /* already detached */ assert(cache_entry_is_valid(cached)); - if_assert_failed return JS_FALSE; + if_assert_failed return false; /* Get a strong reference to the cache entry to prevent it * from being deleted if some function called below decides to @@ -83,24 +84,26 @@ cache_entry_get_property_content(JSContext *ctx, JS::HandleObject hobj, JS::Hand * eventually unlock the object. */ object_lock(cached); - undef_to_jsval(ctx, vp); + args.rval().setUndefined(); + fragment = get_cache_fragment(cached); if (!fragment) { - ret = JS_FALSE; + ret = false; } else { - *vp = STRING_TO_JSVAL(JS_NewStringCopyN(smjs_ctx, fragment->data, fragment->length)); - ret = JS_TRUE; + args.rval().setString(JS_NewStringCopyN(smjs_ctx, fragment->data, fragment->length)); + ret = true; } object_unlock(cached); return ret; } -static JSBool -cache_entry_set_property_content(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp) +static bool +cache_entry_set_property_content(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct cache_entry *cached; JSString *jsstr; @@ -110,15 +113,15 @@ cache_entry_set_property_content(JSContext *ctx, JS::HandleObject hobj, JS::Hand /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &cache_entry_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &cache_entry_class, NULL)) + return false; - cached = JS_GetInstancePrivate(ctx, obj, + cached = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &cache_entry_class, NULL); - if (!cached) return JS_FALSE; /* already detached */ + if (!cached) return false; /* already detached */ assert(cache_entry_is_valid(cached)); - if_assert_failed return JS_FALSE; + if_assert_failed return false; /* Get a strong reference to the cache entry to prevent it * from being deleted if some function called below decides to @@ -126,51 +129,53 @@ cache_entry_set_property_content(JSContext *ctx, JS::HandleObject hobj, JS::Hand * eventually unlock the object. */ object_lock(cached); - jsstr = JS_ValueToString(smjs_ctx, *vp); + jsstr = JS::ToString(smjs_ctx, args[0]); str = JS_EncodeString(smjs_ctx, jsstr); len = JS_GetStringLength(jsstr); add_fragment(cached, 0, str, len); normalize_cache_entry(cached, len); object_unlock(cached); - return JS_TRUE; + return true; } -static JSBool -cache_entry_get_property_type(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) +static bool +cache_entry_get_property_type(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct cache_entry *cached; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &cache_entry_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &cache_entry_class, NULL)) + return false; - cached = JS_GetInstancePrivate(ctx, obj, + cached = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &cache_entry_class, NULL); - if (!cached) return JS_FALSE; /* already detached */ + if (!cached) return false; /* already detached */ assert(cache_entry_is_valid(cached)); - if_assert_failed return JS_FALSE; + if_assert_failed return false; /* Get a strong reference to the cache entry to prevent it * from being deleted if some function called below decides to * collect garbage. After this, all code paths must * eventually unlock the object. */ object_lock(cached); - *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, cached->content_type)); + args.rval().setString(JS_NewStringCopyZ(smjs_ctx, cached->content_type)); object_unlock(cached); - return JS_TRUE; + return true; } -static JSBool -cache_entry_set_property_type(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp) +static bool +cache_entry_set_property_type(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct cache_entry *cached; JSString *jsstr; @@ -179,15 +184,15 @@ cache_entry_set_property_type(JSContext *ctx, JS::HandleObject hobj, JS::HandleI /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &cache_entry_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &cache_entry_class, NULL)) + return false; - cached = JS_GetInstancePrivate(ctx, obj, + cached = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &cache_entry_class, NULL); - if (!cached) return JS_FALSE; /* already detached */ + if (!cached) return false; /* already detached */ assert(cache_entry_is_valid(cached)); - if_assert_failed return JS_FALSE; + if_assert_failed return false; /* Get a strong reference to the cache entry to prevent it * from being deleted if some function called below decides to @@ -195,13 +200,13 @@ cache_entry_set_property_type(JSContext *ctx, JS::HandleObject hobj, JS::HandleI * eventually unlock the object. */ object_lock(cached); - jsstr = JS_ValueToString(smjs_ctx, *vp); + jsstr = JS::ToString(smjs_ctx, args[0]); str = JS_EncodeString(smjs_ctx, jsstr); mem_free_set(&cached->content_type, stracpy(str)); object_unlock(cached); - return JS_TRUE; + return true; } @@ -249,11 +254,13 @@ smjs_get_cache_entry_object(struct cache_entry *cached) cache_entry_object = JS_NewObject(smjs_ctx, (JSClass *) &cache_entry_class, - NULL, NULL); + JS::NullPtr(), JS::NullPtr()); if (!cache_entry_object) return NULL; - if (JS_FALSE == JS_DefineProperties(smjs_ctx, cache_entry_object, + JS::RootedObject r_cache_entry_object(smjs_ctx, cache_entry_object); + + if (false == JS_DefineProperties(smjs_ctx, r_cache_entry_object, (JSPropertySpec *) cache_entry_props)) return NULL; @@ -279,7 +286,9 @@ smjs_detach_cache_entry_object(struct cache_entry *cached) if (!cached->jsobject) return; - assert(JS_GetInstancePrivate(smjs_ctx, cached->jsobject, + JS::RootedObject r_jsobject(smjs_ctx, cached->jsobject); + + assert(JS_GetInstancePrivate(smjs_ctx, r_jsobject, (JSClass *) &cache_entry_class, NULL) == cached); if_assert_failed {} @@ -288,72 +297,75 @@ smjs_detach_cache_entry_object(struct cache_entry *cached) cached->jsobject = NULL; } -static JSBool -cache_entry_get_property_length(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) +static bool +cache_entry_get_property_length(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct cache_entry *cached; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &cache_entry_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &cache_entry_class, NULL)) + return false; - cached = JS_GetInstancePrivate(ctx, obj, + cached = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &cache_entry_class, NULL); - if (!cached) return JS_FALSE; /* already detached */ + if (!cached) return false; /* already detached */ assert(cache_entry_is_valid(cached)); - if_assert_failed return JS_FALSE; + if_assert_failed return false; /* Get a strong reference to the cache entry to prevent it * from being deleted if some function called below decides to * collect garbage. After this, all code paths must * eventually unlock the object. */ object_lock(cached); - *vp = INT_TO_JSVAL(cached->length); + args.rval().setInt32(cached->length); object_unlock(cached); - return JS_TRUE; + return true; } -static JSBool -cache_entry_get_property_head(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) +static bool +cache_entry_get_property_head(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct cache_entry *cached; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &cache_entry_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &cache_entry_class, NULL)) + return false; - cached = JS_GetInstancePrivate(ctx, obj, + cached = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &cache_entry_class, NULL); - if (!cached) return JS_FALSE; /* already detached */ + if (!cached) return false; /* already detached */ assert(cache_entry_is_valid(cached)); - if_assert_failed return JS_FALSE; + if_assert_failed return false; /* Get a strong reference to the cache entry to prevent it * from being deleted if some function called below decides to * collect garbage. After this, all code paths must * eventually unlock the object. */ object_lock(cached); - *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, cached->head)); + args.rval().setString(JS_NewStringCopyZ(smjs_ctx, cached->head)); object_unlock(cached); - return JS_TRUE; + return true; } -static JSBool -cache_entry_set_property_head(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp) +static bool +cache_entry_set_property_head(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct cache_entry *cached; JSString *jsstr; @@ -362,15 +374,15 @@ cache_entry_set_property_head(JSContext *ctx, JS::HandleObject hobj, JS::HandleI /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &cache_entry_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &cache_entry_class, NULL)) + return false; - cached = JS_GetInstancePrivate(ctx, obj, + cached = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &cache_entry_class, NULL); - if (!cached) return JS_FALSE; /* already detached */ + if (!cached) return false; /* already detached */ assert(cache_entry_is_valid(cached)); - if_assert_failed return JS_FALSE; + if_assert_failed return false; /* Get a strong reference to the cache entry to prevent it * from being deleted if some function called below decides to @@ -378,42 +390,43 @@ cache_entry_set_property_head(JSContext *ctx, JS::HandleObject hobj, JS::HandleI * eventually unlock the object. */ object_lock(cached); - jsstr = JS_ValueToString(smjs_ctx, *vp); + jsstr = JS::ToString(smjs_ctx, args[0]); str = JS_EncodeString(smjs_ctx, jsstr); mem_free_set(&cached->head, stracpy(str)); object_unlock(cached); - return JS_TRUE; + return true; } -static JSBool -cache_entry_get_property_uri(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) +static bool +cache_entry_get_property_uri(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct cache_entry *cached; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &cache_entry_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &cache_entry_class, NULL)) + return false; - cached = JS_GetInstancePrivate(ctx, obj, + cached = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &cache_entry_class, NULL); - if (!cached) return JS_FALSE; /* already detached */ + if (!cached) return false; /* already detached */ assert(cache_entry_is_valid(cached)); - if_assert_failed return JS_FALSE; + if_assert_failed return false; /* Get a strong reference to the cache entry to prevent it * from being deleted if some function called below decides to * collect garbage. After this, all code paths must * eventually unlock the object. */ object_lock(cached); - *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, struri(cached->uri))); + args.rval().setString(JS_NewStringCopyZ(smjs_ctx, struri(cached->uri))); object_unlock(cached); - return JS_TRUE; + return true; } diff --git a/src/scripting/smjs/core.c b/src/scripting/smjs/core.c index 04906142..91b13986 100644 --- a/src/scripting/smjs/core.c +++ b/src/scripting/smjs/core.c @@ -75,14 +75,16 @@ static int smjs_do_file(unsigned char *path) { int ret = 1; - jsval rval; struct string script; if (!init_string(&script)) return 0; + jsval val; + JS::RootedValue rval(smjs_ctx, val); + JS::RootedObject cg(smjs_ctx, JS::CurrentGlobalOrNull(smjs_ctx)); + if (!add_file_to_string(&script, path) - || JS_FALSE == JS_EvaluateScript(smjs_ctx, - JS_GetGlobalForScopeChain(smjs_ctx), + || false == JS_EvaluateScript(smjs_ctx, cg, script.source, script.length, path, 1, &rval)) { alert_smjs_error("error loading script file"); ret = 0; @@ -93,17 +95,18 @@ smjs_do_file(unsigned char *path) return ret; } -static JSBool +static bool smjs_do_file_wrapper(JSContext *ctx, unsigned int argc, jsval *rval) { - jsval *argv = JS_ARGV(ctx, rval); - JSString *jsstr = JS_ValueToString(smjs_ctx, *argv); + JS::CallArgs args = CallArgsFromVp(argc, rval); + + JSString *jsstr = JS::ToString(smjs_ctx, args[0]); unsigned char *path = JS_EncodeString(smjs_ctx, jsstr); if (smjs_do_file(path)) - return JS_TRUE; + return true; - return JS_FALSE; + return false; } static void @@ -136,15 +139,15 @@ init_smjs(struct module *module) return; } - JS_SetOptions(smjs_ctx, JSOPTION_VAROBJFIX | JS_METHODJIT); - JS_SetErrorReporter(smjs_ctx, error_reporter); smjs_init_global_object(); smjs_init_elinks_object(); - JS_DefineFunction(smjs_ctx, smjs_global_object, "do_file", + JS::RootedObject r_smjs_global_object(smjs_ctx, smjs_global_object); + + JS_DefineFunction(smjs_ctx, r_smjs_global_object, "do_file", &smjs_do_file_wrapper, 1, 0); smjs_load_hooks(); diff --git a/src/scripting/smjs/elinks_object.c b/src/scripting/smjs/elinks_object.c index 88fd4d7b..cf72b30e 100644 --- a/src/scripting/smjs/elinks_object.c +++ b/src/scripting/smjs/elinks_object.c @@ -32,20 +32,21 @@ /* @elinks_funcs{"alert"} */ -static JSBool +static bool elinks_alert(JSContext *ctx, unsigned int argc, jsval *rval) { - jsval val; - jsval *argv = JS_ARGV(ctx, rval); + JS::CallArgs args = CallArgsFromVp(argc, rval); + unsigned char *string; struct terminal *term; if (argc != 1) - return JS_TRUE; + return true; + + string = JS_EncodeString(ctx, args[0].toString()); - string = jsval_to_string(ctx, &argv[0]); if (!*string) - return JS_TRUE; + return true; if (smjs_ses) { term = smjs_ses->tab->term; @@ -61,32 +62,30 @@ elinks_alert(JSContext *ctx, unsigned int argc, jsval *rval) sleep(3); } - undef_to_jsval(ctx, &val); - JS_SET_RVAL(ctx, rval, val); + args.rval().setUndefined(); - return JS_TRUE; + return true; } /* @elinks_funcs{"execute"} */ -static JSBool +static bool elinks_execute(JSContext *ctx, unsigned int argc, jsval *rval) { - jsval val; - jsval *argv = JS_ARGV(ctx, rval); + JS::CallArgs args = CallArgsFromVp(argc, rval); + unsigned char *string; if (argc != 1) - return JS_TRUE; + return true; - string = jsval_to_string(ctx, &argv[0]); + string = JS_EncodeString(ctx, args[0].toString()); if (!*string) - return JS_TRUE; + return true; exec_on_terminal(smjs_ses->tab->term, string, "", TERM_EXEC_BG); - undef_to_jsval(ctx, &val); - JS_SET_RVAL(ctx, rval, val); - return JS_TRUE; + args.rval().setUndefined(); + return true; } enum elinks_prop { @@ -95,20 +94,19 @@ enum elinks_prop { ELINKS_SESSION, }; -static JSBool elinks_get_property_home(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool elinks_get_property_location(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool elinks_set_property_location(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp); -static JSBool elinks_get_property_session(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); - +static bool elinks_get_property_home(JSContext *ctx, unsigned int argc, jsval *vp); +static bool elinks_get_property_location(JSContext *ctx, unsigned int argc, jsval *vp); +static bool elinks_set_property_location(JSContext *ctx, unsigned int argc, jsval *vp); +static bool elinks_get_property_session(JSContext *ctx, unsigned int argc, jsval *vp); static const JSPropertySpec elinks_props[] = { - { "home", 0, JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_READONLY, JSOP_WRAPPER(elinks_get_property_home), JSOP_NULLWRAPPER }, - { "location", 0, JSPROP_ENUMERATE | JSPROP_PERMANENT, JSOP_WRAPPER(elinks_get_property_location), JSOP_WRAPPER(elinks_set_property_location) }, - { "session", 0, JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_READONLY, JSOP_WRAPPER(elinks_get_property_session), JSOP_NULLWRAPPER}, + JS_PSG("home", elinks_get_property_home, JSPROP_ENUMERATE), + JS_PSGS("location", elinks_get_property_location, elinks_set_property_location, JSPROP_ENUMERATE), + JS_PSG("session", elinks_get_property_session, JSPROP_ENUMERATE), { NULL } }; -static JSBool elinks_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool elinks_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp); +static bool elinks_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); +static bool elinks_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, bool strict, JS::MutableHandleValue hvp); static const JSClass elinks_class = { "elinks", @@ -120,80 +118,78 @@ static const JSClass elinks_class = { /* @elinks_class.getProperty */ -static JSBool +static bool elinks_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &elinks_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &elinks_class, NULL)) + return false; if (!JSID_IS_INT(id)) { - /* Note: If we return JS_FALSE here, the object's methods and + /* Note: If we return false here, the object's methods and * user-added properties do not work. */ - return JS_TRUE; + return true; } - undef_to_jsval(ctx, vp); + hvp.setUndefined(); switch (JSID_TO_INT(id)) { case ELINKS_HOME: - *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, elinks_home)); + hvp.setString(JS_NewStringCopyZ(smjs_ctx, elinks_home)); - return JS_TRUE; + return true; case ELINKS_LOCATION: { struct uri *uri; - if (!smjs_ses) return JS_FALSE; + if (!smjs_ses) return false; uri = have_location(smjs_ses) ? cur_loc(smjs_ses)->vs.uri : smjs_ses->loading_uri; - *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, + hvp.setString(JS_NewStringCopyZ(smjs_ctx, uri ? (const char *) struri(uri) : "")); - return JS_TRUE; + return true; } case ELINKS_SESSION: { JSObject *jsobj; - if (!smjs_ses) return JS_FALSE; + if (!smjs_ses) return false; jsobj = smjs_get_session_object(smjs_ses); - if (!jsobj) return JS_FALSE; + if (!jsobj) return false; - object_to_jsval(ctx, vp, jsobj); + hvp.setObject(*jsobj); - return JS_TRUE; + return true; } default: INTERNAL("Invalid ID %d in elinks_get_property().", JSID_TO_INT(id)); } - return JS_FALSE; + return false; } -static JSBool -elinks_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp) +static bool +elinks_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, bool strict, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &elinks_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &elinks_class, NULL)) + return false; if (!JSID_IS_INT(id)) { - /* Note: If we return JS_FALSE here, the object's methods and + /* Note: If we return false here, the object's methods and * user-added properties do not work. */ - return JS_TRUE; + return true; } switch (JSID_TO_INT(id)) { @@ -201,24 +197,24 @@ elinks_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSB JSString *jsstr; unsigned char *url; - if (!smjs_ses) return JS_FALSE; + if (!smjs_ses) return false; - jsstr = JS_ValueToString(smjs_ctx, *vp); - if (!jsstr) return JS_FALSE; + jsstr = JS::ToString(smjs_ctx, hvp); + if (!jsstr) return false; url = JS_EncodeString(smjs_ctx, jsstr); - if (!url) return JS_FALSE; + if (!url) return false; goto_url(smjs_ses, url); - return JS_TRUE; + return true; } default: INTERNAL("Invalid ID %d in elinks_set_property().", JSID_TO_INT(id)); } - return JS_FALSE; + return false; } @@ -256,107 +252,117 @@ smjs_init_elinks_object(void) } /* If elinks. is defined, call it with the given arguments, - * store the return value in rval, and return JS_TRUE. Else return JS_FALSE. */ -JSBool -smjs_invoke_elinks_object_method(unsigned char *method, jsval argv[], int argc, - jsval *rval) + * store the return value in rval, and return true. Else return false. */ +bool +smjs_invoke_elinks_object_method(unsigned char *method, int argc, jsval *argv, JS::MutableHandleValue rval) { + JS::CallArgs args = CallArgsFromVp(argc, argv); + assert(smjs_ctx); assert(smjs_elinks_object); - assert(rval); assert(argv); - if (JS_FALSE == JS_GetProperty(smjs_ctx, smjs_elinks_object, - method, rval)) - return JS_FALSE; + JS::RootedObject r_smjs_elinks_object(smjs_ctx, smjs_elinks_object); + jsval val; + JS::RootedValue fun(smjs_ctx, val); - if (JSVAL_IS_VOID(*rval)) - return JS_FALSE; + if (false == JS_GetProperty(smjs_ctx, r_smjs_elinks_object, + method, &fun)) + return false; - return JS_CallFunctionValue(smjs_ctx, smjs_elinks_object, - *rval, argc, argv, rval); + if (rval.isUndefined()) + return false; + + return JS_CallFunctionValue(smjs_ctx, r_smjs_elinks_object, fun, args, rval); } -static JSBool -elinks_get_property_home(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) +static bool +elinks_get_property_home(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &elinks_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &elinks_class, NULL)) + return false; - *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, elinks_home)); + args.rval().setString(JS_NewStringCopyZ(smjs_ctx, elinks_home)); - return JS_TRUE; + return true; } -static JSBool -elinks_get_property_location(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) +static bool +elinks_get_property_location(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + struct uri *uri; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &elinks_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &elinks_class, NULL)) + return false; - if (!smjs_ses) return JS_FALSE; + if (!smjs_ses) return false; uri = have_location(smjs_ses) ? cur_loc(smjs_ses)->vs.uri : smjs_ses->loading_uri; - *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, uri ? (const char *) struri(uri) : "")); + args.rval().setString(JS_NewStringCopyZ(smjs_ctx, uri ? (const char *) struri(uri) : "")); - return JS_TRUE; + return true; } -static JSBool -elinks_set_property_location(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp) +static bool +elinks_set_property_location(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + JSString *jsstr; unsigned char *url; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &elinks_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &elinks_class, NULL)) + return false; - if (!smjs_ses) return JS_FALSE; + if (!smjs_ses) return false; - jsstr = JS_ValueToString(smjs_ctx, *vp); - if (!jsstr) return JS_FALSE; + jsstr = JS::ToString(smjs_ctx, args[0]); + if (!jsstr) return false; url = JS_EncodeString(smjs_ctx, jsstr); - if (!url) return JS_FALSE; + if (!url) return false; goto_url(smjs_ses, url); - return JS_TRUE; + return true; } -static JSBool -elinks_get_property_session(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) +static bool +elinks_get_property_session(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + JSObject *jsobj; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &elinks_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &elinks_class, NULL)) + return false; - if (!smjs_ses) return JS_FALSE; + if (!smjs_ses) return false; jsobj = smjs_get_session_object(smjs_ses); - if (!jsobj) return JS_FALSE; + if (!jsobj) return false; - object_to_jsval(ctx, vp, jsobj); + args.rval().setObject(*jsobj);; - return JS_TRUE; + return true; } diff --git a/src/scripting/smjs/elinks_object.h b/src/scripting/smjs/elinks_object.h index 0395d892..5b519151 100644 --- a/src/scripting/smjs/elinks_object.h +++ b/src/scripting/smjs/elinks_object.h @@ -12,7 +12,6 @@ void smjs_init_elinks_object(void); /* Invoke elinks. with the given arguments and put the return value * into *rval. */ -JSBool smjs_invoke_elinks_object_method(unsigned char *method, - jsval argv[], int argc, jsval *rval); +bool smjs_invoke_elinks_object_method(unsigned char *method, int argc, jsval *argv, JS::MutableHandleValue rval); #endif diff --git a/src/scripting/smjs/global_object.c b/src/scripting/smjs/global_object.c index 80866b2a..44e71f9c 100644 --- a/src/scripting/smjs/global_object.c +++ b/src/scripting/smjs/global_object.c @@ -32,7 +32,7 @@ smjs_get_global_object(void) JSAutoRequest ar(smjs_ctx); RootedObject jsobj(smjs_ctx); - jsobj = JS_NewGlobalObject(smjs_ctx, (JSClass *) &global_class, NULL); + jsobj = JS_NewGlobalObject(smjs_ctx, (JSClass *) &global_class, NULL, JS::DontFireOnNewGlobalHook); if (!jsobj) return NULL; diff --git a/src/scripting/smjs/globhist.c b/src/scripting/smjs/globhist.c index 2f8e5bc7..c0c69561 100644 --- a/src/scripting/smjs/globhist.c +++ b/src/scripting/smjs/globhist.c @@ -12,8 +12,8 @@ #include "scripting/smjs/elinks_object.h" #include "util/memory.h" -static JSBool smjs_globhist_item_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool smjs_globhist_item_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp); +static bool smjs_globhist_item_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); +static bool smjs_globhist_item_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, bool strict, JS::MutableHandleValue hvp); static void smjs_globhist_item_finalize(JSFreeOp *op, JSObject *obj); @@ -51,26 +51,25 @@ enum smjs_globhist_item_prop { GLOBHIST_LAST_VISIT = -3, }; -static JSBool smjs_globhist_item_get_property_title(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool smjs_globhist_item_set_property_title(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp); -static JSBool smjs_globhist_item_get_property_url(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool smjs_globhist_item_set_property_url(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp); -static JSBool smjs_globhist_item_get_property_last_visit(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool smjs_globhist_item_set_property_last_visit(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp); +static bool smjs_globhist_item_get_property_title(JSContext *ctx, unsigned int argc, jsval *vp); +static bool smjs_globhist_item_set_property_title(JSContext *ctx, unsigned int argc, jsval *vp); +static bool smjs_globhist_item_get_property_url(JSContext *ctx, unsigned int argc, jsval *vp); +static bool smjs_globhist_item_set_property_url(JSContext *ctx, unsigned int argc, jsval *vp); +static bool smjs_globhist_item_get_property_last_visit(JSContext *ctx, unsigned int argc, jsval *vp); +static bool smjs_globhist_item_set_property_last_visit(JSContext *ctx, unsigned int argc, jsval *vp); static const JSPropertySpec smjs_globhist_item_props[] = { - { "title", 0, JSPROP_ENUMERATE, JSOP_WRAPPER(smjs_globhist_item_get_property_title), JSOP_WRAPPER(smjs_globhist_item_set_property_title) }, - { "url", 0, JSPROP_ENUMERATE, JSOP_WRAPPER(smjs_globhist_item_get_property_url), JSOP_WRAPPER(smjs_globhist_item_set_property_url) }, - { "last_visit", 0, JSPROP_ENUMERATE, JSOP_WRAPPER(smjs_globhist_item_get_property_last_visit), JSOP_WRAPPER(smjs_globhist_item_set_property_last_visit) }, + JS_PSGS("title", smjs_globhist_item_get_property_title, smjs_globhist_item_set_property_title, JSPROP_ENUMERATE), + JS_PSGS("url", smjs_globhist_item_get_property_url, smjs_globhist_item_set_property_url, JSPROP_ENUMERATE), + JS_PSGS("last_visit", smjs_globhist_item_get_property_last_visit, smjs_globhist_item_set_property_last_visit, JSPROP_ENUMERATE), { NULL } }; /* @smjs_globhist_item_class.getProperty */ -static JSBool +static bool smjs_globhist_item_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); struct global_history_item *history_item; @@ -78,31 +77,29 @@ smjs_globhist_item_get_property(JSContext *ctx, JS::HandleObject hobj, JS::Handl /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &smjs_globhist_item_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL)) + return false; - history_item = JS_GetInstancePrivate(ctx, obj, + history_item = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL); - if (!history_item) return JS_FALSE; + if (!history_item) return false; - undef_to_jsval(ctx, vp); + hvp.setUndefined(); if (!JSID_IS_INT(id)) - return JS_FALSE; + return false; switch (JSID_TO_INT(id)) { case GLOBHIST_TITLE: - *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, - history_item->title)); + hvp.setString(JS_NewStringCopyZ(smjs_ctx, history_item->title)); - return JS_TRUE; + return true; case GLOBHIST_URL: - *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, - history_item->url)); + hvp.setString(JS_NewStringCopyZ(smjs_ctx, history_item->url)); - return JS_TRUE; + return true; case GLOBHIST_LAST_VISIT: /* TODO: I'd rather return a date object, but that introduces * synchronisation issues: @@ -120,25 +117,24 @@ smjs_globhist_item_get_property(JSContext *ctx, JS::HandleObject hobj, JS::Handl * Since the Date object uses milliseconds since the epoch, * I'd rather export that, but SpiderMonkey doesn't provide * a suitable type. -- Miciah */ - *vp = JS_NumberValue(history_item->last_visit); + hvp.setInt32(history_item->last_visit); - return JS_TRUE; + return true; default: /* Unrecognized integer property ID; someone is using * the object as an array. SMJS builtin classes (e.g. - * js_RegExpClass) just return JS_TRUE in this case + * js_RegExpClass) just return true in this case * and leave *@vp unchanged. Do the same here. * (Actually not quite the same, as we already used * @undef_to_jsval.) */ - return JS_TRUE; + return true; } } /* @smjs_globhist_item_class.setProperty */ -static JSBool -smjs_globhist_item_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp) +static bool +smjs_globhist_item_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, bool strict, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); struct global_history_item *history_item; @@ -146,50 +142,50 @@ smjs_globhist_item_set_property(JSContext *ctx, JS::HandleObject hobj, JS::Handl /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &smjs_globhist_item_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL)) + return false; - history_item = JS_GetInstancePrivate(ctx, obj, + history_item = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL); - if (!history_item) return JS_FALSE; + if (!history_item) return false; if (!JSID_IS_INT(id)) - return JS_FALSE; + return false; switch (JSID_TO_INT(id)) { case GLOBHIST_TITLE: { - JSString *jsstr = JS_ValueToString(smjs_ctx, *vp); + JSString *jsstr = JS::ToString(smjs_ctx, hvp); unsigned char *str = JS_EncodeString(smjs_ctx, jsstr); mem_free_set(&history_item->title, stracpy(str)); - return JS_TRUE; + return true; } case GLOBHIST_URL: { - JSString *jsstr = JS_ValueToString(smjs_ctx, *vp); + JSString *jsstr = JS::ToString(smjs_ctx, hvp); unsigned char *str = JS_EncodeString(smjs_ctx, jsstr); mem_free_set(&history_item->url, stracpy(str)); - return JS_TRUE; + return true; } case GLOBHIST_LAST_VISIT: { uint32_t seconds; /* Bug 923: Assumes time_t values fit in uint32. */ - JS_ValueToECMAUint32(smjs_ctx, *vp, &seconds); + JS::ToInt32(smjs_ctx, hvp, &seconds); history_item->last_visit = seconds; - return JS_TRUE; + return true; } default: /* Unrecognized integer property ID; someone is using * the object as an array. SMJS builtin classes (e.g. - * js_RegExpClass) just return JS_TRUE in this case. + * js_RegExpClass) just return true in this case. * Do the same here. */ - return JS_TRUE; + return true; } } @@ -200,9 +196,12 @@ smjs_get_globhist_item_object(struct global_history_item *history_item) JSObject *jsobj; jsobj = JS_NewObject(smjs_ctx, (JSClass *) &smjs_globhist_item_class, - NULL, NULL); + JS::NullPtr(), JS::NullPtr()); + + JS::RootedObject r_jsobj(smjs_ctx, jsobj); + if (!jsobj - || JS_TRUE != JS_DefineProperties(smjs_ctx, jsobj, + || true != JS_DefineProperties(smjs_ctx, r_jsobj, (JSPropertySpec *) smjs_globhist_item_props)) { return NULL; } @@ -214,22 +213,22 @@ smjs_get_globhist_item_object(struct global_history_item *history_item) /* @smjs_globhist_class.getProperty */ -static JSBool +static bool smjs_globhist_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); - (void)obj; JSObject *jsobj; unsigned char *uri_string; struct global_history_item *history_item; jsval tmp; + JS::RootedValue r_tmp(ctx, tmp); - if (!JS_IdToValue(ctx, id, &tmp)) + + if (!JS_IdToValue(ctx, id, &r_tmp)) goto ret_null; - uri_string = JS_EncodeString(ctx, JS_ValueToString(ctx, tmp)); + uri_string = JS_EncodeString(ctx, JS::ToString(ctx, r_tmp)); if (!uri_string) goto ret_null; history_item = get_global_history_item(uri_string); @@ -238,14 +237,14 @@ smjs_globhist_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId h jsobj = smjs_get_globhist_item_object(history_item); if (!jsobj) goto ret_null; - *vp = OBJECT_TO_JSVAL(jsobj); + hvp.setObject(*jsobj); - return JS_TRUE; + return true; ret_null: - *vp = JSVAL_NULL; + hvp.setNull(); - return JS_TRUE; + return true; } static const JSClass smjs_globhist_class = { @@ -261,7 +260,7 @@ smjs_get_globhist_object(void) JSObject *globhist; globhist = JS_NewObject(smjs_ctx, (JSClass *) &smjs_globhist_class, - NULL, NULL); + JS::NullPtr(), JS::NullPtr()); if (!globhist) return NULL; return globhist; @@ -279,40 +278,43 @@ smjs_init_globhist_interface(void) globhist = smjs_get_globhist_object(); if (!globhist) return; - val = OBJECT_TO_JSVAL(globhist); + JS::RootedObject r_smjs_elinks_object(smjs_ctx, smjs_elinks_object); + JS::RootedValue r_val(smjs_ctx, val); + r_val.setObject(*globhist); - JS_SetProperty(smjs_ctx, smjs_elinks_object, "globhist", &val); + JS_SetProperty(smjs_ctx, r_smjs_elinks_object, "globhist", r_val); } -static JSBool -smjs_globhist_item_get_property_title(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, - JS::MutableHandleValue hvp) +static bool +smjs_globhist_item_get_property_title(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct global_history_item *history_item; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &smjs_globhist_item_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL)) + return false; - history_item = JS_GetInstancePrivate(ctx, obj, + history_item = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL); - if (!history_item) return JS_FALSE; + if (!history_item) return false; - *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, history_item->title)); + args.rval().setString(JS_NewStringCopyZ(smjs_ctx, history_item->title)); - return JS_TRUE; + return true; } -static JSBool -smjs_globhist_item_set_property_title(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp) +static bool +smjs_globhist_item_set_property_title(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct global_history_item *history_item; JSString *jsstr; @@ -321,51 +323,52 @@ smjs_globhist_item_set_property_title(JSContext *ctx, JS::HandleObject hobj, JS: /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &smjs_globhist_item_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL)) + return false; - history_item = JS_GetInstancePrivate(ctx, obj, + history_item = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL); - if (!history_item) return JS_FALSE; + if (!history_item) return false; - jsstr = JS_ValueToString(smjs_ctx, *vp); + jsstr = JS::ToString(smjs_ctx, args[0]); str = JS_EncodeString(smjs_ctx, jsstr); mem_free_set(&history_item->title, stracpy(str)); - return JS_TRUE; + return true; } -static JSBool -smjs_globhist_item_get_property_url(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, - JS::MutableHandleValue hvp) +static bool +smjs_globhist_item_get_property_url(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct global_history_item *history_item; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &smjs_globhist_item_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL)) + return false; - history_item = JS_GetInstancePrivate(ctx, obj, + history_item = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL); - if (!history_item) return JS_FALSE; + if (!history_item) return false; - *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, history_item->url)); + args.rval().setString(JS_NewStringCopyZ(smjs_ctx, history_item->url)); - return JS_TRUE; + return true; } -static JSBool -smjs_globhist_item_set_property_url(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp) +static bool +smjs_globhist_item_set_property_url(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct global_history_item *history_item; JSString *jsstr; @@ -374,41 +377,41 @@ smjs_globhist_item_set_property_url(JSContext *ctx, JS::HandleObject hobj, JS::H /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &smjs_globhist_item_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL)) + return false; - history_item = JS_GetInstancePrivate(ctx, obj, + history_item = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL); - if (!history_item) return JS_FALSE; + if (!history_item) return false; - jsstr = JS_ValueToString(smjs_ctx, *vp); + jsstr = JS::ToString(smjs_ctx, args[0]); str = JS_EncodeString(smjs_ctx, jsstr); mem_free_set(&history_item->url, stracpy(str)); - return JS_TRUE; + return true; } -static JSBool -smjs_globhist_item_get_property_last_visit(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, - JS::MutableHandleValue hvp) +static bool +smjs_globhist_item_get_property_last_visit(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct global_history_item *history_item; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &smjs_globhist_item_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL)) + return false; - history_item = JS_GetInstancePrivate(ctx, obj, + history_item = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL); - if (!history_item) return JS_FALSE; + if (!history_item) return false; /* TODO: I'd rather return a date object, but that introduces * synchronisation issues: @@ -426,16 +429,17 @@ smjs_globhist_item_get_property_last_visit(JSContext *ctx, JS::HandleObject hobj * Since the Date object uses milliseconds since the epoch, * I'd rather export that, but SpiderMonkey doesn't provide * a suitable type. -- Miciah */ - *vp = JS_NumberValue(history_item->last_visit); + args.rval().setInt32(history_item->last_visit); - return JS_TRUE; + return true; } /* @smjs_globhist_item_class.setProperty */ -static JSBool -smjs_globhist_item_set_property_last_visit(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp) +static bool +smjs_globhist_item_set_property_last_visit(JSContext *ctx, unsigned int argc, jsval *vp) { - ELINKS_CAST_PROP_PARAMS + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); struct global_history_item *history_item; uint32_t seconds; @@ -443,18 +447,18 @@ smjs_globhist_item_set_property_last_visit(JSContext *ctx, JS::HandleObject hobj /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &smjs_globhist_item_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL)) + return false; - history_item = JS_GetInstancePrivate(ctx, obj, + history_item = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &smjs_globhist_item_class, NULL); - if (!history_item) return JS_FALSE; + if (!history_item) return false; /* Bug 923: Assumes time_t values fit in uint32. */ - JS_ValueToECMAUint32(smjs_ctx, *vp, &seconds); + JS::ToInt32(smjs_ctx, args[0], &seconds); history_item->last_visit = seconds; - return JS_TRUE; + return true; } diff --git a/src/scripting/smjs/hooks.c b/src/scripting/smjs/hooks.c index d69daf68..e1f6e570 100644 --- a/src/scripting/smjs/hooks.c +++ b/src/scripting/smjs/hooks.c @@ -27,20 +27,20 @@ script_hook_url(va_list ap, void *data) unsigned char **url = va_arg(ap, unsigned char **); struct session *ses = va_arg(ap, struct session *); enum evhook_status ret = EVENT_HOOK_STATUS_NEXT; - jsval args[1], rval; + jsval args[3], rval; + JS::RootedValue r_rval(smjs_ctx, rval); if (*url == NULL) return EVENT_HOOK_STATUS_NEXT; smjs_ses = ses; + args[2].setString(JS_NewStringCopyZ(smjs_ctx, *url)); - args[0] = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, *url)); - - if (JS_TRUE == smjs_invoke_elinks_object_method(data, args, 1, &rval)) { - if (JSVAL_IS_BOOLEAN(rval)) { - if (JS_FALSE == JSVAL_TO_BOOLEAN(rval)) + if (true == smjs_invoke_elinks_object_method(data, 1, args, &r_rval)) { + if (r_rval.isBoolean()) { + if (false == (r_rval.toBoolean())) ret = EVENT_HOOK_STATUS_LAST; } else { - JSString *jsstr = JS_ValueToString(smjs_ctx, rval); + JSString *jsstr = JS::ToString(smjs_ctx, r_rval); unsigned char *str = JS_EncodeString(smjs_ctx, jsstr); mem_free_set(url, stracpy(str)); @@ -59,7 +59,8 @@ script_hook_pre_format_html(va_list ap, void *data) struct cache_entry *cached = va_arg(ap, struct cache_entry *); enum evhook_status ret = EVENT_HOOK_STATUS_NEXT; JSObject *cache_entry_object, *view_state_object = NULL; - jsval args[2], rval; + jsval args[4], rval; + JS::RootedValue r_rval(smjs_ctx, rval); evhook_use_params(ses && cached); @@ -76,12 +77,12 @@ script_hook_pre_format_html(va_list ap, void *data) cache_entry_object = smjs_get_cache_entry_object(cached); if (!cache_entry_object) goto end; - args[0] = OBJECT_TO_JSVAL(cache_entry_object); - args[1] = OBJECT_TO_JSVAL(view_state_object); + args[2].setObject(*cache_entry_object); + args[3].setObject(*view_state_object); - if (JS_TRUE == smjs_invoke_elinks_object_method("preformat_html", - args, 2, &rval)) - if (JS_FALSE == JSVAL_TO_BOOLEAN(rval)) + if (true == smjs_invoke_elinks_object_method("preformat_html", + 2, args, &r_rval)) + if (false == JSVAL_TO_BOOLEAN(rval)) ret = EVENT_HOOK_STATUS_LAST; end: diff --git a/src/scripting/smjs/keybinding.c b/src/scripting/smjs/keybinding.c index 498ca4ac..6d5e8898 100644 --- a/src/scripting/smjs/keybinding.c +++ b/src/scripting/smjs/keybinding.c @@ -13,8 +13,8 @@ #include "scripting/smjs/elinks_object.h" #include "util/memory.h" -static JSBool keymap_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool keymap_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp); +static bool keymap_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); +static bool keymap_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, bool strict, JS::MutableHandleValue hvp); static void keymap_finalize(JSFreeOp *op, JSObject *obj); static const JSClass keymap_class = { @@ -26,50 +26,53 @@ static const JSClass keymap_class = { }; /* @keymap_class.getProperty */ -static JSBool +static bool keymap_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); unsigned char *action_str; const unsigned char *keystroke_str; int *data; jsval tmp; + JS::RootedValue r_tmp(ctx, tmp); /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &keymap_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &keymap_class, NULL)) + return false; - data = JS_GetInstancePrivate(ctx, obj, + data = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &keymap_class, NULL); - if (!JS_IdToValue(ctx, id, &tmp)) + if (!JS_IdToValue(ctx, id, &r_tmp)) goto ret_null; - keystroke_str = JS_EncodeString(ctx, JS_ValueToString(ctx, tmp)); + keystroke_str = JS_EncodeString(ctx, JS::ToString(ctx, r_tmp)); if (!keystroke_str) goto ret_null; action_str = get_action_name_from_keystroke((enum keymap_id) *data, keystroke_str); if (!action_str || !strcmp(action_str, "none")) goto ret_null; - *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(ctx, action_str)); + hvp.setString(JS_NewStringCopyZ(ctx, action_str)); - return JS_TRUE; + return true; ret_null: - *vp = JSVAL_NULL; + hvp.setNull(); - return JS_TRUE; + return true; } static enum evhook_status smjs_keybinding_action_callback(va_list ap, void *data) { + JS::CallArgs args; + jsval rval; + JS::RootedValue r_rval(smjs_ctx, rval); struct session *ses = va_arg(ap, struct session *); JSObject *jsobj = data; @@ -77,8 +80,12 @@ smjs_keybinding_action_callback(va_list ap, void *data) smjs_ses = ses; - JS_CallFunctionValue(smjs_ctx, NULL, OBJECT_TO_JSVAL(jsobj), - 0, NULL, &rval); + jsval r2; + JS::RootedValue r_jsobject(smjs_ctx, r2); + r_jsobject.setObject(*jsobj); + + JS_CallFunctionValue(smjs_ctx, JS::NullPtr(), r_jsobject, + args, &r_rval); smjs_ses = NULL; @@ -86,10 +93,9 @@ smjs_keybinding_action_callback(va_list ap, void *data) } /* @keymap_class.setProperty */ -static JSBool -keymap_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp) +static bool +keymap_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, bool strict, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); int *data; @@ -100,48 +106,49 @@ keymap_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSB /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &keymap_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &keymap_class, NULL)) + return false; - data = JS_GetInstancePrivate(ctx, obj, + data = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &keymap_class, NULL); /* Ugly fact: we need to get the string from the id to give to bind_do, * which will of course then convert the string back to an id... */ keymap_str = get_keymap_name((enum keymap_id) *data); - if (!keymap_str) return JS_FALSE; + if (!keymap_str) return false; - JS_IdToValue(ctx, id, &val); - keystroke_str = JS_EncodeString(ctx, JS_ValueToString(ctx, val)); - if (!keystroke_str) return JS_FALSE; + JS::RootedValue rval(ctx, val); + JS_IdToValue(ctx, id, &rval); + keystroke_str = JS_EncodeString(ctx, JS::ToString(ctx, rval)); + if (!keystroke_str) return false; - if (JSVAL_IS_STRING(*vp)) { + if (hvp.isString()) { unsigned char *action_str; - action_str = JS_EncodeString(ctx, JS_ValueToString(ctx, *vp)); - if (!action_str) return JS_FALSE; + action_str = JS_EncodeString(ctx, JS::ToString(ctx, hvp)); + if (!action_str) return false; if (bind_do(keymap_str, keystroke_str, action_str, 0)) - return JS_FALSE; + return false; - return JS_TRUE; + return true; - } else if (JSVAL_IS_NULL(*vp)) { /* before JSVAL_IS_OBJECT */ + } else if (hvp.isNull()) { /* before JSVAL_IS_OBJECT */ if (bind_do(keymap_str, keystroke_str, "none", 0)) - return JS_FALSE; + return false; - return JS_TRUE; + return true; - } else if (!JSVAL_IS_PRIMITIVE(*vp) || JSVAL_IS_NULL(*vp)) { + } else if (hvp.isObject() || hvp.isNull()) { unsigned char *err = NULL; int event_id; struct string event_name = NULL_STRING; - JSObject *jsobj = JSVAL_TO_OBJECT(*vp); + JSObject *jsobj = &hvp.toObject(); - if (JS_FALSE == JS_ObjectIsFunction(ctx, jsobj)) - return JS_FALSE; + if (false == JS_ObjectIsFunction(ctx, jsobj)) + return false; - if (!init_string(&event_name)) return JS_FALSE; + if (!init_string(&event_name)) return false; add_format_to_string(&event_name, "smjs-run-func %p", jsobj); @@ -154,7 +161,7 @@ keymap_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSB if (err) { alert_smjs_error(err); - return JS_FALSE; + return false; } event_id = register_event_hook(event_id, @@ -165,13 +172,13 @@ keymap_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSB alert_smjs_error("error registering event hook" " for keybinding"); - return JS_FALSE; + return false; } - return JS_TRUE; + return true; } - return JS_FALSE; + return false; } /* @keymap_class.finalize */ @@ -198,7 +205,7 @@ smjs_get_keymap_object(enum keymap_id keymap_id) assert(smjs_ctx); keymap_object = JS_NewObject(smjs_ctx, (JSClass *) &keymap_class, - NULL, NULL); + JS::NullPtr(),JS::NullPtr()); if (!keymap_object) return NULL; @@ -225,9 +232,12 @@ smjs_get_keymap_hash_object(void) JSObject *keymaps_hash; keymaps_hash = JS_NewObject(smjs_ctx, (JSClass *) &keymaps_hash_class, - NULL, NULL); + JS::NullPtr(), JS::NullPtr()); if (!keymaps_hash) return NULL; + JS::RootedObject r_keymaps_hash(smjs_ctx, keymaps_hash); + JS::RootedValue r_val(smjs_ctx, val); + for (keymap_id = 0; keymap_id < KEYMAP_MAX; ++keymap_id) { unsigned char *keymap_str = get_keymap_name(keymap_id); JSObject *map = smjs_get_keymap_object(keymap_id); @@ -236,9 +246,9 @@ smjs_get_keymap_hash_object(void) if (!map) return NULL; - val = OBJECT_TO_JSVAL(map); + r_val.setObject(*map); - JS_SetProperty(smjs_ctx, keymaps_hash, keymap_str, &val); + JS_SetProperty(smjs_ctx, r_keymaps_hash, keymap_str, r_val); } return keymaps_hash; @@ -256,7 +266,9 @@ smjs_init_keybinding_interface(void) keymaps_hash = smjs_get_keymap_hash_object(); if (!keymaps_hash) return; - val = OBJECT_TO_JSVAL(keymaps_hash); + JS::RootedValue r_val(smjs_ctx, val); + r_val.setObject(*keymaps_hash); + JS::RootedObject r_smjs_elinks_object(smjs_ctx, smjs_elinks_object); - JS_SetProperty(smjs_ctx, smjs_elinks_object, "keymaps", &val); + JS_SetProperty(smjs_ctx, r_smjs_elinks_object, "keymaps", r_val); } diff --git a/src/scripting/smjs/load_uri.c b/src/scripting/smjs/load_uri.c index f7011cbd..ad8a1a42 100644 --- a/src/scripting/smjs/load_uri.c +++ b/src/scripting/smjs/load_uri.c @@ -24,7 +24,7 @@ struct smjs_load_uri_hop { * jsval that points to the corresponding JSObject. Besides, * JS_AddNamedRoot is not documented to support JSFunction * pointers. */ - jsval callback; + JS::MutableHandleValue callback; }; static void @@ -32,11 +32,15 @@ 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; + JS::CallArgs argv; + JS::RootedValue r_rval(smjs_ctx, rval); + if (!download->cached) goto end; /* download->cached->object.refcount is typically 0 here @@ -52,22 +56,24 @@ smjs_loading_callback(struct download *download, void *data) if (!cache_entry_object) goto end; args[0] = OBJECT_TO_JSVAL(cache_entry_object); - JS_CallFunctionValue(smjs_ctx, NULL, hop->callback, 1, args, &rval); + argv = CallArgsFromVp(1, args); + + JS_CallFunctionValue(smjs_ctx, JS::NullPtr(), hop->callback, argv, &r_rval); end: if (download->cached) object_unlock(download->cached); - JS_RemoveValueRoot(smjs_ctx, &hop->callback); mem_free(download->data); mem_free(download); smjs_ses = saved_smjs_ses; } -static JSBool +static bool smjs_load_uri(JSContext *ctx, unsigned int argc, jsval *rval) { - jsval *argv = JS_ARGV(ctx, rval); + JS::CallArgs args = CallArgsFromVp(argc, rval); + struct smjs_load_uri_hop *hop; struct download *download; JSString *jsstr; @@ -75,45 +81,38 @@ smjs_load_uri(JSContext *ctx, unsigned int argc, jsval *rval) unsigned char *uri_string; struct uri *uri; - if (argc < 2) return JS_FALSE; + if (argc < 2) return false; - jsstr = JS_ValueToString(smjs_ctx, argv[0]); + jsstr = JS::ToString(smjs_ctx, args[0]); uri_string = JS_EncodeString(smjs_ctx, jsstr); - if (!uri_string || !*uri_string) return JS_FALSE; + if (!uri_string || !*uri_string) return false; uri = get_uri(uri_string, 0); - if (!uri) return JS_FALSE; + if (!uri) return false; external_handler = get_protocol_external_handler(NULL, uri); if (external_handler) { /* Because smjs_load_uri is carrying out an asynchronous * operation, it is inappropriate to call an external * handler here, so just return. */ - return JS_FALSE; + return false; } download = mem_alloc(sizeof(*download)); if (!download) { done_uri(uri); - return JS_FALSE; + return false; } hop = mem_alloc(sizeof(*hop)); if (!hop) { mem_free(download); done_uri(uri); - return JS_FALSE; + return false; } - hop->callback = argv[1]; + hop->callback.set(args[1]); hop->ses = smjs_ses; - if (!JS_AddNamedValueRoot(smjs_ctx, &hop->callback, - "smjs_load_uri_hop.callback")) { - mem_free(hop); - mem_free(download); - done_uri(uri); - return JS_FALSE; - } download->data = hop; download->callback = (download_callback_T *) smjs_loading_callback; @@ -122,7 +121,7 @@ smjs_load_uri(JSContext *ctx, unsigned int argc, jsval *rval) done_uri(uri); - return JS_TRUE; + return true; } void @@ -131,6 +130,8 @@ smjs_init_load_uri_interface(void) if (!smjs_ctx || !smjs_elinks_object) return; - JS_DefineFunction(smjs_ctx, smjs_elinks_object, "load_uri", + JS::RootedObject r_smjs_elinks_object(smjs_ctx, smjs_elinks_object); + + JS_DefineFunction(smjs_ctx, r_smjs_elinks_object, "load_uri", &smjs_load_uri, 2, 0); } diff --git a/src/scripting/smjs/session_object.c b/src/scripting/smjs/session_object.c index 98f8f017..f107ff6e 100644 --- a/src/scripting/smjs/session_object.c +++ b/src/scripting/smjs/session_object.c @@ -30,10 +30,10 @@ static JSObject *smjs_session_object; -static JSBool session_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool session_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp); +static bool session_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); +static bool session_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, bool strict, JS::MutableHandleValue hvp); static void session_finalize(JSFreeOp *op, JSObject *obj); -static JSBool session_construct(JSContext *ctx, unsigned int argc, jsval *rval); +static bool session_construct(JSContext *ctx, unsigned int argc, jsval *rval); static const JSClass session_class = { "session", @@ -44,7 +44,7 @@ static const JSClass session_class = { NULL, NULL, NULL, session_construct }; -static JSBool smjs_location_array_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); +static bool smjs_location_array_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); static void smjs_location_array_finalize(JSFreeOp *op, JSObject *obj); static const JSClass location_array_class = { @@ -62,10 +62,9 @@ static const JSClass location_array_class = { * location_array_class and related routines before session_class. */ /* @location_array.getProperty */ -static JSBool +static bool smjs_location_array_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); struct session *ses; @@ -75,22 +74,22 @@ smjs_location_array_get_property(JSContext *ctx, JS::HandleObject hobj, JS::Hand /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &location_array_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &location_array_class, NULL)) + return false; - ses = JS_GetInstancePrivate(ctx, obj, + ses = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &location_array_class, NULL); - if (!ses) return JS_FALSE; + if (!ses) return false; - undef_to_jsval(ctx, vp); + hvp.setUndefined(); if (!JSID_IS_INT(id)) - return JS_FALSE; + return false; assert(ses); - if_assert_failed return JS_TRUE; + if_assert_failed return true; - if (!have_location(ses)) return JS_FALSE; + if (!have_location(ses)) return false; index = JSID_TO_INT(id); for (loc = cur_loc(ses); @@ -99,15 +98,17 @@ smjs_location_array_get_property(JSContext *ctx, JS::HandleObject hobj, JS::Hand if (!index) { JSObject *obj = smjs_get_view_state_object(&loc->vs); - if (obj) object_to_jsval(ctx, vp, obj); + if (obj) { + hvp.setObject(*obj); + } - return JS_TRUE; + return true; } index += index > 0 ? -1 : 1; } - return JS_FALSE; + return false; } /** Pointed to by location_array_class.finalize. SpiderMonkey automatically @@ -147,7 +148,7 @@ smjs_get_session_location_array_object(struct session *ses) assert(smjs_ctx); if_assert_failed return NULL; - obj = JS_NewObject(smjs_ctx, (JSClass *) &location_array_class, NULL, NULL); + obj = JS_NewObject(smjs_ctx, (JSClass *) &location_array_class, JS::NullPtr(), JS::NullPtr()); if (!obj) return NULL; /* Do this last, so that if any previous step fails, we can @@ -163,6 +164,30 @@ smjs_get_session_location_array_object(struct session *ses) * smjs_detach_session_object detaches both session.jsobject and * session.history.js_object. */ +static bool session_get_property_visited(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_set_property_visited(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_get_property_history(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_get_property_loading_uri(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_get_property_reloadlevel(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_set_property_reloadlevel(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_get_property_redirect_cnt(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_set_property_redirect_cnt(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_get_property_search_direction(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_set_property_search_direction(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_get_property_kbdprefix(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_set_property_kbdprefix(JSContext *ctx, unsigned int argc, jsval *vp); + +static bool session_get_property_mark(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_set_property_mark(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_get_property_exit_query(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_get_property_insert_mode(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_set_property_insert_mode(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_get_property_navigate_mode(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_set_property_navigate_mode(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_get_property_search_word(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_set_property_search_word(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_get_property_last_search_word(JSContext *ctx, unsigned int argc, jsval *vp); +static bool session_set_property_last_search_word(JSContext *ctx, unsigned int argc, jsval *vp); enum session_prop { SESSION_VISITED, @@ -184,30 +209,353 @@ enum session_prop { }; static const JSPropertySpec session_props[] = { - { "visited", SESSION_VISITED, JSPROP_ENUMERATE }, - { "history", SESSION_HISTORY, JSPROP_ENUMERATE | JSPROP_READONLY }, - { "loading_uri", SESSION_LOADING_URI, JSPROP_ENUMERATE | JSPROP_READONLY }, - { "reloadlevel", SESSION_RELOADLEVEL, JSPROP_ENUMERATE }, - { "redirect_cnt", SESSION_REDIRECT_CNT, JSPROP_ENUMERATE }, + JS_PSGS("visited", session_get_property_visited, session_set_property_visited, JSPROP_ENUMERATE), + JS_PSG("history", session_get_property_history, JSPROP_ENUMERATE), + JS_PSG("loading_uri", session_get_property_loading_uri, JSPROP_ENUMERATE), + JS_PSGS("reloadlevel", session_get_property_reloadlevel, session_set_property_reloadlevel, JSPROP_ENUMERATE), + JS_PSGS("redirect_cnt", session_get_property_redirect_cnt, session_set_property_redirect_cnt, JSPROP_ENUMERATE), /* XXX: { "doc_view", SESSION_DOC_VIEW, JSPROP_ENUMERATE | JSPROP_READONLY }, */ /* XXX: { "frames", SESSION_FRAMES, JSPROP_ENUMERATE | JSPROP_READONLY }, */ - { "search_direction", SESSION_SEARCH_DIRECTION, JSPROP_ENUMERATE }, - { "kbdprefix", SESSION_KBDPREFIX, JSPROP_ENUMERATE }, - { "mark", SESSION_MARK_WAITING_FOR, JSPROP_ENUMERATE }, - { "exit_query", SESSION_EXIT_QUERY, JSPROP_ENUMERATE | JSPROP_READONLY }, - { "insert_mode", SESSION_INSERT_MODE, JSPROP_ENUMERATE }, - { "navigate_mode", SESSION_NAVIGATE_MODE, JSPROP_ENUMERATE }, - { "search_word", SESSION_SEARCH_WORD, JSPROP_ENUMERATE }, - { "last_search_word", SESSION_LAST_SEARCH_WORD, JSPROP_ENUMERATE }, + JS_PSGS("search_direction", session_get_property_search_direction, session_set_property_search_direction, JSPROP_ENUMERATE), + JS_PSGS("kbdprefix", session_get_property_kbdprefix, session_set_property_kbdprefix, JSPROP_ENUMERATE), + JS_PSGS("mark", session_get_property_mark, session_set_property_mark, JSPROP_ENUMERATE), + JS_PSG("exit_query", session_get_property_exit_query, JSPROP_ENUMERATE), + JS_PSGS("insert_mode", session_get_property_insert_mode, session_set_property_insert_mode, JSPROP_ENUMERATE), + JS_PSGS("navigate_mode", session_get_property_navigate_mode, session_set_property_navigate_mode, JSPROP_ENUMERATE), + JS_PSGS("search_word", session_get_property_search_word, session_set_property_search_word, JSPROP_ENUMERATE), + JS_PSGS("last_search_word", session_get_property_last_search_word, session_set_property_last_search_word, JSPROP_ENUMERATE), /* XXX: { "type_queries", SESSION_TYPE_QUERIES, JSPROP_ENUMERATE }, */ - { NULL } + JS_PS_END }; +static bool +session_get_property_visited(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + args.rval().setInt32(ses->status.visited); + + return true; +} + +static bool +session_get_property_history(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + JSObject *obj = smjs_get_session_location_array_object(ses); + + if (obj) { + args.rval().setObject(*obj); + } else { + args.rval().setUndefined(); + } + + return true; +} + +static bool +session_get_property_loading_uri(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + struct uri *uri = have_location(ses) ? cur_loc(ses)->vs.uri + : ses->loading_uri; + + if (uri) { + args.rval().setString(JS_NewStringCopyZ(ctx, struri(uri))); + } else { + args.rval().setUndefined(); + } + + return true; +} + +static bool +session_get_property_reloadlevel(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + args.rval().setInt32(ses->reloadlevel); + + return true; +} + +static bool +session_get_property_redirect_cnt(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + args.rval().setInt32(ses->redirect_cnt); + + return true; +} + +static bool +session_get_property_search_direction(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + args.rval().setString(JS_NewStringCopyZ(ctx, ses->search_direction == 1 ? "down" : "up")); + + return true; +} + +static bool +session_get_property_kbdprefix(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + args.rval().setInt32(ses->kbdprefix.repeat_count); + + return true; +} + +static bool +session_get_property_mark(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + args.rval().setString(JS_NewStringCopyZ(ctx, ses->kbdprefix.mark == KP_MARK_NOTHING + ? "nothing" + : ses->kbdprefix.mark == KP_MARK_SET + ? "set" + : "goto")); + + return true; +} + +static bool +session_get_property_exit_query(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + args.rval().setInt32(ses->exit_query); + + return true; +} + +static bool +session_get_property_insert_mode(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + args.rval().setString(JS_NewStringCopyZ(ctx, + ses->insert_mode == INSERT_MODE_LESS + ? "disabled" + : ses->insert_mode == INSERT_MODE_ON + ? "on" + : "off")); + + return true; +} + +static bool +session_get_property_navigate_mode(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + args.rval().setString(JS_NewStringCopyZ(ctx, + ses->navigate_mode == NAVIGATE_CURSOR_ROUTING + ? "cursor" + : "linkwise")); + + return true; +} + +static bool +session_get_property_search_word(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + args.rval().setString(JS_NewStringCopyZ(ctx, ses->search_word)); + + return true; +} + +static bool +session_get_property_last_search_word(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + args.rval().setString(JS_NewStringCopyZ(ctx, ses->last_search_word)); + + return true; +} + /* @session_class.getProperty */ -static JSBool +static bool session_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); struct session *ses; @@ -215,108 +563,421 @@ session_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &session_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; - ses = JS_GetInstancePrivate(ctx, obj, + ses = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &session_class, NULL); - if (!ses) return JS_FALSE; + if (!ses) return false; if (!JSID_IS_INT(id)) { - /* Note: If we return JS_FALSE here, the object's methods do not + /* Note: If we return false here, the object's methods do not * work. */ - return JS_TRUE; + return true; } /* XXX: Lock session here if it is ever changed to have an OBJECT_HEAD. */ - undef_to_jsval(ctx, vp); + hvp.setUndefined(); switch (JSID_TO_INT(id)) { case SESSION_VISITED: - int_to_jsval(ctx, vp, ses->status.visited); + hvp.setInt32(ses->status.visited); - return JS_TRUE; + return true; case SESSION_HISTORY: { JSObject *obj = smjs_get_session_location_array_object(ses); - if (obj) object_to_jsval(ctx, vp, obj); + if (obj) { + hvp.setObject(*obj); + } - return JS_TRUE; + return true; } case SESSION_LOADING_URI: { struct uri *uri = have_location(ses) ? cur_loc(ses)->vs.uri : ses->loading_uri; - if (uri) string_to_jsval(ctx, vp, struri(uri)); + if (uri) { + hvp.setString(JS_NewStringCopyZ(ctx, struri(uri))); + } - return JS_TRUE; + return true; } case SESSION_RELOADLEVEL: - int_to_jsval(ctx, vp, ses->reloadlevel); + hvp.setInt32(ses->reloadlevel); - return JS_TRUE; + return true; case SESSION_REDIRECT_CNT: - int_to_jsval(ctx, vp, ses->redirect_cnt); + hvp.setInt32(ses->redirect_cnt); - return JS_TRUE; + return true; case SESSION_SEARCH_DIRECTION: - string_to_jsval(ctx, vp, ses->search_direction == 1 ? "down" - : "up"); + hvp.setString(JS_NewStringCopyZ(ctx, ses->search_direction == 1 ? "down" : "up")); - return JS_TRUE; + return true; case SESSION_KBDPREFIX: - int_to_jsval(ctx, vp, ses->kbdprefix.repeat_count); + hvp.setInt32(ses->kbdprefix.repeat_count); - return JS_TRUE; + return true; case SESSION_MARK_WAITING_FOR: - string_to_jsval(ctx, vp, ses->kbdprefix.mark == KP_MARK_NOTHING + hvp.setString(JS_NewStringCopyZ(ctx, ses->kbdprefix.mark == KP_MARK_NOTHING ? "nothing" : ses->kbdprefix.mark == KP_MARK_SET ? "set" - : "goto"); + : "goto")); - return JS_TRUE; + return true; case SESSION_EXIT_QUERY: - int_to_jsval(ctx, vp, ses->exit_query); + hvp.setInt32(ses->exit_query); - return JS_TRUE; + return true; case SESSION_INSERT_MODE: - string_to_jsval(ctx, vp, + hvp.setString(JS_NewStringCopyZ(ctx, ses->insert_mode == INSERT_MODE_LESS ? "disabled" : ses->insert_mode == INSERT_MODE_ON ? "on" - : "off"); + : "off")); - return JS_TRUE; + return true; case SESSION_NAVIGATE_MODE: - string_to_jsval(ctx, vp, + hvp.setString(JS_NewStringCopyZ(ctx, ses->navigate_mode == NAVIGATE_CURSOR_ROUTING ? "cursor" - : "linkwise"); + : "linkwise")); - return JS_TRUE; + return true; case SESSION_SEARCH_WORD: - string_to_jsval(ctx, vp, ses->search_word); + hvp.setString(JS_NewStringCopyZ(ctx, ses->search_word)); - return JS_TRUE; + return true; case SESSION_LAST_SEARCH_WORD: - string_to_jsval(ctx, vp, ses->last_search_word); + hvp.setString(JS_NewStringCopyZ(ctx, ses->last_search_word)); - return JS_TRUE; + return true; default: INTERNAL("Invalid ID %d in session_get_property().", JSID_TO_INT(id)); } - return JS_FALSE; + return false; } -static JSBool -session_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp) +static bool +session_set_property_visited(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + int v = args[0].toInt32(); + ses->status.visited = v; + + return true; +} + +static bool +session_set_property_reloadlevel(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + JS::ToInt32(ctx, args[0], &ses->reloadlevel); + + return true; +} + +static bool +session_set_property_redirect_cnt(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + JS::ToInt32(ctx, args[0], &ses->redirect_cnt); + + return true; +} + +static bool +session_set_property_search_direction(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + unsigned char *str; + JSString *jsstr; + + jsstr = JS::ToString(ctx, args[0]); + if (!jsstr) return true; + + str = JS_EncodeString(ctx, jsstr); + if (!str) return true; + + if (!strcmp(str, "up")) + ses->search_direction = -1; + else if (!strcmp(str, "down")) + ses->search_direction = 1; + else + return false; + + return true; +} + +static bool +session_set_property_kbdprefix(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + JS::ToInt32(ctx, args[0], &ses->kbdprefix.repeat_count); + + return true; +} + +static bool +session_set_property_mark(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + unsigned char *str; + JSString *jsstr; + + jsstr = JS::ToString(ctx, args[0]); + if (!jsstr) return true; + + str = JS_EncodeString(ctx, jsstr); + if (!str) return true; + + if (!strcmp(str, "nothing")) + ses->kbdprefix.mark = KP_MARK_NOTHING; + else if (!strcmp(str, "set")) + ses->kbdprefix.mark = KP_MARK_SET; + else if (!strcmp(str, "goto")) + ses->kbdprefix.mark = KP_MARK_GOTO; + else + return false; + + return true; +} + +static bool +session_set_property_insert_mode(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + unsigned char *str; + JSString *jsstr; + + jsstr = JS::ToString(ctx, args[0]); + if (!jsstr) return true; + + str = JS_EncodeString(ctx, jsstr); + if (!str) return true; + + if (!strcmp(str, "disabled")) + ses->insert_mode = INSERT_MODE_LESS; + else if (!strcmp(str, "on")) + ses->insert_mode = INSERT_MODE_ON; + else if (!strcmp(str, "off")) + ses->insert_mode = INSERT_MODE_OFF; + else + return false; + + return true; +} + +static bool +session_set_property_navigate_mode(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + unsigned char *str; + JSString *jsstr; + + jsstr = JS::ToString(ctx, args[0]); + if (!jsstr) return true; + + str = JS_EncodeString(ctx, jsstr); + if (!str) return true; + + if (!strcmp(str, "cursor")) + ses->navigate_mode = NAVIGATE_CURSOR_ROUTING; + else if (!strcmp(str, "linkwise")) + ses->navigate_mode = NAVIGATE_LINKWISE; + else + return false; + + return true; +} + +static bool +session_set_property_search_word(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + unsigned char *str; + JSString *jsstr; + + jsstr = JS::ToString(ctx, args[0]); + if (!jsstr) return true; + + str = JS_EncodeString(ctx, jsstr); + if (!str) return true; + + mem_free_set(&ses->search_word, str); + + return true; +} + +static bool +session_set_property_last_search_word(JSContext *ctx, unsigned int argc, jsval *vp) +{ + JS::CallArgs args = CallArgsFromVp(argc, vp); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + + struct session *ses; + + /* This can be called if @obj if not itself an instance of the + * appropriate class but has one in its prototype chain. Fail + * such calls. */ + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; + + ses = JS_GetInstancePrivate(ctx, hobj, + (JSClass *) &session_class, NULL); + if (!ses) return false; + + unsigned char *str; + JSString *jsstr; + + jsstr = JS::ToString(ctx, args[0]); + if (!jsstr) return true; + + str = JS_EncodeString(ctx, jsstr); + if (!str) return true; + + mem_free_set(&ses->last_search_word, str); + + return true; +} + + + +static bool +session_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, bool strict, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); struct session *ses; @@ -324,63 +985,65 @@ session_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &session_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &session_class, NULL)) + return false; - ses = JS_GetInstancePrivate(ctx, obj, + ses = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &session_class, NULL); - if (!ses) return JS_FALSE; + if (!ses) return false; if (!JSID_IS_INT(id)) - return JS_FALSE; + return false; switch (JSID_TO_INT(id)) { case SESSION_VISITED: - ses->status.visited = atol(jsval_to_string(ctx, vp)); + int v; + JS::ToInt32(ctx, hvp, &v); + ses->status.visited = v; - return JS_TRUE; + return true; /* SESSION_HISTORY is RO */ /* SESSION_LOADING_URI is RO */ case SESSION_RELOADLEVEL: - ses->reloadlevel = atol(jsval_to_string(ctx, vp)); + JS::ToInt32(ctx, hvp, &ses->reloadlevel); - return JS_TRUE; + return true; case SESSION_REDIRECT_CNT: - ses->redirect_cnt = atol(jsval_to_string(ctx, vp)); + JS::ToInt32(ctx, hvp, &ses->redirect_cnt); - return JS_TRUE; + return true; case SESSION_SEARCH_DIRECTION: { unsigned char *str; JSString *jsstr; - jsstr = JS_ValueToString(ctx, *vp); - if (!jsstr) return JS_TRUE; + jsstr = JS::ToString(ctx, hvp); + if (!jsstr) return true; str = JS_EncodeString(ctx, jsstr); - if (!str) return JS_TRUE; + if (!str) return true; if (!strcmp(str, "up")) ses->search_direction = -1; else if (!strcmp(str, "down")) ses->search_direction = 1; else - return JS_FALSE; + return false; - return JS_TRUE; + return true; } case SESSION_KBDPREFIX: - ses->kbdprefix.repeat_count = atol(jsval_to_string(ctx, vp)); + JS::ToInt32(ctx, hvp, &ses->kbdprefix.repeat_count); - return JS_TRUE; + return true; case SESSION_MARK_WAITING_FOR: { unsigned char *str; JSString *jsstr; - jsstr = JS_ValueToString(ctx, *vp); - if (!jsstr) return JS_TRUE; + jsstr = JS::ToString(ctx, hvp); + if (!jsstr) return true; str = JS_EncodeString(ctx, jsstr); - if (!str) return JS_TRUE; + if (!str) return true; if (!strcmp(str, "nothing")) ses->kbdprefix.mark = KP_MARK_NOTHING; @@ -389,20 +1052,20 @@ session_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS else if (!strcmp(str, "goto")) ses->kbdprefix.mark = KP_MARK_GOTO; else - return JS_FALSE; + return false; - return JS_TRUE; + return true; } /* SESSION_EXIT_QUERY is RO */ case SESSION_INSERT_MODE: { unsigned char *str; JSString *jsstr; - jsstr = JS_ValueToString(ctx, *vp); - if (!jsstr) return JS_TRUE; + jsstr = JS::ToString(ctx, hvp); + if (!jsstr) return true; str = JS_EncodeString(ctx, jsstr); - if (!str) return JS_TRUE; + if (!str) return true; if (!strcmp(str, "disabled")) ses->insert_mode = INSERT_MODE_LESS; @@ -411,96 +1074,97 @@ session_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS else if (!strcmp(str, "off")) ses->insert_mode = INSERT_MODE_OFF; else - return JS_FALSE; + return false; - return JS_TRUE; + return true; } case SESSION_NAVIGATE_MODE: { unsigned char *str; JSString *jsstr; - jsstr = JS_ValueToString(ctx, *vp); - if (!jsstr) return JS_TRUE; + jsstr = JS::ToString(ctx, hvp); + if (!jsstr) return true; str = JS_EncodeString(ctx, jsstr); - if (!str) return JS_TRUE; + if (!str) return true; if (!strcmp(str, "cursor")) ses->navigate_mode = NAVIGATE_CURSOR_ROUTING; else if (!strcmp(str, "linkwise")) ses->navigate_mode = NAVIGATE_LINKWISE; else - return JS_FALSE; + return false; - return JS_TRUE; + return true; } case SESSION_SEARCH_WORD: { unsigned char *str; JSString *jsstr; - jsstr = JS_ValueToString(ctx, *vp); - if (!jsstr) return JS_TRUE; + jsstr = JS::ToString(ctx, hvp); + if (!jsstr) return true; str = JS_EncodeString(ctx, jsstr); - if (!str) return JS_TRUE; + if (!str) return true; mem_free_set(&ses->search_word, str); - return JS_TRUE; + return true; } case SESSION_LAST_SEARCH_WORD: { unsigned char *str; JSString *jsstr; - jsstr = JS_ValueToString(ctx, *vp); - if (!jsstr) return JS_TRUE; + jsstr = JS::ToString(ctx, hvp); + if (!jsstr) return true; str = JS_EncodeString(ctx, jsstr); - if (!str) return JS_TRUE; + if (!str) return true; mem_free_set(&ses->last_search_word, str); - return JS_TRUE; + return true; } default: INTERNAL("Invalid ID %d in session_set_property().", JSID_TO_INT(id)); } - return JS_FALSE; + return false; } /** Pointed to by session_class.construct. Create a new session (tab) * and return the JSObject wrapper. */ -static JSBool +static bool session_construct(JSContext *ctx, unsigned int argc, jsval *rval) { + JS::CallArgs args = CallArgsFromVp(argc, rval); + JS::RootedObject hobj(ctx, &args.thisv().toObject()); + jsval val; - jsval *argv = JS_ARGV(ctx, rval); int bg = 0; /* open new tab in background */ struct session *ses; JSObject *jsobj; if (argc > 1) { - return JS_TRUE; + return true; } if (argc >= 1) { - bg = jsval_to_boolean(ctx, &argv[0]); + bg = args[0].toBoolean(); } - if (!smjs_ses) return JS_FALSE; + if (!smjs_ses) return false; ses = init_session(smjs_ses, smjs_ses->tab->term, NULL, bg); - if (!ses) return JS_FALSE; + if (!ses) return false; jsobj = smjs_get_session_object(ses); - if (!jsobj) return JS_FALSE; + if (!jsobj) return false; - object_to_jsval(ctx, &val, jsobj); - JS_SET_RVAL(ctx, rval, val); + args.rval().setObject(*jsobj); - return JS_TRUE; + return true; } /** Pointed to by session_class.finalize. SpiderMonkey automatically @@ -540,10 +1204,12 @@ smjs_get_session_object(struct session *ses) assert(smjs_ctx); if_assert_failed return NULL; - obj = JS_NewObject(smjs_ctx, (JSClass *) &session_class, NULL, NULL); + obj = JS_NewObject(smjs_ctx, (JSClass *) &session_class, JS::NullPtr(), JS::NullPtr()); if (!obj) return NULL; - if (JS_FALSE == JS_DefineProperties(smjs_ctx, obj, + JS::RootedObject r_obj(smjs_ctx, obj); + + if (false == JS_DefineProperties(smjs_ctx, r_obj, (JSPropertySpec *) session_props)) return NULL; @@ -568,7 +1234,8 @@ smjs_detach_session_object(struct session *ses) if_assert_failed return; if (ses->jsobject) { - assert(JS_GetInstancePrivate(smjs_ctx, ses->jsobject, + JS::RootedObject r_jsobject(smjs_ctx, ses->jsobject); + assert(JS_GetInstancePrivate(smjs_ctx, r_jsobject, (JSClass *) &session_class, NULL) == ses); if_assert_failed {} @@ -578,7 +1245,9 @@ smjs_detach_session_object(struct session *ses) } if (ses->history_jsobject) { - assert(JS_GetInstancePrivate(smjs_ctx, ses->history_jsobject, + JS::RootedObject r_history_jsobject(smjs_ctx, ses->history_jsobject); + + assert(JS_GetInstancePrivate(smjs_ctx, r_history_jsobject, (JSClass *) &location_array_class, NULL) == ses); @@ -595,7 +1264,7 @@ smjs_detach_session_object(struct session *ses) * already 0 and it is about to be freed. If a JSObject was * previously attached to the session object, the object will remain in * memory but it will no longer be able to access the session object. */ -static JSBool +static bool session_array_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) { ELINKS_CAST_PROP_PARAMS @@ -609,22 +1278,22 @@ session_array_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId h undef_to_jsval(ctx, vp); if (!JSID_IS_INT(id)) - return JS_FALSE; + return false; assert(term); - if_assert_failed return JS_TRUE; + if_assert_failed return true; index = JSID_TO_INT(id); foreach_tab (tab, term->windows) { if (!index) break; --index; } - if ((void *) tab == (void *) &term->windows) return JS_FALSE; + if ((void *) tab == (void *) &term->windows) return false; tabobj = smjs_get_session_object(tab->data); if (tabobj) object_to_jsval(ctx, vp, tabobj); - return JS_TRUE; + return true; } static const JSClass session_array_class = { @@ -644,7 +1313,7 @@ smjs_get_session_array_object(struct terminal *term) if_assert_failed return NULL; obj = JS_NewObject(smjs_ctx, (JSClass *) &session_array_class, - NULL, NULL); + JS::NullPtr(), JS::NullPtr()); if (!obj) return NULL; JS_SetPrivate(obj, term); @@ -665,7 +1334,8 @@ smjs_detach_session_array_object(struct terminal *term) if (!term->session_array_jsobject) return; - assert(JS_GetInstancePrivate(smjs_ctx, term->session_array_jsobject, + JS::RootedObject r_term_session_array_jsobject(smjs_ctx, term->session_array_jsobject); + assert(JS_GetInstancePrivate(smjs_ctx, r_term_session_array_jsobject, (JSClass *) &session_array_class, NULL) == term); if_assert_failed {} @@ -674,41 +1344,40 @@ smjs_detach_session_array_object(struct terminal *term) term->session_array_jsobject = NULL; } -static JSBool +static bool smjs_session_goto_url(JSContext *ctx, unsigned int argc, jsval *rval) { - jsval val; + JS::CallArgs args = CallArgsFromVp(argc, rval); + JS::RootedObject this_o(ctx, &args.thisv().toObject()); + struct delayed_open *deo; struct uri *uri; - jsval *argv = JS_ARGV(ctx, rval); JSString *jsstr; unsigned char *url; struct session *ses; - struct JSObject *this_o; - if (argc != 1) return JS_FALSE; + if (argc != 1) return false; - this_o = JS_THIS_OBJECT(ctx, rval); if (!JS_InstanceOf(ctx, this_o, (JSClass *) &session_class, NULL)) - return JS_FALSE; + return false; ses = JS_GetInstancePrivate(ctx, this_o, (JSClass *) &session_class, NULL); - if (!ses) return JS_FALSE; /* detached */ + if (!ses) return false; /* detached */ - jsstr = JS_ValueToString(ctx, argv[0]); - if (!jsstr) return JS_FALSE; + jsstr = JS::ToString(ctx, args[0]); + if (!jsstr) return false; url = JS_EncodeString(ctx, jsstr); - if (!url) return JS_FALSE; + if (!url) return false; uri = get_uri(url, 0); - if (!uri) return JS_FALSE; + if (!uri) return false; deo = mem_calloc(1, sizeof(*deo)); if (!deo) { done_uri(uri); - return JS_FALSE; + return false; } deo->ses = ses; @@ -716,12 +1385,11 @@ smjs_session_goto_url(JSContext *ctx, unsigned int argc, jsval *rval) /* deo->target = NULL; */ register_bottom_half(delayed_goto_uri_frame, deo); - undef_to_jsval(ctx, &val); - JS_SET_RVAL(ctx, rval, val); + args.rval().setUndefined(); done_uri(uri); - return JS_TRUE; + return true; } static const spidermonkeyFunctionSpec session_funcs[] = { diff --git a/src/scripting/smjs/terminal_object.c b/src/scripting/smjs/terminal_object.c index c1cf3e2d..4a3a1992 100644 --- a/src/scripting/smjs/terminal_object.c +++ b/src/scripting/smjs/terminal_object.c @@ -17,7 +17,7 @@ #include "util/memory.h" #include "viewer/text/vs.h" -static JSBool terminal_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); +static bool terminal_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); static void terminal_finalize(JSFreeOp *op, JSObject *obj); static const JSClass terminal_class = { @@ -38,10 +38,9 @@ static const JSPropertySpec terminal_props[] = { }; /* @terminal_class.getProperty */ -static JSBool +static bool terminal_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); struct terminal *term; @@ -49,31 +48,33 @@ terminal_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, J /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &terminal_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &terminal_class, NULL)) + return false; - term = JS_GetInstancePrivate(ctx, obj, + term = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &terminal_class, NULL); - if (!term) return JS_FALSE; /* already detached */ + if (!term) return false; /* already detached */ - undef_to_jsval(ctx, vp); + hvp.setUndefined(); - if (!JSID_IS_INT(id)) return JS_FALSE; + if (!JSID_IS_INT(id)) return false; switch (JSID_TO_INT(id)) { case TERMINAL_TAB: { JSObject *obj = smjs_get_session_array_object(term); - if (obj) object_to_jsval(ctx, vp, obj); + if (obj) { + hvp.setObject(*obj); + } - return JS_TRUE; + return true; } default: INTERNAL("Invalid ID %d in terminal_get_property().", JSID_TO_INT(id)); } - return JS_FALSE; + return false; } /** Pointed to by terminal_class.finalize. SpiderMonkey automatically @@ -111,11 +112,12 @@ smjs_get_terminal_object(struct terminal *term) assert(smjs_ctx); if_assert_failed return NULL; - obj = JS_NewObject(smjs_ctx, (JSClass *) &terminal_class, NULL, NULL); + obj = JS_NewObject(smjs_ctx, (JSClass *) &terminal_class, JS::NullPtr(), JS::NullPtr()); if (!obj) return NULL; - if (JS_FALSE == JS_DefineProperties(smjs_ctx, obj, + JS::RootedObject robj(smjs_ctx, obj); + if (false == JS_DefineProperties(smjs_ctx, robj, (JSPropertySpec *) terminal_props)) return NULL; @@ -143,7 +145,9 @@ smjs_detach_terminal_object(struct terminal *term) if (!term->jsobject) return; - assert(JS_GetInstancePrivate(smjs_ctx, term->jsobject, + JS::RootedObject r_jsobject(smjs_ctx, term->jsobject); + + assert(JS_GetInstancePrivate(smjs_ctx, r_jsobject, (JSClass *) &terminal_class, NULL) == term); if_assert_failed {} @@ -154,31 +158,32 @@ smjs_detach_terminal_object(struct terminal *term) /* @terminal_array_class.getProperty */ -static JSBool +static bool terminal_array_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); int index; struct terminal *term; - undef_to_jsval(ctx, vp); + hvp.setUndefined(); if (!JSID_IS_INT(id)) - return JS_FALSE; + return false; index = JSID_TO_INT(id); foreach (term, terminals) { if (!index) break; --index; } - if ((void *) term == (void *) &terminals) return JS_FALSE; + if ((void *) term == (void *) &terminals) return false; - obj = smjs_get_terminal_object(term); - if (obj) object_to_jsval(ctx, vp, obj); + JSObject *obj = smjs_get_terminal_object(term); + if (obj) { + hvp.setObject(*obj); + } - return JS_TRUE; + return true; ; } @@ -199,7 +204,7 @@ smjs_get_terminal_array_object(void) if_assert_failed return NULL; return JS_NewObject(smjs_ctx, (JSClass *) &terminal_array_class, - NULL, NULL); + JS::NullPtr(), JS::NullPtr()); } void @@ -214,7 +219,9 @@ smjs_init_terminal_interface(void) obj = smjs_get_terminal_array_object(); if (!obj) return; - val = OBJECT_TO_JSVAL(obj); + JS::RootedValue rval(smjs_ctx, val); + rval.setObject(*obj); + JS::RootedObject r_smjs_elinks_object(smjs_ctx, smjs_elinks_object); - JS_SetProperty(smjs_ctx, smjs_elinks_object, "terminal", &val); + JS_SetProperty(smjs_ctx, r_smjs_elinks_object, "terminal", rval); } diff --git a/src/scripting/smjs/view_state_object.c b/src/scripting/smjs/view_state_object.c index 158d08e7..a8be80bd 100644 --- a/src/scripting/smjs/view_state_object.c +++ b/src/scripting/smjs/view_state_object.c @@ -20,8 +20,8 @@ #include "util/memory.h" #include "viewer/text/vs.h" -static JSBool view_state_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); -static JSBool view_state_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp); +static bool view_state_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp); +static bool view_state_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, bool strict, JS::MutableHandleValue hvp); static void view_state_finalize(JSFreeOp *op, JSObject *obj); static const JSClass view_state_class = { @@ -42,16 +42,15 @@ enum view_state_prop { }; static const JSPropertySpec view_state_props[] = { - { "plain", VIEW_STATE_PLAIN, JSPROP_ENUMERATE }, - { "uri", VIEW_STATE_URI, JSPROP_ENUMERATE | JSPROP_READONLY }, + { "plain", (unsigned char)VIEW_STATE_PLAIN, JSPROP_ENUMERATE }, + { "uri", (unsigned char)VIEW_STATE_URI, JSPROP_ENUMERATE | JSPROP_READONLY }, { NULL } }; /* @view_state_class.getProperty */ -static JSBool +static bool view_state_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); struct view_state *vs; @@ -59,44 +58,42 @@ view_state_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &view_state_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &view_state_class, NULL)) + return false; - vs = JS_GetInstancePrivate(ctx, obj, + vs = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &view_state_class, NULL); - if (!vs) return JS_FALSE; + if (!vs) return false; - undef_to_jsval(ctx, vp); + hvp.setUndefined(); if (!JSID_IS_INT(id)) - return JS_FALSE; + return false; switch (JSID_TO_INT(id)) { case VIEW_STATE_PLAIN: - *vp = INT_TO_JSVAL(vs->plain); + hvp.setInt32(vs->plain); - return JS_TRUE; + return true; case VIEW_STATE_URI: - *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, - struri(vs->uri))); + hvp.setString(JS_NewStringCopyZ(smjs_ctx, struri(vs->uri))); - return JS_TRUE; + return true; default: /* Unrecognized integer property ID; someone is using * the object as an array. SMJS builtin classes (e.g. - * js_RegExpClass) just return JS_TRUE in this case + * js_RegExpClass) just return true in this case * and leave *@vp unchanged. Do the same here. * (Actually not quite the same, as we already used * @undef_to_jsval.) */ - return JS_TRUE; + return true; } } /* @view_state_class.setProperty */ -static JSBool -view_state_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JSBool strict, JS::MutableHandleValue hvp) +static bool +view_state_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, bool strict, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS jsid id = hid.get(); struct view_state *vs; @@ -104,28 +101,28 @@ view_state_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ - if (!JS_InstanceOf(ctx, obj, (JSClass *) &view_state_class, NULL)) - return JS_FALSE; + if (!JS_InstanceOf(ctx, hobj, (JSClass *) &view_state_class, NULL)) + return false; - vs = JS_GetInstancePrivate(ctx, obj, + vs = JS_GetInstancePrivate(ctx, hobj, (JSClass *) &view_state_class, NULL); - if (!vs) return JS_FALSE; + if (!vs) return false; if (!JSID_IS_INT(id)) - return JS_FALSE; + return false; switch (JSID_TO_INT(id)) { case VIEW_STATE_PLAIN: { - vs->plain = atol(jsval_to_string(ctx, vp)); + vs->plain = hvp.toInt32(); - return JS_TRUE; + return true; } default: /* Unrecognized integer property ID; someone is using * the object as an array. SMJS builtin classes (e.g. - * js_RegExpClass) just return JS_TRUE in this case. + * js_RegExpClass) just return true in this case. * Do the same here. */ - return JS_TRUE; + return true; } } @@ -169,11 +166,13 @@ smjs_get_view_state_object(struct view_state *vs) view_state_object = JS_NewObject(smjs_ctx, (JSClass *) &view_state_class, - NULL, NULL); + JS::NullPtr(), JS::NullPtr()); if (!view_state_object) return NULL; - if (JS_FALSE == JS_DefineProperties(smjs_ctx, view_state_object, + JS::RootedObject r_view_state_object(smjs_ctx, view_state_object); + + if (false == JS_DefineProperties(smjs_ctx, r_view_state_object, (JSPropertySpec *) view_state_props)) return NULL; @@ -186,28 +185,25 @@ smjs_get_view_state_object(struct view_state *vs) return view_state_object; } -static JSBool +static bool smjs_elinks_get_view_state(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp) { - ELINKS_CAST_PROP_PARAMS - (void)obj; - JSObject *vs_obj; struct view_state *vs; - *vp = JSVAL_NULL; + hvp.setNull(); - if (!smjs_ses || !have_location(smjs_ses)) return JS_TRUE; + if (!smjs_ses || !have_location(smjs_ses)) return true; vs = &cur_loc(smjs_ses)->vs; - if (!vs) return JS_TRUE; + if (!vs) return true; vs_obj = smjs_get_view_state_object(vs); - if (!vs_obj) return JS_TRUE; + if (!vs_obj) return true; - *vp = OBJECT_TO_JSVAL(vs_obj); + hvp.setObject(*vs_obj); - return JS_TRUE; + return true; } /** Ensure that no JSObject contains the pointer @a vs. This is called from @@ -223,7 +219,9 @@ smjs_detach_view_state_object(struct view_state *vs) if (!vs->jsobject) return; - assert(JS_GetInstancePrivate(smjs_ctx, vs->jsobject, + JS::RootedObject r_vs_jsobject(smjs_ctx, vs->jsobject); + + assert(JS_GetInstancePrivate(smjs_ctx, r_vs_jsobject, (JSClass *) &view_state_class, NULL) == vs); if_assert_failed {} @@ -238,7 +236,9 @@ smjs_init_view_state_interface(void) if (!smjs_ctx || !smjs_elinks_object) return; - JS_DefineProperty(smjs_ctx, smjs_elinks_object, "vs", JSVAL_NULL, - smjs_elinks_get_view_state, JS_StrictPropertyStub, - JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_READONLY); + JS::RootedObject r_smjs_elinks_object(smjs_ctx, smjs_elinks_object); + + JS_DefineProperty(smjs_ctx, r_smjs_elinks_object, "vs", (int32_t)0, + (unsigned int)(JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_READONLY), smjs_elinks_get_view_state, JS_StrictPropertyStub + ); }