From 836c223a759ea714621c028d14553f99fd6cc58e Mon Sep 17 00:00:00 2001 From: ishmal Date: Sun, 27 Aug 2006 08:57:12 +0000 Subject: [PATCH] New files. These will be the basis for ECMA-DOM binding using Spidermonkey. --- src/dom/jsbind.cpp | 1171 ++++++++++++++++++++++++++++++++++++++++++ src/dom/jsengine.cpp | 132 +++++ src/dom/jsengine.h | 126 +++++ 3 files changed, 1429 insertions(+) create mode 100644 src/dom/jsbind.cpp create mode 100644 src/dom/jsengine.cpp create mode 100644 src/dom/jsengine.h diff --git a/src/dom/jsbind.cpp b/src/dom/jsbind.cpp new file mode 100644 index 000000000..3243703b1 --- /dev/null +++ b/src/dom/jsbind.cpp @@ -0,0 +1,1171 @@ + /** + * Phoebe DOM Implementation. + * + * This is a C++ approximation of the W3C DOM model, which follows + * fairly closely the specifications in the various .idl files, copies of + * which are provided for reference. Most important is this one: + * + * http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/idl-definitions.html + * + * Authors: + * Bob Jamison + * + * Copyright (C) 2006 Bob Jamison + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + #include "domimpl.h" + #include "jsengine.h" + + namespace org + { + namespace w3c + { + namespace dom + { + + /** + * To ensure that we at least attempt to bind ECMAScript to DOM as closely as + * possible, we will include the entire Appendix H of the XML Level 3 Core spec: + * http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/ecma-script-binding.html + */ + +/** + * Appendix H: ECMAScript Language Binding + * + * This appendix contains the complete ECMAScript [ECMAScript] binding for the + * Level 3 Document Object Model Core definitions. H.1 ECMAScript Binding + * Extension + * + * + * This section defines the DOMImplementationRegistry object, discussed in + * Bootstrapping, for ECMAScript. + * + * + * Objects that implements the DOMImplementationRegistry interface + * + * DOMImplementationRegistry is a global variable which has the following functions: + * + * getDOMImplementation(features) + * This method returns the first registered object that implements the + * DOMImplementation interface and has the desired features, or null if none is + * found. The features parameter is a String. See also + * DOMImplementationSource.getDOMImplementation(). + * + * getDOMImplementationList(features) + * This method returns a DOMImplementationList list of registered object that + * implements the DOMImplementation interface and has the desired features. The + * features parameter is a String. See also + * DOMImplementationSource.getDOMImplementationList(). + * + * + */ + + + +/** + * H.2 Other Core interfaces + */ + + +/** + * Properties of the DOMException Constructor function: + * + * DOMException.INDEX_SIZE_ERR + * The value of the constant DOMException.INDEX_SIZE_ERR is 1. + * DOMException.DOMSTRING_SIZE_ERR + * The value of the constant DOMException.DOMSTRING_SIZE_ERR is 2. + * DOMException.HIERARCHY_REQUEST_ERR + * The value of the constant DOMException.HIERARCHY_REQUEST_ERR is 3. + * DOMException.WRONG_DOCUMENT_ERR + * The value of the constant DOMException.WRONG_DOCUMENT_ERR is 4. + * DOMException.INVALID_CHARACTER_ERR + * The value of the constant DOMException.INVALID_CHARACTER_ERR is 5. + * DOMException.NO_DATA_ALLOWED_ERR + * The value of the constant DOMException.NO_DATA_ALLOWED_ERR is 6. + * DOMException.NO_MODIFICATION_ALLOWED_ERR + * The value of the constant DOMException.NO_MODIFICATION_ALLOWED_ERR is 7. + * DOMException.NOT_FOUND_ERR + * The value of the constant DOMException.NOT_FOUND_ERR is 8. + * DOMException.NOT_SUPPORTED_ERR + * The value of the constant DOMException.NOT_SUPPORTED_ERR is 9. + * DOMException.INUSE_ATTRIBUTE_ERR + * The value of the constant DOMException.INUSE_ATTRIBUTE_ERR is 10. + * DOMException.INVALID_STATE_ERR + * The value of the constant DOMException.INVALID_STATE_ERR is 11. + * DOMException.SYNTAX_ERR + * The value of the constant DOMException.SYNTAX_ERR is 12. + * DOMException.INVALID_MODIFICATION_ERR + * The value of the constant DOMException.INVALID_MODIFICATION_ERR is 13. + * DOMException.NAMESPACE_ERR + * The value of the constant DOMException.NAMESPACE_ERR is 14. + * DOMException.INVALID_ACCESS_ERR + * The value of the constant DOMException.INVALID_ACCESS_ERR is 15. + * DOMException.VALIDATION_ERR + * The value of the constant DOMException.VALIDATION_ERR is 16. + * DOMException.TYPE_MISMATCH_ERR + * The value of the constant DOMException.TYPE_MISMATCH_ERR is 17. + * + * Objects that implement the DOMException interface: + * + * Properties of objects that implement the DOMException interface: + * + * code + * This property is a Number. + * + */ + +/** + * Objects that implement the DOMStringList interface: + * + * Properties of objects that implement the DOMStringList interface: + * + * length + * This read-only property is a Number. + * + * Functions of objects that implement the DOMStringList interface: + * + * item(index) + * This function returns a String. + * The index parameter is a Number. + * Note: This object can also be dereferenced using square bracket notation + * (e.g. obj[1]). Dereferencing with an integer index is equivalent + * to invoking the item function with that index. + * + * contains(str) + * This function returns a Boolean. + * The str parameter is a String. + * + */ + + + +/** + * Objects that implement the NameList interface: + * + * Properties of objects that implement the NameList interface: + * + * length + * This read-only property is a Number. + * + * Functions of objects that implement the NameList interface: + * + * getName(index) + * This function returns a String. + * The index parameter is a Number. + * getNamespaceURI(index) + * This function returns a String. + * The index parameter is a Number. + * contains(str) + * This function returns a Boolean. + * The str parameter is a String. + * containsNS(namespaceURI, name) + * This function returns a Boolean. + * The namespaceURI parameter is a String. + * The name parameter is a String. + */ + + +/** + * Objects that implement the DOMImplementationList interface: + * + * Properties of objects that implement the DOMImplementationList interface: + * + * length + * This read-only property is a Number. + * + * Functions of objects that implement the DOMImplementationList interface: + * + * item(index) + * This function returns an object that implements the DOMImplementation interface. + * The index parameter is a Number. + * Note: This object can also be dereferenced using square bracket notation + * (e.g. obj[1]). Dereferencing with an integer index is equivalent + * to invoking the item function with that index. + * + * + */ + +/** + * Objects that implement the DOMImplementationSource interface: + * + * Functions of objects that implement the DOMImplementationSource interface: + * + * getDOMImplementation(features) + * This function returns an object that implements the DOMImplementation interface. + * The features parameter is a String. + * getDOMImplementationList(features) + * This function returns an object that implements the DOMImplementationList + * interface. + * The features parameter is a String. + */ + +/** + * Objects that implement the DOMImplementation interface: + * + * Functions of objects that implement the DOMImplementation interface: + * + * hasFeature(feature, version) + * This function returns a Boolean. + * The feature parameter is a String. + * The version parameter is a String. + * createDocumentType(qualifiedName, publicId, systemId) + * This function returns an object that implements the DocumentType interface. + * The qualifiedName parameter is a String. + * The publicId parameter is a String. + * The systemId parameter is a String. + * This function can raise an object that implements the DOMException interface. + * createDocument(namespaceURI, qualifiedName, doctype) + * This function returns an object that implements the Document interface. + * The namespaceURI parameter is a String. + * The qualifiedName parameter is a String. + * The doctype parameter is an object that implements the DocumentType interface. + * This function can raise an object that implements the DOMException interface. + * getFeature(feature, version) + * This function returns an object that implements the Object interface. + * The feature parameter is a String. + * The version parameter is a String. + */ + +/** + * Objects that implement the DocumentFragment interface: + * + * Objects that implement the DocumentFragment interface have all properties and + * functions of the Node interface. + */ + + +/** + * Objects that implement the Document interface: + * + * Objects that implement the Document interface have all properties and functions + * of the Node interface as well as the properties and functions defined below. + * Properties of objects that implement the Document interface: + * + * + * doctype + * This read-only property is an object that implements the DocumentType interface. + * implementation + * This read-only property is an object that implements the DOMImplementation + * interface. + * documentElement + * This read-only property is an object that implements the Element interface. + * inputEncoding + * This read-only property is a String. + * xmlEncoding + * This read-only property is a String. + * xmlStandalone + * This property is a Boolean and can raise an object that implements the + * DOMException interface on setting. + * xmlVersion + * This property is a String and can raise an object that implements the + * DOMException interface on setting. + * strictErrorChecking + * This property is a Boolean. + * documentURI + * This property is a String. + * domConfig + * This read-only property is an object that implements the DOMConfiguration + * interface. + * + * + * Functions of objects that implement the Document interface: + * + * createElement(tagName) + * This function returns an object that implements the Element interface. + * The tagName parameter is a String. + * This function can raise an object that implements the DOMException interface. + * createDocumentFragment() + * This function returns an object that implements the DocumentFragment interface. + * createTextNode(data) + * This function returns an object that implements the Text interface. + * The data parameter is a String. + * createComment(data) + * This function returns an object that implements the Comment interface. + * The data parameter is a String. + * createCDATASection(data) + * This function returns an object that implements the CDATASection interface. + * The data parameter is a String. + * This function can raise an object that implements the DOMException interface. + * createProcessingInstruction(target, data) + * This function returns an object that implements the ProcessingInstruction interface. + * The target parameter is a String. + * The data parameter is a String. + * This function can raise an object that implements the DOMException interface. + * createAttribute(name) + * This function returns an object that implements the Attr interface. + * The name parameter is a String. + * This function can raise an object that implements the DOMException interface. + * createEntityReference(name) + * This function returns an object that implements the EntityReference interface. + * The name parameter is a String. + * This function can raise an object that implements the DOMException interface. + * getElementsByTagName(tagname) + * This function returns an object that implements the NodeList interface. + * The tagname parameter is a String. + * importNode(importedNode, deep) + * This function returns an object that implements the Node interface. + * The importedNode parameter is an object that implements the Node interface. + * The deep parameter is a Boolean. + * This function can raise an object that implements the DOMException interface. + * createElementNS(namespaceURI, qualifiedName) + * This function returns an object that implements the Element interface. + * The namespaceURI parameter is a String. + * The qualifiedName parameter is a String. + * This function can raise an object that implements the DOMException interface. + * createAttributeNS(namespaceURI, qualifiedName) + * This function returns an object that implements the Attr interface. + * The namespaceURI parameter is a String. + * The qualifiedName parameter is a String. + * This function can raise an object that implements the DOMException interface. + * getElementsByTagNameNS(namespaceURI, localName) + * This function returns an object that implements the NodeList interface. + * The namespaceURI parameter is a String. + * The localName parameter is a String. + * getElementById(elementId) + * This function returns an object that implements the Element interface. + * The elementId parameter is a String. + * adoptNode(source) + * This function returns an object that implements the Node interface. + * The source parameter is an object that implements the Node interface. + * This function can raise an object that implements the DOMException interface. + * normalizeDocument() + * This function has no return value. + * renameNode(n, namespaceURI, qualifiedName) + * This function returns an object that implements the Node interface. + * The n parameter is an object that implements the Node interface. + * The namespaceURI parameter is a String. + * The qualifiedName parameter is a String. + * This function can raise an object that implements the DOMException interface. + */ + + +/** + * Properties of the Node Constructor function: + * + * Node.ELEMENT_NODE + * The value of the constant Node.ELEMENT_NODE is 1. + * Node.ATTRIBUTE_NODE + * The value of the constant Node.ATTRIBUTE_NODE is 2. + * Node.TEXT_NODE + * The value of the constant Node.TEXT_NODE is 3. + * Node.CDATA_SECTION_NODE + * The value of the constant Node.CDATA_SECTION_NODE is 4. + * Node.ENTITY_REFERENCE_NODE + * The value of the constant Node.ENTITY_REFERENCE_NODE is 5. + * Node.ENTITY_NODE + * The value of the constant Node.ENTITY_NODE is 6. + * Node.PROCESSING_INSTRUCTION_NODE + * The value of the constant Node.PROCESSING_INSTRUCTION_NODE is 7. + * Node.COMMENT_NODE + * The value of the constant Node.COMMENT_NODE is 8. + * Node.DOCUMENT_NODE + * The value of the constant Node.DOCUMENT_NODE is 9. + * Node.DOCUMENT_TYPE_NODE + * The value of the constant Node.DOCUMENT_TYPE_NODE is 10. + * Node.DOCUMENT_FRAGMENT_NODE + * The value of the constant Node.DOCUMENT_FRAGMENT_NODE is 11. + * Node.NOTATION_NODE + * The value of the constant Node.NOTATION_NODE is 12. + * Node.DOCUMENT_POSITION_DISCONNECTED + * The value of the constant Node.DOCUMENT_POSITION_DISCONNECTED is 0x01. + * Node.DOCUMENT_POSITION_PRECEDING + * The value of the constant Node.DOCUMENT_POSITION_PRECEDING is 0x02. + * Node.DOCUMENT_POSITION_FOLLOWING + * The value of the constant Node.DOCUMENT_POSITION_FOLLOWING is 0x04. + * Node.DOCUMENT_POSITION_CONTAINS + * The value of the constant Node.DOCUMENT_POSITION_CONTAINS is 0x08. + * Node.DOCUMENT_POSITION_CONTAINED_BY + * The value of the constant Node.DOCUMENT_POSITION_CONTAINED_BY is 0x10. + * Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC + * The value of the constant Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC is 0x20. + * + * Objects that implement the Node interface: + * + * Properties of objects that implement the Node interface: + * + * nodeName + * This read-only property is a String. + * nodeValue + * This property is a String, can raise an object that implements the DOMException + * interface on setting and can raise an object that implements the DOMException + * interface on retrieval. + * nodeType + * This read-only property is a Number. + * parentNode + * This read-only property is an object that implements the Node interface. + * childNodes + * This read-only property is an object that implements the NodeList interface. + * firstChild + * This read-only property is an object that implements the Node interface. + * lastChild + * This read-only property is an object that implements the Node interface. + * previousSibling + * This read-only property is an object that implements the Node interface. + * nextSibling + * This read-only property is an object that implements the Node interface. + * attributes + * This read-only property is an object that implements the NamedNodeMap interface. + * ownerDocument + * This read-only property is an object that implements the Document interface. + * namespaceURI + * This read-only property is a String. + * prefix + * This property is a String and can raise an object that implements the + * DOMException interface on setting. + * localName + * This read-only property is a String. + * baseURI + * This read-only property is a String. + * textContent + * This property is a String, can raise an object that implements the DOMException + * interface on setting and can raise an object that implements the DOMException + * interface on retrieval. + * + * + * Functions of objects that implement the Node interface: + * + * insertBefore(newChild, refChild) + * This function returns an object that implements the Node interface. + * The newChild parameter is an object that implements the Node interface. + * The refChild parameter is an object that implements the Node interface. + * This function can raise an object that implements the DOMException interface. + * replaceChild(newChild, oldChild) + * This function returns an object that implements the Node interface. + * The newChild parameter is an object that implements the Node interface. + * The oldChild parameter is an object that implements the Node interface. + * This function can raise an object that implements the DOMException interface. + * removeChild(oldChild) + * This function returns an object that implements the Node interface. + * The oldChild parameter is an object that implements the Node interface. + * This function can raise an object that implements the DOMException interface. + * appendChild(newChild) + * This function returns an object that implements the Node interface. + * The newChild parameter is an object that implements the Node interface. + * This function can raise an object that implements the DOMException interface. + * hasChildNodes() + * This function returns a Boolean. + * cloneNode(deep) + * This function returns an object that implements the Node interface. + * The deep parameter is a Boolean. + * normalize() + * This function has no return value. + * isSupported(feature, version) + * This function returns a Boolean. + * The feature parameter is a String. + * The version parameter is a String. + * hasAttributes() + * This function returns a Boolean. + * compareDocumentPosition(other) + * This function returns a Number. + * The other parameter is an object that implements the Node interface. + * This function can raise an object that implements the DOMException interface. + * isSameNode(other) + * This function returns a Boolean. + * The other parameter is an object that implements the Node interface. + * lookupPrefix(namespaceURI) + * This function returns a String. + * The namespaceURI parameter is a String. + * isDefaultNamespace(namespaceURI) + * This function returns a Boolean. + * The namespaceURI parameter is a String. + * lookupNamespaceURI(prefix) + * This function returns a String. + * The prefix parameter is a String. + * isEqualNode(arg) + * This function returns a Boolean. + * The arg parameter is an object that implements the Node interface. + * getFeature(feature, version) + * This function returns an object that implements the Object interface. + * The feature parameter is a String. + * The version parameter is a String. + * setUserData(key, data, handler) + * This function returns an object that implements the any type interface. + * The key parameter is a String. + * The data parameter is an object that implements the any type interface. + * The handler parameter is an object that implements the UserDataHandler interface. + * getUserData(key) + * This function returns an object that implements the any type interface. + * The key parameter is a String. + * + */ + +class JSNode +{ +public: + + /** + * JSConstructor - Callback for when a this object is created + */ + static JSBool JSConstructor(JSContext *cx, JSObject *obj, uintN argc, + jsval *argv, jsval *rval) + { + Node *p = new NodeImpl(); + if ( ! JS_SetPrivate(cx, obj, p) ) + return JS_FALSE; + *rval = OBJECT_TO_JSVAL(obj); + return JS_TRUE; + } + + /** + * JSInit - Create a prototype for this class + */ + static JSObject* JSInit(JSContext *cx, JSObject *obj, JSObject *proto = NULL) + { + JSObject *newObj = JS_InitClass(cx, obj, proto, &classDef, + JSConstructor, 0, + properties, methods, + staticProperties, staticMethods); + return newObj; + } + + /** + * JSDestructor - Callback for when a this object is destroyed + */ + static void JSDestructor(JSContext *cx, JSObject *obj) + { + Node *p = (Node *) JS_GetPrivate(cx, obj); + delete p; + p = NULL; + } + + /** + * JSGetProperty - Callback for retrieving properties + */ + static JSBool JSGetProperty(JSContext *cx, JSObject *obj, + jsval id, jsval *vp) + { + if (!JSVAL_IS_INT(id)) + return JS_FALSE; + Node *p = (Node *) JS_GetPrivate(cx, obj); + switch( JSVAL_TO_INT( id ) ) + { + case name_prop: + { + return JS_TRUE; + } + case age_prop: + { + //*vp = INT_TO_JSVAL(priv->getNode()->GetAge()); + return JS_TRUE; + } + } + return JS_FALSE; + } + + /** + * JSSetProperty - Callback for setting properties + */ + static JSBool JSSetProperty(JSContext *cx, JSObject *obj, + jsval id, jsval *vp) + { + if (!JSVAL_IS_INT(id)) + return JS_FALSE; + Node *p = (Node *) JS_GetPrivate(cx, obj); + switch( JSVAL_TO_INT( id ) ) + { + case name_prop: + { + return JS_TRUE; + } + case age_prop: + { + //*vp = INT_TO_JSVAL(priv->getNode()->GetAge()); + return JS_TRUE; + } + } + return JS_FALSE; + } + + + +private: + + // Standard JS Binding fields + static JSClass classDef; + enum + { + name_prop, + age_prop + }; + static JSPropertySpec properties[]; + static JSPropertySpec staticProperties[]; + static JSFunctionSpec methods[]; + static JSFunctionSpec staticMethods[]; + +}; + +// JSCustomer.cpp +JSClass JSNode::classDef = +{ + "Node", + JSCLASS_HAS_PRIVATE, + JS_PropertyStub, JS_PropertyStub, + JSNode::JSGetProperty, JSNode::JSSetProperty, + JS_EnumerateStub, JS_ResolveStub, + JS_ConvertStub, JSNode::JSDestructor +}; + +JSPropertySpec JSNode::properties[] = +{ + { "name", JSNode::name_prop, JSPROP_ENUMERATE }, + { "age", JSNode::age_prop, JSPROP_ENUMERATE }, + { 0 } +}; + +JSPropertySpec JSNode::staticProperties[] = +{ + { 0 } +}; + +JSFunctionSpec JSNode::methods[] = +{ +// { "computeReduction", computeReduction, 1, 0, 0 }, + { 0 } +}; + +JSFunctionSpec JSNode::staticMethods[] = +{ + { 0 } +}; + + + + + + + +/** + * Objects that implement the NodeList interface: + * + * Properties of objects that implement the NodeList interface: + * + * length + * This read-only property is a Number. + * + * Functions of objects that implement the NodeList interface: + * + * item(index) + * This function returns an object that implements the Node interface. + * The index parameter is a Number. + * Note: This object can also be dereferenced using square bracket notation + * (e.g. obj[1]). Dereferencing with an integer index is equivalent + * to invoking the item function with that index. + * + * + */ + +/** + * Objects that implement the NamedNodeMap interface: + * + * Properties of objects that implement the NamedNodeMap interface: + * + * length + * This read-only property is a Number. + * + * Functions of objects that implement the NamedNodeMap interface: + * + * getNamedItem(name) + * This function returns an object that implements the Node interface. + * The name parameter is a String. + * setNamedItem(arg) + * This function returns an object that implements the Node interface. + * The arg parameter is an object that implements the Node interface. + * This function can raise an object that implements the DOMException interface. + * removeNamedItem(name) + * This function returns an object that implements the Node interface. + * The name parameter is a String. + * This function can raise an object that implements the DOMException interface. + * item(index) + * This function returns an object that implements the Node interface. + * The index parameter is a Number. + * Note: This object can also be dereferenced using square bracket notation + * (e.g. obj[1]). Dereferencing with an integer index is equivalent + * to invoking the item function with that index. + * getNamedItemNS(namespaceURI, localName) + * This function returns an object that implements the Node interface. + * The namespaceURI parameter is a String. + * The localName parameter is a String. + * This function can raise an object that implements the DOMException interface. + * setNamedItemNS(arg) + * This function returns an object that implements the Node interface. + * The arg parameter is an object that implements the Node interface. + * This function can raise an object that implements the DOMException interface. + * removeNamedItemNS(namespaceURI, localName) + * This function returns an object that implements the Node interface. + * The namespaceURI parameter is a String. + * The localName parameter is a String. + * This function can raise an object that implements the DOMException interface. + */ + + +/** + * Objects that implement the CharacterData interface: + * + * Objects that implement the CharacterData interface have all properties and + * functions of the Node interface as well as the properties and functions defined + * below. Properties of objects that implement the CharacterData interface: + * + * + * data + * This property is a String, can raise an object that implements the DOMException + * interface on setting and can raise an object that implements the DOMException + * interface on retrieval. + * length + * This read-only property is a Number. + * + * Functions of objects that implement the CharacterData interface: + * + * substringData(offset, count) + * This function returns a String. + * The offset parameter is a Number. + * The count parameter is a Number. + * This function can raise an object that implements the DOMException interface. + * appendData(arg) + * This function has no return value. + * The arg parameter is a String. + * This function can raise an object that implements the DOMException interface. + * insertData(offset, arg) + * This function has no return value. + * The offset parameter is a Number. + * The arg parameter is a String. + * This function can raise an object that implements the DOMException interface. + * deleteData(offset, count) + * This function has no return value. + * The offset parameter is a Number. + * The count parameter is a Number. + * This function can raise an object that implements the DOMException interface. + * replaceData(offset, count, arg) + * This function has no return value. + * The offset parameter is a Number. + * The count parameter is a Number. + * The arg parameter is a String. + * This function can raise an object that implements the DOMException interface. + */ + +/** + * Objects that implement the Attr interface: + * + * Objects that implement the Attr interface have all properties and functions of + * the Node interface as well as the properties and functions defined below. + * Properties of objects that implement the Attr interface: + * + * + * name + * This read-only property is a String. + * specified + * This read-only property is a Boolean. + * value + * This property is a String and can raise an object that implements the + * DOMException interface on setting. + * ownerElement + * This read-only property is an object that implements the Element interface. + * schemaTypeInfo + * This read-only property is an object that implements the TypeInfo interface. + * isId + * This read-only property is a Boolean. + * + */ + +/** + * Objects that implement the Element interface: + * + * Objects that implement the Element interface have all properties and functions + * of the Node interface as well as the properties and functions defined below. + * Properties of objects that implement the Element interface: + * + * + * tagName + * This read-only property is a String. + * schemaTypeInfo + * This read-only property is an object that implements the TypeInfo interface. + * + * Functions of objects that implement the Element interface: + * + * getAttribute(name) + * This function returns a String. + * The name parameter is a String. + * setAttribute(name, value) + * This function has no return value. + * The name parameter is a String. + * The value parameter is a String. + * This function can raise an object that implements the DOMException interface. + * removeAttribute(name) + * This function has no return value. + * The name parameter is a String. + * This function can raise an object that implements the DOMException interface. + * getAttributeNode(name) + * This function returns an object that implements the Attr interface. + * The name parameter is a String. + * setAttributeNode(newAttr) + * This function returns an object that implements the Attr interface. + * The newAttr parameter is an object that implements the Attr interface. + * This function can raise an object that implements the DOMException interface. + * removeAttributeNode(oldAttr) + * This function returns an object that implements the Attr interface. + * The oldAttr parameter is an object that implements the Attr interface. + * This function can raise an object that implements the DOMException interface. + * getElementsByTagName(name) + * This function returns an object that implements the NodeList interface. + * The name parameter is a String. + * getAttributeNS(namespaceURI, localName) + * This function returns a String. + * The namespaceURI parameter is a String. + * The localName parameter is a String. + * This function can raise an object that implements the DOMException interface. + * setAttributeNS(namespaceURI, qualifiedName, value) + * This function has no return value. + * The namespaceURI parameter is a String. + * The qualifiedName parameter is a String. + * The value parameter is a String. + * This function can raise an object that implements the DOMException interface. + * removeAttributeNS(namespaceURI, localName) + * This function has no return value. + * The namespaceURI parameter is a String. + * The localName parameter is a String. + * This function can raise an object that implements the DOMException interface. + * getAttributeNodeNS(namespaceURI, localName) + * This function returns an object that implements the Attr interface. + * The namespaceURI parameter is a String. + * The localName parameter is a String. + * This function can raise an object that implements the DOMException interface. + * setAttributeNodeNS(newAttr) + * This function returns an object that implements the Attr interface. + * The newAttr parameter is an object that implements the Attr interface. + * This function can raise an object that implements the DOMException interface. + * getElementsByTagNameNS(namespaceURI, localName) + * This function returns an object that implements the NodeList interface. + * The namespaceURI parameter is a String. + * The localName parameter is a String. + * This function can raise an object that implements the DOMException interface. + * hasAttribute(name) + * This function returns a Boolean. + * The name parameter is a String. + * hasAttributeNS(namespaceURI, localName) + * This function returns a Boolean. + * The namespaceURI parameter is a String. + * The localName parameter is a String. + * This function can raise an object that implements the DOMException interface. + * setIdAttribute(name, isId) + * This function has no return value. + * The name parameter is a String. + * The isId parameter is a Boolean. + * This function can raise an object that implements the DOMException interface. + * setIdAttributeNS(namespaceURI, localName, isId) + * This function has no return value. + * The namespaceURI parameter is a String. + * The localName parameter is a String. + * The isId parameter is a Boolean. + * This function can raise an object that implements the DOMException interface. + * setIdAttributeNode(idAttr, isId) + * This function has no return value. + * The idAttr parameter is an object that implements the Attr interface. + * The isId parameter is a Boolean. + * This function can raise an object that implements the DOMException interface. + */ + +/** + * Objects that implement the Text interface: + * + * Objects that implement the Text interface have all properties and functions of + * the CharacterData interface as well as the properties and functions defined + * below. Properties of objects that implement the Text interface: + * + * + * isElementContentWhitespace + * This read-only property is a Boolean. + * wholeText + * This read-only property is a String. + * + * Functions of objects that implement the Text interface: + * + * splitText(offset) + * This function returns an object that implements the Text interface. + * The offset parameter is a Number. + * This function can raise an object that implements the DOMException interface. + * replaceWholeText(content) + * This function returns an object that implements the Text interface. + * The content parameter is a String. + * This function can raise an object that implements the DOMException interface. + */ + +/** + * Objects that implement the Comment interface: + * + * Objects that implement the Comment interface have all properties and functions + * of the CharacterData interface. + * + */ + +/** + * Properties of the TypeInfo Constructor function: + * + * TypeInfo.DERIVATION_RESTRICTION + * The value of the constant TypeInfo.DERIVATION_RESTRICTION is 0x00000001. + * TypeInfo.DERIVATION_EXTENSION + * The value of the constant TypeInfo.DERIVATION_EXTENSION is 0x00000002. + * TypeInfo.DERIVATION_UNION + * The value of the constant TypeInfo.DERIVATION_UNION is 0x00000004. + * TypeInfo.DERIVATION_LIST + * The value of the constant TypeInfo.DERIVATION_LIST is 0x00000008. + * + * Objects that implement the TypeInfo interface: + * + * Properties of objects that implement the TypeInfo interface: + * + * typeName + * This read-only property is a String. + * typeNamespace + * This read-only property is a String. + * + * Functions of objects that implement the TypeInfo interface: + * + * isDerivedFrom(typeNamespaceArg, typeNameArg, derivationMethod) + * This function returns a Boolean. + * The typeNamespaceArg parameter is a String. + * The typeNameArg parameter is a String. + * The derivationMethod parameter is a Number. + */ + +/** + * Properties of the UserDataHandler Constructor function: + * + * UserDataHandler.NODE_CLONED + * The value of the constant UserDataHandler.NODE_CLONED is 1. + * UserDataHandler.NODE_IMPORTED + * The value of the constant UserDataHandler.NODE_IMPORTED is 2. + * UserDataHandler.NODE_DELETED + * The value of the constant UserDataHandler.NODE_DELETED is 3. + * UserDataHandler.NODE_RENAMED + * The value of the constant UserDataHandler.NODE_RENAMED is 4. + * UserDataHandler.NODE_ADOPTED + * The value of the constant UserDataHandler.NODE_ADOPTED is 5. + * + * UserDataHandler function: + * This function has no return value. The first parameter is a Number. The second + * parameter is a String. The third parameter is an object that implements the any + * type interface. The fourth parameter is an object that implements the Node + * interface. The fifth parameter is an object that implements the Node interface. + * Properties of the DOMError Constructor function: + * + * + * DOMError.SEVERITY_WARNING + * The value of the constant DOMError.SEVERITY_WARNING is 1. + * DOMError.SEVERITY_ERROR + * The value of the constant DOMError.SEVERITY_ERROR is 2. + * DOMError.SEVERITY_FATAL_ERROR + * The value of the constant DOMError.SEVERITY_FATAL_ERROR is 3. + */ + + +/** + * Objects that implement the DOMError interface: + * + * Properties of objects that implement the DOMError interface: + * + * severity + * This read-only property is a Number. + * message + * This read-only property is a String. + * type + * This read-only property is a String. + * relatedException + * This read-only property is an object that implements the Object interface. + * relatedData + * This read-only property is an object that implements the Object interface. + * location + * This read-only property is an object that implements the DOMLocator interface. + * + * DOMErrorHandler function: + * This function returns a Boolean. The parameter is an object that implements the + * DOMError interface. + * + * + */ + +/** + * Objects that implement the DOMLocator interface: + * + * Properties of objects that implement the DOMLocator interface: + * + * lineNumber + * This read-only property is a Number. + * columnNumber + * This read-only property is a Number. + * byteOffset + * This read-only property is a Number. + * utf16Offset + * This read-only property is a Number. + * relatedNode + * This read-only property is an object that implements the Node interface. + * uri + * This read-only property is a String. + */ + +/** + * Objects that implement the DOMConfiguration interface: + * + * Properties of objects that implement the DOMConfiguration interface: + * + * parameterNames + * This read-only property is an object that implements the DOMStringList interface. + * + * Functions of objects that implement the DOMConfiguration interface: + * + * setParameter(name, value) + * This function has no return value. + * The name parameter is a String. + * The value parameter is an object that implements the any type interface. + * This function can raise an object that implements the DOMException interface. + * getParameter(name) + * This function returns an object that implements the any type interface. + * The name parameter is a String. + * This function can raise an object that implements the DOMException interface. + * canSetParameter(name, value) + * This function returns a Boolean. + * The name parameter is a String. + * The value parameter is an object that implements the any type interface. + */ + + +/** + * Objects that implement the CDATASection interface: + * + * Objects that implement the CDATASection interface have all properties and + * functions of the Text interface. + * + */ + +/** + * Objects that implement the DocumentType interface: + * + * Objects that implement the DocumentType interface have all properties and + * functions of the Node interface as well as the properties and functions defined + * below. Properties of objects that implement the DocumentType interface: + * + * + * name + * This read-only property is a String. + * entities + * This read-only property is an object that implements the NamedNodeMap interface. + * notations + * This read-only property is an object that implements the NamedNodeMap interface. + * publicId + * This read-only property is a String. + * systemId + * This read-only property is a String. + * internalSubset + * This read-only property is a String. + */ + + +/** + * Objects that implement the Notation interface: + * + * Objects that implement the Notation interface have all properties and functions + * of the Node interface as well as the properties and functions defined below. + * Properties of objects that implement the Notation interface: + * + * + * publicId + * This read-only property is a String. + * systemId + * This read-only property is a String. + */ + +/** + * Objects that implement the Entity interface: + * + * Objects that implement the Entity interface have all properties and functions + * of the Node interface as well as the properties and functions defined below. + * Properties of objects that implement the Entity + * interface: + * + * + * publicId + * This read-only property is a String. + * systemId + * This read-only property is a String. + * notationName + * This read-only property is a String. + * inputEncoding + * This read-only property is a String. + * xmlEncoding + * This read-only property is a String. + * xmlVersion + * This read-only property is a String. + */ + +/** + * Objects that implement the EntityReference interface: + * + * Objects that implement the EntityReference interface have all properties and + * functions of the Node interface. + * + */ + + +/** + * Objects that implement the ProcessingInstruction interface: + * + * Objects that implement the ProcessingInstruction interface have all properties + * and functions of the Node interface as well as the properties and functions + * defined below. Properties of objects that implement the ProcessingInstruction + * interface: + * + * target + * This read-only property is a String. + * data + * This property is a String and can raise an object that implements the + * DOMException interface on setting. + * + */ + + +/** + * Note: In addition of having DOMConfiguration parameters exposed to the + * application using the setParameter and getParameter, those parameters are also + * exposed as ECMAScript properties on the DOMConfiguration object. The name of + * the parameter is converted into a property name using a camel-case convention: + * the character '-' (HYPHEN-MINUS) is removed and the following character is + * being replaced by its uppercase equivalent. + */ + + //######################################################################## +//# C L A S S E S +//######################################################################## + + + +//######################################################################## +//# M A I N B I N D I N G +//######################################################################## + +bool JavascriptEngine::createClasses() +{ + + return true; +} + + +} // namespace dom +} // namespace w3c +} // namespace org + +//######################################################################## +//# E N D O F F I L E +//######################################################################## + diff --git a/src/dom/jsengine.cpp b/src/dom/jsengine.cpp new file mode 100644 index 000000000..598682aa7 --- /dev/null +++ b/src/dom/jsengine.cpp @@ -0,0 +1,132 @@ +/** + * Phoebe DOM Implementation. + * + * This is a C++ approximation of the W3C DOM model, which follows + * fairly closely the specifications in the various .idl files, copies of + * which are provided for reference. Most important is this one: + * + * http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/idl-definitions.html + * + * Authors: + * Bob Jamison + * + * Copyright (C) 2006 Bob Jamison + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include "jsengine.h" + +#include +#include + +namespace org +{ +namespace w3c +{ +namespace dom +{ + + + +//######################################################################## +//# M E S S A G E S +//######################################################################## +void JavascriptEngine::error(char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + fprintf(stderr, "JS error: "); + vfprintf(stderr, fmt, args); + fprintf(stderr, "\n"); + va_end(args); +} + + +void JavascriptEngine::trace(char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + fprintf(stdout, "JS: "); + vfprintf(stdout, fmt, args); + fprintf(stdout, "\n"); + va_end(args); +} + + + +static JSClass globalClass = +{ + "Global", 0, + JS_PropertyStub, JS_PropertyStub, + JS_PropertyStub, JS_PropertyStub, + JS_EnumerateStub, JS_ResolveStub, + JS_ConvertStub, JS_FinalizeStub +}; + + +bool JavascriptEngine::startup() +{ + /* You need a runtime and one or more contexts to do anything with JS. */ + rt = JS_NewRuntime(0x400000L); + if (!rt) + { + error("can't create JavaScript runtime"); + return false; + } + + cx = JS_NewContext(rt, 8192); + if (!cx) + { + error("can't create JavaScript context"); + return false; + } + /* + * The context definitely wants a global object, in order to have standard + * classes and functions like Date and parseInt. See below for details on + * JS_NewObject. + */ + + globalObj = JS_NewObject(cx, &globalClass, 0, 0); + JS_InitStandardClasses(cx, globalObj); + + if (!createClasses()) + { + return false; + } + + return true; +} + + + + +bool JavascriptEngine::shutdown() +{ + + return true; +} + + +} // namespace dom +} // namespace w3c +} // namespace org + + +//######################################################################## +//# E N D O F F I L E +//######################################################################## + diff --git a/src/dom/jsengine.h b/src/dom/jsengine.h new file mode 100644 index 000000000..1390afe7e --- /dev/null +++ b/src/dom/jsengine.h @@ -0,0 +1,126 @@ +#ifndef __JSENGINE_H__ +#define __JSENGINE_H__ +/** + * Phoebe DOM Implementation. + * + * This is a C++ approximation of the W3C DOM model, which follows + * fairly closely the specifications in the various .idl files, copies of + * which are provided for reference. Most important is this one: + * + * http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/idl-definitions.html + * + * Authors: + * Bob Jamison + * + * Copyright (C) 2006 Bob Jamison + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include "js/jsapi.h" + + +namespace org +{ +namespace w3c +{ +namespace dom +{ + +/** + * + */ +class JavascriptEngine +{ +public: + + /** + * + */ + JavascriptEngine() + { init(); } + + /** + * + */ + JavascriptEngine(const JavascriptEngine &other) + { assign(other); } + + /** + * + */ + JavascriptEngine &operator=(const JavascriptEngine &other) + { assign(other); return *this; } + + /** + * + */ + bool startup(); + + /** + * + */ + bool shutdown(); + + /** + * + */ + virtual ~JavascriptEngine() + {} + + +private: + + void init() + { + rt = NULL; + cx = NULL; + globalObj = NULL; + } + + void assign(const JavascriptEngine &other) + { + rt = other.rt; + cx = other.cx; + globalObj = other.globalObj; + } + + /** + * + */ + bool createClasses(); + + void error(char *fmt, ...); + void trace(char *fmt, ...); + + JSRuntime *rt; + + JSContext *cx; + + JSObject *globalObj; + +}; + + + +} // namespace dom +} // namespace w3c +} // namespace org + + +#endif /* __JSENGINE_H__ */ + + -- 2.30.2