1 /* "elinks.bookmarks" */
9 #include "bookmarks/bookmarks.h"
10 #include "ecmascript/spidermonkey/util.h"
11 #include "main/event.h"
12 #include "scripting/smjs/core.h"
13 #include "scripting/smjs/elinks_object.h"
14 #include "util/memory.h"
20 smjs_get_bookmark_generic_object(struct bookmark
*bookmark
, JSClass
*clasp
)
24 jsobj
= JS_NewObject(smjs_ctx
, clasp
, NULL
, NULL
);
25 if (!jsobj
) return NULL
;
27 if (!bookmark
) return jsobj
;
29 if (JS_TRUE
== JS_SetPrivate(smjs_ctx
, jsobj
, bookmark
)) {
30 object_lock(bookmark
);
39 bookmark_finalize(JSContext
*ctx
, JSObject
*obj
)
41 struct bookmark
*bookmark
= JS_GetPrivate(ctx
, obj
);
43 if (bookmark
) object_unlock(bookmark
);
47 /*** bookmark object ***/
55 static const JSPropertySpec bookmark_props
[] = {
56 { "title", BOOKMARK_TITLE
, JSPROP_ENUMERATE
},
57 { "url", BOOKMARK_URL
, JSPROP_ENUMERATE
},
58 { "children", BOOKMARK_CHILDREN
, JSPROP_ENUMERATE
| JSPROP_READONLY
},
62 static JSObject
*smjs_get_bookmark_folder_object(struct bookmark
*bookmark
);
65 bookmark_get_property(JSContext
*ctx
, JSObject
*obj
, jsval id
, jsval
*vp
)
67 struct bookmark
*bookmark
= JS_GetPrivate(ctx
, obj
);
69 if (!bookmark
) return JS_FALSE
;
71 undef_to_jsval(ctx
, vp
);
73 if (!JSVAL_IS_INT(id
))
76 switch (JSVAL_TO_INT(id
)) {
78 *vp
= STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx
,
83 *vp
= STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx
,
87 case BOOKMARK_CHILDREN
:
88 *vp
= OBJECT_TO_JSVAL(smjs_get_bookmark_folder_object(bookmark
));
92 INTERNAL("Invalid ID %d in bookmark_get_property().",
100 bookmark_set_property(JSContext
*ctx
, JSObject
*obj
, jsval id
, jsval
*vp
)
102 struct bookmark
*bookmark
= JS_GetPrivate(ctx
, obj
);
104 if (!bookmark
) return JS_FALSE
;
106 if (!JSVAL_IS_INT(id
))
109 switch (JSVAL_TO_INT(id
)) {
110 case BOOKMARK_TITLE
: {
111 JSString
*jsstr
= JS_ValueToString(smjs_ctx
, *vp
);
112 unsigned char *str
= JS_GetStringBytes(jsstr
);
114 mem_free_set(&bookmark
->title
, stracpy(str
));
119 JSString
*jsstr
= JS_ValueToString(smjs_ctx
, *vp
);
120 unsigned char *str
= JS_GetStringBytes(jsstr
);
122 mem_free_set(&bookmark
->url
, stracpy(str
));
127 INTERNAL("Invalid ID %d in bookmark_set_property().",
134 static const JSClass bookmark_class
= {
136 JSCLASS_HAS_PRIVATE
, /* struct bookmark * */
137 JS_PropertyStub
, JS_PropertyStub
,
138 bookmark_get_property
, bookmark_set_property
,
139 JS_EnumerateStub
, JS_ResolveStub
, JS_ConvertStub
, bookmark_finalize
,
143 smjs_get_bookmark_object(struct bookmark
*bookmark
)
147 jsobj
= smjs_get_bookmark_generic_object(bookmark
,
148 (JSClass
*) &bookmark_class
);
151 && JS_TRUE
== JS_DefineProperties(smjs_ctx
, jsobj
,
152 (JSPropertySpec
*) bookmark_props
))
159 /*** bookmark folder object ***/
162 bookmark_folder_get_property(JSContext
*ctx
, JSObject
*obj
, jsval id
, jsval
*vp
)
164 struct bookmark
*bookmark
;
165 struct bookmark
*folder
= JS_GetPrivate(ctx
, obj
);
166 unsigned char *title
;
170 title
= JS_GetStringBytes(JS_ValueToString(ctx
, id
));
171 if (!title
) return JS_TRUE
;
173 bookmark
= get_bookmark_by_name(folder
, title
);
175 *vp
= OBJECT_TO_JSVAL(smjs_get_bookmark_object(bookmark
));
181 static const JSClass bookmark_folder_class
= {
183 JSCLASS_HAS_PRIVATE
, /* struct bookmark * */
184 JS_PropertyStub
, JS_PropertyStub
,
185 bookmark_folder_get_property
, JS_PropertyStub
,
186 JS_EnumerateStub
, JS_ResolveStub
, JS_ConvertStub
, bookmark_finalize
,
190 smjs_get_bookmark_folder_object(struct bookmark
*bookmark
)
192 return smjs_get_bookmark_generic_object(bookmark
,
193 (JSClass
*) &bookmark_folder_class
);
197 smjs_init_bookmarks_interface(void)
200 struct JSObject
*bookmarks_object
;
202 if (!smjs_ctx
|| !smjs_elinks_object
)
205 bookmarks_object
= smjs_get_bookmark_folder_object(NULL
);
206 if (!bookmarks_object
) return;
208 val
= OBJECT_TO_JSVAL(bookmarks_object
);
210 JS_SetProperty(smjs_ctx
, smjs_elinks_object
, "bookmarks", &val
);