[Project_owners] XPCOM call local function
Anton Glazatov
antonglv at gmail.com
Tue Feb 3 04:38:08 PST 2009
>> 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 <antonglv at gmail.com
> <mailto:antonglv at gmail.com>> 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
> <antonglv at gmail.com <mailto:antonglv at gmail.com>
> <mailto:antonglv at gmail.com <mailto:antonglv at gmail.com>>> 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
> Project_owners at mozdev.org
> <mailto:Project_owners at mozdev.org>
> <mailto:Project_owners at mozdev.org
> <mailto:Project_owners at mozdev.org>>
>
> https://www.mozdev.org/mailman/listinfo/project_owners
>
>
>
> _______________________________________________
> Project_owners mailing list
> Project_owners at mozdev.org
> <mailto:Project_owners at mozdev.org>
> <mailto:Project_owners at mozdev.org
> <mailto:Project_owners at mozdev.org>>
>
> https://www.mozdev.org/mailman/listinfo/project_owners
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Project_owners mailing list
> Project_owners at mozdev.org <mailto:Project_owners at mozdev.org>
> https://www.mozdev.org/mailman/listinfo/project_owners
>
>
>
> _______________________________________________
> Project_owners mailing list
> Project_owners at mozdev.org <mailto:Project_owners at mozdev.org>
> https://www.mozdev.org/mailman/listinfo/project_owners
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Project_owners mailing list
> Project_owners at mozdev.org
> https://www.mozdev.org/mailman/listinfo/project_owners
>
More information about the Project_owners
mailing list