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]> 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]>> 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]> >> 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 >
_______________________________________________ Project_owners mailing list [email protected] https://www.mozdev.org/mailman/listinfo/project_owners
