From 22368db2325bf25d597023f34399b51c59cdfc2e Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Fri, 17 Aug 2012 11:52:59 +0100 Subject: add js property (dom attribute) support to the document/element objects --- javascript/jsapi.h | 13 ++++++++++++- javascript/jsapi/document.c | 3 +++ javascript/jsapi/element.c | 15 +++++++++++++++ javascript/jsapi/htmldocument.c | 8 +++++++- javascript/jsapi/htmlelement.c | 10 +++++++++- javascript/jsapi/node.c | 25 +++++++++++++++++++++++-- javascript/jsapi/window.c | 15 ++------------- 7 files changed, 71 insertions(+), 18 deletions(-) diff --git a/javascript/jsapi.h b/javascript/jsapi.h index 2c10d02ce..c4c1ed099 100644 --- a/javascript/jsapi.h +++ b/javascript/jsapi.h @@ -69,6 +69,9 @@ #define JSAPI_PS(name, tinyid, flags) \ { #name , tinyid , flags , jsapi_property_##name##_get , jsapi_property_##name##_set } +#define JSAPI_PS_RO(name, tinyid, flags) \ + { #name , tinyid , flags | JSPROP_READONLY, jsapi_property_##name##_get , NULL } + #define JSAPI_PS_END { NULL, 0, 0, NULL, NULL } static inline JSObject * @@ -126,7 +129,15 @@ JS_NewCompartmentAndGlobalObject(JSContext *cx, jsapi_property_##name##_set \ } -#define JSAPI_PS_END { NULL, 0,0,NULL,NULL } +#define JSAPI_PS_RO(name, tinyid, flags) { \ + #name , \ + tinyid , \ + flags | JSPROP_READONLY, \ + jsapi_property_##name##_get , \ + NULL \ + } + +#define JSAPI_PS_END { NULL, 0, 0, NULL, NULL } #define JSString_to_char(injsstring, outchar, outlen) \ diff --git a/javascript/jsapi/document.c b/javascript/jsapi/document.c index e5dfcd523..2d3bde41a 100644 --- a/javascript/jsapi/document.c +++ b/javascript/jsapi/document.c @@ -105,3 +105,6 @@ static JSBool JSAPI_NATIVE(getElementById, JSContext *cx, uintN argc, jsval *vp) JSAPI_FS_NODE, \ JSAPI_FS(getElementById, 1, 0) \ + +#define JSAPI_PS_DOCUMENT \ + JSAPI_PS_NODE diff --git a/javascript/jsapi/element.c b/javascript/jsapi/element.c index cefb95966..d301321d9 100644 --- a/javascript/jsapi/element.c +++ b/javascript/jsapi/element.c @@ -82,3 +82,18 @@ static JSBool JSAPI_NATIVE(getAttribute, JSContext *cx, uintN argc, jsval *vp) #define JSAPI_FS_ELEMENT \ JSAPI_FS_NODE, \ JSAPI_FS(getAttribute, 0, 0) + +static JSBool JSAPI_PROPERTYGET(id, JSContext *cx, JSObject *obj, jsval *vp) +{ + JS_SET_RVAL(cx, vp, JSVAL_NULL); + return JS_TRUE; +} + +static JSBool JSAPI_PROPERTYSET(id, JSContext *cx, JSObject *obj, jsval *vp) +{ + return JS_FALSE; +} + +#define JSAPI_PS_ELEMENT \ + JSAPI_PS_NODE, \ + JSAPI_PS(id, 0, JSPROP_ENUMERATE | JSPROP_SHARED) diff --git a/javascript/jsapi/htmldocument.c b/javascript/jsapi/htmldocument.c index aa9efbcd1..1a58e4e19 100644 --- a/javascript/jsapi/htmldocument.c +++ b/javascript/jsapi/htmldocument.c @@ -209,6 +209,12 @@ static JSFunctionSpec jsfunctions_document[] = { JSAPI_FS_END }; +static JSPropertySpec jsproperties_document[] = +{ + JSAPI_PS_DOCUMENT, + JSAPI_PS_END +}; + static void jsfinalize_document(JSContext *cx, JSObject *obj) { struct jsclass_document_priv *document; @@ -238,7 +244,7 @@ JSObject *jsapi_new_document(JSContext *cx, JSObject *parent, struct html_conten &JSCLASS_OBJECT, NULL, 0, - NULL, + jsproperties_document, jsfunctions_document, NULL, NULL); diff --git a/javascript/jsapi/htmlelement.c b/javascript/jsapi/htmlelement.c index 90cb06aba..a7846bacd 100644 --- a/javascript/jsapi/htmlelement.c +++ b/javascript/jsapi/htmlelement.c @@ -178,6 +178,14 @@ static JSFunctionSpec jsfunctions_element[] = { }; + + +static JSPropertySpec jsproperties_element[] = +{ + JSAPI_PS_ELEMENT, + JSAPI_PS_END +}; + JSObject * jsapi_new_element(JSContext *cx, JSObject *parent, @@ -201,7 +209,7 @@ jsapi_new_element(JSContext *cx, &JSCLASS_OBJECT, NULL, 0, - NULL, + jsproperties_element, jsfunctions_element, NULL, NULL); diff --git a/javascript/jsapi/node.c b/javascript/jsapi/node.c index d6a4f4406..b8c073752 100644 --- a/javascript/jsapi/node.c +++ b/javascript/jsapi/node.c @@ -260,8 +260,7 @@ static JSBool JSAPI_NATIVE(isDefaultNamespace, JSContext *cx, uintN argc, jsval return JS_TRUE; } - -#define JSAPI_FS_NODE \ +#define JSAPI_FS_NODE \ JSAPI_FS_EVENTTARGET, \ JSAPI_FS(hasChildNodes, 0, 0), \ JSAPI_FS(compareDocumentPosition, 0, 0), \ @@ -276,3 +275,25 @@ static JSBool JSAPI_NATIVE(isDefaultNamespace, JSContext *cx, uintN argc, jsval JSAPI_FS(lookupPrefix, 0, 0), \ JSAPI_FS(lookupNamespaceURI, 0, 0), \ JSAPI_FS(isDefaultNamespace, 0, 0) + + +static JSBool JSAPI_PROPERTYGET(nodeType, JSContext *cx, JSObject *obj, jsval *vp) +{ + JS_SET_RVAL(cx, vp, JSVAL_NULL); + return JS_TRUE; +} + +static JSBool JSAPI_PROPERTYGET(textContent, JSContext *cx, JSObject *obj, jsval *vp) +{ + JS_SET_RVAL(cx, vp, JSVAL_NULL); + return JS_TRUE; +} + +static JSBool JSAPI_PROPERTYSET(textContent, JSContext *cx, JSObject *obj, jsval *vp) +{ + return JS_FALSE; +} + +#define JSAPI_PS_NODE \ + JSAPI_PS_RO(nodeType, 0, JSPROP_ENUMERATE | JSPROP_SHARED), \ + JSAPI_PS(textContent, 0, JSPROP_ENUMERATE | JSPROP_SHARED) diff --git a/javascript/jsapi/window.c b/javascript/jsapi/window.c index 4f7e75109..72d3837d9 100644 --- a/javascript/jsapi/window.c +++ b/javascript/jsapi/window.c @@ -248,27 +248,16 @@ static JSBool JSAPI_PROPERTYGET(window, JSContext *cx, JSObject *obj, jsval *vp) return JS_TRUE; } -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; -} - - static JSPropertySpec jsproperties_window[] = { - JSAPI_PS(window, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED), - JSAPI_PS(self, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED), + JSAPI_PS_RO(window, 0, JSPROP_ENUMERATE | JSPROP_SHARED), + JSAPI_PS_RO(self, 0, JSPROP_ENUMERATE | JSPROP_SHARED), JSAPI_PS_END }; -- cgit v1.2.3