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

Reply via email to