summaryrefslogtreecommitdiff
path: root/javascript/jsapi/navigator.c
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2012-07-02 01:16:57 +0100
committerVincent Sanders <vince@kyllikki.org>2012-07-02 22:48:53 +0100
commit67648c621d67de0921417884e0efb33a4e86a0f3 (patch)
tree4615a6b175d28b80982115dfc885f26e959c3b0f /javascript/jsapi/navigator.c
parent274a76d97a878ef66155a215e1d16c33998f5597 (diff)
downloadnetsurf-67648c621d67de0921417884e0efb33a4e86a0f3.tar.gz
netsurf-67648c621d67de0921417884e0efb33a4e86a0f3.tar.bz2
Implement navigator properties
Signed-Off-By: Vincent Sanders <vince@netsurf-browser.org>
Diffstat (limited to 'javascript/jsapi/navigator.c')
-rw-r--r--javascript/jsapi/navigator.c152
1 files changed, 151 insertions, 1 deletions
diff --git a/javascript/jsapi/navigator.c b/javascript/jsapi/navigator.c
index 44af710ad..daddc1d45 100644
--- a/javascript/jsapi/navigator.c
+++ b/javascript/jsapi/navigator.c
@@ -16,14 +16,164 @@
* 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",
@@ -48,7 +198,7 @@ JSObject *jsapi_new_navigator(JSContext *cx, JSObject *parent)
&jsclass_navigator,
NULL,
0,
- NULL,
+ jsproperties_navigator,
jsfunctions_navigator,
NULL,
NULL);