Debian bug 534835: Check some SpiderMonkey return values
[elinks.git] / src / scripting / smjs / elinks_object.c
blob5a9b394436be6f82f649d5e8f6e03f2764ae13e8
1 /* The "elinks" object */
3 #ifdef HAVE_CONFIG_H
4 #include "config.h"
5 #endif
7 #include "elinks.h"
9 #include "bfu/msgbox.h"
10 #include "config/home.h"
11 #include "ecmascript/spidermonkey-shared.h"
12 #include "intl/gettext/libintl.h"
13 #include "protocol/uri.h"
14 #include "scripting/scripting.h"
15 #include "scripting/smjs/action_object.h"
16 #include "scripting/smjs/bookmarks.h"
17 #include "scripting/smjs/core.h"
18 #include "scripting/smjs/elinks_object.h"
19 #include "scripting/smjs/global_object.h"
20 #include "scripting/smjs/globhist.h"
21 #include "scripting/smjs/keybinding.h"
22 #include "scripting/smjs/load_uri.h"
23 #include "scripting/smjs/view_state_object.h"
24 #include "session/location.h"
25 #include "session/session.h"
26 #include "session/task.h"
29 static JSBool
30 elinks_get_home(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
32 *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, elinks_home));
34 return JS_TRUE;
37 static JSBool
38 elinks_get_location(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
40 struct uri *uri;
42 if (!smjs_ses) return JS_FALSE;
44 uri = have_location(smjs_ses) ? cur_loc(smjs_ses)->vs.uri
45 : smjs_ses->loading_uri;
46 if (!uri) return JS_FALSE;
48 *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx, struri(uri)));
50 return JS_TRUE;
53 static JSBool
54 elinks_set_location(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
56 JSString *jsstr;
57 unsigned char *url;
59 if (!smjs_ses) return JS_FALSE;
61 jsstr = JS_ValueToString(smjs_ctx, *vp);
62 if (!jsstr) return JS_FALSE;
64 url = JS_GetStringBytes(jsstr);
65 if (!url) return JS_FALSE;
67 goto_url(smjs_ses, url);
69 return JS_TRUE;
72 /* @elinks_funcs{"alert"} */
73 static JSBool
74 elinks_alert(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
76 unsigned char *string;
78 if (argc != 1)
79 return JS_TRUE;
81 string = jsval_to_string(ctx, &argv[0]);
82 if (!*string)
83 return JS_TRUE;
85 info_box(smjs_ses->tab->term, MSGBOX_NO_TEXT_INTL,
86 N_("User script alert"), ALIGN_LEFT, string);
88 undef_to_jsval(ctx, rval);
90 return JS_TRUE;
93 /* @elinks_funcs{"execute"} */
94 static JSBool
95 elinks_execute(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
97 unsigned char *string;
99 if (argc != 1)
100 return JS_TRUE;
102 string = jsval_to_string(ctx, &argv[0]);
103 if (!*string)
104 return JS_TRUE;
106 exec_on_terminal(smjs_ses->tab->term, string, "", TERM_EXEC_BG);
107 undef_to_jsval(ctx, rval);
109 return JS_TRUE;
112 static const JSClass elinks_class = {
113 "elinks",
115 JS_PropertyStub, JS_PropertyStub,
116 JS_PropertyStub, JS_PropertyStub,
117 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub
120 static const spidermonkeyFunctionSpec elinks_funcs[] = {
121 { "alert", elinks_alert, 1 },
122 { "execute", elinks_execute, 1 },
123 { NULL }
126 static JSObject *
127 smjs_get_elinks_object(void)
129 JSObject *jsobj;
131 assert(smjs_ctx);
132 assert(smjs_global_object);
134 jsobj = spidermonkey_InitClass(smjs_ctx, smjs_global_object, NULL,
135 (JSClass *) &elinks_class, NULL, 0, NULL,
136 elinks_funcs, NULL, NULL);
137 if (!jsobj) return NULL;
139 if (!JS_DefineProperty(smjs_ctx, jsobj, "location", JSVAL_NULL,
140 elinks_get_location, elinks_set_location,
141 JSPROP_ENUMERATE | JSPROP_PERMANENT))
142 return NULL;
144 if (!JS_DefineProperty(smjs_ctx, jsobj, "home", JSVAL_NULL,
145 elinks_get_home, JS_PropertyStub,
146 JSPROP_ENUMERATE
147 | JSPROP_PERMANENT
148 | JSPROP_READONLY))
149 return NULL;
151 return jsobj;
154 void
155 smjs_init_elinks_object(void)
157 smjs_elinks_object = smjs_get_elinks_object(); /* TODO: check NULL */
159 smjs_init_action_interface();
160 smjs_init_bookmarks_interface();
161 smjs_init_globhist_interface();
162 smjs_init_keybinding_interface();
163 smjs_init_load_uri_interface();
164 smjs_init_view_state_interface();
167 /* If elinks.<method> is defined, call it with the given arguments,
168 * store the return value in rval, and return JS_TRUE. Else return JS_FALSE. */
169 JSBool
170 smjs_invoke_elinks_object_method(unsigned char *method, jsval argv[], int argc,
171 jsval *rval)
173 assert(smjs_ctx);
174 assert(smjs_elinks_object);
175 assert(rval);
176 assert(argv);
178 if (JS_FALSE == JS_GetProperty(smjs_ctx, smjs_elinks_object,
179 method, rval))
180 return JS_FALSE;
182 if (JSVAL_VOID == *rval)
183 return JS_FALSE;
185 return JS_CallFunctionValue(smjs_ctx, smjs_elinks_object,
186 *rval, argc, argv, rval);