1
0
mirror of https://github.com/rkd77/elinks.git synced 2025-02-02 15:09:23 -05:00

[smjs] JSAutoRealm

This commit is contained in:
Witold Filipczyk 2023-01-19 19:21:47 +01:00
parent c8138381a4
commit f428a27812
6 changed files with 24 additions and 17 deletions

View File

@ -78,7 +78,7 @@ smjs_do_file(char *path)
opts.setNoScriptRval(true);
JS::RootedValue rval(smjs_ctx);
JS::Realm *prev = JS::EnterRealm(smjs_ctx, smjs_elinks_object);
JSAutoRealm ar(smjs_ctx, smjs_elinks_object);
if (add_file_to_string(&script, path)) {
JS::SourceText<mozilla::Utf8Unit> srcBuf;
@ -98,7 +98,6 @@ smjs_do_file(char *path)
ret = 0;
}
JS::LeaveRealm(smjs_ctx, prev);
done_string(&script);
return ret;
@ -154,7 +153,8 @@ init_smjs(struct module *module)
smjs_init_elinks_object();
JS::RootedObject r_smjs_global_object(smjs_ctx, smjs_global_object);
JS::RootedObject r_smjs_global_object(smjs_ctx, smjs_global_object->get());
JSAutoRealm ar(smjs_ctx, r_smjs_global_object);
JS_DefineFunction(smjs_ctx, r_smjs_global_object, "do_file",
&smjs_do_file_wrapper, 1, 0);

View File

@ -137,7 +137,10 @@ smjs_get_elinks_object(void)
assert(smjs_ctx);
assert(smjs_global_object);
return spidermonkey_InitClass(smjs_ctx, smjs_global_object, NULL,
JS::RootedObject obj(smjs_ctx, smjs_global_object->get());
JSAutoRealm ar(smjs_ctx, obj);
return spidermonkey_InitClass(smjs_ctx, obj, NULL,
(JSClass *) &elinks_class, NULL, 0,
(JSPropertySpec *) elinks_props,
elinks_funcs, NULL, NULL);
@ -148,6 +151,8 @@ smjs_init_elinks_object(void)
{
smjs_elinks_object = smjs_get_elinks_object(); /* TODO: check NULL */
JSAutoRealm ar(smjs_ctx, smjs_elinks_object);
smjs_init_action_interface();
smjs_init_bookmarks_interface();
smjs_init_globhist_interface();

View File

@ -13,7 +13,7 @@
using namespace JS;
JSObject *smjs_global_object;
JS::Heap<JSObject*> *smjs_global_object;
static const JSClassOps global_ops = {
nullptr, nullptr,
@ -26,7 +26,7 @@ static const JSClass global_class = {
&global_ops
};
static JSObject *
static JS::Heap<JSObject*> *
smjs_get_global_object(void)
{
assert(smjs_ctx);
@ -36,15 +36,17 @@ smjs_get_global_object(void)
// return NULL;
// }
JS::RootedObject jsobj(smjs_ctx, JS_NewGlobalObject(smjs_ctx, (JSClass *) &global_class, NULL, JS::DontFireOnNewGlobalHook, opts));
JS::RootedObject jsobj(smjs_ctx);
JS::Heap<JSObject*> *global_obj = new JS::Heap<JSObject*>(JS_NewGlobalObject(smjs_ctx, &global_class, NULL, JS::DontFireOnNewGlobalHook, opts));
jsobj = global_obj->get();
JSAutoRealm ar(smjs_ctx, jsobj);
if (!jsobj) return NULL;
new JSAutoRealm(smjs_ctx, jsobj);
JS::InitRealmStandardClasses(smjs_ctx);
return jsobj;
return global_obj;
}
void

View File

@ -5,7 +5,7 @@
/* The root of the object hierarchy. If object 'foo' has this as its parent,
* you can use foo's method and properties with 'foo.<method|property>'. */
extern JSObject *smjs_global_object;
extern JS::Heap<JSObject*> *smjs_global_object;
/* Create the global object and assign it to smjs_global_object. */
void smjs_init_global_object(void);

View File

@ -33,7 +33,7 @@ script_hook_url(va_list ap, void *data)
if (*url == NULL) return EVENT_HOOK_STATUS_NEXT;
JS::Realm *prev = JS::EnterRealm(smjs_ctx, smjs_elinks_object);
JSAutoRealm ar(smjs_ctx, smjs_elinks_object);
smjs_ses = ses;
args[2].setString(utf8_to_jsstring(smjs_ctx, *url, -1));
@ -48,9 +48,7 @@ script_hook_url(va_list ap, void *data)
mem_free_set(url, stracpy(str));
}
}
smjs_ses = NULL;
JS::LeaveRealm(smjs_ctx, prev);
return ret;
}
@ -65,7 +63,7 @@ script_hook_pre_format_html(va_list ap, void *data)
JS::Value args[4];
JS::RootedValue r_rval(smjs_ctx);
JS::Realm *prev = JS::EnterRealm(smjs_ctx, smjs_elinks_object);
JSAutoRealm ar(smjs_ctx, smjs_elinks_object);
evhook_use_params(ses && cached);
@ -96,7 +94,6 @@ script_hook_pre_format_html(va_list ap, void *data)
end:
JS::LeaveRealm(smjs_ctx, prev);
smjs_ses = NULL;
return ret;
}

View File

@ -1121,8 +1121,11 @@ smjs_init_session_interface(void)
assert(smjs_ctx);
assert(smjs_global_object);
JS::RootedObject obj(smjs_ctx, smjs_global_object->get());
JSAutoRealm ar(smjs_ctx, obj);
smjs_session_object =
spidermonkey_InitClass(smjs_ctx, smjs_global_object, NULL,
spidermonkey_InitClass(smjs_ctx, obj, NULL,
(JSClass *) &session_class, session_construct,
0, (JSPropertySpec *) session_props,
session_funcs, NULL, NULL);