1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-12-04 14:46:47 -05:00

[mozjs38] ELinks is compilable, was not heavily tested.

This commit is contained in:
Witold Filipczyk 2020-10-16 19:54:02 +02:00
parent ca24054cc6
commit 01c511f52d
25 changed files with 345 additions and 478 deletions

View File

@ -612,11 +612,11 @@ case "$with_spidermonkey" in
;;
esac
for package in mozjs-31; do
for package in mozjs-38; do
if test -n "$CONFIG_SPIDERMONKEY"; then
break
else
AC_MSG_CHECKING([for SpiderMonkey (mozjs-31) in pkg-config $package])
AC_MSG_CHECKING([for SpiderMonkey (mozjs-38) in pkg-config $package])
if $PKG_CONFIG --cflags --libs $package > /dev/null 2>&AS_MESSAGE_LOG_FD; then
SPIDERMONKEY_LIBS="$($PKG_CONFIG --libs $package)"
SPIDERMONKEY_CFLAGS="$($PKG_CONFIG --cflags $package)"

View File

@ -271,7 +271,7 @@ if conf_data.get('CONFIG_BZIP2')
endif
if conf_data.get('CONFIG_ECMASCRIPT')
mozjsdeps = dependency('mozjs-24')
mozjsdeps = dependency('mozjs-38')
deps += mozjsdeps
endif

View File

@ -48,7 +48,7 @@ spidermonkey_runtime_addref(void)
return 0;
}
spidermonkey_runtime = JS_NewRuntime(4L * 1024L * 1024L, JS_USE_HELPER_THREADS);
spidermonkey_runtime = JS_NewRuntime(4L * 1024L * 1024L);
if (!spidermonkey_runtime) return 0;
spidermonkey_empty_context = JS_NewContext(spidermonkey_runtime,

View File

@ -69,7 +69,7 @@ static inline unsigned char *
jsval_to_string(JSContext *ctx, jsval *vp)
{
JS::RootedValue r_vp(ctx, *vp);
JSString *str = JS::ToString(ctx, r_vp);
JSString *str = r_vp.toString();
return empty_string_or_(JS_EncodeString(ctx, str));
}

View File

@ -142,7 +142,7 @@ spidermonkey_get_interpreter(struct ecmascript_interpreter *interpreter)
JSAutoRequest ar(ctx);
JS_SetContextPrivate(ctx, interpreter);
//JS_SetOptions(ctx, JSOPTION_VAROBJFIX | JS_METHODJIT);
JS_SetErrorReporter(ctx, error_reporter);
JS_SetErrorReporter(spidermonkey_runtime, error_reporter);
JS_SetInterruptCallback(spidermonkey_runtime, heartbeat_callback);
JS::RootedObject window_obj(ctx, JS_NewGlobalObject(ctx, &window_class, NULL, JS::DontFireOnNewGlobalHook));
@ -265,8 +265,9 @@ spidermonkey_eval(struct ecmascript_interpreter *interpreter,
JS::RootedObject cg(ctx, JS::CurrentGlobalOrNull(ctx));
JS::RootedValue r_val(ctx, rval);
JS::CompileOptions options(ctx);
JS_EvaluateScript(ctx, cg, code->source, code->length, "", 0, &r_val);
JS::Evaluate(ctx, cg, options, code->source, code->length, &r_val);
done_heartbeat(interpreter->heartbeat);
}
@ -287,7 +288,14 @@ spidermonkey_eval_stringback(struct ecmascript_interpreter *interpreter,
JS::RootedObject cg(ctx, JS::CurrentGlobalOrNull(ctx));
JS::RootedValue r_rval(ctx, rval);
ret = JS_EvaluateScript(ctx, cg, code->source, code->length, "", 0, &r_rval);
JS::CompileOptions options(ctx);
// options.setIntroductionType("js shell load")
// .setUTF8(true)
// .setCompileAndGo(true)
// .setNoScriptRval(true);
ret = JS::Evaluate(ctx, cg, options, code->source, code->length, &r_rval);
done_heartbeat(interpreter->heartbeat);
if (ret == false) {
@ -298,7 +306,7 @@ spidermonkey_eval_stringback(struct ecmascript_interpreter *interpreter,
return NULL;
}
return stracpy(JS_EncodeString(ctx, JS::ToString(ctx, r_rval)));
return stracpy(JS_EncodeString(ctx, r_rval.toString()));
}
@ -307,7 +315,7 @@ spidermonkey_eval_boolback(struct ecmascript_interpreter *interpreter,
struct string *code)
{
JSContext *ctx;
JSFunction *fun;
JS::RootedFunction fun(ctx);
jsval rval;
int ret;
@ -317,16 +325,16 @@ spidermonkey_eval_boolback(struct ecmascript_interpreter *interpreter,
interpreter->ret = NULL;
JS::CompileOptions options(ctx);
JS::RootedObject cg(ctx, JS::CurrentGlobalOrNull(ctx));
fun = JS_CompileFunction(ctx, cg, "", 0, NULL, code->source,
code->length, options);
if (!fun)
JS::AutoObjectVector ag(ctx);
if (!JS::CompileFunction(ctx, ag, options, "", 0, nullptr, code->source,
code->length, &fun)) {
return -1;
};
interpreter->heartbeat = add_heartbeat(interpreter);
JS::RootedFunction r_fun(ctx, fun);
JS::RootedValue r_val(ctx, rval);
ret = JS_CallFunction(ctx, cg, r_fun, JS::HandleValueArray::empty(), &r_val);
JS::RootedObject cg(ctx, JS::CurrentGlobalOrNull(ctx));
ret = JS_CallFunction(ctx, cg, fun, JS::HandleValueArray::empty(), &r_val);
done_heartbeat(interpreter->heartbeat);
if (ret == 2) { /* onClick="history.back()" */
@ -335,12 +343,12 @@ spidermonkey_eval_boolback(struct ecmascript_interpreter *interpreter,
if (ret == false) {
return -1;
}
if (JSVAL_IS_VOID(rval)) {
if (r_val.isUndefined()) {
/* Undefined value. */
return -1;
}
return jsval_to_boolean(ctx, &rval);
return r_val.toBoolean();
}
struct module spidermonkey_module = struct_module(

View File

@ -53,9 +53,9 @@ static bool document_get_property(JSContext *ctx, JS::HandleObject hobj, JS::Han
JSClass document_class = {
"document",
JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
document_get_property, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub
nullptr, nullptr, nullptr
};
#ifdef CONFIG_COOKIES

View File

@ -69,9 +69,9 @@ static void form_finalize(JSFreeOp *op, JSObject *obj);
static JSClass form_class = {
"form",
JSCLASS_HAS_PRIVATE, /* struct form_view *, or NULL if detached */
JS_PropertyStub, JS_PropertyStub,
JS_PropertyStub, nullptr,
form_get_property, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, form_finalize
nullptr, nullptr, nullptr, form_finalize
};
@ -89,9 +89,9 @@ static void input_finalize(JSFreeOp *op, JSObject *obj);
static JSClass input_class = {
"input", /* here, we unleash ourselves */
JSCLASS_HAS_PRIVATE, /* struct form_state *, or NULL if detached */
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
input_get_property, input_set_property,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, input_finalize
nullptr, nullptr, nullptr, input_finalize
};
/* Tinyids of properties. Use negative values to distinguish these
@ -228,12 +228,43 @@ input_set_property_accessKey(JSContext *ctx, unsigned int argc, jsval *vp)
/* Hiddens have no link. */
if (linknum >= 0) link = &document->links[linknum];
accesskey = jsval_to_accesskey(ctx, args[0]);
// accesskey = jsval_to_accesskey(ctx, args[0]);
if (accesskey == UCS_NO_CHAR)
size_t len;
char16_t chr[2];
accesskey = UCS_NO_CHAR;
if (!args[0].isString()) {
return false;
else if (link)
}
JSString *str = args[0].toString();
len = JS_GetStringLength(str);
/* This implementation ignores extra characters in the string. */
if (len < 1) {
accesskey = 0; /* which means no access key */
} else if (len == 1) {
JS_GetStringCharAt(ctx, str, 0, &chr[0]);
if (!is_utf16_surrogate(chr[0])) {
accesskey = chr[0];
}
} else {
JS_GetStringCharAt(ctx, str, 1, &chr[1]);
if (is_utf16_high_surrogate(chr[0])
&& is_utf16_low_surrogate(chr[1])) {
accesskey = join_utf16_surrogates(chr[0], chr[1]);
}
}
if (accesskey == UCS_NO_CHAR) {
JS_ReportError(ctx, "Invalid UTF-16 sequence");
return false;
}
if (link) {
link->accesskey = accesskey;
}
return true;
}
@ -1601,8 +1632,7 @@ input_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, bool
: FORM_MODE_NORMAL);
break;
case JSP_INPUT_MAX_LENGTH:
if (!JS::ToInt32(ctx, hvp, &fc->maxlength))
return false;
fc->maxlength = hvp.toInt32();
break;
case JSP_INPUT_NAME:
mem_free_set(&fc->name, stracpy(jsval_to_string(ctx, vp)));
@ -1627,10 +1657,7 @@ input_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, bool
break;
case JSP_INPUT_SELECTED_INDEX:
if (fc->type == FC_SELECT) {
int item;
if (!JS::ToInt32(ctx, hvp, &item))
return false;
int item = hvp.toInt32();
if (item >= 0 && item < fc->nvalues) {
fs->state = item;
@ -1798,7 +1825,7 @@ get_input_object(JSContext *ctx, JSObject *jsform, struct form_state *fs)
/* jsform ('form') is input's parent */
/* FIXME: That is NOT correct since the real containing element
* should be its parent, but gimme DOM first. --pasky */
jsinput = JS_NewObject(ctx, &input_class, JS::NullPtr(), r_jsform);
jsinput = JS_NewObject(ctx, &input_class, r_jsform);
if (!jsinput)
return NULL;
@ -1908,13 +1935,13 @@ static bool form_elements_get_property(JSContext *ctx, JS::HandleObject hobj, JS
static JSClass form_elements_class = {
"elements",
JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
form_elements_get_property, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL
nullptr, nullptr, nullptr, nullptr
};
static bool form_elements_item2(JSContext *ctx, JSObject *obj, int index, jsval *rval);
static bool form_elements_namedItem2(JSContext *ctx, JSObject *obj, unsigned char *string, jsval *rval);
static bool form_elements_item2(JSContext *ctx, JS::HandleObject hobj, int index, JS::MutableHandleValue hvp);
static bool form_elements_namedItem2(JSContext *ctx, JS::HandleObject hobj, unsigned char *string, JS::MutableHandleValue hvp);
static bool form_elements_item(JSContext *ctx, unsigned int argc, jsval *rval);
static bool form_elements_namedItem(JSContext *ctx, unsigned int argc, jsval *rval);
@ -1942,7 +1969,6 @@ static JSPropertySpec form_elements_props[] = {
static bool
form_elements_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp)
{
ELINKS_CAST_PROP_PARAMS
jsid id = hid.get();
jsval idval;
@ -1962,7 +1988,7 @@ form_elements_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId h
if (!JS_InstanceOf(ctx, hobj, &form_elements_class, NULL)) {
return false;
}
parent_form = JS_GetParent(obj);
parent_form = JS_GetParent(hobj);
assert(JS_InstanceOf(ctx, parent_form, &form_class, NULL));
if_assert_failed return false;
parent_doc = JS_GetParent(parent_form);
@ -1983,8 +2009,8 @@ form_elements_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId h
if (JSID_IS_STRING(id)) {
JS::RootedValue r_idval(ctx, idval);
JS_IdToValue(ctx, id, &r_idval);
unsigned char *string = JS_EncodeString(ctx, JS::ToString(ctx, r_idval));
form_elements_namedItem2(ctx, obj, string, vp);
unsigned char *string = JS_EncodeString(ctx, r_idval.toString());
form_elements_namedItem2(ctx, hobj, string, hvp);
return true;
}
@ -1992,19 +2018,19 @@ form_elements_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId h
return true;
}
undef_to_jsval(ctx, vp);
hvp.setUndefined();
switch (JSID_TO_INT(id)) {
case JSP_FORM_ELEMENTS_LENGTH:
int_to_jsval(ctx, vp, list_size(&form->items));
hvp.setInt32(list_size(&form->items));
break;
default:
/* Array index. */
int index;
JS::RootedValue r_idval(ctx, idval);
JS_IdToValue(ctx, id, &r_idval);
JS::ToInt32(ctx, r_idval, &index);
form_elements_item2(ctx, obj, index, vp);
index = r_idval.toInt32();
form_elements_item2(ctx, hobj, index, hvp);
break;
}
@ -2056,24 +2082,23 @@ form_elements_get_property_length(JSContext *ctx, unsigned int argc, jsval *vp)
/* @form_elements_funcs{"item"} */
static bool
form_elements_item(JSContext *ctx, unsigned int argc, jsval *rval)
form_elements_item(JSContext *ctx, unsigned int argc, jsval *vp)
{
jsval val = JSVAL_VOID;
JSObject *obj = JS_THIS_OBJECT(ctx, rval);
JS::CallArgs args = JS::CallArgsFromVp(argc, rval);
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
JS::RootedObject hobj(ctx, &args.thisv().toObject());
JS::RootedValue rval(ctx, val);
int index;
JS::ToInt32(ctx, args[0], &index);
int index = args[0].toInt32();
bool ret = form_elements_item2(ctx, obj, index, &val);
bool ret = form_elements_item2(ctx, hobj, index, &rval);
args.rval().set(rval.get());
args.rval().set(val);
// JS_SET_RVAL(ctx, rval, val);
return ret;
}
static bool
form_elements_item2(JSContext *ctx, JSObject *obj, int index, jsval *rval)
form_elements_item2(JSContext *ctx, JS::HandleObject hobj, int index, JS::MutableHandleValue hvp)
{
JS::RootedObject parent_form(ctx); /* instance of @form_class */
JS::RootedObject parent_doc(ctx); /* instance of @document_class */
@ -2086,10 +2111,8 @@ form_elements_item2(JSContext *ctx, JSObject *obj, int index, jsval *rval)
struct el_form_control *fc;
int counter = -1;
JS::RootedObject hobj(ctx, obj);
if (!JS_InstanceOf(ctx, hobj, &form_elements_class, NULL)) return false;
parent_form = JS_GetParent(obj);
parent_form = JS_GetParent(hobj);
assert(JS_InstanceOf(ctx, parent_form, &form_class, NULL));
if_assert_failed return false;
parent_doc = JS_GetParent(parent_form);
@ -2107,7 +2130,7 @@ form_elements_item2(JSContext *ctx, JSObject *obj, int index, jsval *rval)
if (!form_view) return false; /* detached */
form = find_form_by_form_view(document, form_view);
undef_to_jsval(ctx, rval);
hvp.setUndefined();
foreach (fc, form->items) {
counter++;
@ -2117,8 +2140,9 @@ form_elements_item2(JSContext *ctx, JSObject *obj, int index, jsval *rval)
if (fs) {
JSObject *fcobj = get_form_control_object(ctx, parent_form, fc->type, fs);
if (fcobj)
object_to_jsval(ctx, rval, fcobj);
if (fcobj) {
hvp.setObject(*fcobj);
}
}
break;
}
@ -2129,21 +2153,24 @@ form_elements_item2(JSContext *ctx, JSObject *obj, int index, jsval *rval)
/* @form_elements_funcs{"namedItem"} */
static bool
form_elements_namedItem(JSContext *ctx, unsigned int argc, jsval *rval)
form_elements_namedItem(JSContext *ctx, unsigned int argc, jsval *vp)
{
jsval val = JSVAL_VOID;
JSObject *obj = JS_THIS_OBJECT(ctx, rval);
JS::CallArgs args = JS::CallArgsFromVp(argc, rval);
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
JS::RootedObject hobj(ctx, &args.thisv().toObject());
JS::RootedValue rval(ctx, val);
// jsval *argv = JS_ARGV(ctx, rval);
unsigned char *string = JS_EncodeString(ctx, JS::ToString(ctx, args[0]));
bool ret = form_elements_namedItem2(ctx, obj, string, &val);
args.rval().set(val);
unsigned char *string = JS_EncodeString(ctx, args[0].toString());
bool ret = form_elements_namedItem2(ctx, hobj, string, &rval);
args.rval().set(rval);
// JS_SET_RVAL(ctx, rval, val);
return ret;
}
static bool
form_elements_namedItem2(JSContext *ctx, JSObject *obj, unsigned char *string, jsval *rval)
form_elements_namedItem2(JSContext *ctx, JS::HandleObject hobj, unsigned char *string, JS::MutableHandleValue hvp)
{
JS::RootedObject parent_form(ctx); /* instance of @form_class */
JS::RootedObject parent_doc(ctx); /* instance of @document_class */
@ -2159,10 +2186,8 @@ form_elements_namedItem2(JSContext *ctx, JSObject *obj, unsigned char *string, j
return true;
}
JS::RootedObject hobj(ctx, obj);
if (!JS_InstanceOf(ctx, hobj, &form_elements_class, NULL)) return false;
parent_form = JS_GetParent(obj);
parent_form = JS_GetParent(hobj);
assert(JS_InstanceOf(ctx, parent_form, &form_class, NULL));
if_assert_failed return false;
parent_doc = JS_GetParent(parent_form);
@ -2180,7 +2205,7 @@ form_elements_namedItem2(JSContext *ctx, JSObject *obj, unsigned char *string, j
if (!form_view) return false; /* detached */
form = find_form_by_form_view(document, form_view);
undef_to_jsval(ctx, rval);
hvp.setUndefined();
foreach (fc, form->items) {
if ((fc->id && !c_strcasecmp(string, fc->id))
@ -2190,8 +2215,9 @@ form_elements_namedItem2(JSContext *ctx, JSObject *obj, unsigned char *string, j
if (fs) {
JSObject *fcobj = get_form_control_object(ctx, parent_form, fc->type, fs);
if (fcobj)
object_to_jsval(ctx, rval, fcobj);
if (fcobj) {
hvp.setObject(*fcobj);
}
}
break;
}
@ -2325,7 +2351,7 @@ form_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::M
case JSP_FORM_ELEMENTS:
{
/* jsform ('form') is form_elements' parent; who knows is that's correct */
JSObject *jsform_elems = JS_NewObject(ctx, &form_elements_class, JS::NullPtr(), hobj);
JSObject *jsform_elems = JS_NewObject(ctx, &form_elements_class, hobj);
JS::RootedObject r_jsform_elems(ctx, jsform_elems);
@ -2500,7 +2526,7 @@ form_get_property_elements(JSContext *ctx, unsigned int argc, jsval *vp)
if (!fv) return false; /* detached */
/* jsform ('form') is form_elements' parent; who knows is that's correct */
JSObject *jsform_elems = JS_NewObject(ctx, &form_elements_class, JS::NullPtr(), hobj);
JSObject *jsform_elems = JS_NewObject(ctx, &form_elements_class, hobj);
JS::RootedObject r_jsform_elems(ctx, jsform_elems);
JS_DefineProperties(ctx, r_jsform_elems, (JSPropertySpec *) form_elements_props);
@ -3030,7 +3056,7 @@ get_form_object(JSContext *ctx, JSObject *jsdoc, struct form_view *fv)
/* jsdoc ('document') is fv's parent */
/* FIXME: That is NOT correct since the real containing element
* should be its parent, but gimme DOM first. --pasky */
jsform = JS_NewObject(ctx, &form_class, JS::NullPtr(), r_jsdoc);
jsform = JS_NewObject(ctx, &form_class, r_jsdoc);
if (jsform == NULL)
return NULL;
JS::RootedObject r_jsform(ctx, jsform);
@ -3095,13 +3121,13 @@ static bool forms_get_property_length(JSContext *ctx, unsigned int argc, jsval *
JSClass forms_class = {
"forms",
JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub,
JS_PropertyStub, nullptr,
forms_get_property, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL
nullptr, nullptr, nullptr, nullptr
};
static bool forms_item(JSContext *ctx, unsigned int argc, jsval *rval);
static bool forms_item2(JSContext *ctx, JSObject *obj, unsigned int argc, jsval *argv, jsval *rval);
static bool forms_item2(JSContext *ctx, JS::HandleObject hobj, int index, JS::MutableHandleValue hvp);
static bool forms_namedItem(JSContext *ctx, unsigned int argc, jsval *rval);
const spidermonkeyFunctionSpec forms_funcs[] = {
@ -3126,9 +3152,9 @@ JSPropertySpec forms_props[] = {
* string (but might not be). If found, set *rval = the DOM
* object. If not found, leave *rval unchanged. */
static void
find_form_by_name(JSContext *ctx, JSObject *jsdoc,
find_form_by_name(JSContext *ctx, JS::HandleObject jsdoc,
struct document_view *doc_view,
unsigned char *string, jsval *rval)
unsigned char *string, JS::MutableHandleValue hvp)
{
struct form *form;
@ -3137,7 +3163,7 @@ find_form_by_name(JSContext *ctx, JSObject *jsdoc,
foreach (form, doc_view->document->forms) {
if (form->name && !c_strcasecmp(string, form->name)) {
object_to_jsval(ctx, rval, get_form_object(ctx, jsdoc,
hvp.setObject(*get_form_object(ctx, jsdoc,
find_form_view(doc_view, form)));
break;
}
@ -3148,7 +3174,6 @@ find_form_by_name(JSContext *ctx, JSObject *jsdoc,
static bool
forms_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::MutableHandleValue hvp)
{
ELINKS_CAST_PROP_PARAMS
jsid id = hid.get();
jsval idval;
@ -3163,7 +3188,7 @@ forms_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::
if (!JS_InstanceOf(ctx, hobj, &forms_class, NULL))
return false;
parent_doc = JS_GetParent(obj);
parent_doc = JS_GetParent(hobj);
assert(JS_InstanceOf(ctx, parent_doc, &document_class, NULL));
if_assert_failed return false;
@ -3190,8 +3215,8 @@ forms_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::
* we must leave *vp unchanged here, to avoid
* "TypeError: forms.namedItem is not a function". */
JS_IdToValue(ctx, id, &r_idval);
unsigned char *string = JS_EncodeString(ctx, JS::ToString(ctx, r_idval));
find_form_by_name(ctx, parent_doc, doc_view, string, vp);
unsigned char *string = JS_EncodeString(ctx, r_idval.toString());
find_form_by_name(ctx, parent_doc, doc_view, string, hvp);
return true;
}
@ -3199,7 +3224,8 @@ forms_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS::
/* Array index. */
JS::RootedValue r_idval(ctx, idval);
JS_IdToValue(ctx, id, &r_idval);
forms_item2(ctx, obj, 1, &idval, vp);
int index = r_idval.toInt32();
forms_item2(ctx, hobj, index, hvp);
return true;
}
@ -3242,36 +3268,36 @@ forms_get_property_length(JSContext *ctx, unsigned int argc, jsval *vp)
/* @forms_funcs{"item"} */
static bool
forms_item(JSContext *ctx, unsigned int argc, jsval *rval)
forms_item(JSContext *ctx, unsigned int argc, jsval *vp)
{
jsval val = JSVAL_VOID;
JSObject *obj = JS_THIS_OBJECT(ctx, rval);
JS::CallArgs args = JS::CallArgsFromVp(argc, rval);
// jsval *argv = JS_ARGV(ctx, rval);
bool ret = forms_item2(ctx, obj, argc, rval, &val);
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
JS::RootedObject hobj(ctx, &args.thisv().toObject());
JS::RootedValue rval(ctx, val);
args.rval().set(val);
// jsval *argv = JS_ARGV(ctx, rval);
int index = args[0].toInt32();
bool ret = forms_item2(ctx, hobj, index, &rval);
args.rval().set(rval.get());
return ret;
}
static bool
forms_item2(JSContext *ctx, JSObject *obj, unsigned int argc, jsval *argv, jsval *rval)
forms_item2(JSContext *ctx, JS::HandleObject hobj, int index, JS::MutableHandleValue hvp)
{
JS::RootedObject parent_doc(ctx); /* instance of @document_class */
JS::RootedObject parent_win(ctx); /* instance of @window_class */
struct view_state *vs;
struct form_view *fv;
int counter = -1;
int index;
JS::RootedObject hobj(ctx, obj);
JS::CallArgs args = JS::CallArgsFromVp(argc, argv);
if (!JS_InstanceOf(ctx, hobj, &forms_class, &args))
if (!JS_InstanceOf(ctx, hobj, &forms_class, NULL))
return false;
parent_doc = JS_GetParent(obj);
parent_doc = JS_GetParent(hobj);
assert(JS_InstanceOf(ctx, parent_doc, &document_class, NULL));
if_assert_failed return false;
@ -3282,18 +3308,12 @@ forms_item2(JSContext *ctx, JSObject *obj, unsigned int argc, jsval *argv, jsval
vs = JS_GetInstancePrivate(ctx, parent_win,
&window_class, NULL);
if (argc != 1)
return true;
if (!JS::ToInt32(ctx, args[0], &index))
return false;
undef_to_jsval(ctx, rval);
hvp.setUndefined();
foreach (fv, vs->forms) {
counter++;
if (counter == index) {
object_to_jsval(ctx, rval, get_form_object(ctx, parent_doc, fv));
hvp.setObject(*get_form_object(ctx, parent_doc, fv));
break;
}
}
@ -3303,21 +3323,20 @@ forms_item2(JSContext *ctx, JSObject *obj, unsigned int argc, jsval *argv, jsval
/* @forms_funcs{"namedItem"} */
static bool
forms_namedItem(JSContext *ctx, unsigned int argc, jsval *rval)
forms_namedItem(JSContext *ctx, unsigned int argc, jsval *vp)
{
jsval val;
JS::RootedObject parent_doc(ctx); /* instance of @document_class */
JS::RootedObject parent_win(ctx); /* instance of @window_class */
JSObject *obj = JS_THIS_OBJECT(ctx, rval);
JS::CallArgs args = JS::CallArgsFromVp(argc, rval);
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
JS::RootedObject hobj(ctx, &args.thisv().toObject());
// jsval *argv = JS_ARGV(ctx, rval);
struct view_state *vs;
struct document_view *doc_view;
JS::RootedObject hobj(ctx, obj);
if (!JS_InstanceOf(ctx, hobj, &forms_class, &args)) return false;
parent_doc = JS_GetParent(obj);
parent_doc = JS_GetParent(hobj);
assert(JS_InstanceOf(ctx, parent_doc, &document_class, NULL));
if_assert_failed return false;
parent_win = JS_GetParent(parent_doc);
@ -3331,11 +3350,13 @@ forms_namedItem(JSContext *ctx, unsigned int argc, jsval *rval)
if (argc != 1)
return true;
undef_to_jsval(ctx, &val);
args.rval().setUndefined();
unsigned char *string = JS_EncodeString(ctx, args[0].toString());
find_form_by_name(ctx, parent_doc, doc_view, string, &val);
args.rval().set(val);
JS::RootedValue rval(ctx, val);
find_form_by_name(ctx, parent_doc, doc_view, string, &rval);
args.rval().set(rval.get());
return true;
}
@ -3344,7 +3365,7 @@ forms_namedItem(JSContext *ctx, unsigned int argc, jsval *rval)
static JSString *
unicode_to_jsstring(JSContext *ctx, unicode_val_T u)
{
jschar buf[2];
char16_t buf[2];
/* This is supposed to make a string from which
* jsval_to_accesskey() can get the original @u back.
@ -3373,23 +3394,25 @@ static unicode_val_T
jsval_to_accesskey(JSContext *ctx, JS::MutableHandleValue hvp)
{
size_t len;
const jschar *chr;
char16_t chr[2];
JSString *str = JS::ToString(ctx, hvp);
JSString *str = hvp.toString();
len = JS_GetStringLength(str);
chr = JS_GetStringCharsZ(ctx, str);
/* This implementation ignores extra characters in the string. */
if (len < 1)
return 0; /* which means no access key */
JS_GetStringCharAt(ctx, str, 0, &chr[0]);
if (!is_utf16_surrogate(chr[0])) {
return chr[0];
}
if (len >= 2
&& is_utf16_high_surrogate(chr[0])
&& is_utf16_low_surrogate(chr[1])) {
return join_utf16_surrogates(chr[0], chr[1]);
if (len >= 2) {
JS_GetStringCharAt(ctx, str, 1, &chr[1]);
if (is_utf16_high_surrogate(chr[0])
&& is_utf16_low_surrogate(chr[1])) {
return join_utf16_surrogates(chr[0], chr[1]);
}
}
JS_ReportError(ctx, "Invalid UTF-16 sequence");
return UCS_NO_CHAR; /* which the caller will reject */

View File

@ -52,9 +52,9 @@ static bool history_go(JSContext *ctx, unsigned int argc, jsval *rval);
JSClass history_class = {
"history",
JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL
nullptr, nullptr, nullptr, nullptr
};
const spidermonkeyFunctionSpec history_funcs[] = {
@ -107,14 +107,12 @@ history_go(JSContext *ctx, unsigned int argc, jsval *rval)
struct session *ses = doc_view->session;
JS::CallArgs args = JS::CallArgsFromVp(argc, rval);
// jsval *argv = JS_ARGV(ctx, rval);
int index;
struct location *loc;
if (argc != 1)
return true;
index = atol(jsval_to_string(ctx, args[0].address()));
int index = args[0].toInt32();
for (loc = cur_loc(ses);
loc != (struct location *) &ses->history.history;
@ -139,9 +137,9 @@ static bool location_set_property_href(JSContext *ctx, unsigned int argc, jsval
JSClass location_class = {
"location",
JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL
nullptr, nullptr, nullptr, nullptr
};
/* Tinyids of properties. Use negative values to distinguish these

View File

@ -54,9 +54,9 @@ static bool navigator_get_property_userAgent(JSContext *ctx, unsigned int argc,
JSClass navigator_class = {
"navigator",
JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL
nullptr, nullptr, nullptr, nullptr
};
/* Tinyids of properties. Use negative values to distinguish these

View File

@ -51,17 +51,17 @@ static bool unibar_set_property_visible(JSContext *ctx, unsigned int argc, jsval
JSClass menubar_class = {
"menubar",
JSCLASS_HAS_PRIVATE, /* const char * "t" */
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL
nullptr, nullptr, nullptr, nullptr
};
/* Each @statusbar_class object must have a @window_class parent. */
JSClass statusbar_class = {
"statusbar",
JSCLASS_HAS_PRIVATE, /* const char * "s" */
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL
nullptr, nullptr, nullptr, nullptr
};
/* Tinyids of properties. Use negative values to distinguish these

View File

@ -57,7 +57,7 @@ static inline int
jsval_to_boolean(JSContext *ctx, jsval *vp)
{
JS::RootedValue r_vp(ctx, *vp);
return (int)JS::ToBoolean(r_vp);
return (int)r_vp.toBoolean();
}
#endif

View File

@ -55,9 +55,9 @@ static bool window_get_property_top(JSContext *ctx, unsigned int argc, jsval *vp
JSClass window_class = {
"window",
JSCLASS_HAS_PRIVATE | JSCLASS_GLOBAL_FLAGS, /* struct view_state * */
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
window_get_property, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL
nullptr, nullptr, nullptr, nullptr
};
@ -432,7 +432,7 @@ window_setTimeout(JSContext *ctx, unsigned int argc, jsval *rval)
code = stracpy(code);
if (!code)
return true;
timeout = atoi(jsval_to_string(ctx, args[1].address()));
timeout = args[1].toInt32();
if (timeout <= 0) {
mem_free(code);
return true;

View File

@ -29,9 +29,9 @@ static bool smjs_action_fn_callback(JSContext *ctx, unsigned int argc, jsval *rv
static const JSClass action_fn_class = {
"action_fn",
JSCLASS_HAS_PRIVATE, /* struct smjs_action_fn_callback_hop * */
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
nullptr, nullptr, nullptr,
smjs_action_fn_finalize,
NULL,
smjs_action_fn_callback,
@ -111,11 +111,8 @@ smjs_action_fn_callback(JSContext *ctx, unsigned int argc, jsval *rval)
}
if (argc >= 1) {
int32_t val;
if (true == JS::ToInt32(smjs_ctx, args[0], &val)) {
set_kbd_repeat_count(hop->ses, val);
}
int32_t val = args[0].toInt32();
set_kbd_repeat_count(hop->ses, val);
}
do_action(hop->ses, hop->action_id, 1);
@ -134,7 +131,7 @@ smjs_get_action_fn_object(unsigned char *action_str)
if (!smjs_ses) return NULL;
obj = JS_NewObject(smjs_ctx, (JSClass *) &action_fn_class, JS::NullPtr(), JS::NullPtr());
obj = JS_NewObject(smjs_ctx, (JSClass *) &action_fn_class);
if (!obj) return NULL;
hop = mem_alloc(sizeof(*hop));
@ -175,7 +172,7 @@ action_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS:
hvp.setNull();
JS_IdToValue(ctx, id, &rval);
action_str = JS_EncodeString(ctx, JS::ToString(ctx, rval));
action_str = JS_EncodeString(ctx, rval.toString());
if (!action_str) return true;
action_fn = smjs_get_action_fn_object(action_str);
@ -189,9 +186,9 @@ action_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS:
static const JSClass action_class = {
"action",
0,
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
action_get_property, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL,
nullptr, nullptr, nullptr, nullptr,
};
static JSObject *
@ -201,7 +198,7 @@ smjs_get_action_object(void)
assert(smjs_ctx);
obj = JS_NewObject(smjs_ctx, (JSClass *) &action_class, JS::NullPtr(), JS::NullPtr());
obj = JS_NewObject(smjs_ctx, (JSClass *) &action_class);
return obj;
}

View File

@ -23,17 +23,17 @@ static bool bookmark_folder_get_property(JSContext *ctx, JS::HandleObject hobj,
static const JSClass bookmark_class = {
"bookmark",
JSCLASS_HAS_PRIVATE, /* struct bookmark * */
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, bookmark_finalize,
nullptr, nullptr, nullptr, bookmark_finalize,
};
static const JSClass bookmark_folder_class = {
"bookmark_folder",
JSCLASS_HAS_PRIVATE, /* struct bookmark * */
JS_PropertyStub, JS_PropertyStub,
JS_PropertyStub, nullptr,
bookmark_folder_get_property, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, bookmark_finalize,
nullptr, nullptr, nullptr, bookmark_finalize,
};
static JSObject *
@ -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, JS::NullPtr(), JS::NullPtr());
jsobj = JS_NewObject(smjs_ctx, clasp);
if (!jsobj) return NULL;
if (!bookmark) return jsobj;
@ -131,13 +131,15 @@ jsval_to_bookmark_string(JSContext *ctx, JS::HandleValue val, unsigned char **re
{
unsigned char *str;
JSString *jsstr = JS::ToString(ctx, val);
JSString *jsstr = val.toString();
if (jsstr == NULL) {
return false;
}
str = jsstring_to_utf8(ctx, jsstr, NULL);
JS::RootedString r_jsstr(ctx, jsstr);
str = JS_EncodeStringToUTF8(ctx, r_jsstr);
if (str == NULL) {
return false;
}

View File

@ -20,9 +20,9 @@ static void cache_entry_finalize(JSFreeOp *op, JSObject *obj);
static const JSClass cache_entry_class = {
"cache_entry",
JSCLASS_HAS_PRIVATE, /* struct cache_entry *; a weak reference */
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, cache_entry_finalize
nullptr, nullptr, nullptr, cache_entry_finalize
};
/* Tinyids of properties. Use negative values to distinguish these
@ -129,7 +129,7 @@ cache_entry_set_property_content(JSContext *ctx, unsigned int argc, jsval *vp)
* eventually unlock the object. */
object_lock(cached);
jsstr = JS::ToString(smjs_ctx, args[0]);
jsstr = args[0].toString();
str = JS_EncodeString(smjs_ctx, jsstr);
len = JS_GetStringLength(jsstr);
add_fragment(cached, 0, str, len);
@ -200,7 +200,7 @@ cache_entry_set_property_type(JSContext *ctx, unsigned int argc, jsval *vp)
* eventually unlock the object. */
object_lock(cached);
jsstr = JS::ToString(smjs_ctx, args[0]);
jsstr = args[0].toString();
str = JS_EncodeString(smjs_ctx, jsstr);
mem_free_set(&cached->content_type, stracpy(str));
@ -253,8 +253,7 @@ smjs_get_cache_entry_object(struct cache_entry *cached)
if_assert_failed return NULL;
cache_entry_object = JS_NewObject(smjs_ctx,
(JSClass *) &cache_entry_class,
JS::NullPtr(), JS::NullPtr());
(JSClass *) &cache_entry_class);
if (!cache_entry_object) return NULL;
@ -390,7 +389,7 @@ cache_entry_set_property_head(JSContext *ctx, unsigned int argc, jsval *vp)
* eventually unlock the object. */
object_lock(cached);
jsstr = JS::ToString(smjs_ctx, args[0]);
jsstr = args[0].toString();
str = JS_EncodeString(smjs_ctx, jsstr);
mem_free_set(&cached->head, stracpy(str));

View File

@ -83,9 +83,11 @@ smjs_do_file(unsigned char *path)
JS::RootedValue rval(smjs_ctx, val);
JS::RootedObject cg(smjs_ctx, JS::CurrentGlobalOrNull(smjs_ctx));
JS::CompileOptions options(smjs_ctx);
if (!add_file_to_string(&script, path)
|| false == JS_EvaluateScript(smjs_ctx, cg,
script.source, script.length, path, 1, &rval)) {
|| false == JS::Evaluate(smjs_ctx, cg, options,
script.source, script.length, &rval)) {
alert_smjs_error("error loading script file");
ret = 0;
}
@ -100,7 +102,7 @@ smjs_do_file_wrapper(JSContext *ctx, unsigned int argc, jsval *rval)
{
JS::CallArgs args = CallArgsFromVp(argc, rval);
JSString *jsstr = JS::ToString(smjs_ctx, args[0]);
JSString *jsstr = args[0].toString();
unsigned char *path = JS_EncodeString(smjs_ctx, jsstr);
if (smjs_do_file(path))
@ -139,7 +141,7 @@ init_smjs(struct module *module)
return;
}
JS_SetErrorReporter(smjs_ctx, error_reporter);
JS_SetErrorReporter(spidermonkey_runtime, error_reporter);
smjs_init_global_object();
@ -188,7 +190,7 @@ utf8_to_jsstring(JSContext *ctx, const unsigned char *str, int length)
size_t in_bytes;
const unsigned char *in_end;
size_t utf16_alloc;
jschar *utf16;
char16_t *utf16;
size_t utf16_used;
JSString *jsstr;
@ -200,7 +202,7 @@ utf8_to_jsstring(JSContext *ctx, const unsigned char *str, int length)
/* Each byte of input can become at most one UTF-16 unit.
* Check whether the multiplication could overflow. */
assert(!needs_utf16_surrogates(UCS_REPLACEMENT_CHARACTER));
if (in_bytes > ((size_t) -1) / sizeof(jschar)) {
if (in_bytes > ((size_t) -1) / sizeof(char16_t)) {
#ifdef HAVE_JS_REPORTALLOCATIONOVERFLOW
JS_ReportAllocationOverflow(ctx);
#else
@ -211,7 +213,7 @@ utf8_to_jsstring(JSContext *ctx, const unsigned char *str, int length)
utf16_alloc = in_bytes;
/* Use malloc because SpiderMonkey will handle the memory after
* this routine finishes. */
utf16 = malloc(utf16_alloc * sizeof(jschar));
utf16 = malloc(utf16_alloc * sizeof(char16_t));
if (utf16 == NULL) {
JS_ReportOutOfMemory(ctx);
return NULL;
@ -247,22 +249,22 @@ utf8_to_jsstring(JSContext *ctx, const unsigned char *str, int length)
return jsstr;
}
/** Convert a jschar array to UTF-8 and append it to struct string.
/** Convert a char16_t array to UTF-8 and append it to struct string.
* Replace misused surrogate codepoints with UCS_REPLACEMENT_CHARACTER.
*
* @param[in,out] utf8
* The function appends characters to this UTF-8 string.
*
* @param[in] utf16
* Pointer to the first element in an array of jschars.
* Pointer to the first element in an array of char16_ts.
*
* @param[in] len
* Number of jschars in the @a utf16 array.
* Number of char16_ts in the @a utf16 array.
*
* @return @a utf8 if successful, or NULL if not. */
static struct string *
add_jschars_to_utf8_string(struct string *utf8,
const jschar *utf16, size_t len)
const char16_t *utf16, size_t len)
{
size_t pos;
@ -309,11 +311,11 @@ unsigned char *
jsstring_to_utf8(JSContext *ctx, JSString *jsstr, int *length)
{
size_t utf16_len;
const jschar *utf16;
const char16_t *utf16;
struct string utf8;
utf16_len = JS_GetStringLength(jsstr);
utf16 = JS_GetStringCharsZ(ctx, jsstr); /* stays owned by jsstr */
utf16 = JS_GetTwoByteExternalStringChars(jsstr); /* stays owned by jsstr */
if (utf16 == NULL) {
/* JS_GetStringChars doesn't have a JSContext *
* parameter so it can't report the error

View File

@ -111,9 +111,9 @@ static bool elinks_set_property(JSContext *ctx, JS::HandleObject hobj, JS::Handl
static const JSClass elinks_class = {
"elinks",
0,
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
elinks_get_property, elinks_set_property,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL
nullptr, nullptr, nullptr, nullptr
};
@ -199,7 +199,7 @@ elinks_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, boo
if (!smjs_ses) return false;
jsstr = JS::ToString(smjs_ctx, hvp);
jsstr = hvp.toString();
if (!jsstr) return false;
url = JS_EncodeString(smjs_ctx, jsstr);
@ -332,7 +332,7 @@ elinks_set_property_location(JSContext *ctx, unsigned int argc, jsval *vp)
if (!smjs_ses) return false;
jsstr = JS::ToString(smjs_ctx, args[0]);
jsstr = args[0].toString();
if (!jsstr) return false;
url = JS_EncodeString(smjs_ctx, jsstr);

View File

@ -18,9 +18,9 @@ JSObject *smjs_global_object;
static const JSClass global_class = {
"global", JSCLASS_GLOBAL_FLAGS,
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL
nullptr, nullptr, nullptr, nullptr
};
static JSObject *

View File

@ -20,9 +20,9 @@ static void smjs_globhist_item_finalize(JSFreeOp *op, JSObject *obj);
static const JSClass smjs_globhist_item_class = {
"global_history_item",
JSCLASS_HAS_PRIVATE, /* struct global_history_item * */
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
smjs_globhist_item_get_property, smjs_globhist_item_set_property,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
nullptr, nullptr, nullptr,
smjs_globhist_item_finalize,
};
@ -156,7 +156,7 @@ smjs_globhist_item_set_property(JSContext *ctx, JS::HandleObject hobj, JS::Handl
switch (JSID_TO_INT(id)) {
case GLOBHIST_TITLE: {
JSString *jsstr = JS::ToString(smjs_ctx, hvp);
JSString *jsstr = hvp.toString();
unsigned char *str = JS_EncodeString(smjs_ctx, jsstr);
mem_free_set(&history_item->title, stracpy(str));
@ -164,7 +164,7 @@ smjs_globhist_item_set_property(JSContext *ctx, JS::HandleObject hobj, JS::Handl
return true;
}
case GLOBHIST_URL: {
JSString *jsstr = JS::ToString(smjs_ctx, hvp);
JSString *jsstr = hvp.toString();
unsigned char *str = JS_EncodeString(smjs_ctx, jsstr);
mem_free_set(&history_item->url, stracpy(str));
@ -172,11 +172,8 @@ smjs_globhist_item_set_property(JSContext *ctx, JS::HandleObject hobj, JS::Handl
return true;
}
case GLOBHIST_LAST_VISIT: {
uint32_t seconds;
/* Bug 923: Assumes time_t values fit in uint32. */
JS::ToInt32(smjs_ctx, hvp, &seconds);
history_item->last_visit = seconds;
history_item->last_visit = hvp.toInt32();
return true;
}
@ -195,8 +192,7 @@ smjs_get_globhist_item_object(struct global_history_item *history_item)
{
JSObject *jsobj;
jsobj = JS_NewObject(smjs_ctx, (JSClass *) &smjs_globhist_item_class,
JS::NullPtr(), JS::NullPtr());
jsobj = JS_NewObject(smjs_ctx, (JSClass *) &smjs_globhist_item_class);
JS::RootedObject r_jsobj(smjs_ctx, jsobj);
@ -228,7 +224,7 @@ smjs_globhist_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId h
if (!JS_IdToValue(ctx, id, &r_tmp))
goto ret_null;
uri_string = JS_EncodeString(ctx, JS::ToString(ctx, r_tmp));
uri_string = JS_EncodeString(ctx, r_tmp.toString());
if (!uri_string) goto ret_null;
history_item = get_global_history_item(uri_string);
@ -249,9 +245,9 @@ ret_null:
static const JSClass smjs_globhist_class = {
"global_history", 0,
JS_PropertyStub, JS_PropertyStub,
JS_PropertyStub, nullptr,
smjs_globhist_get_property, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL,
nullptr, nullptr, nullptr, nullptr
};
static JSObject *
@ -259,8 +255,7 @@ smjs_get_globhist_object(void)
{
JSObject *globhist;
globhist = JS_NewObject(smjs_ctx, (JSClass *) &smjs_globhist_class,
JS::NullPtr(), JS::NullPtr());
globhist = JS_NewObject(smjs_ctx, (JSClass *) &smjs_globhist_class);
if (!globhist) return NULL;
return globhist;
@ -332,7 +327,7 @@ smjs_globhist_item_set_property_title(JSContext *ctx, unsigned int argc, jsval *
if (!history_item) return false;
jsstr = JS::ToString(smjs_ctx, args[0]);
jsstr = args[0].toString();
str = JS_EncodeString(smjs_ctx, jsstr);
mem_free_set(&history_item->title, stracpy(str));
@ -386,7 +381,7 @@ smjs_globhist_item_set_property_url(JSContext *ctx, unsigned int argc, jsval *vp
if (!history_item) return false;
jsstr = JS::ToString(smjs_ctx, args[0]);
jsstr = args[0].toString();
str = JS_EncodeString(smjs_ctx, jsstr);
mem_free_set(&history_item->url, stracpy(str));
@ -442,7 +437,6 @@ smjs_globhist_item_set_property_last_visit(JSContext *ctx, unsigned int argc, js
JS::RootedObject hobj(ctx, &args.thisv().toObject());
struct global_history_item *history_item;
uint32_t seconds;
/* This can be called if @obj if not itself an instance of the
* appropriate class but has one in its prototype chain. Fail
@ -457,8 +451,7 @@ smjs_globhist_item_set_property_last_visit(JSContext *ctx, unsigned int argc, js
if (!history_item) return false;
/* Bug 923: Assumes time_t values fit in uint32. */
JS::ToInt32(smjs_ctx, args[0], &seconds);
history_item->last_visit = seconds;
history_item->last_visit = args[0].toInt32();
return true;
}

View File

@ -40,7 +40,7 @@ script_hook_url(va_list ap, void *data)
if (false == (r_rval.toBoolean()))
ret = EVENT_HOOK_STATUS_LAST;
} else {
JSString *jsstr = JS::ToString(smjs_ctx, r_rval);
JSString *jsstr = r_rval.toString();
unsigned char *str = JS_EncodeString(smjs_ctx, jsstr);
mem_free_set(url, stracpy(str));
@ -82,7 +82,7 @@ script_hook_pre_format_html(va_list ap, void *data)
if (true == smjs_invoke_elinks_object_method("preformat_html",
2, args, &r_rval))
if (false == JSVAL_TO_BOOLEAN(rval))
if (false == r_rval.toBoolean())
ret = EVENT_HOOK_STATUS_LAST;
end:

View File

@ -20,9 +20,9 @@ static void keymap_finalize(JSFreeOp *op, JSObject *obj);
static const JSClass keymap_class = {
"keymap",
JSCLASS_HAS_PRIVATE, /* int * */
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
keymap_get_property, keymap_set_property,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, keymap_finalize,
nullptr, nullptr, nullptr, keymap_finalize,
};
/* @keymap_class.getProperty */
@ -49,7 +49,7 @@ keymap_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS:
if (!JS_IdToValue(ctx, id, &r_tmp))
goto ret_null;
keystroke_str = JS_EncodeString(ctx, JS::ToString(ctx, r_tmp));
keystroke_str = JS_EncodeString(ctx, r_tmp.toString());
if (!keystroke_str) goto ret_null;
action_str = get_action_name_from_keystroke((enum keymap_id) *data,
@ -119,13 +119,13 @@ keymap_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, boo
JS::RootedValue rval(ctx, val);
JS_IdToValue(ctx, id, &rval);
keystroke_str = JS_EncodeString(ctx, JS::ToString(ctx, rval));
keystroke_str = JS_EncodeString(ctx, rval.toString());
if (!keystroke_str) return false;
if (hvp.isString()) {
unsigned char *action_str;
action_str = JS_EncodeString(ctx, JS::ToString(ctx, hvp));
action_str = JS_EncodeString(ctx, hvp.toString());
if (!action_str) return false;
if (bind_do(keymap_str, keystroke_str, action_str, 0))
@ -204,8 +204,7 @@ smjs_get_keymap_object(enum keymap_id keymap_id)
assert(smjs_ctx);
keymap_object = JS_NewObject(smjs_ctx, (JSClass *) &keymap_class,
JS::NullPtr(),JS::NullPtr());
keymap_object = JS_NewObject(smjs_ctx, (JSClass *) &keymap_class);
if (!keymap_object) return NULL;
@ -219,9 +218,9 @@ smjs_get_keymap_object(enum keymap_id keymap_id)
static const JSClass keymaps_hash_class = {
"keymaps_hash",
JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub,
JS_PropertyStub, nullptr,
JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL,
nullptr, nullptr, nullptr, nullptr,
};
static JSObject *
@ -231,8 +230,7 @@ smjs_get_keymap_hash_object(void)
int keymap_id;
JSObject *keymaps_hash;
keymaps_hash = JS_NewObject(smjs_ctx, (JSClass *) &keymaps_hash_class,
JS::NullPtr(), JS::NullPtr());
keymaps_hash = JS_NewObject(smjs_ctx, (JSClass *) &keymaps_hash_class);
if (!keymaps_hash) return NULL;
JS::RootedObject r_keymaps_hash(smjs_ctx, keymaps_hash);

View File

@ -83,7 +83,7 @@ smjs_load_uri(JSContext *ctx, unsigned int argc, jsval *rval)
if (argc < 2) return false;
jsstr = JS::ToString(smjs_ctx, args[0]);
jsstr = args[0].toString();
uri_string = JS_EncodeString(smjs_ctx, jsstr);
if (!uri_string || !*uri_string) return false;

View File

@ -37,10 +37,10 @@ static bool session_construct(JSContext *ctx, unsigned int argc, jsval *rval);
static const JSClass session_class = {
"session",
JSCLASS_HAS_PRIVATE, /* struct session *; a weak reference */
JS_PropertyStub, JS_DeletePropertyStub,
JSCLASS_HAS_PRIVATE | JSCLASS_IMPLEMENTS_BARRIERS, /* struct session *; a weak reference */
JS_PropertyStub, nullptr,
session_get_property, session_set_property,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, session_finalize,
nullptr, nullptr, nullptr, session_finalize,
NULL, NULL, NULL, session_construct
};
@ -50,9 +50,9 @@ static void smjs_location_array_finalize(JSFreeOp *op, JSObject *obj);
static const JSClass location_array_class = {
"location_array",
JSCLASS_HAS_PRIVATE, /* struct session *; a weak reference */
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
smjs_location_array_get_property, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, smjs_location_array_finalize,
nullptr, nullptr, nullptr, smjs_location_array_finalize,
};
/* location_array_class is the class for array object, the elements of which
@ -148,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, JS::NullPtr(), JS::NullPtr());
obj = JS_NewObject(smjs_ctx, (JSClass *) &location_array_class);
if (!obj) return NULL;
/* Do this last, so that if any previous step fails, we can
@ -576,91 +576,6 @@ session_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, JS
return true;
}
/* XXX: Lock session here if it is ever changed to have an OBJECT_HEAD. */
hvp.setUndefined();
switch (JSID_TO_INT(id)) {
case SESSION_VISITED:
hvp.setInt32(ses->status.visited);
return true;
case SESSION_HISTORY: {
JSObject *obj = smjs_get_session_location_array_object(ses);
if (obj) {
hvp.setObject(*obj);
}
return true;
}
case SESSION_LOADING_URI: {
struct uri *uri = have_location(ses) ? cur_loc(ses)->vs.uri
: ses->loading_uri;
if (uri) {
hvp.setString(JS_NewStringCopyZ(ctx, struri(uri)));
}
return true;
}
case SESSION_RELOADLEVEL:
hvp.setInt32(ses->reloadlevel);
return true;
case SESSION_REDIRECT_CNT:
hvp.setInt32(ses->redirect_cnt);
return true;
case SESSION_SEARCH_DIRECTION:
hvp.setString(JS_NewStringCopyZ(ctx, ses->search_direction == 1 ? "down" : "up"));
return true;
case SESSION_KBDPREFIX:
hvp.setInt32(ses->kbdprefix.repeat_count);
return true;
case SESSION_MARK_WAITING_FOR:
hvp.setString(JS_NewStringCopyZ(ctx, ses->kbdprefix.mark == KP_MARK_NOTHING
? "nothing"
: ses->kbdprefix.mark == KP_MARK_SET
? "set"
: "goto"));
return true;
case SESSION_EXIT_QUERY:
hvp.setInt32(ses->exit_query);
return true;
case SESSION_INSERT_MODE:
hvp.setString(JS_NewStringCopyZ(ctx,
ses->insert_mode == INSERT_MODE_LESS
? "disabled"
: ses->insert_mode == INSERT_MODE_ON
? "on"
: "off"));
return true;
case SESSION_NAVIGATE_MODE:
hvp.setString(JS_NewStringCopyZ(ctx,
ses->navigate_mode == NAVIGATE_CURSOR_ROUTING
? "cursor"
: "linkwise"));
return true;
case SESSION_SEARCH_WORD:
hvp.setString(JS_NewStringCopyZ(ctx, ses->search_word));
return true;
case SESSION_LAST_SEARCH_WORD:
hvp.setString(JS_NewStringCopyZ(ctx, ses->last_search_word));
return true;
default:
INTERNAL("Invalid ID %d in session_get_property().",
JSID_TO_INT(id));
}
return false;
}
@ -706,7 +621,7 @@ session_set_property_reloadlevel(JSContext *ctx, unsigned int argc, jsval *vp)
(JSClass *) &session_class, NULL);
if (!ses) return false;
JS::ToInt32(ctx, args[0], &ses->reloadlevel);
ses->reloadlevel = args[0].toInt32();
return true;
}
@ -729,7 +644,7 @@ session_set_property_redirect_cnt(JSContext *ctx, unsigned int argc, jsval *vp)
(JSClass *) &session_class, NULL);
if (!ses) return false;
JS::ToInt32(ctx, args[0], &ses->redirect_cnt);
ses->redirect_cnt = args[0].toInt32();
return true;
}
@ -755,7 +670,7 @@ session_set_property_search_direction(JSContext *ctx, unsigned int argc, jsval *
unsigned char *str;
JSString *jsstr;
jsstr = JS::ToString(ctx, args[0]);
jsstr = args[0].toString();
if (!jsstr) return true;
str = JS_EncodeString(ctx, jsstr);
@ -789,7 +704,7 @@ session_set_property_kbdprefix(JSContext *ctx, unsigned int argc, jsval *vp)
(JSClass *) &session_class, NULL);
if (!ses) return false;
JS::ToInt32(ctx, args[0], &ses->kbdprefix.repeat_count);
ses->kbdprefix.repeat_count = args[0].toInt32();
return true;
}
@ -815,7 +730,7 @@ session_set_property_mark(JSContext *ctx, unsigned int argc, jsval *vp)
unsigned char *str;
JSString *jsstr;
jsstr = JS::ToString(ctx, args[0]);
jsstr = args[0].toString();
if (!jsstr) return true;
str = JS_EncodeString(ctx, jsstr);
@ -854,7 +769,7 @@ session_set_property_insert_mode(JSContext *ctx, unsigned int argc, jsval *vp)
unsigned char *str;
JSString *jsstr;
jsstr = JS::ToString(ctx, args[0]);
jsstr = args[0].toString();
if (!jsstr) return true;
str = JS_EncodeString(ctx, jsstr);
@ -893,7 +808,7 @@ session_set_property_navigate_mode(JSContext *ctx, unsigned int argc, jsval *vp)
unsigned char *str;
JSString *jsstr;
jsstr = JS::ToString(ctx, args[0]);
jsstr = args[0].toString();
if (!jsstr) return true;
str = JS_EncodeString(ctx, jsstr);
@ -930,7 +845,7 @@ session_set_property_search_word(JSContext *ctx, unsigned int argc, jsval *vp)
unsigned char *str;
JSString *jsstr;
jsstr = JS::ToString(ctx, args[0]);
jsstr = args[0].toString();
if (!jsstr) return true;
str = JS_EncodeString(ctx, jsstr);
@ -962,7 +877,7 @@ session_set_property_last_search_word(JSContext *ctx, unsigned int argc, jsval *
unsigned char *str;
JSString *jsstr;
jsstr = JS::ToString(ctx, args[0]);
jsstr = args[0].toString();
if (!jsstr) return true;
str = JS_EncodeString(ctx, jsstr);
@ -995,141 +910,6 @@ session_set_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId hid, bo
if (!JSID_IS_INT(id))
return false;
switch (JSID_TO_INT(id)) {
case SESSION_VISITED:
int v;
JS::ToInt32(ctx, hvp, &v);
ses->status.visited = v;
return true;
/* SESSION_HISTORY is RO */
/* SESSION_LOADING_URI is RO */
case SESSION_RELOADLEVEL:
JS::ToInt32(ctx, hvp, &ses->reloadlevel);
return true;
case SESSION_REDIRECT_CNT:
JS::ToInt32(ctx, hvp, &ses->redirect_cnt);
return true;
case SESSION_SEARCH_DIRECTION: {
unsigned char *str;
JSString *jsstr;
jsstr = JS::ToString(ctx, hvp);
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;
}
case SESSION_KBDPREFIX:
JS::ToInt32(ctx, hvp, &ses->kbdprefix.repeat_count);
return true;
case SESSION_MARK_WAITING_FOR: {
unsigned char *str;
JSString *jsstr;
jsstr = JS::ToString(ctx, hvp);
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;
}
/* SESSION_EXIT_QUERY is RO */
case SESSION_INSERT_MODE: {
unsigned char *str;
JSString *jsstr;
jsstr = JS::ToString(ctx, hvp);
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;
}
case SESSION_NAVIGATE_MODE: {
unsigned char *str;
JSString *jsstr;
jsstr = JS::ToString(ctx, hvp);
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;
}
case SESSION_SEARCH_WORD: {
unsigned char *str;
JSString *jsstr;
jsstr = JS::ToString(ctx, hvp);
if (!jsstr) return true;
str = JS_EncodeString(ctx, jsstr);
if (!str) return true;
mem_free_set(&ses->search_word, str);
return true;
}
case SESSION_LAST_SEARCH_WORD: {
unsigned char *str;
JSString *jsstr;
jsstr = JS::ToString(ctx, hvp);
if (!jsstr) return true;
str = JS_EncodeString(ctx, jsstr);
if (!str) return true;
mem_free_set(&ses->last_search_word, str);
return true;
}
default:
INTERNAL("Invalid ID %d in session_set_property().",
JSID_TO_INT(id));
}
return false;
}
@ -1139,7 +919,7 @@ static bool
session_construct(JSContext *ctx, unsigned int argc, jsval *rval)
{
JS::CallArgs args = CallArgsFromVp(argc, rval);
JS::RootedObject hobj(ctx, &args.thisv().toObject());
//JS::RootedObject hobj(ctx, &args.thisv().toObject());
jsval val;
int bg = 0; /* open new tab in background */
@ -1204,7 +984,7 @@ smjs_get_session_object(struct session *ses)
assert(smjs_ctx);
if_assert_failed return NULL;
obj = JS_NewObject(smjs_ctx, (JSClass *) &session_class, JS::NullPtr(), JS::NullPtr());
obj = JS_NewObject(smjs_ctx, (JSClass *) &session_class);
if (!obj) return NULL;
JS::RootedObject r_obj(smjs_ctx, obj);
@ -1299,9 +1079,9 @@ session_array_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId h
static const JSClass session_array_class = {
"session_array",
JSCLASS_HAS_PRIVATE, /* struct terminal *term; a weak reference */
JS_PropertyStub, JS_PropertyStub,
JS_PropertyStub, nullptr,
session_array_get_property, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL
nullptr, nullptr, nullptr, nullptr
};
JSObject *
@ -1312,8 +1092,7 @@ smjs_get_session_array_object(struct terminal *term)
assert(smjs_ctx);
if_assert_failed return NULL;
obj = JS_NewObject(smjs_ctx, (JSClass *) &session_array_class,
JS::NullPtr(), JS::NullPtr());
obj = JS_NewObject(smjs_ctx, (JSClass *) &session_array_class);
if (!obj) return NULL;
JS_SetPrivate(obj, term);
@ -1365,7 +1144,7 @@ smjs_session_goto_url(JSContext *ctx, unsigned int argc, jsval *rval)
(JSClass *) &session_class, NULL);
if (!ses) return false; /* detached */
jsstr = JS::ToString(ctx, args[0]);
jsstr = args[0].toString();
if (!jsstr) return false;
url = JS_EncodeString(ctx, jsstr);

View File

@ -23,9 +23,9 @@ static void terminal_finalize(JSFreeOp *op, JSObject *obj);
static const JSClass terminal_class = {
"terminal",
JSCLASS_HAS_PRIVATE, /* struct terminal *; a weak refernce */
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
terminal_get_property, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, terminal_finalize
nullptr, nullptr, nullptr, terminal_finalize
};
enum terminal_prop {
@ -112,7 +112,7 @@ smjs_get_terminal_object(struct terminal *term)
assert(smjs_ctx);
if_assert_failed return NULL;
obj = JS_NewObject(smjs_ctx, (JSClass *) &terminal_class, JS::NullPtr(), JS::NullPtr());
obj = JS_NewObject(smjs_ctx, (JSClass *) &terminal_class);
if (!obj) return NULL;
@ -190,9 +190,9 @@ terminal_array_get_property(JSContext *ctx, JS::HandleObject hobj, JS::HandleId
static const JSClass terminal_array_class = {
"terminal_array",
0,
JS_PropertyStub, JS_PropertyStub,
JS_PropertyStub, nullptr,
terminal_array_get_property, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL
nullptr, nullptr, nullptr, nullptr
};
/** Return an SMJS object that scripts can use an array to get terminal
@ -203,8 +203,7 @@ smjs_get_terminal_array_object(void)
assert(smjs_ctx);
if_assert_failed return NULL;
return JS_NewObject(smjs_ctx, (JSClass *) &terminal_array_class,
JS::NullPtr(), JS::NullPtr());
return JS_NewObject(smjs_ctx, (JSClass *) &terminal_array_class);
}
void

View File

@ -27,9 +27,9 @@ static void view_state_finalize(JSFreeOp *op, JSObject *obj);
static const JSClass view_state_class = {
"view_state",
JSCLASS_HAS_PRIVATE, /* struct view_state * */
JS_PropertyStub, JS_DeletePropertyStub,
JS_PropertyStub, nullptr,
view_state_get_property, view_state_set_property,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, view_state_finalize
nullptr, nullptr, nullptr, view_state_finalize
};
/* Tinyids of properties. Use negative values to distinguish these
@ -41,10 +41,80 @@ enum view_state_prop {
VIEW_STATE_URI = -2,
};
static bool
view_state_get_property_plain(JSContext *ctx, unsigned int argc, jsval *vp)
{
JS::CallArgs args = CallArgsFromVp(argc, vp);
JS::RootedObject hobj(ctx, &args.thisv().toObject());
struct view_state *vs;
/* 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 *) &view_state_class, NULL))
return false;
vs = JS_GetInstancePrivate(ctx, hobj,
(JSClass *) &view_state_class, NULL);
if (!vs) return false;
args.rval().setInt32(vs->plain);
return true;
}
static bool
view_state_set_property_plain(JSContext *ctx, unsigned int argc, jsval *vp)
{
JS::CallArgs args = CallArgsFromVp(argc, vp);
JS::RootedObject hobj(ctx, &args.thisv().toObject());
struct view_state *vs;
if (argc != 1) {
return false;
}
/* 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 *) &view_state_class, NULL))
return false;
vs = JS_GetInstancePrivate(ctx, hobj,
(JSClass *) &view_state_class, NULL);
if (!vs) return false;
vs->plain = args[0].toInt32();
return true;
}
static bool
view_state_get_property_uri(JSContext *ctx, unsigned int argc, jsval *vp)
{
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, hobj, (JSClass *) &view_state_class, NULL))
return false;
struct view_state *vs = JS_GetInstancePrivate(ctx, hobj,
(JSClass *) &view_state_class, NULL);
if (!vs) return false;
args.rval().setString(JS_NewStringCopyZ(ctx, struri(vs->uri)));
return true;
}
static const JSPropertySpec view_state_props[] = {
{ "plain", (unsigned char)VIEW_STATE_PLAIN, JSPROP_ENUMERATE },
{ "uri", (unsigned char)VIEW_STATE_URI, JSPROP_ENUMERATE | JSPROP_READONLY },
{ NULL }
JS_PSGS("plain", view_state_get_property_plain, view_state_set_property_plain, JSPROP_ENUMERATE),
JS_PSG("uri", view_state_get_property_uri, JSPROP_ENUMERATE),
JS_PS_END
};
/* @view_state_class.getProperty */
@ -165,8 +235,7 @@ smjs_get_view_state_object(struct view_state *vs)
if_assert_failed return NULL;
view_state_object = JS_NewObject(smjs_ctx,
(JSClass *) &view_state_class,
JS::NullPtr(), JS::NullPtr());
(JSClass *) &view_state_class);
if (!view_state_object) return NULL;