Modified:
trunk/gom/ChangeLog
trunk/gom/src/xpgom/gomwrapped.cc
trunk/gom/src/xpgom/xgDocument.cc
trunk/gom/src/xpgom/xgElement.cc
trunk/gom/src/xpgom/xgNode.cc
trunk/gom/src/xpgom/xgWrapped.cc
trunk/gom/src/xpgom/xpgom.js
Log:
2008-08-12 jacob berkman <ja...@ilovegom.org>
* src/xpgom/xpgom.js: use an io stream and
nsISAXXMLReader-based parser instead of XHR so that we can
load scripts etc. correctly
* src/xpgom/xgElement.cc (SetAttribute): implement
* src/xpgom/xgNode.cc (AppendChild): implement
* src/xpgom/xgDocument.cc (CreateElementNS): implement
* src/xpgom/gomwrapped.cc (gom_wrap_g_object): here is a
thought: check to make sure that the object we are wrapping
actually supports the interface we're looking for
* src/xpgom/xgWrapped.cc (QueryInterface): fallback to
re-wrapping our GObject if we haven't found a type yet
Modified: trunk/gom/ChangeLog
==============================================================================
--- trunk/gom/ChangeLog (original)
+++ trunk/gom/ChangeLog Tue Aug 12 22:32:20 2008
@@ -1,3 +1,22 @@
+2008-08-12 jacob berkman <ja...@ilovegom.org>
+
+ * src/xpgom/xpgom.js: use an io stream and
+ nsISAXXMLReader-based parser instead of XHR so that we can
+ load scripts etc. correctly
+
+ * src/xpgom/xgElement.cc (SetAttribute): implement
+
+ * src/xpgom/xgNode.cc (AppendChild): implement
+
+ * src/xpgom/xgDocument.cc (CreateElementNS): implement
+
+ * src/xpgom/gomwrapped.cc (gom_wrap_g_object): here is a
+ thought: check to make sure that the object we are wrapping
+ actually supports the interface we're looking for
+
+ * src/xpgom/xgWrapped.cc (QueryInterface): fallback to
+ re-wrapping our GObject if we haven't found a type yet
+
2008-08-11 jacob berkman <ja...@ilovegom.org>
* include/gommacros.h (XG_RETURN_NOT_IMPLEMENTED): macro to
Modified: trunk/gom/src/xpgom/gomwrapped.cc
==============================================================================
--- trunk/gom/src/xpgom/gomwrapped.cc (original)
+++ trunk/gom/src/xpgom/gomwrapped.cc Tue Aug 12 22:32:20 2008
@@ -226,15 +226,19 @@
}
for (li = wrap_map; li; li = li->next) {
ent = (WrapMapEntry *)li->data;
- if (iid.Equals (ent->mIid)) {
- char nsid[NSID_LENGTH];
- iid.ToProvidedString (nsid);
- g_print (GOM_LOC ("%s %p is_a %s (%s)\n"),
- G_OBJECT_TYPE_NAME (object),
- object,
- nsid,
- g_type_name (ent->mInterfaceType));
- return ent->mConstructor (G_OBJECT (object), iid, retval);
+ //g_print (GOM_LOC ("%s?\n"), g_type_name (ent->mInterfaceType));
+ if (g_type_is_a (G_OBJECT_TYPE (object), ent->mInterfaceType)) {
+ //g_print (GOM_LOC ("maybe %s...\n"), g_type_name
(ent->mInterfaceType));
+ if (iid.Equals (ent->mIid)) {
+ char nsid[NSID_LENGTH];
+ iid.ToProvidedString (nsid);
+ g_print (GOM_LOC ("%s %p is_a %s (%s)\n"),
+ G_OBJECT_TYPE_NAME (object),
+ object,
+ nsid,
+ g_type_name (ent->mInterfaceType));
+ return ent->mConstructor (G_OBJECT (object), iid, retval);
+ }
}
}
return NS_ERROR_NO_INTERFACE;
Modified: trunk/gom/src/xpgom/xgDocument.cc
==============================================================================
--- trunk/gom/src/xpgom/xgDocument.cc (original)
+++ trunk/gom/src/xpgom/xgDocument.cc Tue Aug 12 22:32:20 2008
@@ -31,6 +31,7 @@
#include <nsIDOMElement.h>
#include <nsIDOMDOMImplementation.h>
#include <nsIDOMDocumentType.h>
+#include <nsStringAPI.h>
#include "gommacros.h"
@@ -147,9 +148,25 @@
}
/* nsIDOMElement createElementNS (in DOMString namespaceURI, in DOMString
qualifiedName) raises (DOMException); */
-NS_IMETHODIMP xgDocument::CreateElementNS(const nsAString & namespaceURI,
const nsAString & qualifiedName, nsIDOMElement **_retval)
+NS_IMETHODIMP
+xgDocument::CreateElementNS (const nsAString &namespaceURI,
+ const nsAString &qualifiedName,
+ nsIDOMElement **_retval)
{
- XG_RETURN_NOT_IMPLEMENTED;
+ CHECK_INITIALIZED;
+ GOM_ASTRING_TO_GSTRING_RETURN (nspace, namespaceURI,
NS_ERROR_INVALID_ARG);
+ GOM_ASTRING_TO_GSTRING_RETURN (qname, qualifiedName,
NS_ERROR_INVALID_ARG);
+
+ GError *error = NULL;
+ GomElement *elem = gom_document_create_element_ns (GOM_DOCUMENT
(mWrapped),
+ nspace, qname, &error);
+ GOM_RETURN_NSRESULT_FROM_GERROR (error);
+
+ nsresult rv = gom_wrap_g_object (elem, NS_GET_IID (nsIDOMElement),
(gpointer *)_retval);
+ if (elem) {
+ g_object_unref (elem);
+ }
+ return rv;
}
/* nsIDOMAttr createAttributeNS (in DOMString namespaceURI, in DOMString
qualifiedName) raises (DOMException); */
Modified: trunk/gom/src/xpgom/xgElement.cc
==============================================================================
--- trunk/gom/src/xpgom/xgElement.cc (original)
+++ trunk/gom/src/xpgom/xgElement.cc Tue Aug 12 22:32:20 2008
@@ -64,9 +64,16 @@
}
/* void setAttribute (in DOMString name, in DOMString value) raises
(DOMException); */
-NS_IMETHODIMP xgElement::SetAttribute(const nsAString & name, const
nsAString & value)
+NS_IMETHODIMP
+xgElement::SetAttribute (const nsAString &name, const nsAString &value)
{
- XG_RETURN_NOT_IMPLEMENTED;
+ CHECK_INITIALIZED;
+ GOM_ASTRING_TO_GSTRING_RETURN (gname, name, NS_ERROR_INVALID_ARG);
+ GOM_ASTRING_TO_GSTRING_RETURN (gvalue, value, NS_ERROR_INVALID_ARG);
+ GError *error = NULL;
+ gom_element_set_attribute (GOM_ELEMENT (mWrapped), gname, gvalue,
&error);
+ GOM_RETURN_NSRESULT_FROM_GERROR (error);
+ return NS_OK;
}
/* void removeAttribute (in DOMString name) raises (DOMException); */
Modified: trunk/gom/src/xpgom/xgNode.cc
==============================================================================
--- trunk/gom/src/xpgom/xgNode.cc (original)
+++ trunk/gom/src/xpgom/xgNode.cc Tue Aug 12 22:32:20 2008
@@ -150,9 +150,25 @@
}
/* nsIDOMNode appendChild (in nsIDOMNode newChild) raises (DOMException);
*/
-NS_IMETHODIMP xgNode::AppendChild(nsIDOMNode *newChild, nsIDOMNode
**_retval)
+NS_IMETHODIMP
+xgNode::AppendChild (nsIDOMNode *newChild, nsIDOMNode **_retval)
{
- XG_RETURN_NOT_IMPLEMENTED;
+ CHECK_INITIALIZED;
+ GError *error = NULL;
+ GomNode *new_child = (GomNode *)gom_wrap_xpcom (newChild,
GOM_TYPE_NODE, &error);
+ GOM_RETURN_NSRESULT_FROM_GERROR (error);
+
+ GomNode *ret = gom_node_append_child (GOM_NODE (mWrapped), new_child,
&error);
+ if (new_child) {
+ g_object_unref (new_child);
+ }
+ GOM_RETURN_NSRESULT_FROM_GERROR (error);
+
+ nsresult rv = gom_wrap_g_object (ret, NS_GET_IID (nsIDOMNode),
(gpointer *)_retval);
+ if (ret) {
+ g_object_unref (ret);
+ }
+ return rv;
}
/* boolean hasChildNodes (); */
Modified: trunk/gom/src/xpgom/xgWrapped.cc
==============================================================================
--- trunk/gom/src/xpgom/xgWrapped.cc (original)
+++ trunk/gom/src/xpgom/xgWrapped.cc Tue Aug 12 22:32:20 2008
@@ -23,12 +23,24 @@
*/
#include "config.h"
+#include "xpgom/gomwrapped.hh"
#include "xpgom/xgWrapped.hh"
#include "gom/dom/gomdomexception.h"
#include "gommacros.h"
-NS_IMPL_ISUPPORTS1 (xgWrapped, xgPIWrapped)
+NS_IMPL_ADDREF (xgWrapped)
+NS_IMPL_RELEASE (xgWrapped)
+
+NS_INTERFACE_TABLE_HEAD(xgWrapped)
+NS_INTERFACE_TABLE1(xgWrapped, xgPIWrapped)
+if (NS_SUCCEEDED (gom_wrap_g_object (mWrapped, aIID, aInstancePtr))) {
+ char nsid[NSID_LENGTH];
+ aIID.ToProvidedString (nsid);
+ g_print (GOM_LOC ("%s -> %s\n"), mTypeName, nsid);
+ return NS_OK;
+ } else
+NS_INTERFACE_TABLE_TAIL
xgWrapped::xgWrapped (GType aType)
: mWrapped (NULL),
@@ -41,6 +53,7 @@
if (mWrapped) {
g_object_remove_weak_pointer (mWrapped, (gpointer *)&mWrapped);
g_object_unref (mWrapped);
+ mWrapped = NULL;
} else if (mTypeName) {
g_warning (GOM_LOC ("We had a %s, but now it's gone..."), mTypeName);
}
Modified: trunk/gom/src/xpgom/xpgom.js
==============================================================================
--- trunk/gom/src/xpgom/xpgom.js (original)
+++ trunk/gom/src/xpgom/xpgom.js Tue Aug 12 22:32:20 2008
@@ -1,40 +1,98 @@
//(function (args) {
args = arguments;
- if (args.length == 0) {
- print ('Usage: xpgom.js <url>');
- quit (1);
- }
- var Cc = Components.classes;
- var Ci = Components.interfaces;
- var req =
Cc['@mozilla.org/xmlextras/xmlhttprequest;1'].createInstance(Ci.nsIXMLHttpRequest);
- print (req);
- print ('Opening: ' + args[0]);
- req.open ('GET', args[0], false);
- req.send(null);
- print (req.responseXML);
-
- var serializer =
Cc['@mozilla.org/xmlextras/xmlserializer;1'].createInstance(Ci.nsIDOMSerializer);
- if (0) {
- print (serializer.serializeToString(req.responseXML));
- }
+if (args.length == 0) {
+ print ('Usage: xpgom.js <url>');
+ quit (1);
+}
+
+var Cc = Components.classes;
+var Ci = Components.interfaces;
+
+var io = Cc['@mozilla.org/network/io-service;1'].getService
(Ci.nsIIOService);
+var uri;
+try {
+ uri = io.newURI (args[0], null, null);
+} catch (e) {
+ print ('could not create uri: ' + e);
+ quit (1);
+}
+
+var chan = io.newChannelFromURI (uri);
+var stream = chan.open();
+
+var reader = Cc['@mozilla.org/saxparser/xmlreader;1'].createInstance
(Ci.nsISAXXMLReader);
+var doc = null;
+reader.contentHandler = {
+ elem: null,
+
+ // nsISAXContentHandler
+ startDocument: function () {
+ print ("startDocument");
+ },
+
+ endDocument: function () {
+ print ("endDocument");
+ },
- var root = req.responseXML.documentElement;
+ startElement: function (nsUri, localName, qName, /*nsISAXAttributes*/
attributes) {
+ var elem;
+ if (doc) {
+ elem = doc.createElementNS (nsUri, qName);
+ } else {
+ var dom =
Cc['@ilovegom.org/dom-implementation;1'].createInstance(Ci.nsIDOMDOMImplementation);
+ doc = dom.createDocument (nsUri, qName, null);
+ elem = doc.documentElement;
+ }
+ for(var i = 0; i < attributes.length; i++) {
+ elem.setAttribute (attributes.getLocalName (i),
+ attributes.getValue (i));
+ }
+ this.elem = this.elem ? this.elem.appendChild (elem) : elem;
+ },
- var dom =
Cc['@ilovegom.org/dom-implementation;1'].createInstance(Ci.nsIDOMDOMImplementation);
- print (dom);
- print ('has xml: ' + dom.hasFeature ('xml', '1.0'));
-
- var doc = dom.createDocument (root.namespaceURI, root.nodeName, null);
- print (doc);
- if (0) {
- print (serializer.serializeToString (doc));
+ endElement: function(uri, localName, qName) {
+ this.elem = this.elem.parentNode;
+ print("endElement: namespace='" + uri + "', localName='" +
+ localName + "', qName='" + qName + "'");
+ },
+
+ characters: function(value) {
+ print("characters: " + value);
+ },
+
+ processingInstruction: function(target, data) {
+ print("processingInstruction: target='" + target + "', data='" +
+ data + "'");
+ },
+
+ ignorableWhitespace: function(whitespace) {
+ // don't care
+ },
+
+ startPrefixMapping: function(prefix, uri) {
+ // don't care
+ },
+
+ endPrefixMapping: function(prefix) {
+ // don't care
+ },
+
+ // nsISupports
+ QueryInterface: function(iid) {
+ if(!iid.equals(Ci.nsISupports) &&
+ !iid.equals(Ci.nsISAXContentHandler))
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+ return this;
}
+};
+reader.parseFromStream (stream, 'UTF-8', 'text/xml');
+
+var parser = Cc['@mozilla.org/xmlextras/domparser;1'].createInstance
(Ci.nsIDOMParser);
+
+var nsdoc = parser.parseFromString ('<?xml
version="1.0"?>\n<a/>', 'text/xml')
+nsdoc.replaceChild (nsdoc.documentElement, nsdoc.importNode
(doc.documentElement, true));
- var gomRoot = doc.importNode (root, true);
- print (gomRoot);
- print (gomRoot.nodeType);
- print (gomRoot.nodeName);
+var serializer =
Cc['@mozilla.org/xmlextras/xmlserializer;1'].createInstance(Ci.nsIDOMSerializer);
+print (serializer.serializeToString (nsdoc));
- doc.replaceChild (gomRoot, doc.documentElement);
- print (doc.documentElement.nodeName);
//})(arguments);