[Project_owners] XPCOM call local function
joe ertaba
belaviyo at gmail.com
Mon Feb 2 07:33:04 PST 2009
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> 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>> 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>
>> 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
>>
>>
>
> _______________________________________________
> Project_owners mailing list
> Project_owners at mozdev.org
> https://www.mozdev.org/mailman/listinfo/project_owners
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.mozdev.org/pipermail/project_owners/attachments/20090202/b4ff319e/attachment-0001.html>
More information about the Project_owners
mailing list