Bug 846: Document the private data in each SMJS class.
[elinks.git] / src / scripting / smjs / view_state_object.c
blobdfab9542fe1de864eed9b49e6a8f6db85eef696c
1 /* Exports struct view_state to the world of ECMAScript */
3 #ifdef HAVE_CONFIG_H
4 #include "config.h"
5 #endif
7 #include <stdlib.h>
9 #include "elinks.h"
11 #include "ecmascript/spidermonkey/util.h"
12 #include "protocol/uri.h"
13 #include "scripting/smjs/elinks_object.h"
14 #include "scripting/smjs/view_state_object.h"
15 #include "scripting/smjs/core.h"
16 #include "session/history.h"
17 #include "session/location.h"
18 #include "session/session.h"
19 #include "util/error.h"
20 #include "util/memory.h"
21 #include "viewer/text/vs.h"
23 enum view_state_prop {
24 VIEW_STATE_PLAIN,
25 VIEW_STATE_URI,
28 static const JSPropertySpec view_state_props[] = {
29 { "plain", VIEW_STATE_PLAIN, JSPROP_ENUMERATE },
30 { "uri", VIEW_STATE_URI, JSPROP_ENUMERATE | JSPROP_READONLY },
31 { NULL }
34 static JSBool
35 view_state_get_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
37 struct view_state *vs = JS_GetPrivate(ctx, obj);
39 undef_to_jsval(ctx, vp);
41 if (!JSVAL_IS_INT(id))
42 return JS_FALSE;
44 switch (JSVAL_TO_INT(id)) {
45 case VIEW_STATE_PLAIN:
46 *vp = INT_TO_JSVAL(vs->plain);
48 return JS_TRUE;
49 case VIEW_STATE_URI:
50 *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx,
51 struri(vs->uri)));
53 return JS_TRUE;
54 default:
55 INTERNAL("Invalid ID %d in view_state_get_property().",
56 JSVAL_TO_INT(id));
59 return JS_FALSE;
62 static JSBool
63 view_state_set_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
65 struct view_state *vs = JS_GetPrivate(ctx, obj);
67 if (!JSVAL_IS_INT(id))
68 return JS_FALSE;
70 switch (JSVAL_TO_INT(id)) {
71 case VIEW_STATE_PLAIN: {
72 vs->plain = atol(jsval_to_string(ctx, vp));
74 return JS_TRUE;
76 default:
77 INTERNAL("Invalid ID %d in view_state_set_property().",
78 JSVAL_TO_INT(id));
81 return JS_FALSE;
84 static const JSClass view_state_class = {
85 "view_state",
86 JSCLASS_HAS_PRIVATE, /* struct view_state * */
87 JS_PropertyStub, JS_PropertyStub,
88 view_state_get_property, view_state_set_property,
89 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub
92 JSObject *
93 smjs_get_view_state_object(struct view_state *vs)
95 JSObject *view_state_object;
97 assert(smjs_ctx);
99 view_state_object = JS_NewObject(smjs_ctx,
100 (JSClass *) &view_state_class,
101 NULL, NULL);
103 if (!view_state_object) return NULL;
105 if (JS_FALSE == JS_SetPrivate(smjs_ctx, view_state_object, vs))
106 return NULL;
108 if (JS_FALSE == JS_DefineProperties(smjs_ctx, view_state_object,
109 (JSPropertySpec *) view_state_props))
110 return NULL;
112 return view_state_object;
115 static JSBool
116 smjs_elinks_get_view_state(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
118 JSObject *vs_obj;
119 struct view_state *vs;
121 *vp = JSVAL_NULL;
123 if (!smjs_ses || !have_location(smjs_ses)) return JS_TRUE;
125 vs = &cur_loc(smjs_ses)->vs;
126 if (!vs) return JS_TRUE;
128 vs_obj = smjs_get_view_state_object(vs);
129 if (!vs_obj) return JS_TRUE;
131 *vp = OBJECT_TO_JSVAL(vs_obj);
133 return JS_TRUE;
136 void
137 smjs_init_view_state_interface(void)
139 if (!smjs_ctx || !smjs_elinks_object)
140 return;
142 JS_DefineProperty(smjs_ctx, smjs_elinks_object, "vs", JSVAL_NULL,
143 smjs_elinks_get_view_state, JS_PropertyStub,
144 JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_READONLY);