>> If in component I have a observer (like protocol observer), it will fire some function (in this case newChannel function), I dont know how can I find which window & which tab send this request ?

I think protocol handler is not suitable object to search for request owner. Protocol handler has not enough info (in his method's arguments) to do it by itself.

joe ertaba wrote:
Thanks, Second method look great,

I have another question, maybe not fully related to this topic!

See this XPCOM for example: Adding a New Protocol to Mozilla <http://www.nexgenmedia.net/docs/protocol/> If in component I have a observer (like protocol observer), it will fire some function (in this case newChannel function), I dont know how can I find which window & which tab send this request ?

---------

If I use global variable then it refer to final window!
Also because observer fire a function always it creates new instance so above methods are suitable for cases which local function fire XPCOM functions, not in this case!





On Mon, Feb 2, 2009 at 3:20 PM, Anton Glazatov <[email protected] <mailto:[email protected]>> wrote:

    joe,

    >> 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()

    It is because 'createInstance' method makes new instance of
    'ext1Component' object each time it is called.
    There is yet another two ways to avoid 'null' value of '_obj'
    object field.
    1) 'getService' method may be used istead of  'createInstance'
    method, so only one instance of 'ext1Component' object will be
    created for all windows; it is analogue of way you has proposed
    (global variable), and here may be cross-windows 'callbacks': for
    example, window1 calls 'init', then window2 calls another
    component's method, but '_obj' points to window1.
    2) extension's object can have field to store 'ext1Component'
    instance, for example:
    var extobject =
    {
      mc: null,

      init: function ()
      {
          this. mc = Components. classes...
          this. mc. init (this);
      },
      go: function ()
      {
          this. mc. bar ();
      }
    };
    In case 2) each window can have its own instance of
    'ext1Component' object.

    joe ertaba wrote:

        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] <mailto:[email protected]>
        <mailto:[email protected] <mailto:[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]
        <mailto:[email protected]>
        <mailto:[email protected]
        <mailto:[email protected]>>

               https://www.mozdev.org/mailman/listinfo/project_owners

           _______________________________________________
           Project_owners mailing list
           [email protected]
        <mailto:[email protected]>
        <mailto:[email protected]
        <mailto:[email protected]>>

           https://www.mozdev.org/mailman/listinfo/project_owners


        ------------------------------------------------------------------------

        _______________________________________________
        Project_owners mailing list
        [email protected] <mailto:[email protected]>
        https://www.mozdev.org/mailman/listinfo/project_owners

    _______________________________________________
    Project_owners mailing list
    [email protected] <mailto:[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