diff options
author | Vincent Sanders <vince@kyllikki.org> | 2012-07-02 22:51:06 +0100 |
---|---|---|
committer | Vincent Sanders <vince@kyllikki.org> | 2012-07-02 22:51:06 +0100 |
commit | e205f0f99e0cb6ffa0044c6c1322f5da8f795183 (patch) | |
tree | 71da1109b3cb5b41c77d221d67cd5183558bff80 | |
parent | 20e99e4f20a982de43f6aec8b5f962369d5e8d22 (diff) | |
parent | 67648c621d67de0921417884e0efb33a4e86a0f3 (diff) | |
download | netsurf-e205f0f99e0cb6ffa0044c6c1322f5da8f795183.tar.gz netsurf-e205f0f99e0cb6ffa0044c6c1322f5da8f795183.tar.bz2 |
Merge branch 'vince/jsnavigator'
Merge javascript navigator object implementation
-rw-r--r-- | Makefile.sources | 2 | ||||
-rw-r--r-- | javascript/jsapi.c | 5 | ||||
-rw-r--r-- | javascript/jsapi.h | 33 | ||||
-rw-r--r-- | javascript/jsapi/console.c | 13 | ||||
-rw-r--r-- | javascript/jsapi/navigator.c | 205 | ||||
-rw-r--r-- | javascript/jsapi/window.c | 32 |
6 files changed, 286 insertions, 4 deletions
diff --git a/Makefile.sources b/Makefile.sources index 0d7eb865f..3dcec40a3 100644 --- a/Makefile.sources +++ b/Makefile.sources @@ -29,7 +29,7 @@ S_DESKTOP := cookies.c history_global_core.c hotlist.c knockout.c \ # Javascript sources ifeq ($(NETSURF_USE_JS),YES) -S_JSAPI = window.c document.c console.c +S_JSAPI = window.c document.c navigator.c console.c S_JAVASCRIPT += content.c jsapi.c $(addprefix jsapi/,$(S_JSAPI)) else S_JAVASCRIPT += none.c diff --git a/javascript/jsapi.c b/javascript/jsapi.c index d0a73b34e..52321db3f 100644 --- a/javascript/jsapi.c +++ b/javascript/jsapi.c @@ -96,6 +96,7 @@ jsobject *js_newcompartment(jscontext *ctx, void *win_priv, void *doc_priv) JSContext *cx = (JSContext *)ctx; JSObject *window_obj = NULL; JSObject *document_obj; + JSObject *navigator_obj; JSObject *console_obj; if (cx == NULL) @@ -111,6 +112,10 @@ jsobject *js_newcompartment(jscontext *ctx, void *win_priv, void *doc_priv) if (document_obj == NULL) goto js_newcompartment_fail; + navigator_obj = jsapi_new_navigator(cx, window_obj); + if (navigator_obj == NULL) + goto js_newcompartment_fail; + /* @todo forms, history, location */ console_obj = jsapi_new_console(cx, window_obj); diff --git a/javascript/jsapi.h b/javascript/jsapi.h index 4024d267b..ac5ada79c 100644 --- a/javascript/jsapi.h +++ b/javascript/jsapi.h @@ -92,7 +92,7 @@ JS_NewCompartmentAndGlobalObject(JSContext *cx, #else /* #if JS_VERSION <= 180 */ /* three parameter jsapi native call */ -#define JSAPI_NATIVE(name, cx, argc, vp) jsnative_##name(cx, argc, vp) +#define JSAPI_NATIVE(name, cx, argc, vp) jsapi_native_##name(cx, argc, vp) /* three parameter function descriptor */ #define JSAPI_FS(name, nargs, flags) \ @@ -137,9 +137,38 @@ JS_NewCompartmentAndGlobalObject(JSContext *cx, #endif - +/** Create a new javascript window object + * + * @param cx The javascript context. + * @param parent The parent object or NULL for new global + * @param win_priv The private context to set on the object + * @return new javascript object or NULL on error + */ JSObject *jsapi_new_window(JSContext *cx, JSObject *parent, void *win_priv); + +/** Create a new javascript document object + * + * @param cx The javascript context. + * @param parent The parent object, usually a global window object + * @param doc_priv The private context to set on the object + * @return new javascript object or NULL on error + */ JSObject *jsapi_new_document(JSContext *cx, JSObject *parent, void *doc_priv); + +/** Create a new javascript console object + * + * @param cx The javascript context. + * @param parent The parent object, usually a global window object + * @return new javascript object or NULL on error + */ JSObject *jsapi_new_console(JSContext *cx, JSObject *parent); +/** Create a new javascript navigator object + * + * @param cx The javascript context. + * @param parent The parent object, usually a global window object + * @return new javascript object or NULL on error + */ +JSObject *jsapi_new_navigator(JSContext *cx, JSObject *parent); + #endif diff --git a/javascript/jsapi/console.c b/javascript/jsapi/console.c index 990d50f66..6a3cc1801 100644 --- a/javascript/jsapi/console.c +++ b/javascript/jsapi/console.c @@ -18,7 +18,6 @@ #include "javascript/jsapi.h" -//#include "content/content.h" #include "utils/log.h" static JSBool JSAPI_NATIVE(debug, JSContext *cx, uintN argc, jsval *vp) @@ -65,6 +64,18 @@ static JSBool JSAPI_NATIVE(info, JSContext *cx, uintN argc, jsval *vp) static JSBool JSAPI_NATIVE(log, JSContext *cx, uintN argc, jsval *vp) { + unsigned int argloop; + JSString *jsstr; + unsigned long jsstrlen; + char *txt; + + for (argloop = 0; argloop < argc; argloop++) { + jsstr = JS_ValueToString(cx, *JSAPI_ARGV(cx, vp + argloop)); + + JSString_to_char(jsstr, txt, jsstrlen); + LOG(("%s", txt)); + } + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); return JS_TRUE; } diff --git a/javascript/jsapi/navigator.c b/javascript/jsapi/navigator.c new file mode 100644 index 000000000..daddc1d45 --- /dev/null +++ b/javascript/jsapi/navigator.c @@ -0,0 +1,205 @@ +/* + * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org> + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <assert.h> + +#include "javascript/jsapi.h" + +#include "desktop/netsurf.h" +#include "desktop/options.h" + +#include "utils/config.h" +#include "utils/useragent.h" +#include "utils/log.h" +#include "utils/utsname.h" + +/* + * navigator properties for netsurf + * + * Property | Everyone else | NetSurf | Notes + * ------------+-----------------+--------------+------------------------------ + * appCodeName | "Mozilla" | "NetSurf" | This is kinda a pointless + * | | | constant as everyone returns + * | | | "Mozilla" which is dumb + * ------------+-----------------+--------------+------------------------------ + * appName | "<Browsername>" | "NetSurf" | Browsers named other than + * | | | "Netscape", "Mozilla", + * | | | "Netscape Navigator", + * | | | "Microsoft Internet Explorer" + * | | | often other browser have + * | | | "(compatible with Netscape)" + * | | | append. + * ------------+-----------------+--------------+------------------------------ + * appVersion | "<ver> (<type>)"| "<ver>" | Actually just the version + * | | | number e.g "3.0". + * ------------+-----------------+--------------+------------------------------ + * language | "<lang>" | "<lang>" | The language the frontend is + * | | | configured for + * ------------+-----------------+--------------+------------------------------ + * platform | "<krn> <hw>" | "<krn> <hw>" | Efectively uname -s -i, + * | | | eg "Linux x86_64" + * ------------+-----------------+--------------+------------------------------ + * userAgent | "Mozilla/5.0 (" | "NetSurf" | The usual useragent string + * | | | with excessive lies + * ------------+-----------------+--------------+------------------------------ + */ + +static JSFunctionSpec jsfunctions_navigator[] = { + JS_FS_END +}; + +#define NAVIGATOR_APPNAME "NetSurf" +#define NAVIGATOR_APPCODENAME "NetSurf" + +static JSBool JSAPI_PROPERTYGET(appName, JSContext *cx, JSObject *obj, jsval *vp) +{ + JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, NAVIGATOR_APPNAME))); + return JS_TRUE; +} + +static JSBool JSAPI_PROPERTYSET(appName, JSContext *cx, JSObject *obj, jsval *vp) +{ + assert(false); + return JS_FALSE; +} + +static JSBool JSAPI_PROPERTYGET(appCodeName, JSContext *cx, JSObject *obj, jsval *vp) +{ + JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, NAVIGATOR_APPCODENAME))); + return JS_TRUE; +} + +static JSBool JSAPI_PROPERTYSET(appCodeName, JSContext *cx, JSObject *obj, jsval *vp) +{ + assert(false); + return JS_FALSE; +} + +static JSBool JSAPI_PROPERTYGET(appVersion, JSContext *cx, JSObject *obj, jsval *vp) +{ + JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, netsurf_version))); + return JS_TRUE; +} + +static JSBool JSAPI_PROPERTYSET(appVersion, JSContext *cx, JSObject *obj, jsval *vp) +{ + assert(false); + return JS_FALSE; +} + +static JSBool JSAPI_PROPERTYGET(language, JSContext *cx, JSObject *obj, jsval *vp) +{ + const char *alang = nsoption_charp(accept_language); + + if (alang != NULL) { + JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, alang))); + } else { + JS_SET_RVAL(cx, vp, JSVAL_VOID); + } + return JS_TRUE; +} + +static JSBool JSAPI_PROPERTYSET(language, JSContext *cx, JSObject *obj, jsval *vp) +{ + assert(false); + return JS_FALSE; +} + +static JSBool JSAPI_PROPERTYGET(platform, JSContext *cx, JSObject *obj, jsval *vp) +{ + struct utsname *cutsname; + + cutsname = malloc(sizeof(struct utsname)); + + if ((cutsname == NULL) || uname(cutsname) < 0) { + JS_SET_RVAL(cx, vp, JSVAL_VOID); + } else { + char *platstr; + int platstrlen; + platstrlen = strlen(cutsname->sysname) + strlen(cutsname->machine) + 2; + platstr = malloc(platstrlen); + if (platstr != NULL) { + snprintf(platstr, platstrlen, "%s %s", cutsname->sysname, cutsname->machine); + JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyN(cx, platstr, platstrlen - 1))); + free(platstr); + } else { + JS_SET_RVAL(cx, vp, JSVAL_VOID); + } + } + return JS_TRUE; +} + +static JSBool JSAPI_PROPERTYSET(platform, JSContext *cx, JSObject *obj, jsval *vp) +{ + assert(false); + return JS_FALSE; +} + +static JSBool JSAPI_PROPERTYGET(userAgent, JSContext *cx, JSObject *obj, jsval *vp) +{ + JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, user_agent_string()))); + return JS_TRUE; +} + +static JSBool JSAPI_PROPERTYSET(userAgent, JSContext *cx, JSObject *obj, jsval *vp) +{ + assert(false); + return JS_FALSE; +} + + +static JSPropertySpec jsproperties_navigator[] = +{ + JSAPI_PS(appName, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED), + JSAPI_PS(appCodeName, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED), + JSAPI_PS(appVersion, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED), + JSAPI_PS(language, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED), + JSAPI_PS(platform, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED), + JSAPI_PS(userAgent, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED), + JSAPI_PS_END +}; + +static JSClass jsclass_navigator = +{ + "navigator", + JSCLASS_HAS_PRIVATE, + JS_PropertyStub, + JS_PropertyStub, + JS_PropertyStub, + JS_StrictPropertyStub, + JS_EnumerateStub, + JS_ResolveStub, + JS_ConvertStub, + JS_FinalizeStub, + JSCLASS_NO_OPTIONAL_MEMBERS +}; + + +JSObject *jsapi_new_navigator(JSContext *cx, JSObject *parent) +{ + return JS_InitClass(cx, + parent, + NULL, + &jsclass_navigator, + NULL, + 0, + jsproperties_navigator, + jsfunctions_navigator, + NULL, + NULL); +} diff --git a/javascript/jsapi/window.c b/javascript/jsapi/window.c index f1c845152..06e6cdfe8 100644 --- a/javascript/jsapi/window.c +++ b/javascript/jsapi/window.c @@ -202,8 +202,40 @@ static JSBool JSAPI_NATIVE(prompt, JSContext *cx, uintN argc, jsval *vp) return JS_TRUE; } +static JSBool JSAPI_NATIVE(close, JSContext *cx, uintN argc, jsval *vp) +{ + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); + + return JS_TRUE; +} + +static JSBool JSAPI_NATIVE(stop, JSContext *cx, uintN argc, jsval *vp) +{ + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); + + return JS_TRUE; +} + +static JSBool JSAPI_NATIVE(focus, JSContext *cx, uintN argc, jsval *vp) +{ + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); + + return JS_TRUE; +} + +static JSBool JSAPI_NATIVE(blur, JSContext *cx, uintN argc, jsval *vp) +{ + JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); + + return JS_TRUE; +} + static JSFunctionSpec jsfunctions_window[] = { + JSAPI_FS(close, 0, 0), + JSAPI_FS(stop, 0, 0), + JSAPI_FS(focus, 0, 0), + JSAPI_FS(blur, 0, 0), JSAPI_FS(alert, 1, 0), JSAPI_FS(confirm, 1, 0), JSAPI_FS(prompt, 1, 0), |