Thank you very much Anton, examples helps me a lot.
In order for future reference for other developers I have one modification
in (/components/ext1component.js) for both ext1 & ext2
instead of:
function ext1Component ()
{
this. wrappedJSObject = this;
}
ext1Component. prototype =
{
QueryInterface: function (iid)
{
if (!iid. equals (Components. interfaces. ext1Component) &&
!iid. equals (Components. interfaces. nsISupports))
throw Components. results. NS_ERROR_NO_INTERFACE;
return this;
},
_obj: null,
init: function (obj)
{
this. _obj = obj;
// ...
this. _obj. foo ();
}
};
use this one:
*var _obj;*
function ext1Component ()
{
this. wrappedJSObject = this;
}
ext1Component. prototype =
{
QueryInterface: function (iid)
{
if (!iid. equals (Components. interfaces. ext1Component) &&
!iid. equals (Components. interfaces. nsISupports))
throw Components. results. NS_ERROR_NO_INTERFACE;
return this;
},
init: function (obj)
{
* _obj = obj;*
// ...
*_obj. foo ();*
}
};
In this case _obj. foo (); can be used in other functions in ext1Component
too, in original case this._obj will be null if it is used in other
functions than init()
-Joe
On Mon, Feb 2, 2009 at 12:02 AM, Anton Glazatov <[email protected]> wrote:
> >> Is it possible to declare object variable into the idl file?
> No, it isn't possible. Component method's argument should implement any
> interface.
>
> >> but I think I should reverse them, something like
> Yes, you are right.
>
> >> I don't exactly know why I need QueryIntrface here in my extension js
> file beside in component
> If you will use wrappedJSObject in your component constructor (see here:
> https://developer.mozilla.org/en/How_to_Build_an_XPCOM_Component_in_Javascript),
> you need not to define extra interface for callback.
>
> >> Would you please give me a sample extension file
> You can see attached files. The ext1 doesn't use wrappedJSObject, and ext2
> use wrappedJSObject.
>
> Btw, there is third way to call extension's function from xpcom component -
> you may use global notifications (see nsIObserverService / nsIObserver).
>
> joe ertaba wrote:
>
>> Thanks Anton
>>
>> Second method looks great, but I have few problems with it
>>
>>
>> or you may implement any interface in your extension's object, it
>> may be somethink like
>>
>> // xpcom .idl
>> ...
>> interface YourComponent: nsISupports
>> {
>> ...
>> void init (in YourComponentCallback obj);
>> ...
>> };
>>
>> interface YourComponentCallback: nsISupports
>> {
>> ...
>> void foo ();
>> ...
>> };
>>
>>
>>
>> Is it possible to declare object variable into the idl file?
>> something like
>>
>> interface YourComponent: nsISupports { void init (in object obj); };
>>
>> As I think it doesnt mean to declare object in idl! so I should use your
>> trick, but I think I should reverse them, something like
>>
>> // xpcom .idl
>> ...
>>
>> interface YourComponentCallback: nsISupports
>> {
>> ...
>> void foo ();
>> ...
>> };
>>
>> interface YourComponent: nsISupports
>> {
>> ...
>> void init (in YourComponentCallback obj);
>> ...
>> };
>>
>>
>> // xpcom
>> ...
>> extobject: null,
>> ...
>> init: function (obj) { this. extobject = obj; },
>> ...
>> bar: function () { this. extobject. foo (); }, // call extension's
>> function
>> ...
>>
>> // extension
>> var yourextensionobject =
>> {
>> ...
>> init: function () {
>> var mycomponent = Components. classes ["@yourcomponent.cid"].
>> createInstance (Components. interfaces. YourComponent);
>> mycomponent. init (this);
>> },
>> ...
>> foo: function () { ... },
>> ...
>> QueryIntrface: function (iid)
>> {
>> if ((!iid. equals (Components. interfaces. nsISupprots) &&
>> (!iid. equals (Components. interfaces. nsIYourComponentCallback))
>> Components. results. NS_ERROR_NO_INTERFACE;
>> return this;
>> }
>>
>>
>> I don't exactly know why I need QueryIntrface here in my extension js file
>> beside in component, if it helps to declare object (YourComponentCallback)
>> then is it enough or some other things also needed (in xpcom we need lots of
>> other thing like Factories, Modules,... )
>>
>> Maybe I am somehow confized! because I never see idl & QueryIntrface for
>> normal js (not compont)
>>
>> Would you please give me a sample extension file or at least some toturial
>> which explain these concepts :)
>>
>> Thanks in advance
>> Joe
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Project_owners mailing list
>> [email protected]
>> https://www.mozdev.org/mailman/listinfo/project_owners
>>
>>
>
>
> _______________________________________________
> Project_owners mailing list
> [email protected]
> https://www.mozdev.org/mailman/listinfo/project_owners
>
>
_______________________________________________
Project_owners mailing list
[email protected]
https://www.mozdev.org/mailman/listinfo/project_owners