This file is indexed.

/usr/share/idl/firefox/nsIXPConnect.idl is in firefox-dev 11.0+build1-0ubuntu4.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 *
 * ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is Mozilla Communicator client code, released
 * March 31, 1998.
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 1998
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *   John Bandhauer <jband@netscape.com> (original author)
 *   Nate Nielsen <nielsen@memberwebs.com> 
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either of the GNU General Public License Version 2 or later (the "GPL"),
 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

/* The core XPConnect public interfaces. */

#include "nsISupports.idl"
#include "nsIClassInfo.idl"
#include "xpccomponents.idl"
#include "xpcjsid.idl"
#include "xpcexception.idl"
#include "nsIInterfaceInfo.idl"
#include "nsIInterfaceInfoManager.idl"
#include "nsIExceptionService.idl"
#include "nsIVariant.idl"

%{ C++
#include "jspubtd.h"
#include "xptinfo.h"
#include "nsAXPCNativeCallContext.h"

class nsWrapperCache;
%}

/***************************************************************************/

// NB: jsval and jsid are declared in nsIVariant.idl

[ptr] native JSContextPtr(JSContext);
[ptr] native JSClassPtr(JSClass);
[ptr] native JSObjectPtr(JSObject);
[ptr] native JSValPtr(jsval);
[ptr] native JSValConstPtr(const jsval);
      native JSPropertyOp(JSPropertyOp);
      native JSEqualityOp(JSEqualityOp);
[ptr] native voidPtrPtr(void*);
[ptr] native nsScriptObjectTracerPtr(nsScriptObjectTracer);
[ref] native nsCCTraversalCallbackRef(nsCycleCollectionTraversalCallback);
[ptr] native nsAXPCNativeCallContextPtr(nsAXPCNativeCallContext);
[ptr] native nsWrapperCachePtr(nsWrapperCache);

/***************************************************************************/

%{ C++
/***************************************************************************/
#define GENERATE_XPC_FAILURE(x) \
            (NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_XPCONNECT,x))

#define NS_ERROR_XPC_NOT_ENOUGH_ARGS                   GENERATE_XPC_FAILURE( 1)
#define NS_ERROR_XPC_NEED_OUT_OBJECT                   GENERATE_XPC_FAILURE( 2)
#define NS_ERROR_XPC_CANT_SET_OUT_VAL                  GENERATE_XPC_FAILURE( 3)
#define NS_ERROR_XPC_NATIVE_RETURNED_FAILURE           GENERATE_XPC_FAILURE( 4)
#define NS_ERROR_XPC_CANT_GET_INTERFACE_INFO           GENERATE_XPC_FAILURE( 5)
#define NS_ERROR_XPC_CANT_GET_PARAM_IFACE_INFO         GENERATE_XPC_FAILURE( 6)
#define NS_ERROR_XPC_CANT_GET_METHOD_INFO              GENERATE_XPC_FAILURE( 7)
#define NS_ERROR_XPC_UNEXPECTED                        GENERATE_XPC_FAILURE( 8)
#define NS_ERROR_XPC_BAD_CONVERT_JS                    GENERATE_XPC_FAILURE( 9)
#define NS_ERROR_XPC_BAD_CONVERT_NATIVE                GENERATE_XPC_FAILURE(10)
#define NS_ERROR_XPC_BAD_CONVERT_JS_NULL_REF           GENERATE_XPC_FAILURE(11)
#define NS_ERROR_XPC_BAD_OP_ON_WN_PROTO                GENERATE_XPC_FAILURE(12)
#define NS_ERROR_XPC_CANT_CONVERT_WN_TO_FUN            GENERATE_XPC_FAILURE(13)
#define NS_ERROR_XPC_CANT_DEFINE_PROP_ON_WN            GENERATE_XPC_FAILURE(14)
#define NS_ERROR_XPC_CANT_WATCH_WN_STATIC              GENERATE_XPC_FAILURE(15)
#define NS_ERROR_XPC_CANT_EXPORT_WN_STATIC             GENERATE_XPC_FAILURE(16)
#define NS_ERROR_XPC_SCRIPTABLE_CALL_FAILED            GENERATE_XPC_FAILURE(17)
#define NS_ERROR_XPC_SCRIPTABLE_CTOR_FAILED            GENERATE_XPC_FAILURE(18)
#define NS_ERROR_XPC_CANT_CALL_WO_SCRIPTABLE           GENERATE_XPC_FAILURE(19)
#define NS_ERROR_XPC_CANT_CTOR_WO_SCRIPTABLE           GENERATE_XPC_FAILURE(20)
#define NS_ERROR_XPC_CI_RETURNED_FAILURE               GENERATE_XPC_FAILURE(21)
#define NS_ERROR_XPC_GS_RETURNED_FAILURE               GENERATE_XPC_FAILURE(22)
#define NS_ERROR_XPC_BAD_CID                           GENERATE_XPC_FAILURE(23)
#define NS_ERROR_XPC_BAD_IID                           GENERATE_XPC_FAILURE(24)
#define NS_ERROR_XPC_CANT_CREATE_WN                    GENERATE_XPC_FAILURE(25)
#define NS_ERROR_XPC_JS_THREW_EXCEPTION                GENERATE_XPC_FAILURE(26)
#define NS_ERROR_XPC_JS_THREW_NATIVE_OBJECT            GENERATE_XPC_FAILURE(27)
#define NS_ERROR_XPC_JS_THREW_JS_OBJECT                GENERATE_XPC_FAILURE(28)
#define NS_ERROR_XPC_JS_THREW_NULL                     GENERATE_XPC_FAILURE(29)
#define NS_ERROR_XPC_JS_THREW_STRING                   GENERATE_XPC_FAILURE(30)
#define NS_ERROR_XPC_JS_THREW_NUMBER                   GENERATE_XPC_FAILURE(31)
#define NS_ERROR_XPC_JAVASCRIPT_ERROR                  GENERATE_XPC_FAILURE(32)
#define NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS     GENERATE_XPC_FAILURE(33)
#define NS_ERROR_XPC_CANT_CONVERT_PRIMITIVE_TO_ARRAY   GENERATE_XPC_FAILURE(34)
#define NS_ERROR_XPC_CANT_CONVERT_OBJECT_TO_ARRAY      GENERATE_XPC_FAILURE(35)
#define NS_ERROR_XPC_NOT_ENOUGH_ELEMENTS_IN_ARRAY      GENERATE_XPC_FAILURE(36)
#define NS_ERROR_XPC_CANT_GET_ARRAY_INFO               GENERATE_XPC_FAILURE(37)
#define NS_ERROR_XPC_NOT_ENOUGH_CHARS_IN_STRING        GENERATE_XPC_FAILURE(38)
#define NS_ERROR_XPC_SECURITY_MANAGER_VETO             GENERATE_XPC_FAILURE(39)
#define NS_ERROR_XPC_INTERFACE_NOT_SCRIPTABLE          GENERATE_XPC_FAILURE(40)
#define NS_ERROR_XPC_INTERFACE_NOT_FROM_NSISUPPORTS    GENERATE_XPC_FAILURE(41)
#define NS_ERROR_XPC_CANT_GET_JSOBJECT_OF_DOM_OBJECT   GENERATE_XPC_FAILURE(42)
#define NS_ERROR_XPC_CANT_SET_READ_ONLY_CONSTANT       GENERATE_XPC_FAILURE(43)
#define NS_ERROR_XPC_CANT_SET_READ_ONLY_ATTRIBUTE      GENERATE_XPC_FAILURE(44)
#define NS_ERROR_XPC_CANT_SET_READ_ONLY_METHOD         GENERATE_XPC_FAILURE(45)
#define NS_ERROR_XPC_CANT_ADD_PROP_TO_WRAPPED_NATIVE   GENERATE_XPC_FAILURE(46)
#define NS_ERROR_XPC_CALL_TO_SCRIPTABLE_FAILED         GENERATE_XPC_FAILURE(47)
#define NS_ERROR_XPC_JSOBJECT_HAS_NO_FUNCTION_NAMED    GENERATE_XPC_FAILURE(48)
#define NS_ERROR_XPC_BAD_ID_STRING                     GENERATE_XPC_FAILURE(49)
#define NS_ERROR_XPC_BAD_INITIALIZER_NAME              GENERATE_XPC_FAILURE(50)
#define NS_ERROR_XPC_HAS_BEEN_SHUTDOWN                 GENERATE_XPC_FAILURE(51)
#define NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN            GENERATE_XPC_FAILURE(52)
#define NS_ERROR_XPC_BAD_CONVERT_JS_ZERO_ISNOT_NULL    GENERATE_XPC_FAILURE(53)

// any new errors here should have an associated entry added in xpc.msg
/***************************************************************************/
%}

/***************************************************************************/

// forward declarations...
interface nsIXPCScriptable;
interface nsIXPConnect;
interface nsIXPConnectWrappedNative;
interface nsIInterfaceInfo;
interface nsIXPCSecurityManager;
interface nsIPrincipal;

%{C++
class nsCycleCollectionTraversalCallback;
class nsScriptObjectTracer;
%}

/***************************************************************************/
[uuid(8916a320-d118-11d3-8f3a-0010a4e73d9a)]
interface nsIXPConnectJSObjectHolder : nsISupports
{
    readonly attribute JSObjectPtr      JSObject;
};

[uuid(f819a95a-6ab5-4a02-bda6-32861e859581)]
interface nsIXPConnectWrappedNative : nsIXPConnectJSObjectHolder
{
    /* attribute 'JSObject' inherited from nsIXPConnectJSObjectHolder */
    readonly attribute nsISupports      Native;
    readonly attribute JSObjectPtr      JSObjectPrototype;

    /**
     * These are here as an aid to nsIXPCScriptable implementors
     */

    readonly attribute nsIXPConnect XPConnect;
    nsIInterfaceInfo FindInterfaceWithMember(in jsid nameID);
    nsIInterfaceInfo FindInterfaceWithName(in jsid nameID);

    void debugDump(in short depth);

    void refreshPrototype();
    /* 
     * This returns a pointer into the instance and care should be taken
     * to make sure the pointer is not kept past the life time of the
     * object it points into.
     */
    voidPtrPtr GetSecurityInfoAddress();

    /*
     * NOTE: Add new IDL methods _before_ the C++ block below if you
     * add them.  Otherwise the vtable won't be what xpidl thinks it
     * is, since GetObjectPrincipal() is virtual.
     */

%{C++
    /**
     * Faster access to the native object from C++.  Will never return null.
     */
    nsISupports* Native() const { return mIdentity; }

protected:
    nsISupports *mIdentity;
public:
%}
};

%{C++
#include "nsCOMPtr.h"

inline
const nsQueryInterface
do_QueryWrappedNative(nsIXPConnectWrappedNative *aWrappedNative)
{
    return nsQueryInterface(aWrappedNative->Native());
}

inline
const nsQueryInterfaceWithError
do_QueryWrappedNative(nsIXPConnectWrappedNative *aWrappedNative,
                      nsresult *aError)

{
    return nsQueryInterfaceWithError(aWrappedNative->Native(), aError);
}

%}

[uuid(BED52030-BCA6-11d2-BA79-00805F8A5DD7)]
interface nsIXPConnectWrappedJS : nsIXPConnectJSObjectHolder
{
    /* attribute 'JSObject' inherited from nsIXPConnectJSObjectHolder */
    readonly attribute nsIInterfaceInfo InterfaceInfo;
    readonly attribute nsIIDPtr         InterfaceIID;

    void debugDump(in short depth);

    void aggregatedQueryInterface(in nsIIDRef uuid,
                                  [iid_is(uuid),retval] out nsQIResult result);

};

/***************************************************************************/

/**
 * This is a sort of a placeholder interface. It is not intended to be
 * implemented. It exists to give the nsIXPCSecurityManager an iid on
 * which to gate a specific activity in XPConnect.
 *
 * That activity is...
 *
 * When JavaScript code uses a component that is itself implemented in
 * JavaScript then XPConnect will build a wrapper rather than directly
 * expose the JSObject of the component. This allows components implemented
 * in JavaScript to 'look' just like any other xpcom component (from the
 * perspective of the JavaScript caller). This insulates the component from
 * the caller and hides any properties or methods that are not part of the
 * interface as declared in xpidl. Usually this is a good thing.
 *
 * However, in some cases it is useful to allow the JS caller access to the
 * JS component's underlying implementation. In order to facilitate this
 * XPConnect supports the 'wrappedJSObject' property. The caller code can do:
 *
 * // 'foo' is some xpcom component (that might be implemented in JS).
 * try {
 *   var bar = foo.wrappedJSObject;
 *   if(bar) {
 *      // bar is the underlying JSObject. Do stuff with it here.
 *   }
 * } catch(e) {
 *   // security exception?
 * }
 *
 * Recall that 'foo' above is an XPConnect wrapper, not the underlying JS
 * object. The property get "foo.wrappedJSObject" will only succeed if three
 * conditions are met:
 *
 * 1) 'foo' really is an XPConnect wrapper around a JSObject.
 * 2) The underlying JSObject actually implements a "wrappedJSObject"
 *    property that returns a JSObject. This is called by XPConnect. This
 *    restriction allows wrapped objects to only allow access to the underlying
 *    JSObject if they choose to do so. Ususally this just means that 'foo'
 *    would have a property tht looks like:
 *       this.wrappedJSObject = this.
 * 3) The implemementation of nsIXPCSecurityManager (if installed) allows
 *    a property get on the interface below. Although the JSObject need not
 *    implement 'nsIXPCWrappedJSObjectGetter', XPConnect will ask the
 *    security manager if it is OK for the caller to access the only method
 *    in nsIXPCWrappedJSObjectGetter before allowing the activity. This fits
 *    in with the security manager paradigm and makes control over accessing
 *    the property on this interface the control factor for getting the
 *    underlying wrapped JSObject of a JS component from JS code.
 *
 * Notes:
 *
 * a) If 'foo' above were the underlying JSObject and not a wrapper at all,
 *    then this all just works and XPConnect is not part of the picture at all.
 * b) One might ask why 'foo' should not just implement an interface through
 *    which callers might get at the underlying object. There are three reasons:
 *   i)   XPConnect would still have to do magic since JSObject is not a
 *        scriptable type.
 *   ii)  JS Components might use aggregation (like C++ objects) and have
 *        different JSObjects for different interfaces 'within' an aggregate
 *        object. But, using an additional interface only allows returning one
 *        underlying JSObject. However, this allows for the possibility that
 *        each of the aggregte JSObjects could return something different.
 *        Note that one might do: this.wrappedJSObject = someOtherObject;
 *   iii) Avoiding the explicit interface makes it easier for both the caller
 *        and the component.
 *
 *  Anyway, some future implementation of nsIXPCSecurityManager might want
 *  do special processing on 'nsIXPCSecurityManager::CanGetProperty' when
 *  the interface id is that of nsIXPCWrappedJSObjectGetter.
 */

[scriptable, uuid(254bb2e0-6439-11d4-8fe0-0010a4e73d9a)]
interface nsIXPCWrappedJSObjectGetter : nsISupports
{
    readonly attribute nsISupports neverCalled;
};

/***************************************************************************/

/*
 * This interface is implemented by outside code and registered with xpconnect
 * via nsIXPConnect::setFunctionThisTranslator.
 *
 * The reason this exists is to support calls to JavaScript event callbacks
 * needed by the DOM via xpconnect from C++ code.
 *
 * We've added support for wrapping JS function objects as xpcom interfaces
 * by declaring the given interface as a [function] interface. However, to
 * support the requirements of JS event callbacks we need to call the JS
 * function with the 'this' set as the JSObject for which the event is being
 * fired; e.g. a form node.
 *
 * We've decided that for all cases we care about the appropriate 'this' object
 * can be derived from the first param in the call to the callback. In the
 * event handler case the first param is an event object.
 *
 * Though we can't change all the JS code so that it would setup its own 'this',
 * we can add plugin 'helper' support to xpconnect. And that is what we have
 * here.
 *
 * The idea is that at startup time some code that cares about this issue
 * (e.g. the DOM helper code) can register a nsIXPCFunctionThisTranslator
 * object with xpconnect to handle calls to [function] interfaces of a given
 * iid. When xpconnect goes to invoke a method on a wrapped JSObject for
 * an interface marked as [function], xpconnect will check if the first param
 * of the method is an xpcom object pointer and if so it will check to see if a
 * nsIXPCFunctionThisTranslator has been registered for the given iid of the
 * interface being called. If so it will call the translator and get an
 * interface pointer to use as the 'this' for the call. If the translator
 * returns a non-null interface pointer (which it should then have addref'd
 * since it is being returned as an out param), xpconnect will attempt to build
 * a wrapper around the pointer and get a JSObject from that wrapper to use
 * as the 'this' for the call.
 *
 * If a null interface pointer is returned then xpconnect will use the default
 * 'this' - the same JSObject as the function object it is calling.
 *
 * The translator can also return a non-null aIIDOfResult to tell xpconnect what
 * type of wrapper to build. If that is null then xpconnect will assume the
 * wrapper should be for nsISupports. For objects that support flattening -
 * i.e. expose nsIClassInfo and that interface's getInterfaces method - then
 * a flattened wrapper will be created and no iid was really necessary.
 *
 * XXX aHideFirstParamFromJS is intended to allow the trimming of that first
 * param (used to indicate 'this') from the actual call to the JS code. The JS
 * DOM does not require this functionality and it is **NOT YET IMPLEMENTED**
 *
 */

[uuid(039ef260-2a0d-11d5-90a7-0010a4e73d9a)]
interface nsIXPCFunctionThisTranslator : nsISupports
{
    nsISupports TranslateThis(in nsISupports        aInitialThis,
                              in nsIInterfaceInfo   aInterfaceInfo,
                              in PRUint16           aMethodIndex,
                              out boolean            aHideFirstParamFromJS,
                              out nsIIDPtr          aIIDOfResult);
};

/***************************************************************************/

%{ C++
// For use with the service manager
// {CB6593E0-F9B2-11d2-BDD6-000064657374}
#define NS_XPCONNECT_CID \
{ 0xcb6593e0, 0xf9b2, 0x11d2, \
    { 0xbd, 0xd6, 0x0, 0x0, 0x64, 0x65, 0x73, 0x74 } }
%}

[uuid(07661008-5505-4784-a612-89f7dc2144da)]
interface nsIXPConnect : nsISupports
{
%{ C++
  NS_DEFINE_STATIC_CID_ACCESSOR(NS_XPCONNECT_CID)
%}

    /**
     * Initializes classes on a global object that has already been created.
     */
    void
    initClasses(in JSContextPtr aJSContext,
                in JSObjectPtr  aGlobalJSObj);

    /**
     * Creates a new global object using the given aCOMObj as the global
     * object. The object will be set up according to the flags (defined
     * below). If you do not pass INIT_JS_STANDARD_CLASSES, then aCOMObj
     * must implement nsIXPCScriptable so it can resolve the standard
     * classes when asked by the JS engine.
     *
     * @param aJSContext the context to use while creating the global object.
     * @param aCOMObj the native object that represents the global object.
     * @param aIID the IID used to wrap the global object.
     * @param aPrincipal the principal of the code that will run in this
     *                   compartment. Can be null if not on the main thread.
     * @param aExtraPtr must be passed if aPrincipal is null. Used to separate
     *                  code from the same principal into different
     *                  compartments, as for sandboxes.
     * @param aFlags one of the flags below specifying what options this
     *               global object wants.
     */
    nsIXPConnectJSObjectHolder
    initClassesWithNewWrappedGlobal(
                  in JSContextPtr aJSContext,
                  in nsISupports  aCOMObj,
                  in nsIIDRef     aIID,
                  in nsIPrincipal aPrincipal,
                  in nsISupports  aExtraPtr,
                  in PRUint32     aFlags);

    const PRUint32 INIT_JS_STANDARD_CLASSES  = 1 << 0;
    const PRUint32 FLAG_SYSTEM_GLOBAL_OBJECT = 1 << 1;
    const PRUint32 OMIT_COMPONENTS_OBJECT    = 1 << 2;

    /**
    * wrapNative will create a new JSObject or return an existing one.
    *
    * The JSObject is returned inside a refcounted nsIXPConnectJSObjectHolder.
    * As long as this holder is held the JSObject will be protected from
    * collection by JavaScript's garbage collector. It is a good idea to
    * transfer the JSObject to some equally protected place before releasing
    * the holder (i.e. use JS_SetProperty to make this object a property of
    * some other JSObject).
    *
    * This method now correctly deals with cases where the passed in xpcom
    * object already has an associated JSObject for the cases:
    *  1) The xpcom object has already been wrapped for use in the same scope
    *     as an nsIXPConnectWrappedNative.
    *  2) The xpcom object is in fact a nsIXPConnectWrappedJS and thus already
    *     has an underlying JSObject.
    *  3) The xpcom object implements nsIScriptObjectOwner; i.e. is an idlc
    *     style DOM object for which we can call GetScriptObject to get the
    *     JSObject it uses to represent itself into JavaScript.
    *
    * It *might* be possible to QueryInterface the nsIXPConnectJSObjectHolder
    * returned by the method into a nsIXPConnectWrappedNative or a
    * nsIXPConnectWrappedJS.
    *
    * This method will never wrap the JSObject involved in an
    * XPCNativeWrapper before returning.
    *
    * Returns:
    *    success:
    *       NS_OK
    *    failure:
    *       NS_ERROR_XPC_BAD_CONVERT_NATIVE
    *       NS_ERROR_XPC_CANT_GET_JSOBJECT_OF_DOM_OBJECT
    *       NS_ERROR_FAILURE
    */
    nsIXPConnectJSObjectHolder
    wrapNative(in JSContextPtr aJSContext,
               in JSObjectPtr  aScope,
               in nsISupports  aCOMObj,
               in nsIIDRef     aIID);

    /**
     * Same as wrapNative, but also returns the JSObject in aVal. C++ callers
     * can pass in null for the aHolder argument, but in that case they must
     * ensure that aVal is rooted.
     * aIID may be null, it means the same as passing in
     * &NS_GET_IID(nsISupports) but when passing in null certain shortcuts
     * can be taken because we know without comparing IIDs that the caller is
     * asking for an nsISupports wrapper.
     * If aAllowWrapper, then the returned value will be wrapped in the proper
     * type of security wrapper on top of the XPCWrappedNative (if needed).
     * This method doesn't push aJSContext on the context stack, so the caller
     * is required to push it if the top of the context stack is not equal to
     * aJSContext.
     */
    void
    wrapNativeToJSVal(in JSContextPtr aJSContext,
                      in JSObjectPtr  aScope,
                      in nsISupports  aCOMObj,
                      in nsWrapperCachePtr aCache,
                      in nsIIDPtr     aIID,
                      in boolean      aAllowWrapper,
                      out jsval       aVal,
                      out nsIXPConnectJSObjectHolder aHolder);

    /**
    * wrapJS will yield a new or previously existing xpcom interface pointer
    * to represent the JSObject passed in.
    *
    * This method now correctly deals with cases where the passed in JSObject
    * already has an associated xpcom interface for the cases:
    *  1) The JSObject has already been wrapped as a nsIXPConnectWrappedJS.
    *  2) The JSObject is in fact a nsIXPConnectWrappedNative and thus already
    *     has an underlying xpcom object.
    *  3) The JSObject is of a jsclass which supports getting the nsISupports
    *     from the JSObject directly. This is used for idlc style objects
    *     (e.g. DOM objects).
    *
    * It *might* be possible to QueryInterface the resulting interface pointer
    * to nsIXPConnectWrappedJS.
    *
    * Returns:
    *   success:
    *     NS_OK
    *    failure:
    *       NS_ERROR_XPC_BAD_CONVERT_JS
    *       NS_ERROR_FAILURE
    */
    void
    wrapJS(in JSContextPtr aJSContext,
           in JSObjectPtr  aJSObj,
           in nsIIDRef     aIID,
           [iid_is(aIID),retval] out nsQIResult result);

    /**
     * Wraps the given jsval in a nsIVariant and returns the new variant.
     */
    nsIVariant
    jSValToVariant(in JSContextPtr cx, in JSValPtr aJSVal);

    /**
    * This only succeeds if the JSObject is a nsIXPConnectWrappedNative.
    * A new wrapper is *never* constructed.
    */
    nsIXPConnectWrappedNative
    getWrappedNativeOfJSObject(in JSContextPtr aJSContext,
                               in JSObjectPtr  aJSObj);

    [noscript, notxpcom] nsISupports
    getNativeOfWrapper(in JSContextPtr aJSContext,
                       in JSObjectPtr  aJSObj);

    JSObjectPtr
    getJSObjectOfWrapper(in JSContextPtr aJSContext,
                         in JSObjectPtr  aJSObj);

    void setSecurityManagerForJSContext(in JSContextPtr aJSContext,
                                        in nsIXPCSecurityManager aManager,
                                        in PRUint16 flags);

    void getSecurityManagerForJSContext(in JSContextPtr aJSContext,
                                        out nsIXPCSecurityManager aManager,
                                        out PRUint16 flags);

    /**
    * The security manager to use when the current JSContext has no security
    * manager.
    */
    void setDefaultSecurityManager(in nsIXPCSecurityManager aManager,
                                   in PRUint16 flags);

    void getDefaultSecurityManager(out nsIXPCSecurityManager aManager,
                                   out PRUint16 flags);

    nsIStackFrame
    createStackFrameLocation(in PRUint32       aLanguage,
                             in string         aFilename,
                             in string         aFunctionName,
                             in PRInt32        aLineNumber,
                             in nsIStackFrame  aCaller);

    /**
    * @deprecated do-nothing function.
    */
    [deprecated] void syncJSContexts();

    readonly attribute nsIStackFrame                CurrentJSStack;
    readonly attribute nsAXPCNativeCallContextPtr   CurrentNativeCallContext;
    /* pass nsnull to clear pending exception */
             attribute nsIException                 PendingException;

    void debugDump(in short depth);
    void debugDumpObject(in nsISupports aCOMObj, in short depth);
    void debugDumpJSStack(in boolean showArgs,
                          in boolean showLocals,
                          in boolean showThisProps);
    void debugDumpEvalInJSStackFrame(in PRUint32 aFrameNumber,
                                     in string aSourceText);

    /**
    * wrapJSAggregatedToNative is just like wrapJS except it is used in cases
    * where the JSObject is also aggregated to some native xpcom Object.
    * At present XBL is the only system that might want to do this.
    *
    * XXX write more!
    *
    * Returns:
    *   success:
    *     NS_OK
    *    failure:
    *       NS_ERROR_XPC_BAD_CONVERT_JS
    *       NS_ERROR_FAILURE
    */
    void
    wrapJSAggregatedToNative(in nsISupports  aOuter,
                             in JSContextPtr aJSContext,
                             in JSObjectPtr  aJSObj,
                             in nsIIDRef     aIID,
                             [iid_is(aIID),retval] out nsQIResult result);

    // Methods added since mozilla 0.6....

    /**
    * This only succeeds if the native object is already wrapped by xpconnect.
    * A new wrapper is *never* constructed.
    */
    nsIXPConnectWrappedNative
    getWrappedNativeOfNativeObject(in JSContextPtr aJSContext,
                                   in JSObjectPtr  aScope,
                                   in nsISupports  aCOMObj,
                                   in nsIIDRef     aIID);

    nsIXPCFunctionThisTranslator
    getFunctionThisTranslator(in nsIIDRef aIID);

    nsIXPCFunctionThisTranslator
    setFunctionThisTranslator(in nsIIDRef aIID,
                              in nsIXPCFunctionThisTranslator aTranslator);

    nsIXPConnectJSObjectHolder
    reparentWrappedNativeIfFound(in JSContextPtr aJSContext,
                                 in JSObjectPtr  aScope,
                                 in JSObjectPtr  aNewParent,
                                 in nsISupports  aCOMObj);
    void
    moveWrappers(in JSContextPtr aJSContext,
                 in JSObjectPtr  aOldScope,
                 in JSObjectPtr  aNewScope);

    void clearAllWrappedNativeSecurityPolicies();

    nsIXPConnectJSObjectHolder
    getWrappedNativePrototype(in JSContextPtr aJSContext,
                              in JSObjectPtr  aScope,
                              in nsIClassInfo aClassInfo);

    void releaseJSContext(in JSContextPtr aJSContext, in boolean noGC);

    jsval variantToJS(in JSContextPtr ctx, in JSObjectPtr scope, in nsIVariant value);
    nsIVariant JSToVariant(in JSContextPtr ctx, in jsval value);

    /**
     * Restore an old prototype for wrapped natives of type
     * aClassInfo. This should be used only when restoring an old
     * scope into a state close to where it was prior to
     * being reinitialized.
     */
    void restoreWrappedNativePrototype(in JSContextPtr aJSContext,
                                       in JSObjectPtr  aScope,
                                       in nsIClassInfo aClassInfo,
                                       in nsIXPConnectJSObjectHolder aPrototype);

    /**
     * Create a sandbox for evaluating code in isolation using
     * evalInSandboxObject().
     *
     * @param cx A context to use when creating the sandbox object.
     * @param principal The principal (or NULL to use the null principal)
     *                  to use when evaluating code in this sandbox.
     */
    [noscript] nsIXPConnectJSObjectHolder createSandbox(in JSContextPtr cx,
                                                        in nsIPrincipal principal);

    /**
     * Evaluate script in a sandbox, completely isolated from all
     * other running scripts.
     *
     * @param source The source of the script to evaluate.
     * @param cx The context to use when setting up the evaluation of
     *           the script. The actual evaluation will happen on a new
     *           temporary context.
     * @param sandbox The sandbox object to evaluate the script in.
     * @param returnStringOnly The only results to come out of the
     *                         computation (including exceptions) will
     *                         be coerced into strings created in the
     *                         sandbox.
     * @return The result of the evaluation as a jsval. If the caller
     *         intends to use the return value from this call the caller
     *         is responsible for rooting the jsval before making a call
     *         to this method.
     */
    [noscript] jsval evalInSandboxObject(in AString source, in JSContextPtr cx,
                                         in nsIXPConnectJSObjectHolder sandbox,
                                         in boolean returnStringOnly);

    /**
     * Root JS objects held by aHolder.
     * @param aHolder The object that hold the JS objects that should be rooted.
     * @param aTrace The tracer for aHolder.
     */
    [noscript] void addJSHolder(in voidPtr aHolder,
                                in nsScriptObjectTracerPtr aTracer);

    /**
     * Stop rooting the JS objects held by aHolder.
     * @param aHolder The object that hold the rooted JS objects.
     */
    [noscript] void removeJSHolder(in voidPtr aHolder);

    /**
     * Note aJSContext as a child to the cycle collector.
     * @param aJSContext The JSContext to note.
     * @param aCb The cycle collection traversal callback.
     */
    [noscript,notxpcom] void noteJSContext(in JSContextPtr aJSContext,
                                           in nsCCTraversalCallbackRef aCb);

    /**
     * Whether or not XPConnect should report all JS exceptions when returning
     * from JS into C++. False by default, although any value set in the
     * MOZ_REPORT_ALL_JS_EXCEPTIONS environment variable will override the value
     * passed here.
     */
    void setReportAllJSExceptions(in boolean reportAllJSExceptions);

    /**
     * Trigger a JS garbage collection.
     */
    void GarbageCollect(in boolean shrinkingGC);

    /**
     * Define quick stubs on the given object, @a proto.
     *
     * @param cx
     *     A context.  Requires request.
     * @param proto
     *     The (newly created) prototype object for a DOM class.  The JS half
     *     of an XPCWrappedNativeProto.
     * @param flags
     *     Property flags for the quick stub properties--should be either
     *     JSPROP_ENUMERATE or 0.
     * @param interfaceCount
     *     The number of interfaces the class implements.
     * @param interfaceArray
     *     The interfaces the class implements; interfaceArray and
     *     interfaceCount are like what nsIClassInfo.getInterfaces returns.
     */
    [noscript,notxpcom] boolean defineDOMQuickStubs(
        in JSContextPtr cx,
        in JSObjectPtr proto,
        in PRUint32 flags,
        in PRUint32 interfaceCount,
        [array, size_is(interfaceCount)] in nsIIDPtr interfaceArray);

%{C++
    /**
     * Get the object principal for this wrapper.  Note that this may well end
     * up being null; in that case one should seek principals elsewhere.  Null
     * here does NOT indicate system principal or no principals at all, just
     * that this wrapper doesn't have an intrinsic one.
     */
    virtual nsIPrincipal* GetPrincipal(JSObject* obj,
                                       bool allowShortCircuit) const = 0;
    virtual char* DebugPrintJSStack(bool showArgs,
                                    bool showLocals,
                                    bool showThisProps) = 0;
%}

    /**
     * Creates a JS object holder around aObject that will hold the object
     * alive for as long as the holder stays alive.
     */
    nsIXPConnectJSObjectHolder holdObject(in JSContextPtr aJSContext,
                                          in JSObjectPtr aObject);

    /**
     * Return the caller object of the current call from JS.
     */
    [noscript,notxpcom] void getCaller(out JSContextPtr aJSContext,
                                       out JSObjectPtr aObject);

    /**
     * When we place the browser in JS debug mode, there can't be any
     * JS on the stack. This is because we currently activate debugMode 
     * on all scripts in the JSRuntime when the debugger is activated.
     * This method will turn debug mode on or off when the context 
     * stack reaches zero length.
     */
    [noscript] void setDebugModeWhenPossible(in boolean mode,
                                             in boolean allowSyncDisable);
};