diff options
-rw-r--r-- | javascript/jsapi.h | 84 | ||||
-rw-r--r-- | javascript/jsapi/console.c | 74 | ||||
-rw-r--r-- | javascript/jsapi/window.c | 89 |
3 files changed, 162 insertions, 85 deletions
diff --git a/javascript/jsapi.h b/javascript/jsapi.h index 82f5f032a..4024d267b 100644 --- a/javascript/jsapi.h +++ b/javascript/jsapi.h @@ -30,9 +30,48 @@ #endif #if JS_VERSION <= 180 -inline JSObject * -JS_NewCompartmentAndGlobalObject(JSContext *cx, - JSClass *jsclass, + +#include <string.h> + +/* *CAUTION* these macros introduce and use jsthis and jsrval + * parameters, native function code should not conflict with these + */ + +/* five parameter jsapi native call */ +#define JSAPI_NATIVE(name, cx, argc, vp) \ + jsapi_native_##name(cx, JSObject *jsthis, argc, vp, jsval *jsrval) + +/* five parameter function descriptor */ +#define JSAPI_FS(name, nargs, flags) \ + JS_FS(#name, jsapi_native_##name, nargs, flags, 0) + +/* function descriptor end */ +#define JSAPI_FS_END JS_FS_END + +/* return value */ +#define JSAPI_RVAL(cx, vp) JS_RVAL(cx, jsrval) + +/* return value setter */ +#define JSAPI_SET_RVAL(cx, vp, v) JS_SET_RVAL(cx, jsrval, v) + +/* arguments */ +#define JSAPI_ARGV(cx, vp) (vp) + +/* proprty native calls */ +#define JSAPI_PROPERTYGET(name, cx, obj, vp) \ + jsapi_property_##name##_get(cx, obj, jsval id, vp) +#define JSAPI_PROPERTYSET(name, cx, obj, vp) \ + jsapi_property_##name##_set(cx, obj, jsval id, vp) + +/* property specifier */ +#define JSAPI_PS(name, tinyid, flags) \ + { #name , tinyid , flags , jsapi_property_##name##_get , jsapi_property_##name##_set } + +#define JSAPI_PS_END { NULL, 0, 0, NULL, NULL } + +static inline JSObject * +JS_NewCompartmentAndGlobalObject(JSContext *cx, + JSClass *jsclass, JSPrincipals *principals) { JSObject *global; @@ -50,7 +89,44 @@ JS_NewCompartmentAndGlobalObject(JSContext *cx, txt = JS_GetStringBytes(u16_txt); \ outlen = strlen(txt) -#else +#else /* #if JS_VERSION <= 180 */ + +/* three parameter jsapi native call */ +#define JSAPI_NATIVE(name, cx, argc, vp) jsnative_##name(cx, argc, vp) + +/* three parameter function descriptor */ +#define JSAPI_FS(name, nargs, flags) \ + JS_FS(#name, jsapi_native_##name, nargs, flags) + +/* function descriptor end */ +#define JSAPI_FS_END JS_FS_END + +/* return value */ +#define JSAPI_RVAL JS_RVAL + +/* return value setter */ +#define JSAPI_SET_RVAL JS_SET_RVAL + +/* arguments */ +#define JSAPI_ARGV(cx, vp) JS_ARGV(cx,vp) + +/* proprty native calls */ +#define JSAPI_PROPERTYGET(name, cx, obj, vp) \ + jsapi_property_##name##_get(cx, obj, jsid id, vp) +#define JSAPI_PROPERTYSET(name, cx, obj, vp) \ + jsapi_property_##name##_set(cx, obj, jsid id, JSBool strict, vp) + +/* property specifier */ +#define JSAPI_PS(name, tinyid, flags) { \ + #name , \ + tinyid , \ + flags , \ + jsapi_property_##name##_get , \ + jsapi_property_##name##_set \ + } + +#define JSAPI_PS_END { NULL, 0,0,NULL,NULL } + #define JSString_to_char(injsstring, outchar, outlen) \ outlen = JS_GetStringLength(injsstring); \ diff --git a/javascript/jsapi/console.c b/javascript/jsapi/console.c index 2d971e44d..990d50f66 100644 --- a/javascript/jsapi/console.c +++ b/javascript/jsapi/console.c @@ -21,92 +21,92 @@ //#include "content/content.h" #include "utils/log.h" -static JSBool jsdebug(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(debug, JSContext *cx, uintN argc, jsval *vp) { - JS_SET_RVAL(cx, vp, JSVAL_VOID); + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } -static JSBool jsdir(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(dir, JSContext *cx, uintN argc, jsval *vp) { - JS_SET_RVAL(cx, vp, JSVAL_VOID); + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } -static JSBool jserror(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(error, JSContext *cx, uintN argc, jsval *vp) { - JS_SET_RVAL(cx, vp, JSVAL_VOID); + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } -static JSBool jsgroup(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(group, JSContext *cx, uintN argc, jsval *vp) { - JS_SET_RVAL(cx, vp, JSVAL_VOID); + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } -static JSBool jsgroupCollapsed(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(groupCollapsed, JSContext *cx, uintN argc, jsval *vp) { - JS_SET_RVAL(cx, vp, JSVAL_VOID); + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } -static JSBool jsgroupEnd(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(groupEnd, JSContext *cx, uintN argc, jsval *vp) { - JS_SET_RVAL(cx, vp, JSVAL_VOID); + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } -static JSBool jsinfo(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(info, JSContext *cx, uintN argc, jsval *vp) { - JS_SET_RVAL(cx, vp, JSVAL_VOID); + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } -static JSBool jslog(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(log, JSContext *cx, uintN argc, jsval *vp) { - JS_SET_RVAL(cx, vp, JSVAL_VOID); + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } -static JSBool jstime(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(time, JSContext *cx, uintN argc, jsval *vp) { - JS_SET_RVAL(cx, vp, JSVAL_VOID); + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } -static JSBool jstimeEnd(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(timeEnd, JSContext *cx, uintN argc, jsval *vp) { - JS_SET_RVAL(cx, vp, JSVAL_VOID); + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } -static JSBool jstrace(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(trace, JSContext *cx, uintN argc, jsval *vp) { - JS_SET_RVAL(cx, vp, JSVAL_VOID); + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } -static JSBool jswarn(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(warn, JSContext *cx, uintN argc, jsval *vp) { - JS_SET_RVAL(cx, vp, JSVAL_VOID); + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } static JSFunctionSpec jsfunctions_console[] = { - JS_FS("debug", jsdebug, 1, 0), - JS_FS("dir", jsdir, 1, 0), - JS_FS("error", jserror, 1, 0), - JS_FS("group", jsgroup, 1, 0), - JS_FS("groupCollapsed", jsgroupCollapsed, 1, 0), - JS_FS("groupEnd", jsgroupEnd, 1, 0), - JS_FS("info", jsinfo, 1, 0), - JS_FS("log", jslog, 1, 0), - JS_FS("time", jstime, 1, 0), - JS_FS("timeEnd", jstimeEnd, 1, 0), - JS_FS("trace", jstrace, 1, 0), - JS_FS("warn", jswarn, 1, 0), - JS_FS_END + JSAPI_FS(debug, 1, 0), + JSAPI_FS(dir, 1, 0), + JSAPI_FS(error, 1, 0), + JSAPI_FS(group, 1, 0), + JSAPI_FS(groupCollapsed, 1, 0), + JSAPI_FS(groupEnd, 1, 0), + JSAPI_FS(info, 1, 0), + JSAPI_FS(log, 1, 0), + JSAPI_FS(time, 1, 0), + JSAPI_FS(timeEnd, 1, 0), + JSAPI_FS(trace, 1, 0), + JSAPI_FS(warn, 1, 0), + JSAPI_FS_END }; static JSClass jsclass_console = diff --git a/javascript/jsapi/window.c b/javascript/jsapi/window.c index e5034cb3b..f1c845152 100644 --- a/javascript/jsapi/window.c +++ b/javascript/jsapi/window.c @@ -21,7 +21,7 @@ #include "content/content.h" #include "utils/log.h" -/* IDL +/* IDL [NamedPropertiesObject] interface Window : EventTarget { @@ -29,7 +29,7 @@ interface Window : EventTarget { [Unforgeable] readonly attribute WindowProxy window; [Replaceable] readonly attribute WindowProxy self; [Unforgeable] readonly attribute Document document; - attribute DOMString name; + attribute DOMString name; [PutForwards=href, Unforgeable] readonly attribute Location location; readonly attribute History history; @@ -41,7 +41,7 @@ interface Window : EventTarget { [Replaceable] readonly attribute BarProp scrollbars; [Replaceable] readonly attribute BarProp statusbar; [Replaceable] readonly attribute BarProp toolbar; - attribute DOMString status; + attribute DOMString status; void close(); void stop(); void focus(); @@ -51,7 +51,7 @@ interface Window : EventTarget { [Replaceable] readonly attribute WindowProxy frames; [Replaceable] readonly attribute unsigned long length; [Unforgeable] readonly attribute WindowProxy top; - attribute WindowProxy? opener; + attribute WindowProxy? opener; readonly attribute WindowProxy parent; readonly attribute Element? frameElement; WindowProxy open(optional DOMString url, optional DOMString target, optional DOMString features, optional boolean replace); @@ -59,7 +59,7 @@ interface Window : EventTarget { getter object (DOMString name); // the user agent - readonly attribute Navigator navigator; + readonly attribute Navigator navigator; readonly attribute External external; readonly attribute ApplicationCache applicationCache; @@ -147,77 +147,88 @@ interface Window : EventTarget { */ -static JSBool jsnative_alert(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(alert, JSContext *cx, uintN argc, jsval *vp) { JSString* u16_txt; char *txt; unsigned long length; - if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "S", &u16_txt)) + if (!JS_ConvertArguments(cx, argc, JSAPI_ARGV(cx, vp), "S", &u16_txt)) return JS_FALSE; JSString_to_char(u16_txt, txt, length); warn_user(txt, NULL); - JS_SET_RVAL(cx, vp, JSVAL_VOID); - + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); + return JS_TRUE; } -static JSBool jsnative_confirm(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(confirm, JSContext *cx, uintN argc, jsval *vp) { JSString* u16_txt; char *txt; unsigned long length; JSBool result = JS_FALSE; - if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "S", &u16_txt)) + if (!JS_ConvertArguments(cx, argc, JSAPI_ARGV(cx, vp), "S", &u16_txt)) return JS_FALSE; JSString_to_char(u16_txt, txt, length); warn_user(txt, NULL); - JS_SET_RVAL(cx, vp, BOOLEAN_TO_JSVAL(result)); - + JSAPI_SET_RVAL(cx, vp, BOOLEAN_TO_JSVAL(result)); + return JS_TRUE; } -static JSBool jsnative_prompt(JSContext *cx, uintN argc, jsval *vp) +static JSBool JSAPI_NATIVE(prompt, JSContext *cx, uintN argc, jsval *vp) { JSString* u16_txt; char *txt; unsigned long length; - if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "S", &u16_txt)) + if (!JS_ConvertArguments(cx, argc, JSAPI_ARGV(cx, vp), "S", &u16_txt)) return JS_FALSE; JSString_to_char(u16_txt, txt, length); warn_user(txt, NULL); - JS_SET_RVAL(cx, vp, JSVAL_VOID); - + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); + return JS_TRUE; } static JSFunctionSpec jsfunctions_window[] = { - JS_FN("alert", jsnative_alert, 1, 0), - JS_FN("confirm", jsnative_confirm, 1, 0), - JS_FN("prompt", jsnative_prompt, 1, 0), - JS_FS_END + JSAPI_FS(alert, 1, 0), + JSAPI_FS(confirm, 1, 0), + JSAPI_FS(prompt, 1, 0), + JSAPI_FS_END }; -static JSBool jsproperty_get_window(JSContext *ctx, JSObject *obj, jsid id, jsval *vp) +static JSBool JSAPI_PROPERTYGET(window, JSContext *cx, JSObject *obj, jsval *vp) { JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj)); return JS_TRUE; } -static JSBool jsproperty_set_window(JSContext *ctx, JSObject *obj, jsid id, JSBool strict, jsval *vp) +static JSBool JSAPI_PROPERTYSET(window, JSContext *cx, JSObject *obj, jsval *vp) +{ + return JS_FALSE; +} + +static JSBool JSAPI_PROPERTYGET(self, JSContext *cx, JSObject *obj, jsval *vp) +{ + JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj)); + return JS_TRUE; +} + +static JSBool JSAPI_PROPERTYSET(self, JSContext *cx, JSObject *obj, jsval *vp) { return JS_FALSE; } @@ -225,32 +236,22 @@ static JSBool jsproperty_set_window(JSContext *ctx, JSObject *obj, jsid id, JSBo static JSPropertySpec jsproperties_window[] = { - { "window", - 0, - JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED, - jsproperty_get_window, - jsproperty_set_window - }, - { "self", - 0, - JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED, - jsproperty_get_window, - jsproperty_set_window - }, - { NULL, 0,0,NULL,NULL } + JSAPI_PS(window, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED), + JSAPI_PS(self, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED), + JSAPI_PS_END }; /* The class of the global object. */ static JSClass jsclass_window = { - "window", + "window", JSCLASS_HAS_PRIVATE | JSCLASS_GLOBAL_FLAGS, - JS_PropertyStub, - JS_PropertyStub, - JS_PropertyStub, + JS_PropertyStub, + JS_PropertyStub, + JS_PropertyStub, JS_StrictPropertyStub, - JS_EnumerateStub, - JS_ResolveStub, - JS_ConvertStub, + JS_EnumerateStub, + JS_ResolveStub, + JS_ConvertStub, JS_FinalizeStub, JSCLASS_NO_OPTIONAL_MEMBERS }; @@ -259,7 +260,7 @@ static JSClass jsclass_window = { JSObject * jsapi_new_window(JSContext *cx, JSObject *parent, void *win_priv) { JSObject *window = NULL; - + if (parent == NULL) { window = JS_NewCompartmentAndGlobalObject(cx, &jsclass_window, NULL); if (window == NULL) { |