2 * The contents of this file are subject to the Mozilla Public
3 * License Version 1.1 (the "License"); you may not use this file
4 * except in compliance with the License. You may obtain a copy of
5 * the License at http://www.mozilla.org/MPL/
7 * Software distributed under the License is distributed on an "AS
8 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
9 * implied. See the License for the specific language governing
10 * rights and limitations under the License.
12 * The Original Code is the Sablotron XSLT Processor.
14 * The Initial Developer of the Original Code is Ginger Alliance Ltd.
15 * Portions created by Ginger Alliance are Copyright (C) 2000-2002
16 * Ginger Alliance Ltd. All Rights Reserved.
18 * Contributor(s): Han Qi
20 * Alternatively, the contents of this file may be used under the
21 * terms of the GNU General Public License Version 2 or later (the
22 * "GPL"), in which case the provisions of the GPL are applicable
23 * instead of those above. If you wish to allow use of your
24 * version of this file only under the terms of the GPL and not to
25 * allow others to use your version of this file under the MPL,
26 * indicate your decision by deleting the provisions above and
27 * replace them with the notice and other provisions required by
28 * the GPL. If you do not delete the provisions above, a recipient
29 * may use your version of this file under either the MPL or the
37 #define SablotAsExport
42 #define declPRIV NodePrivate *np = (NodePrivate*)JS_GetPrivate(cx, obj)
43 #define NPDOM np->situa->dom()
45 /************************ domex *********************/
47 void domexFinalize(JSContext *cx, JSObject *obj)
49 DomExPrivate *priv = (DomExPrivate*)JS_GetPrivate(cx, obj);
55 JSClass domexClass = {
58 JS_PropertyStub, JS_PropertyStub,
61 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
62 domexFinalize, 0, 0, NULL, NULL, NULL, NULL, 0, 0
65 JSBool domexGetProperty (JSContext *cx, JSObject *obj, jsval id, jsval *vp)
73 DomExPrivate *priv = (DomExPrivate*)JS_GetPrivate(cx, obj);
74 *rval = INT_TO_JSVAL(priv -> code);
78 JSPropertySpec domexProtoProps[] =
80 {"INDEX_SIZE_ERR", 1, PROP_OPT, domexGetProperty, NULL},
81 {"STRING_SIZE_ERR", 2, PROP_OPT, domexGetProperty, NULL},
82 {"HIERARCHY_REQUEST_ERR", 3, PROP_OPT, domexGetProperty, NULL},
83 {"WRONG_DOCUMENT_ERR", 4, PROP_OPT, domexGetProperty, NULL},
84 {"INVALID_CHARACTER_ERR", 5, PROP_OPT, domexGetProperty, NULL},
85 {"NO_DATA_ALLOWED_ERR", 6, PROP_OPT, domexGetProperty, NULL},
86 {"NO_MODIFICATION_ALLOWED_ERR", 7, PROP_OPT, domexGetProperty, NULL},
87 {"NOT_FOUND_ERR", 8, PROP_OPT, domexGetProperty, NULL},
88 {"NOT_SUPPORTED_ERR", 9, PROP_OPT, domexGetProperty, NULL},
89 {"INUSE_ATTRIBUTE_ERR", 10, PROP_OPT, domexGetProperty, NULL},
90 {"INVALID_STATE_ERR", 11, PROP_OPT, domexGetProperty, NULL},
91 {"SYNTAX_ERR", 12, PROP_OPT, domexGetProperty, NULL},
92 {"INVALID_MODIFICATION_ERR", 13, PROP_OPT, domexGetProperty, NULL},
93 {"NAMESPACE_ERR", 14, PROP_OPT, domexGetProperty, NULL},
94 {"INVALID_ACCESS_ERR", 15, PROP_OPT, domexGetProperty, NULL},
98 JS_METHOD(domexToString)
100 DomExPrivate *priv = (DomExPrivate*)JS_GetPrivate(cx, obj);
103 JSPropertySpec* aux = domexProtoProps;
106 if (aux -> tinyid == priv -> code) break;
110 sprintf(buff, "[DOMException %d = %s]", priv -> code,
111 aux -> name ? aux -> name : "unknown code");
112 JSString *str = JS_NewStringCopyZ(cx, buff);
113 *rval = STRING_TO_JSVAL(str);
117 JSPropertySpec domexProps[] =
119 {"code", 0, PROP_OPT, domexGetCode, NULL},
123 JSFunctionSpec domexFunctions[] =
125 {"toString", domexToString, 0, 0, 0},
129 /***************nodelist array **********************/
135 rv = JS_GetElement(cx, obj, JSVAL_TO_INT(argv[0]), rval);
144 // JS_METHOD(nlistDebug)
146 // JSObject *foo = obj;
149 // JSClass *cls = JS_GetClass(foo);
150 // printf("---> clsname: %s\n", cls -> name);
151 // foo = JS_GetPrototype(cx, foo);
157 JS_METHOD(nlistAppend)
160 JS_GetArrayLength(cx, obj, &len);
161 for (unsigned int i = 0; i < argc; i++)
163 JS_SetElement(cx, obj, len++, &argv[i]);
168 JS_METHOD(nlistRemove)
172 JS_DeleteElement(cx, obj, JSVAL_TO_INT(argv[0]));
177 JSFunctionSpec nlistFunctions[] = {
178 {"item", nlistItem, 0, 0, 0},
179 {"append", nlistAppend, 0, 0, 0},
180 //{"remove", nlistRemove, 0, 0, 0}, //BUGGY
184 JS_METHOD(nlistConstructor)
186 //create an array object to replace obj instance
187 JSObject *arr = JS_NewArrayObject(cx, 0, NULL);
189 //get array prototypr (all methods)
190 // JSContextItem *cxi = (JSContextItem*)JS_GetContextPrivate(cx);
192 // if (cxi -> array_proto)
194 // //JS_SetPrototype(cx, obj, cxi -> array_proto);
195 // JS_SetPrototype(cx, arr, cxi -> array_proto);
198 //set original object as a prototype of returned array
199 JS_SetPrototype(cx, arr, obj);
200 //set specific object methods
201 JS_DefineFunctions(cx, obj, nlistFunctions);
203 *rval = OBJECT_TO_JSVAL(arr);
207 JSClass nlistClass = {
213 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
218 nlistConstructor, NULL, NULL, 0, 0
221 /******************** dom implementation ************/
223 JSClass domimplClass = {
224 "DOMImplementation", 0,
225 JS_PropertyStub, JS_PropertyStub,
228 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
229 JS_FinalizeStub, 0, 0, NULL, NULL, NULL, NULL, 0, 0
232 JS_METHOD(domimplHasFeature)
238 JS_METHOD(domimplCreateDocumentType)
244 JS_METHOD(domimplCreateDocument)
250 JSFunctionSpec domimplFunctions[] = {
251 {"hasFeature", domimplHasFeature, 0, 0, 0},
252 {"createDocumentType", domimplCreateDocumentType, 0, 0, 0},
253 {"createDocument", domimplCreateDocument, 0, 0, 0},
257 /************************ node *********************/
258 void* _jsdom_getNodePrivate(Sit S, NodeHandle node)
260 NodePrivate *np = new NodePrivate;
266 JSBool nodeGetProperty (JSContext *cx, JSObject *obj, jsval id, jsval *vp)
272 void nodeFinalize(JSContext *cx, JSObject *obj)
274 NodePrivate *np = (NodePrivate*)JS_GetPrivate(cx, obj);
281 JS_PROP(nodeGetNodeName)
287 switch(NPDOM.getNodeType(np->node)) {
290 case PROCESSING_INSTRUCTION_NODE:
291 val = (char *)NPDOM.getNodeName(np->node);
304 /* NAMESPACE_NODE - not in DOM 2;
305 * CDATASection, DocumentFragment, DocumentType,
306 * Entity,EntityReference, Notation - not in Sablotron
308 val = (char *)NPDOM.getNodeName(np->node);
311 JSString *str = JS_NewStringCopyZ(cx, val);
312 if (doFree) NPDOM.freeName(np->node, val);
313 *rval = STRING_TO_JSVAL(str);
321 JS_PROP(nodeGetNodeValue)
325 char* val = (char *)NPDOM.getNodeValue(np->node);
326 JSString *str = JS_NewStringCopyZ(cx, val);
327 NPDOM.freeValue(np->node, val);
328 *rval = STRING_TO_JSVAL(str);
336 JS_PROP(nodeGetNodeType)
340 *rval = INT_TO_JSVAL(NPDOM.getNodeType(np->node));
348 JS_PROP(nodeGetParentNode)
352 JSObject *o = jsdom_createNode(cx, np, NPDOM.getParent(np->node));
353 *rval = o ? OBJECT_TO_JSVAL(o) : JSVAL_NULL;
361 JS_PROP(nodeGetChildNodes)
365 JSObject *arr = jsdom_createNodeList(cx, 0);
366 *rval = OBJECT_TO_JSVAL(arr);
367 int count = NPDOM.getChildCount(np->node);
368 for (int i = 0; i < count; i++)
370 JSObject *x = jsdom_createNode(cx, np, NPDOM.getChildNo(np->node, i));
371 jsval xx = OBJECT_TO_JSVAL(x);
372 JS_SetElement(cx, arr, i, &xx);
381 JS_PROP(nodeGetFirstChild)
385 JSObject *o = jsdom_createNode(cx, np, NPDOM.getChildNo(np->node, 0));
386 *rval = o ? OBJECT_TO_JSVAL(o) : JSVAL_NULL;
394 JS_PROP(nodeGetLastChild)
398 JSObject *o = jsdom_createNode(cx, np,
399 NPDOM.getChildNo(np->node,
400 NPDOM.getChildCount(np->node) - 1 ));
401 *rval = o ? OBJECT_TO_JSVAL(o) : JSVAL_NULL;
409 JS_PROP(nodeGetPreviousSibling)
413 JSObject *o = jsdom_createNode(cx, np, NPDOM.getPreviousSibling(np->node));
414 *rval = o ? OBJECT_TO_JSVAL(o) : JSVAL_NULL;
422 JS_PROP(nodeGetNextSibling)
426 JSObject *o = jsdom_createNode(cx, np, NPDOM.getNextSibling(np->node));
427 *rval = o ? OBJECT_TO_JSVAL(o) : JSVAL_NULL;
435 JS_PROP(nodeGetAttributes)
439 if (NPDOM.getNodeType(np->node) == ELEMENT_NODE) {
440 JSObject *nmap = jsdom_createNamedNodeMap(cx, 0);
442 int attcount = NPDOM.getAttributeCount(np->node);
443 for (int i = 0; i < attcount; i++)
445 SXP_Node n = NPDOM.getAttributeNo(np->node, i);
446 JSObject *att = jsdom_wrapNode(*(np->situa), cx, n);
447 jsval val = OBJECT_TO_JSVAL(att);
448 char *name = (char *)NPDOM.getNodeName(n);
449 JS_SetProperty(cx, nmap, name, &val);
450 NPDOM.freeName(n,name);
453 *rval = OBJECT_TO_JSVAL(nmap);
464 JS_PROP(nodeGetOwnerDocument)
468 JSObject *o = jsdom_createNode(cx, np, NPDOM.getOwnerDocument(np->node));
469 *rval = o ? OBJECT_TO_JSVAL(o) : JSVAL_NULL;
477 JS_PROP(nodeGetNamespaceUri)
481 char* val = (char *)NPDOM.getNodeNameURI(np->node);
483 JSString *str = JS_NewStringCopyZ(cx, val);
484 *rval = STRING_TO_JSVAL(str);
489 NPDOM.freeName(np->node,val);
497 JS_PROP(nodeGetPrefix)
501 char *val = NULL, *colon = NULL;
503 switch(NPDOM.getNodeType(np->node)) {
510 case PROCESSING_INSTRUCTION_NODE:
511 default: // see comment within nodeGetNodeName
512 val = (char *)NPDOM.getNodeName(np->node);
513 colon = strchr(val,':');
517 JSString *str = JS_NewStringCopyN(cx, val, colon - val);
518 *rval = STRING_TO_JSVAL(str);
523 if (doFree) NPDOM.freeName(np->node, val);
531 JS_PROP(nodeGetLocalName)
535 char* val = (char *)NPDOM.getNodeNameLocal(np->node);
537 JSString *str = JS_NewStringCopyZ(cx, val);
538 *rval = STRING_TO_JSVAL(str);
543 NPDOM.freeName(np->node,val);
551 JS_METHOD(nodeToString)
556 NPDOM.constructStringValue(np->node, val);
557 JSString *str = JS_NewStringCopyZ(cx, (char*)val);
558 *rval = STRING_TO_JSVAL(str);
566 JS_METHOD(nodeUnsupported)
572 JS_METHOD(nodeHasChildNodes)
576 if (NPDOM.getChildCount(np->node)) *rval = JSVAL_TRUE;
577 else *rval = JSVAL_FALSE;
585 JS_METHOD(nodeNormalize)
587 //simply does nothing
591 JS_METHOD(nodeIsSupported)
593 //harmlessly unsupported
598 JS_METHOD(nodeHasAttributes)
602 if (NPDOM.getAttributeCount(np->node)) *rval = JSVAL_TRUE;
603 else *rval = JSVAL_FALSE;
611 JSClass nodeClass = {
614 JS_PropertyStub, JS_PropertyStub,
617 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
618 nodeFinalize, 0, 0, NULL, NULL, NULL, NULL, 0, 0
621 //node prototype properties
622 JSPropertySpec nodeProtoProps[] =
625 {"ELEMENT_NODE", SDOM_ELEMENT_NODE,
626 PROP_OPT, nodeGetProperty, NULL},
627 {"ATTRIBUTE_NODE", SDOM_ATTRIBUTE_NODE,
628 PROP_OPT, nodeGetProperty, NULL},
629 {"TEXT_NODE", SDOM_TEXT_NODE,
630 PROP_OPT, nodeGetProperty, NULL},
631 {"CDATA_SECTION_NODE", SDOM_CDATA_SECTION_NODE,
632 PROP_OPT, nodeGetProperty, NULL},
633 {"ENTITY_REFERENCE_NODE", SDOM_ENTITY_REFERENCE_NODE,
634 PROP_OPT, nodeGetProperty, NULL},
635 {"ENTITY_NODE", SDOM_ENTITY_NODE,
636 PROP_OPT, nodeGetProperty, NULL},
637 {"PROCESSING_INSTRUCTION_NODE", SDOM_PROCESSING_INSTRUCTION_NODE,
638 PROP_OPT, nodeGetProperty, NULL},
639 {"COMMENT_NODE", SDOM_COMMENT_NODE,
640 PROP_OPT, nodeGetProperty, NULL},
641 {"DOCUMENT_NODE", SDOM_DOCUMENT_NODE,
642 PROP_OPT, nodeGetProperty, NULL},
643 {"DOCUMENT_TYPE_NODE", SDOM_DOCUMENT_TYPE_NODE,
644 PROP_OPT, nodeGetProperty, NULL},
645 {"DOCUMENT_FRAGMENT_NODE", SDOM_DOCUMENT_FRAGMENT_NODE,
646 PROP_OPT, nodeGetProperty, NULL},
647 {"NOTATION_NODE", SDOM_NOTATION_NODE ,
648 PROP_OPT, nodeGetProperty, NULL},
653 JSPropertySpec nodeProps[] =
656 {"nodeName", 0, PROP_OPT, nodeGetNodeName, NULL},
657 {"nodeValue", 0, PROP_OPT, nodeGetNodeValue, NULL},
658 {"nodeType", 0, PROP_OPT, nodeGetNodeType, NULL},
659 {"parentNode", 0, PROP_OPT, nodeGetParentNode, NULL},
660 {"childNodes", 0, PROP_OPT, nodeGetChildNodes, NULL},
661 {"firstChild", 0, PROP_OPT, nodeGetFirstChild, NULL},
662 {"lastChild", 0, PROP_OPT, nodeGetLastChild, NULL},
663 {"previousSibling", 0, PROP_OPT, nodeGetPreviousSibling, NULL},
664 {"nextSibling", 0, PROP_OPT, nodeGetNextSibling, NULL},
665 {"attributes", 0, PROP_OPT, nodeGetAttributes, NULL},
666 {"ownerDocument", 0, PROP_OPT, nodeGetOwnerDocument, NULL},
667 {"namespaceURI", 0, PROP_OPT, nodeGetNamespaceUri, NULL},
668 {"prefix", 0, PROP_OPT, nodeGetPrefix, NULL},
669 {"localName", 0, PROP_OPT, nodeGetLocalName, NULL},
674 JSFunctionSpec nodeFunctions[] =
677 {"toString", nodeToString, 0, 0, 0},
678 {"insertBefore", nodeUnsupported, 0, 0, 0},
679 {"replaceChild", nodeUnsupported, 0, 0, 0},
680 {"removeChild", nodeUnsupported, 0, 0, 0},
681 {"appendChild", nodeUnsupported, 0, 0, 0},
682 {"cloneNode", nodeUnsupported, 0, 0, 0},
684 {"hasChildNodes", nodeHasChildNodes, 0, 0, 0},
685 {"normalize", nodeNormalize, 0, 0, 0},
686 {"isSupported", nodeIsSupported, 0, 0, 0},
687 {"hasAttributes", nodeHasAttributes, 0, 0, 0},
691 /************************** document ***********************/
693 JSClass documentClass = {
696 JS_PropertyStub, JS_PropertyStub,
699 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
700 nodeFinalize, 0, 0, NULL, NULL, NULL, NULL, 0, 0
709 JS_PROP(docGetImplementation)
711 JSContextItem *item = (JSContextItem*)JS_GetContextPrivate(cx);
714 *rval = OBJECT_TO_JSVAL(item -> domimpl);
718 JS_PROP(docGetDocumentElement)
722 JSObject *o = jsdom_createNode(cx, np, NPDOM.getChildNo(np->node, 0));
723 *rval = o ? OBJECT_TO_JSVAL(o) : JSVAL_NULL;
731 JS_METHOD(docElementsByTagName)
737 JS_METHOD(docElementsByTagNameNS)
743 JSPropertySpec documentProps[] = {
744 {"doctype", 0, PROP_OPT, docGetType, NULL},
745 {"implementation", 0, PROP_OPT, docGetImplementation, NULL},
746 {"documentElement", 0, PROP_OPT, docGetDocumentElement, NULL},
750 JSFunctionSpec documentFunctions[] = {
752 {"createElement", nodeUnsupported, 0, 0, 0},
753 {"createDocumentFragment", nodeUnsupported, 0, 0, 0},
754 {"createTextNode", nodeUnsupported, 0, 0, 0},
755 {"createComment", nodeUnsupported, 0, 0, 0},
756 {"createCDATASection", nodeUnsupported, 0, 0, 0},
757 {"createProcessingInstruction", nodeUnsupported, 0, 0, 0},
758 {"createAttribute", nodeUnsupported, 0, 0, 0},
759 {"createEntityReference", nodeUnsupported, 0, 0, 0},
760 {"importNode", nodeUnsupported, 0, 0, 0},
761 {"createElementNS", nodeUnsupported, 0, 0, 0},
762 {"createAttributeNS", nodeUnsupported, 0, 0, 0},
763 //we do not support ids
764 {"getElementsById", nodeUnsupported, 0, 0, 0},
765 //should be supported
766 {"getElementsByTagName", docElementsByTagName, 0, 0, 0},
767 {"getElementsByTagNameNS", docElementsByTagNameNS, 0, 0, 0},
771 /************************** element ************************/
773 JSClass elementClass = {
776 JS_PropertyStub, JS_PropertyStub,
779 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
780 nodeFinalize, 0, 0, NULL, NULL, NULL, NULL, 0, 0
784 JS_PROP(eleGetTagName)
789 name = (char *)NPDOM.getNodeName(np->node);
790 JSString *jname = JS_NewStringCopyZ(cx, name);
791 *rval = STRING_TO_JSVAL(jname);
792 NPDOM.freeName(np->node, name);
800 JS_METHOD(eleGetAttribute)
805 JS_ReportError(cx, "Element.getAttribute must have one parameter");
809 JSString *str = JSVAL_TO_STRING(argv[0]);
810 char *name = JS_GetStringBytes(str);
812 int attcount = NPDOM.getAttributeCount(np->node);
816 for (int i = 0; i < attcount; i++) {
817 attnode = NPDOM.getAttributeNo(np->node, i);
818 attname = (char *)NPDOM.getNodeName(attnode);
819 if ( !strcmp(name, attname) ) {
820 value = (char *)NPDOM.getNodeValue(attnode);
821 jval = JS_NewStringCopyZ(cx, value);
822 *rval = STRING_TO_JSVAL(jval);
823 NPDOM.freeValue(attnode, value);
824 NPDOM.freeName(attnode, attname);
827 NPDOM.freeName(attnode, attname);
829 jval = JS_NewStringCopyZ(cx, "");
830 *rval = STRING_TO_JSVAL(jval);
838 JS_METHOD(eleGetAttributeNode)
843 JS_ReportError(cx, "Element.getAttribute must have one parameter");
847 JSString *str = JSVAL_TO_STRING(argv[0]);
848 char *name = JS_GetStringBytes(str);
849 int attcount = NPDOM.getAttributeCount(np->node);
852 for (int i = 0; i < attcount; i++) {
853 attnode = NPDOM.getAttributeNo(np->node, i);
854 attname = (char *)NPDOM.getNodeName(attnode);
855 if ( !strcmp(name, attname) ) {
856 JSObject *o = jsdom_createNode(cx, np, attnode);
857 *rval = o ? OBJECT_TO_JSVAL(o) : JSVAL_NULL;
858 NPDOM.freeName(attnode, attname);
861 NPDOM.freeName(attnode, attname);
871 JS_METHOD(eleGetElementsByTagName)
877 JS_METHOD(eleHasAttribute)
881 JSString *str = JSVAL_TO_STRING(argv[0]);
882 char *name = JS_GetStringBytes(str);
883 int attcount = NPDOM.getAttributeCount(np->node);
886 for (int i = 0; i < attcount; i++) {
887 attnode = NPDOM.getAttributeNo(np->node, i);
888 attname = (char *)NPDOM.getNodeName(attnode);
889 if ( !strcmp(name, attname) ) {
890 NPDOM.freeName(attnode, attname);
894 NPDOM.freeName(attnode, attname);
904 JSPropertySpec elementProps[] =
906 {"tagName", 0, PROP_OPT, eleGetTagName, NULL},
910 JSFunctionSpec elementFunctions[] =
912 {"getAttribute", eleGetAttribute, 0, 0, 0},
913 {"setAttribute", nodeUnsupported, 0, 0, 0},
914 {"removeAttribute", nodeUnsupported, 0, 0, 0},
915 {"getAttributeNode", eleGetAttributeNode, 0, 0, 0},
916 {"setAttributeNode", nodeUnsupported, 0, 0, 0},
917 {"removeAttributeNode", nodeUnsupported, 0, 0, 0},
918 {"getElementsByTagName", eleGetElementsByTagName, 0, 0, 0},
919 {"getAttributeNS", nodeUnsupported, 0, 0, 0},
920 {"setAttributeNS", nodeUnsupported, 0, 0, 0},
921 {"removeAttributeNS", nodeUnsupported, 0, 0, 0},
922 {"getAttributeNodeNS", nodeUnsupported, 0, 0, 0},
923 {"setAttributeNodeNS", nodeUnsupported, 0, 0, 0},
924 {"getElementsByTagNameNS", nodeUnsupported, 0, 0, 0},
925 {"hasAttribute", eleHasAttribute, 0, 0, 0},
926 {"hasAttributeNS", nodeUnsupported, 0, 0, 0},
930 /********************* Attr ************************/
932 JSClass attrClass = {
935 JS_PropertyStub, JS_PropertyStub,
938 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
939 nodeFinalize, 0, 0, NULL, NULL, NULL, NULL, 0, 0
942 JS_PROP(attrGetSpecified)
948 JS_PROP(attrGetOwnerElement)
952 JSObject *o = jsdom_createNode(cx, np, NPDOM.getParent(np->node));
953 *rval = o ? OBJECT_TO_JSVAL(o) : JSVAL_NULL;
961 JSPropertySpec attrProps[] = {
962 {"name", 0, PROP_OPT, nodeGetNodeName, NULL},
963 {"value", 0, PROP_OPT, nodeGetNodeValue, NULL},
964 {"specified", 0, PROP_OPT, attrGetSpecified, NULL},
965 {"ownerElement", 0, PROP_OPT, attrGetOwnerElement, NULL},
969 /******************* character data & Co. **********/
971 JSClass chardataClass = {
974 JS_PropertyStub, JS_PropertyStub,
977 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
978 nodeFinalize, 0, 0, NULL, NULL, NULL, NULL, 0, 0
981 JS_PROP(chardataGetData)
985 char *val = (char *)NPDOM.getNodeValue(np->node);
987 JSString *jval = JS_NewStringCopyZ(cx, val);
988 *rval = STRING_TO_JSVAL(jval);
992 NPDOM.freeValue(np->node, val);
1000 int _getDataLen(const char* data)
1002 return strlen((char *)data);
1005 JS_PROP(chardataGetLength)
1009 const char* val = NPDOM.getNodeValue(np->node);
1010 *rval = INT_TO_JSVAL(_getDataLen(val));
1011 NPDOM.freeValue(np->node, (char*)val);
1019 JS_METHOD(chardataSubstringData)
1025 "CharacterData.substringData must have two parameters");
1029 const char *val = NPDOM.getNodeValue(np->node);
1030 int len = _getDataLen(val);
1031 int off = JSVAL_TO_INT(argv[0]);
1032 int count = JSVAL_TO_INT(argv[1]);
1036 str = JS_NewStringCopyZ(cx, "");
1040 if (off + count > len) count = len - off;
1041 str = JS_NewStringCopyN(cx, val + off, count);
1043 NPDOM.freeValue(np->node, (char*)val);
1044 *rval = STRING_TO_JSVAL(str);
1052 JSPropertySpec chardataProps[] =
1054 {"data", 0, PROP_OPT, chardataGetData, NULL},
1055 {"length", 0, PROP_OPT, chardataGetLength, NULL},
1059 JSFunctionSpec chardataFunctions[] =
1061 {"substringData", chardataSubstringData, 0, 0, 0},
1062 {"appendData", nodeUnsupported, 0, 0, 0},
1063 {"insertData", nodeUnsupported, 0, 0, 0},
1064 {"deleteData", nodeUnsupported, 0, 0, 0},
1065 {"replaceData", nodeUnsupported, 0, 0, 0},
1069 /********************* text ************************/
1071 JSClass textClass = {
1073 JSCLASS_HAS_PRIVATE,
1074 JS_PropertyStub, JS_PropertyStub,
1077 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
1078 nodeFinalize, 0, 0, NULL, NULL, NULL, NULL, 0, 0
1081 JSFunctionSpec textFunctions[] =
1083 {"splitText", nodeUnsupported, 0, 0, 0},
1087 /******************** cdata ************************/
1089 JSClass cdataClass = {
1091 JSCLASS_HAS_PRIVATE,
1092 JS_PropertyStub, JS_PropertyStub,
1095 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
1096 nodeFinalize, 0, 0, NULL, NULL, NULL, NULL, 0, 0
1099 /***************** comment *************************/
1101 JSClass commentClass = {
1103 JSCLASS_HAS_PRIVATE,
1104 JS_PropertyStub, JS_PropertyStub,
1107 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
1108 nodeFinalize, 0, 0, NULL, NULL, NULL, NULL, 0, 0
1111 /********************* named node map **************/
1113 JS_PROP(nnmGetLength)
1115 JSIdArray *arr = JS_Enumerate(cx, obj);
1116 *rval = INT_TO_JSVAL(arr -> length - 1);
1117 JS_DestroyIdArray(cx, arr);
1121 JS_METHOD(nnmGetNamedItem)
1126 JS_ReportError(cx, "NamedNodeMap.getNamedItem must have one parameter");
1129 JSString *str = JSVAL_TO_STRING(argv[0]);
1131 char *name = JS_GetStringBytes(str);
1132 rv = JS_GetProperty(cx, obj, name, &value);
1133 if (rv) *rval = value;
1137 JS_METHOD(nnmSetNamedItem)
1141 JS_ReportError(cx, "NamedNodeMap.setNamedItem must have one parameter");
1144 //check the type here!!!
1145 JSObject *nobj = JSVAL_TO_OBJECT(argv[0]);
1146 JSClass *cls = JS_GET_CLASS(cx, nobj);
1147 JSObject *proto = JS_GetPrototype(cx, nobj);
1148 JSContextItem *cxi = (JSContextItem*)JS_GetContextPrivate(cx);
1149 if (proto == cxi->node || cls == &nodeClass)
1151 NodePrivate *np = (NodePrivate*)JS_GetPrivate(cx, nobj);
1152 char *name = (char *)NPDOM.getNodeName(np->node);
1153 JS_SetProperty(cx, obj, name, &(argv[0]));
1154 NPDOM.freeName(np->node,name);
1159 JS_ReportError(cx, "invalid NamedNodeMap.setNamedItem parameter");
1164 JS_METHOD(nnmRemoveNamedItem)
1168 JS_ReportError(cx, "NamedNodeMap.removeNamedItem must have one parameter");
1171 JSString *str = JSVAL_TO_STRING(argv[0]);
1172 char *name = JS_GetStringBytes(str);
1173 return JS_DeleteProperty(cx, obj, name);
1178 if (argc >= 1 || ! JSVAL_IS_INT(argv[0]) )
1180 JSIdArray *arr = JS_Enumerate(cx, obj);
1181 int idx = JSVAL_TO_INT(argv[0]);
1182 if (idx < 0 || idx >= arr -> length - 1)
1189 //skip the 'length' property
1190 JS_IdToValue(cx, arr->vector[idx + 1], &val);
1191 JS_GetProperty(cx, obj,
1192 JS_GetStringBytes(JSVAL_TO_STRING(val)), rval);
1194 JS_DestroyIdArray(cx, arr);
1199 JS_ReportError(cx, "NamedNodeMap.item must have one parameter");
1204 JSPropertySpec nnmProps[] = {
1205 {"length", 0, PROP_OPT, nnmGetLength, NULL},
1209 JSFunctionSpec nnmFunctions[] = {
1210 {"getNamedItem", nnmGetNamedItem, 0, 0, 0},
1211 {"setNamedItem", nnmSetNamedItem, 0, 0, 0},
1212 {"removeNamedItem", nnmRemoveNamedItem, 0, 0, 0},
1213 {"item", nnmItem, 0, 0, 0},
1214 {"getNamedItemsNS", nodeUnsupported, 0, 0, 0},
1215 {"setNamedItemsNS", nodeUnsupported, 0, 0, 0},
1216 {"removeNamedItemsNS", nodeUnsupported, 0, 0, 0},
1220 JSClass nnmClass = {
1226 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub,
1227 JS_FinalizeStub, 0, 0, NULL, NULL, NULL, NULL, 0, 0
1230 /********************* functions *******************/
1232 JSClass* _jsdom_getNodeClass(SDOM_NodeType type)
1237 case SDOM_ELEMENT_NODE:
1238 cls = &elementClass;
1240 case SDOM_DOCUMENT_NODE:
1241 cls = &documentClass;
1243 case SDOM_ATTRIBUTE_NODE:
1246 case SDOM_TEXT_NODE:
1249 case SDOM_CDATA_SECTION_NODE:
1252 case SDOM_COMMENT_NODE:
1253 cls = &commentClass;
1263 JSClass* _jsdom_getNodeClass(Sit S, JSContext *cx, NodeHandle node)
1265 return _jsdom_getNodeClass((SDOM_NodeType)S.dom().getNodeType(node));
1268 JSObject* jsdom_wrapNode(Sit S, JSContext *cx, NodeHandle node)
1270 JSObject *obj = NULL;
1273 JSContextItem *item = (JSContextItem*)JS_GetContextPrivate(cx);
1276 SDOM_NodeType type = (SDOM_NodeType)S.dom().getNodeType(node);
1278 obj = JS_NewObject(cx, _jsdom_getNodeClass(type),
1280 JS_SetPrivate(cx, obj, _jsdom_getNodePrivate(S, node));
1282 //common methods and properties
1283 JS_DefineProperties(cx, obj, nodeProps);
1284 JS_DefineFunctions(cx, obj, nodeFunctions);
1289 case SDOM_ELEMENT_NODE:
1291 JS_DefineProperties(cx, obj, elementProps);
1292 JS_DefineFunctions(cx, obj, elementFunctions);
1294 case SDOM_DOCUMENT_NODE:
1296 JS_DefineProperties(cx, obj, documentProps);
1297 JS_DefineFunctions(cx, obj, documentFunctions);
1299 case SDOM_ATTRIBUTE_NODE:
1301 JS_DefineProperties(cx, obj, attrProps);
1303 case SDOM_TEXT_NODE:
1305 JS_DefineProperties(cx, obj, chardataProps);
1306 JS_DefineFunctions(cx, obj, chardataFunctions);
1308 JS_DefineFunctions(cx, obj, textFunctions);
1310 case SDOM_CDATA_SECTION_NODE:
1312 JS_DefineProperties(cx, obj, chardataProps);
1313 JS_DefineFunctions(cx, obj, chardataFunctions);
1315 case SDOM_COMMENT_NODE:
1317 JS_DefineProperties(cx, obj, chardataProps);
1318 JS_DefineFunctions(cx, obj, chardataFunctions);
1325 JSObject* jsdom_createNode(JSContext *cx, NodePrivate *np_, NodeHandle node)
1327 return jsdom_wrapNode(*(np_->situa), cx, node);
1331 void jsdom_delegateDOM(JSContext *cx)
1333 JSContextItem *item = (JSContextItem*)JS_GetContextPrivate(cx);
1336 obj = JS_DefineObject(cx, JS_GetGlobalObject(cx), "Node",
1341 JS_DefineProperties(cx, obj, nodeProtoProps);
1343 //DOMException prototype
1344 obj = JS_DefineObject(cx, JS_GetGlobalObject(cx), "DOMException",
1349 JS_DefineProperties(cx, obj, domexProtoProps);
1350 item -> domex = obj;
1352 obj = JS_DefineObject(cx, JS_GetGlobalObject(cx), "DOMImplementation",
1357 JS_DefineFunctions(cx, obj, domimplFunctions);
1358 item -> domimpl = obj;
1360 JSObject *nlclass = JS_InitClass(cx, JS_GetGlobalObject(cx),
1362 &nlistClass, nlistConstructor, 0,
1363 NULL, NULL, NULL, NULL);
1364 item -> nlclass = nlclass;
1366 // JSObject *nnmclass = JS_InitClass(cx, JS_GetGlobalObject(cx),
1368 // &nnmClass, NULL, 0,
1369 // NULL, nnmFunctions, NULL, NULL);
1370 // item -> nnmclass = nnmclass;
1373 void jsdom_raiseException(JSContext *cx, int code)
1375 JSContextItem *item = (JSContextItem*)JS_GetContextPrivate(cx);
1378 JSObject *obj = JS_NewObject(cx, &domexClass, item -> domex, NULL);
1380 DomExPrivate *c = new DomExPrivate;
1382 JS_SetPrivate(cx, obj, c);
1383 //instance props. and funcs.
1384 JS_DefineProperties(cx, obj, domexProps);
1385 JS_DefineFunctions(cx, obj, domexFunctions);
1387 JS_SetPendingException(cx, OBJECT_TO_JSVAL(obj));
1390 JSObject* jsdom_createNodeList(JSContext *cx, int num)
1392 //JSObject *obj = JS_NewArrayObject(cx, 0, NULL);
1393 //JS_DefineFunctions(cx, obj, nlistFunctions);
1394 JSObject *obj = JS_ConstructObject(cx, &nlistClass, NULL, NULL);
1399 JSObject* jsdom_createNamedNodeMap(JSContext *cx, int num)
1401 JSObject *obj = JS_NewObject(cx, &nnmClass, NULL, NULL);
1402 JS_DefineFunctions(cx, obj, nnmFunctions);
1403 JS_DefineProperties(cx, obj, nnmProps);