John,
Here is some code: The runTest invokes getAttribute('id') which suceeds.
When the same thing is attempted from the attach method of the nsIDocHandler
component, it fails.
(This is a meaningless testcase to illustrate my problem.)
Thanks, Praki
======== test.xul========
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window height="100" width="200"
xmlns:html = "http://www.w3.org/1999/xhtml"
xmlns:rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
>
<script>
var dh =
Components.classes["@mprakash.acm.org/dochandler;1"].createInstance();
dh = dh.QueryInterface(Components.interfaces.nsIDocHandler);
dump(dh);
function runTest()
{
alert('invoke getAttribute: ' +
document.getElementById('t1').getAttribute('id'));
dh.attach(document.getElementById('t1'));
}
</script>
<vbox flex="1">
<text id="t1" value="Hello!"/>
<button label="Click" onclick="runTest()"/>
</vbox>
</window>
==============nsIDocHandler.xpidl=================
/**
* xpidl -m typelib -I e:\mozilla\dist\idl nsIDocHandler.xpidl
* xpidl -m header -I e:\mozilla\dist\idl nsIDocHandler.xpidl
*/
#include "nsISupports.idl"
[scriptable, uuid(00000FB1-E222-11D2-9FC4-00105A1C56C0)]
interface nsIDocHandler : nsISupports
{
void attach(in string filename);
void detach();
boolean canHandle(in string filename);
};
==================== nsDocHandler.js =============
/*
* Constants
*/
const DOC_HANDLER_CONTRACTID = '@mprakash.acm.org/dochandler;1';
const DOC_HANDLER_CID =
Components.ID('{00000FB1-E222-11D2-9FC4-00105A1C56C0}');
const DOC_HANDLER_IID = Components.interfaces.nsIDocHandler;
/*
* Class definitions
*/
function nsDocHandler() {
}
nsDocHandler.prototype= {
editor: null,
QueryInterface: function(iid) {
if (!iid.equals(Components.interfaces.nsISupports) &&
!iid.equals(DOC_HANDLER_IID))
throw Components.results.NS_ERROR_NO_INTERFACE;
return this;
},
canHandle: function(fileName) {
dump('\n'+fileName+'\n');
return true;
},
attach: function(e) {
dump('\n**** attach' + e + '\n');
e.getAttribute('id'));
}
};
var nsDocHandlerModule = {
registerSelf: function(compMgr, fileSpec, location, type) {
compMgr.registerComponentWithType(DOC_HANDLER_CID,
"nsDocHandler JS component", DOC_HANDLER_CONTRACTID,
fileSpec, location,
true, true, type);
},
getClassObject: function(compMgr, cid, iid) {
if (!cid.equals(DOC_HANDLER_CID))
throw Components.results.NS_ERROR_NO_INTERFACE;
if (!iid.equals(Components.interfaces.nsIFactory))
throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
return nsDocHandlerFactory;
},
canUnload: function(compMgr) { return true; }
};
var nsDocHandlerFactory = {
createInstance: function(outer, iid) {
if (outer != null)
throw Components.results.NS_ERROR_NO_AGGREGATION;
if (!iid.equals(DOC_HANDLER_IID) &&
!iid.equals(Components.interfaces.nsISupports))
throw Components.results.NS_ERROR_INVALID_ARG;
return new nsDocHandler();
}
}
/* module initialisation */
function NSGetModule(comMgr, fileSpec) { return nsDocHandlerModule; }
=================== end =======================
"John Bandhauer" <[EMAIL PROTECTED]> wrote in message
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
> Please post some of your code (or a simplified test case). It is
> not clear (to me) from your description exactly what your code is
> doing.
>
> John.
>
> Praki Prakash wrote:
> >
> > I hope this makes sense to someone.
> >
> > I am passing a XULElement as an argument to a XPConnect wrapped Java
script
> > method(nsIDocHandler::attach. It is a component implemented in
Javascript)
> > When I invoke any method (even getAttribute) on the argument, the method
> > received, I get the following error.
> >
> > * Call to xpconnect wrapped JSObject produced this error: *
> > [Exception... "'[JavaScript Error: "e.getAttribute is not a function"
{file:
> > "e:\mozilla\dist\win32_d.obj\bin\components\nsDocHandler.js" line: 53}]'
> > when calling method: [nsIDocHandler::attach]" nsresult: "0x80570021
> > (NS_ERROR_XPC_JAVASCR
> > IPT_ERROR_WITH_DETAILS)" location: "JS frame ::
> > chrome://makara/content/ContentArea.js :: anonymous :: line 57" data:
yes]
> > ************************************************************
> > [Exception... "'[JavaScript Error: "e.getAttribute is not a function"
{file:
> > "e:\mozilla\dist\win32_d.obj\bin\components\nsDocHandler.js" line: 53}]'
> > when calling method: [nsIDocHandler::attach]" nsresult: "0x80570021
> > (NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS)" location: "JS frame ::
> > chrome://makara/content/ContentArea.js :: anonymous :: line 57" data:
yes]
> >
> > I am at a complete loss as to what is happening. All I can see in the
> > javascript interpreter is that at the time this error is reported, the
> > interpreter is expecting the callee to be an object and it is not. I can
> > invoke the same getAttribute method at the call site just fine. dump on
the
> > argument displays the object class to be XULElement as expected.
> >
> > Any insight into what is happening? Are components implemented in
Javascript
> > second class citizens?
> >
> > Thanks, Praki