1 /* Exports struct view_state to the world of ECMAScript */
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
{
28 static const JSPropertySpec view_state_props
[] = {
29 { "plain", VIEW_STATE_PLAIN
, JSPROP_ENUMERATE
},
30 { "uri", VIEW_STATE_URI
, JSPROP_ENUMERATE
| JSPROP_READONLY
},
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
))
44 switch (JSVAL_TO_INT(id
)) {
45 case VIEW_STATE_PLAIN
:
46 *vp
= INT_TO_JSVAL(vs
->plain
);
50 *vp
= STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx
,
55 INTERNAL("Invalid ID %d in view_state_get_property().",
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
))
70 switch (JSVAL_TO_INT(id
)) {
71 case VIEW_STATE_PLAIN
: {
72 vs
->plain
= atol(jsval_to_string(ctx
, vp
));
77 INTERNAL("Invalid ID %d in view_state_set_property().",
84 static const JSClass view_state_class
= {
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
93 smjs_get_view_state_object(struct view_state
*vs
)
95 JSObject
*view_state_object
;
99 view_state_object
= JS_NewObject(smjs_ctx
,
100 (JSClass
*) &view_state_class
,
103 if (!view_state_object
) return NULL
;
105 if (JS_FALSE
== JS_SetPrivate(smjs_ctx
, view_state_object
, vs
))
108 if (JS_FALSE
== JS_DefineProperties(smjs_ctx
, view_state_object
,
109 (JSPropertySpec
*) view_state_props
))
112 return view_state_object
;
116 smjs_elinks_get_view_state(JSContext
*ctx
, JSObject
*obj
, jsval id
, jsval
*vp
)
119 struct view_state
*vs
;
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
);
137 smjs_init_view_state_interface(void)
139 if (!smjs_ctx
|| !smjs_elinks_object
)
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
);