When working with XPCOM components, you might come across method declarations like the following one:
[scriptable, uuid(8B5314BC-DB01-11d2-96CE-0060B0FB9956)] interface nsITransferable : nsISupports { ... void getTransferData ( in string aFlavor, out nsISupports aData, out unsigned long aDataLen ) ; ... }
The getTransferData
method takes three parameters, aFlavor
, aData
, and aDataLen
, and returns nothing. aData
and aDataLen
are marked as out
, meaning that they act as "return values" for this method, and are changed during the method call. These are so-called out parameters.
In order to use such a method from JavaScript via XPConnect, you have to follow a specific rule. To get at the out parameters, you have to pass in an object. After the call, this object will have a new property called value
, which contains the out values.
Assuming you have an object called transferable
, you would invoke getTransferData()
as follows:
var aData = {}; var aDataLen = {}; transferable.getTransferData("text/unicode", aData, aDataLen); var data = aData.value; var dataLen = aDataLen.value;
As you can see, after the call to getTransferData()
, the out values are then contained in the value
properties of aData
and aDataLen
.
When implementing a method which has out parameters in JavaScript, you have to set a new property called value
to the out parameter which will hold the required value.
You would implement getTransferData()
as follows:
getTransferData: function(aFlavor, aData, aDataLen) { .. .. aData.value = resultData; aDataLen.value = resultData.length; }