From: ishmal Date: Wed, 30 Aug 2006 14:56:24 +0000 (+0000) Subject: More binding progress. Fix Node::textContent and child manipulation. X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=d0e6f7fc4eeae91c8ddb9d55a652d21742e2b5b3;p=inkscape.git More binding progress. Fix Node::textContent and child manipulation. --- diff --git a/src/dom/dom.h b/src/dom/dom.h index e195dae7d..de3532074 100644 --- a/src/dom/dom.h +++ b/src/dom/dom.h @@ -435,7 +435,7 @@ public: /** * */ - virtual DOMImplementation *getDOMImplementation(unsigned long index) + virtual DOMImplementation *item(unsigned long index) { if (index >implementations.size()) return NULL; @@ -760,13 +760,13 @@ public: /** * */ - virtual DOMString getTextContext() throw(DOMException) = 0; + virtual DOMString getTextContent() throw(DOMException) = 0; /** * */ - virtual void setTextContext(const DOMString &val) throw(DOMException) = 0; + virtual void setTextContent(const DOMString &val) throw(DOMException) = 0; /** diff --git a/src/dom/domconfig.h b/src/dom/domconfig.h index 41dce7a10..053e99712 100644 --- a/src/dom/domconfig.h +++ b/src/dom/domconfig.h @@ -37,7 +37,7 @@ * or GlibMM's Glib::ustring. If neither one is defined, then DOMString * is defined as stdc++'s std::string. */ -#define DOM_STRING_GLIBMM +//#define DOM_STRING_GLIBMM //#define DOM_STRING_OWN diff --git a/src/dom/domimpl.cpp b/src/dom/domimpl.cpp index ecbfd123d..510751895 100644 --- a/src/dom/domimpl.cpp +++ b/src/dom/domimpl.cpp @@ -305,8 +305,34 @@ Node *NodeImpl::insertBefore(const Node *newChild, const Node *refChild) throw(DOMException) { - Node *node = NULL; - return node; + if (!newChild) + return NULL; + + //if no ref, then just append + if (!refChild) + return appendChild(newChild); + + NodeImpl *newChildImpl = dynamic_cast((Node *)newChild); + for (NodeImpl *n = firstChild ; n ; n=n->next) + { + if (n == refChild) + { + //link to new + if (n->prev) + n->prev->next = newChildImpl; + else + firstChild = newChildImpl; + n->prev = newChildImpl; + //link from new + newChildImpl->next = n; + newChildImpl->prev = n->prev; + //reflect new location + newChildImpl->parent = this; + newChildImpl->ownerDocument = ownerDocument; + return n; + } + } + return NULL; } /** @@ -316,8 +342,33 @@ Node *NodeImpl::replaceChild(const Node *newChild, const Node *oldChild) throw(DOMException) { - Node *node = NULL; - return node; + if (!oldChild) + return NULL; + + NodeImpl *newChildImpl = dynamic_cast((Node *)newChild); + for (NodeImpl *n = firstChild ; n ; n=n->next) + { + if (n == oldChild) + { + //link to new + if (n->prev) + n->prev->next = newChildImpl; + else + firstChild = newChildImpl; + if (n->next) + n->next->prev = newChildImpl; + else + lastChild = newChildImpl; + //link from new + newChildImpl->next = n->next; + newChildImpl->prev = n->prev; + //reflect new location + newChildImpl->parent = this; + newChildImpl->ownerDocument = ownerDocument; + return n; + } + } + return NULL; } /** @@ -326,8 +377,21 @@ Node *NodeImpl::replaceChild(const Node *newChild, Node *NodeImpl::removeChild(const Node *oldChild) throw(DOMException) { - Node *node = NULL; - return node; + if (!oldChild) + return NULL; + + for (NodeImpl *n = firstChild ; n ; n=n->next) + { + if (n == oldChild) + { + if (n->prev) + n->prev->next = n->next; + if (n->next) + n->next->prev = n->prev; + return n; + } + } + return NULL; } /** @@ -339,27 +403,27 @@ Node *NodeImpl::appendChild(const Node *newChild) if (!newChild) return NULL; - Node *child = (Node *)newChild; - NodeImpl *childImpl = dynamic_cast (child); + NodeImpl *newChildImpl = + dynamic_cast ((Node *)newChild); - childImpl->parent = this; - childImpl->ownerDocument = ownerDocument; + newChildImpl->parent = this; + newChildImpl->ownerDocument = ownerDocument; if (!firstChild || !lastChild) { //Set up our first member - firstChild = childImpl; - lastChild = childImpl; + firstChild = newChildImpl; + lastChild = newChildImpl; } else { //link at the last position - lastChild->next = childImpl; - childImpl->prev = lastChild; - lastChild = childImpl; + lastChild->next = newChildImpl; + newChildImpl->prev = lastChild; + lastChild = newChildImpl; } - return child; + return (Node *)newChild; } /** @@ -538,19 +602,48 @@ unsigned short NodeImpl::compareDocumentPosition(const Node *otherArg) /** * */ -DOMString NodeImpl::getTextContext() throw(DOMException) +DOMString NodeImpl::getTextContent() throw(DOMException) { - //no idea - return DOMString(""); + DOMString buf; + if (nodeType == TEXT_NODE || + nodeType == CDATA_SECTION_NODE || + nodeType == COMMENT_NODE || + nodeType == PROCESSING_INSTRUCTION_NODE) + buf = getNodeValue(); + else if (nodeType == ELEMENT_NODE || + nodeType == ATTRIBUTE_NODE || + nodeType == ENTITY_NODE || + nodeType == ENTITY_REFERENCE_NODE || + nodeType == DOCUMENT_FRAGMENT_NODE) + { + for (Node *n = getFirstChild() ; n ; + n=n->getNextSibling() ) + { + if (n->getNodeType() != COMMENT_NODE && + n->getNodeType() != COMMENT_NODE) + buf.append(n->getTextContent()); + } + } + return buf; } /** * */ -void NodeImpl::setTextContext(const DOMString &val) throw(DOMException) +void NodeImpl::setTextContent(const DOMString &val) throw(DOMException) { - //no idea + //Delete children + for (Node *n = getFirstChild() ; n ; + n=n->getNextSibling() ) + delete n; + firstChild = lastChild = NULL; + + //Replace with a single text node + NodeImpl *tnode = new NodeImpl(ownerDocument); + tnode->nodeType = Node::TEXT_NODE; + tnode->setNodeValue(val); + appendChild(tnode); } @@ -1028,6 +1121,10 @@ NodeImpl::~NodeImpl() { if (userDataEntries) delete userDataEntries; + //Delete children + for (Node *n = getFirstChild() ; n ; + n=n->getNextSibling() ) + delete n; } diff --git a/src/dom/domimpl.h b/src/dom/domimpl.h index bbd1693ef..669b3d878 100644 --- a/src/dom/domimpl.h +++ b/src/dom/domimpl.h @@ -328,13 +328,13 @@ public: /** * */ - virtual DOMString getTextContext() throw(DOMException); + virtual DOMString getTextContent() throw(DOMException); /** * */ - virtual void setTextContext(const DOMString &val) throw(DOMException); + virtual void setTextContent(const DOMString &val) throw(DOMException); /** diff --git a/src/dom/jsbind.cpp b/src/dom/jsbind.cpp index 4e2af1dec..0cfe47761 100644 --- a/src/dom/jsbind.cpp +++ b/src/dom/jsbind.cpp @@ -60,6 +60,9 @@ //# U T I L I T Y //######################################################################## +//Use this for getting the JavascriptEngine from an object method +#define ENGINE ((JavascriptEngine *) JS_GetContextPrivate(cx)) + /** * The name of the property is an enumeration, so just return the value. @@ -72,12 +75,31 @@ static JSBool JSGetEnumProperty(JSContext *cx, JSObject *obj, } +static JSString *domToJString(JSContext *cx, const DOMString &s) +{ + JSString *str = JS_NewStringCopyN(cx, s.c_str(), s.size()); + return str; +} + +static DOMString jvToDomString(JSContext *cx, jsval s) +{ + JSString *jstr = JS_ValueToString(cx, s); + DOMString str = JS_GetStringBytes(jstr); + return str; +} + +static DOMString jToDomString(JSString *s) +{ + DOMString str = JS_GetStringBytes(s); + return str; +} //######################################################################## //# C L A S S E S //######################################################################## + /** * Appendix H: ECMAScript Language Binding * @@ -121,6 +143,7 @@ class ECMA_DOMImplementationRegistry { public: + /** * JSConstructor - Callback for when a this object is created */ @@ -194,10 +217,11 @@ public: } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; static JSFunctionSpec methods[]; @@ -338,8 +362,9 @@ public: { if (!JSVAL_IS_INT(id)) return JS_FALSE; + int index = JSVAL_TO_INT(id); DOMException *p = (DOMException *) JS_GetPrivate(cx, obj); - switch( JSVAL_TO_INT( id ) ) + switch( index ) { case prop_code: { @@ -358,8 +383,9 @@ public: { if (!JSVAL_IS_INT(id)) return JS_FALSE; + int index = JSVAL_TO_INT( id ); DOMException *p = (DOMException *) JS_GetPrivate(cx, obj); - switch( JSVAL_TO_INT( id ) ) + switch( index ) { case prop_code: { @@ -372,10 +398,11 @@ public: + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; enum { prop_code @@ -521,17 +548,34 @@ public: } /** - * JSGetProperty - Callback for retrieving properties + * JSGetProperty - Use this one for list[index] lookup */ static JSBool JSGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { + if (!JSVAL_IS_INT(id)) + return JS_TRUE; + int index = JSVAL_TO_INT(id); + DOMStringList *p = (DOMStringList *) JS_GetPrivate(cx, obj); + JSString *jstr = domToJString(cx, p->item(index)); + *vp = STRING_TO_JSVAL(jstr); + return JS_FALSE; + } + + /** + * JSGetProperty - Use this one for enumerated property names + */ + static JSBool JSGetNamedProperty(JSContext *cx, JSObject *obj, + jsval id, jsval *vp) + { if (JSVAL_IS_INT(id)) { DOMStringList *p = (DOMStringList *) JS_GetPrivate(cx, obj); if (JSVAL_TO_INT(id) == prop_length) + { *vp = JSVAL_TO_INT(p->getLength()); - return JS_TRUE; + return JS_TRUE; + } } return JS_FALSE; } @@ -551,7 +595,12 @@ public: static JSBool item(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + uint32 index; + if (!JS_ConvertArguments(cx, argc, argv, "u", &index)) + return JS_FALSE; + DOMStringList *p = (DOMStringList *) JS_GetPrivate(cx, obj); + *rval = STRING_TO_JSVAL(domToJString(cx, p->item(index))); + return JS_TRUE; } /** @@ -560,14 +609,20 @@ public: static JSBool contains(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *str; + if (!JS_ConvertArguments(cx, argc, argv, "S", &str)) + return JS_FALSE; + DOMStringList *p = (DOMStringList *) JS_GetPrivate(cx, obj); + *rval = BOOLEAN_TO_JSVAL(p->contains( jToDomString(str))); + return JS_TRUE; } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; enum { @@ -591,7 +646,7 @@ JSClass ECMA_DOMStringList::classDef = JSPropertySpec ECMA_DOMStringList::properties[] = { - { "length", prop_length, JSPROP_READONLY }, + { "length", prop_length, JSPROP_READONLY, JSGetNamedProperty }, { 0 } }; @@ -671,7 +726,7 @@ public: */ static void JSDestructor(JSContext *cx, JSObject *obj) { - DOMException *p = (DOMException *) JS_GetPrivate(cx, obj); + NameList *p = (NameList *) JS_GetPrivate(cx, obj); delete p; } @@ -681,6 +736,16 @@ public: static JSBool JSGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { + if (!JSVAL_IS_INT(id)) + return JS_TRUE; + int index = JSVAL_TO_INT(id); + NameList *p = (NameList *) JS_GetPrivate(cx, obj); + switch (index) + { + case prop_length: + *vp = INT_TO_JSVAL(p->getLength()); + return JS_TRUE; + } return JS_FALSE; } @@ -699,7 +764,12 @@ public: static JSBool getName(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + uint32 index; + if (!JS_ConvertArguments(cx, argc, argv, "u", &index)) + return JS_FALSE; + NameList *p = (NameList *) JS_GetPrivate(cx, obj); + *rval = STRING_TO_JSVAL(domToJString(cx, p->getName(index))); + return JS_TRUE; } /** @@ -708,7 +778,12 @@ public: static JSBool getNamespaceURI(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + uint32 index; + if (!JS_ConvertArguments(cx, argc, argv, "u", &index)) + return JS_FALSE; + NameList *p = (NameList *) JS_GetPrivate(cx, obj); + *rval = STRING_TO_JSVAL(domToJString(cx, p->getNamespaceURI(index))); + return JS_TRUE; } /** @@ -717,7 +792,12 @@ public: static JSBool contains(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *str; + if (!JS_ConvertArguments(cx, argc, argv, "S", &str)) + return JS_FALSE; + NameList *p = (NameList *) JS_GetPrivate(cx, obj); + *rval = BOOLEAN_TO_JSVAL(p->contains( jToDomString(str))); + return JS_TRUE; } /** @@ -726,15 +806,26 @@ public: static JSBool containsNS(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *ns; JSString *name; + if (!JS_ConvertArguments(cx, argc, argv, "SS", &ns, &name)) + return JS_FALSE; + NameList *p = (NameList *) JS_GetPrivate(cx, obj); + *rval = BOOLEAN_TO_JSVAL( + p->containsNS(jToDomString(ns), jToDomString(name))); + return JS_TRUE; } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; + enum + { + prop_length + }; static JSFunctionSpec methods[]; }; @@ -753,6 +844,7 @@ JSClass ECMA_NameList::classDef = JSPropertySpec ECMA_NameList::properties[] = { + { "length", prop_length, JSPROP_READONLY }, { 0 } }; @@ -806,7 +898,7 @@ public: { if (argc != 1) return JS_FALSE; - DOMException *p = new DOMException(JSVAL_TO_INT( argv[0] )); + DOMImplementationList *p = new DOMImplementationList(); if ( ! JS_SetPrivate(cx, obj, p) ) return JS_FALSE; *rval = OBJECT_TO_JSVAL(obj); @@ -830,16 +922,44 @@ public: */ static void JSDestructor(JSContext *cx, JSObject *obj) { - DOMException *p = (DOMException *) JS_GetPrivate(cx, obj); + DOMImplementationList *p = + (DOMImplementationList *) JS_GetPrivate(cx, obj); delete p; } /** - * JSGetProperty - Callback for retrieving properties + * JSGetProperty - Use this one for list[index] lookup */ static JSBool JSGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { + if (!JSVAL_IS_INT(id)) + return JS_TRUE; + int index = JSVAL_TO_INT(id); + DOMImplementationList *p = + (DOMImplementationList *) JS_GetPrivate(cx, obj); + DOMImplementation *di = p->item(index); + *vp = OBJECT_TO_JSVAL(ENGINE->new_DOMImplementation(di)); + return JS_FALSE; + } + + /** + * JSGetProperty - Use this one for enumerated property names + */ + static JSBool JSGetNamedProperty(JSContext *cx, JSObject *obj, + jsval id, jsval *vp) + { + if (!JSVAL_IS_INT(id)) + return JS_TRUE; + int index = JSVAL_TO_INT(id); + DOMImplementationList *p = + (DOMImplementationList *) JS_GetPrivate(cx, obj); + switch (index) + { + case prop_length: + *vp = INT_TO_JSVAL(p->getLength()); + return JS_TRUE; + } return JS_FALSE; } @@ -858,15 +978,27 @@ public: static JSBool item(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + uint32 index; + if (!JS_ConvertArguments(cx, argc, argv, "u", &index)) + return JS_FALSE; + DOMImplementationList *p = + (DOMImplementationList *) JS_GetPrivate(cx, obj); + DOMImplementation *di = p->item(index); + *rval = OBJECT_TO_JSVAL(ENGINE->new_DOMImplementation(di)); + return JS_TRUE; } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; + enum + { + prop_length + }; static JSFunctionSpec methods[]; }; @@ -885,6 +1017,7 @@ JSClass ECMA_DOMImplementationList::classDef = JSPropertySpec ECMA_DOMImplementationList::properties[] = { + { "length", prop_length, JSPROP_READONLY, JSGetNamedProperty }, { 0 } }; @@ -954,7 +1087,8 @@ public: */ static void JSDestructor(JSContext *cx, JSObject *obj) { - DOMImplementationSource *p = (DOMImplementationSource *) JS_GetPrivate(cx, obj); + DOMImplementationSource *p = + (DOMImplementationSource *) JS_GetPrivate(cx, obj); delete p; } @@ -986,7 +1120,15 @@ public: static JSBool getDOMImplementation(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *feature; + if (!JS_ConvertArguments(cx, argc, argv, "S", &feature)) + return JS_FALSE; + DOMImplementationSource *p = + (DOMImplementationSource *) JS_GetPrivate(cx, obj); + DOMImplementation *di = + p->getDOMImplementation(jToDomString(feature)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_DOMImplementation(di)); + return JS_TRUE; } /** @@ -995,14 +1137,22 @@ public: static JSBool getDOMImplementationList(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *feature; + if (!JS_ConvertArguments(cx, argc, argv, "S", &feature)) + return JS_FALSE; + DOMImplementationSource *p = + (DOMImplementationSource *) JS_GetPrivate(cx, obj); + DOMImplementationList di = + p->getDOMImplementationList(jToDomString(feature)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_DOMImplementationList(&di)); + return JS_TRUE; } + static JSClass classDef; private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; static JSFunctionSpec methods[]; @@ -1172,10 +1322,11 @@ public: } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; static JSFunctionSpec methods[]; @@ -1280,10 +1431,11 @@ public: } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; static JSFunctionSpec methods[]; @@ -1503,6 +1655,71 @@ public: static JSBool JSGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { + if (!JSVAL_IS_INT(id)) + return JS_FALSE; + int index = JSVAL_TO_INT(id); + Document *d = (Document *)JS_GetPrivate(cx, obj); + switch (index) + { + case prop_doctype: + { + DocumentType *p = d->getDoctype(); + *vp = OBJECT_TO_JSVAL(ENGINE->new_DocumentType(p)); + return JS_TRUE; + } + case prop_implementation: + { + DOMImplementation *p = d->getImplementation(); + *vp = OBJECT_TO_JSVAL(ENGINE->new_DOMImplementation(p)); + return JS_TRUE; + } + case prop_documentElement: + { + Element *p = d->getDocumentElement(); + *vp = OBJECT_TO_JSVAL(ENGINE->new_Element(p)); + return JS_TRUE; + } + case prop_inputEncoding: + { + DOMString p = d->getInputEncoding(); + *vp = OBJECT_TO_JSVAL(domToJString(cx, p)); + return JS_TRUE; + } + case prop_xmlEncoding: + { + DOMString p = d->getXmlEncoding(); + *vp = OBJECT_TO_JSVAL(domToJString(cx, p)); + return JS_TRUE; + } + case prop_xmlStandalone: + { + *vp = BOOLEAN_TO_JSVAL(d->getXmlStandalone()); + return JS_TRUE; + } + case prop_xmlVersion: + { + DOMString p = d->getXmlVersion(); + *vp = OBJECT_TO_JSVAL(domToJString(cx, p)); + return JS_TRUE; + } + case prop_strictErrorChecking: + { + *vp = BOOLEAN_TO_JSVAL(d->getStrictErrorChecking()); + return JS_TRUE; + } + case prop_documentURI: + { + DOMString p = d->getDocumentURI(); + *vp = OBJECT_TO_JSVAL(domToJString(cx, p)); + return JS_TRUE; + } + case prop_domConfig: + { + DOMConfiguration *p = d->getDomConfig(); + *vp = OBJECT_TO_JSVAL(ENGINE->new_DOMConfiguration(p)); + return JS_TRUE; + } + } return JS_FALSE; } @@ -1512,6 +1729,33 @@ public: static JSBool JSSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { + if (!JSVAL_IS_INT(id)) + return JS_FALSE; + int index = JSVAL_TO_INT(id); + Document *d = (Document *)JS_GetPrivate(cx, obj); + switch (index) + { + case prop_xmlStandalone: + { + d->setXmlStandalone(JSVAL_TO_BOOLEAN(*vp)); + return JS_TRUE; + } + case prop_xmlVersion: + { + d->setXmlVersion(jvToDomString(cx, *vp)); + return JS_TRUE; + } + case prop_strictErrorChecking: + { + d->setStrictErrorChecking(JSVAL_TO_BOOLEAN(*vp)); + return JS_TRUE; + } + case prop_documentURI: + { + d->setDocumentURI(jvToDomString(cx, *vp)); + return JS_TRUE; + } + } return JS_FALSE; } @@ -1526,7 +1770,13 @@ public: static JSBool createElement(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *str; + if (!JS_ConvertArguments(cx, argc, argv, "S", &str)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + Element *p = d->createElement(jToDomString(str)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_Element(p)); + return JS_TRUE; } /** @@ -1535,7 +1785,10 @@ public: static JSBool createDocumentFragment(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + DocumentFragment *p = d->createDocumentFragment(); + *rval = OBJECT_TO_JSVAL(ENGINE->new_DocumentFragment(p)); + return JS_TRUE; } /** @@ -1544,7 +1797,13 @@ public: static JSBool createTextNode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *str; + if (!JS_ConvertArguments(cx, argc, argv, "S", &str)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + Text *p = d->createTextNode(jToDomString(str)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_Text(p)); + return JS_TRUE; } /** @@ -1553,7 +1812,13 @@ public: static JSBool createComment(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *str; + if (!JS_ConvertArguments(cx, argc, argv, "S", &str)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + Comment *p = d->createComment(jToDomString(str)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_Comment(p)); + return JS_TRUE; } /** @@ -1562,7 +1827,13 @@ public: static JSBool createCDATASection(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *str; + if (!JS_ConvertArguments(cx, argc, argv, "S", &str)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + CDATASection *p = d->createCDATASection(jToDomString(str)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_CDATASection(p)); + return JS_TRUE; } /** @@ -1571,7 +1842,14 @@ public: static JSBool createProcessingInstruction(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *name; JSString *data; + if (!JS_ConvertArguments(cx, argc, argv, "SS", &name, &data)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + ProcessingInstruction *p = + d->createProcessingInstruction(jToDomString(name), jToDomString(data)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_ProcessingInstruction(p)); + return JS_TRUE; } /** @@ -1580,7 +1858,13 @@ public: static JSBool createAttribute(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *str; + if (!JS_ConvertArguments(cx, argc, argv, "S", &str)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + Attr *p = d->createAttribute(jToDomString(str)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_Attr(p)); + return JS_TRUE; } /** @@ -1589,7 +1873,13 @@ public: static JSBool createEntityReference(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *str; + if (!JS_ConvertArguments(cx, argc, argv, "S", &str)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + EntityReference *p = d->createEntityReference(jToDomString(str)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_EntityReference(p)); + return JS_TRUE; } /** @@ -1598,7 +1888,13 @@ public: static JSBool getElementsByTagName(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *str; + if (!JS_ConvertArguments(cx, argc, argv, "S", &str)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + NodeList p = d->getElementsByTagName(jToDomString(str)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_NodeList(&p)); + return JS_TRUE; } /** @@ -1607,7 +1903,14 @@ public: static JSBool importNode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSObject *impnode; JSBool deep; + if (!JS_ConvertArguments(cx, argc, argv, "ou", &impnode, &deep)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + Node *n = (Node *)JS_GetPrivate(cx, impnode); + Node *p = d->importNode(n, deep); + *rval = OBJECT_TO_JSVAL(ENGINE->new_Node(p)); + return JS_TRUE; } /** @@ -1616,7 +1919,14 @@ public: static JSBool createElementNS(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *ns; JSString *name; + if (!JS_ConvertArguments(cx, argc, argv, "SS", &ns, &name)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + Element *p = + d->createElementNS(jToDomString(ns), jToDomString(name)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_Element(p)); + return JS_TRUE; } /** @@ -1625,7 +1935,14 @@ public: static JSBool createAttributeNS(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *ns; JSString *name; + if (!JS_ConvertArguments(cx, argc, argv, "SS", &ns, &name)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + Attr *p = + d->createAttributeNS(jToDomString(ns), jToDomString(name)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_Attr(p)); + return JS_TRUE; } /** @@ -1634,7 +1951,14 @@ public: static JSBool getElementsByTagNameNS(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *ns; JSString *name; + if (!JS_ConvertArguments(cx, argc, argv, "SS", &ns, &name)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + NodeList p = + d->getElementsByTagNameNS(jToDomString(ns), jToDomString(name)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_NodeList(&p)); + return JS_TRUE; } /** @@ -1643,7 +1967,13 @@ public: static JSBool getElementById(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSString *str; + if (!JS_ConvertArguments(cx, argc, argv, "S", &str)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + Element *p = d->getElementById(jToDomString(str)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_Element(p)); + return JS_TRUE; } /** @@ -1652,7 +1982,14 @@ public: static JSBool adoptNode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSObject *impnode; + if (!JS_ConvertArguments(cx, argc, argv, "o", &impnode)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + Node *n = (Node *)JS_GetPrivate(cx, impnode); + Node *p = d->adoptNode(n); + *rval = OBJECT_TO_JSVAL(ENGINE->new_Node(p)); + return JS_TRUE; } /** @@ -1661,7 +1998,9 @@ public: static JSBool normalizeDocument(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + d->normalizeDocument(); + return JS_TRUE; } /** @@ -1670,7 +2009,14 @@ public: static JSBool renameNode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - return JS_FALSE; + JSObject *rnode; JSString *nsuri; JSString *qname; + if (!JS_ConvertArguments(cx, argc, argv, "oSS", &rnode, &nsuri, &qname)) + return JS_FALSE; + Document *d = (Document *)JS_GetPrivate(cx, obj); + Node *n = (Node *)JS_GetPrivate(cx, rnode); + Node *p = d->renameNode(n, jToDomString(nsuri), jToDomString(qname)); + *rval = OBJECT_TO_JSVAL(ENGINE->new_Node(p)); + return JS_TRUE; } @@ -2001,18 +2347,103 @@ public: jsval id, jsval *vp) { if (!JSVAL_IS_INT(id)) - return JS_FALSE; - //Node *p = (Node *) JS_GetPrivate(cx, obj); - switch( JSVAL_TO_INT( id ) ) + return JS_FALSE; + int index = JSVAL_TO_INT(id); + Node *n = (Node *)JS_GetPrivate(cx, obj); + switch (index) { case prop_nodeName: { + *vp = OBJECT_TO_JSVAL(domToJString(cx, n->getNodeName())); return JS_TRUE; } case prop_nodeValue: { - //*vp = INT_TO_JSVAL(priv->getNode()->GetAge()); - return JS_TRUE; + *vp = OBJECT_TO_JSVAL(domToJString(cx, n->getNodeValue())); + return JS_TRUE; + } + case prop_nodeType: + { + *vp = INT_TO_JSVAL(n->getNodeType()); + return JS_TRUE; + } + case prop_parentNode: + { + Node *p = n->getParentNode(); + *vp = OBJECT_TO_JSVAL(ENGINE->new_Node(p)); + return JS_TRUE; + } + case prop_childNodes: + { + NodeList p = n->getChildNodes(); + *vp = OBJECT_TO_JSVAL(ENGINE->new_NodeList(&p)); + return JS_TRUE; + } + case prop_firstChild: + { + Node *p = n->getFirstChild(); + *vp = OBJECT_TO_JSVAL(ENGINE->new_Node(p)); + return JS_TRUE; + } + case prop_lastChild: + { + Node *p = n->getLastChild(); + *vp = OBJECT_TO_JSVAL(ENGINE->new_Node(p)); + return JS_TRUE; + } + case prop_previousSibling: + { + Node *p = n->getPreviousSibling(); + *vp = OBJECT_TO_JSVAL(ENGINE->new_Node(p)); + return JS_TRUE; + } + case prop_nextSibling: + { + Node *p = n->getNextSibling(); + *vp = OBJECT_TO_JSVAL(ENGINE->new_Node(p)); + return JS_TRUE; + } + case prop_attributes: + { + NamedNodeMap p = n->getAttributes(); + *vp = OBJECT_TO_JSVAL(ENGINE->new_NamedNodeMap(&p)); + return JS_TRUE; + } + case prop_ownerDocument: + { + Document *p = n->getOwnerDocument(); + *vp = OBJECT_TO_JSVAL(ENGINE->new_Document(p)); + return JS_TRUE; + } + case prop_namespaceURI: + { + DOMString s = n->getNamespaceURI(); + *vp = OBJECT_TO_JSVAL(domToJString(cx, s)); + return JS_TRUE; + } + case prop_prefix: + { + DOMString s = n->getPrefix(); + *vp = OBJECT_TO_JSVAL(domToJString(cx, s)); + return JS_TRUE; + } + case prop_localName: + { + DOMString s = n->getLocalName(); + *vp = OBJECT_TO_JSVAL(domToJString(cx, s)); + return JS_TRUE; + } + case prop_baseURI: + { + DOMString s = n->getBaseURI(); + *vp = OBJECT_TO_JSVAL(domToJString(cx, s)); + return JS_TRUE; + } + case prop_textContent: + { + DOMString s = n->getTextContent(); + *vp = OBJECT_TO_JSVAL(domToJString(cx, s)); + return JS_TRUE; } } return JS_FALSE; @@ -2209,10 +2640,11 @@ public: return JS_FALSE; } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; enum { prop_nodeName, @@ -2471,10 +2903,11 @@ public: + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; enum { @@ -2712,10 +3145,11 @@ public: } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; enum { @@ -2923,10 +3357,11 @@ public: } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; enum { @@ -3062,10 +3497,11 @@ public: + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; enum { @@ -3471,10 +3907,11 @@ public: } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; enum { @@ -3648,11 +4085,11 @@ public: } + static JSClass classDef; private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; enum { @@ -3767,10 +4204,11 @@ public: } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; static JSFunctionSpec methods[]; @@ -3912,11 +4350,11 @@ public: } + static JSClass classDef; private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; enum { @@ -4071,10 +4509,11 @@ public: } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; static JSFunctionSpec methods[]; static JSPropertySpec staticProperties[]; @@ -4215,10 +4654,11 @@ public: } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; enum { prop_severity, @@ -4367,10 +4807,11 @@ public: } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; enum { prop_lineNumber, @@ -4549,10 +4990,11 @@ public: } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; enum { prop_parameterNames @@ -4665,10 +5107,11 @@ public: } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; static JSFunctionSpec methods[]; @@ -4789,11 +5232,11 @@ public: } + static JSClass classDef; private: // Standard JS Binding fields - static JSClass classDef; enum { prop_name, @@ -4917,10 +5360,12 @@ public: return JS_FALSE; } + + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; enum { prop_publicId, @@ -5045,10 +5490,11 @@ public: } + static JSClass classDef; + private: // Standard JS Binding fields - static JSClass classDef; enum { prop_publicId, @@ -5166,11 +5612,11 @@ public: } + static JSClass classDef; private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; static JSFunctionSpec methods[]; @@ -5283,11 +5729,11 @@ public: } + static JSClass classDef; private: // Standard JS Binding fields - static JSClass classDef; static JSPropertySpec properties[]; enum { @@ -5346,16 +5792,16 @@ JSFunctionSpec ECMA_ProcessingInstruction::methods[] = bool JavascriptEngine::createClasses() { - nodeProto = + proto_Node = ECMA_Node::JSInit(cx, globalObj); - characterDataProto = - ECMA_CharacterData::JSInit(cx, globalObj, nodeProto); - textProto = - ECMA_Text::JSInit(cx, globalObj, characterDataProto); - cdataProto = - ECMA_CDATASection::JSInit(cx, globalObj, textProto); - documentProto = - ECMA_CDATASection::JSInit(cx, globalObj, cdataProto); + proto_CharacterData = + ECMA_CharacterData::JSInit(cx, globalObj, proto_Node); + proto_Text = + ECMA_Text::JSInit(cx, globalObj, proto_CharacterData); + proto_CDATASection = + ECMA_CDATASection::JSInit(cx, globalObj, proto_Text); + proto_Document = + ECMA_Document::JSInit(cx, globalObj, proto_CDATASection); return true; } @@ -5369,7 +5815,7 @@ JSObject *JavascriptEngine::wrapDocument(const Document *doc) } JSObject *jsdoc = JS_NewObject(cx, &ECMA_Document::classDef, - documentProto, NULL); + proto_Document, NULL); //Wrap around the document... done! JS_SetPrivate(cx, jsdoc, (void *)doc); @@ -5377,6 +5823,288 @@ JSObject *JavascriptEngine::wrapDocument(const Document *doc) return jsdoc; } +JSObject *JavascriptEngine::new_Attr(Attr *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_Attr::classDef, + proto_Attr, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_CDATASection(CDATASection *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_CDATASection::classDef, + proto_CDATASection, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_CharacterData(CharacterData *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_CharacterData::classDef, + proto_CharacterData, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_Comment(Comment *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_Comment::classDef, + proto_Comment, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_Document(Document *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_Document::classDef, + proto_Document, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_DocumentFragment(DocumentFragment *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_DocumentFragment::classDef, + proto_DocumentFragment, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_DocumentType(DocumentType *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_DocumentType::classDef, + proto_DocumentType, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_DOMConfiguration(DOMConfiguration *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_DOMConfiguration::classDef, + proto_DOMConfiguration, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_DOMError(DOMError *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_DOMError::classDef, + proto_DOMError, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_DOMException(DOMException *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_DOMException::classDef, + proto_DOMException, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_DOMImplementation(DOMImplementation *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_DOMImplementation::classDef, + proto_DOMImplementation, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_DOMImplementationList(DOMImplementationList *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_DOMImplementationList::classDef, + proto_DOMImplementationList, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_DOMImplementationRegistry(DOMImplementationSource *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_DOMImplementationRegistry::classDef, + proto_DOMImplementationRegistry, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_DOMImplementationSource(DOMImplementationSource *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_DOMImplementationSource::classDef, + proto_DOMImplementationSource, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_DOMLocator(DOMLocator *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_DOMLocator::classDef, + proto_DOMLocator, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_DOMStringList(DOMStringList *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_DOMStringList::classDef, + proto_DOMStringList, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_Element(Element *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_Element::classDef, + proto_Element, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_Entity(Entity *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_Entity::classDef, + proto_Entity, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_EntityReference(EntityReference *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_EntityReference::classDef, + proto_EntityReference, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_NamedNodeMap(NamedNodeMap *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_NamedNodeMap::classDef, + proto_NamedNodeMap, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_NameList(NameList *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_NameList::classDef, + proto_NameList, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_Node(Node *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_Node::classDef, + proto_Node, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_NodeList(NodeList *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_NodeList::classDef, + proto_NodeList, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_Notation(Notation *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_Notation::classDef, + proto_Notation, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_ProcessingInstruction(ProcessingInstruction *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_ProcessingInstruction::classDef, + proto_ProcessingInstruction, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_Text(Text *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_Text::classDef, + proto_Text, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_TypeInfo(TypeInfo *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_TypeInfo::classDef, + proto_TypeInfo, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + +JSObject *JavascriptEngine::new_UserDataHandler(UserDataHandler *obj) +{ + JSObject *newObj = JS_NewObject(cx, + &ECMA_UserDataHandler::classDef, + proto_UserDataHandler, + NULL); + JS_SetPrivate(cx, newObj, obj); + return newObj; +} + + + } // namespace dom } // namespace w3c