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
//
// DO NOT EDIT.  THIS FILE IS GENERATED FROM ../../../dist/idl/nsIPermissionManager.idl
//


/// `interface nsIPermissionManager : nsISupports`
///


// The actual type definition for the interface. This struct has methods
// declared on it which will call through its vtable. You never want to pass
// this type around by value, always pass it behind a reference.

#[repr(C)]
pub struct nsIPermissionManager {
    vtable: *const nsIPermissionManagerVTable,

    /// This field is a phantomdata to ensure that the VTable type and any
    /// struct containing it is not safe to send across threads, as XPCOM is
    /// generally not threadsafe.
    ///
    /// XPCOM interfaces in general are not safe to send across threads.
    __nosync: ::std::marker::PhantomData<::std::rc::Rc<u8>>,
}

// Implementing XpCom for an interface exposes its IID, which allows for easy
// use of the `.query_interface<T>` helper method. This also defines that
// method for nsIPermissionManager.
unsafe impl XpCom for nsIPermissionManager {
    const IID: nsIID = nsID(0x4dcb3851, 0xeba2, 0x4e42,
        [0xb2, 0x36, 0x82, 0xd2, 0x59, 0x6f, 0xca, 0x22]);
}

// We need to implement the RefCounted trait so we can be used with `RefPtr`.
// This trait teaches `RefPtr` how to manage our memory.
unsafe impl RefCounted for nsIPermissionManager {
    #[inline]
    unsafe fn addref(&self) {
        self.AddRef();
    }
    #[inline]
    unsafe fn release(&self) {
        self.Release();
    }
}

// This trait is implemented on all types which can be coerced to from nsIPermissionManager.
// It is used in the implementation of `fn coerce<T>`. We hide it from the
// documentation, because it clutters it up a lot.
#[doc(hidden)]
pub trait nsIPermissionManagerCoerce {
    /// Cheaply cast a value of this type from a `nsIPermissionManager`.
    fn coerce_from(v: &nsIPermissionManager) -> &Self;
}

// The trivial implementation: We can obviously coerce ourselves to ourselves.
impl nsIPermissionManagerCoerce for nsIPermissionManager {
    #[inline]
    fn coerce_from(v: &nsIPermissionManager) -> &Self {
        v
    }
}

impl nsIPermissionManager {
    /// Cast this `nsIPermissionManager` to one of its base interfaces.
    #[inline]
    pub fn coerce<T: nsIPermissionManagerCoerce>(&self) -> &T {
        T::coerce_from(self)
    }
}

// Every interface struct type implements `Deref` to its base interface. This
// causes methods on the base interfaces to be directly avaliable on the
// object. For example, you can call `.AddRef` or `.QueryInterface` directly
// on any interface which inherits from `nsISupports`.
impl ::std::ops::Deref for nsIPermissionManager {
    type Target = nsISupports;
    #[inline]
    fn deref(&self) -> &nsISupports {
        unsafe {
            ::std::mem::transmute(self)
        }
    }
}

// Ensure we can use .coerce() to cast to our base types as well. Any type which
// our base interface can coerce from should be coercable from us as well.
impl<T: nsISupportsCoerce> nsIPermissionManagerCoerce for T {
    #[inline]
    fn coerce_from(v: &nsIPermissionManager) -> &Self {
        T::coerce_from(v)
    }
}

// This struct represents the interface's VTable. A pointer to a statically
// allocated version of this struct is at the beginning of every nsIPermissionManager
// object. It contains one pointer field for each method in the interface. In
// the case where we can't generate a binding for a method, we include a void
// pointer.
#[doc(hidden)]
#[repr(C)]
pub struct nsIPermissionManagerVTable {
    /// We need to include the members from the base interface's vtable at the start
    /// of the VTable definition.
    pub __base: nsISupportsVTable,

    /* void add (in nsIURI uri, in string type, in uint32_t permission, [optional] in uint32_t expireType, [optional] in int64_t expireTime); */
    pub Add: unsafe extern "system" fn (this: *const nsIPermissionManager, uri: *const nsIURI, type_: *const libc::c_char, permission: uint32_t, expireType: uint32_t, expireTime: int64_t) -> nsresult,

    /* nsISimpleEnumerator getAllForURI (in nsIURI uri); */
    pub GetAllForURI: unsafe extern "system" fn (this: *const nsIPermissionManager, uri: *const nsIURI, _retval: *mut *const nsISimpleEnumerator) -> nsresult,

    /* void addFromPrincipal (in nsIPrincipal principal, in string typed, in uint32_t permission, [optional] in uint32_t expireType, [optional] in int64_t expireTime); */
    pub AddFromPrincipal: unsafe extern "system" fn (this: *const nsIPermissionManager, principal: *const nsIPrincipal, typed: *const libc::c_char, permission: uint32_t, expireType: uint32_t, expireTime: int64_t) -> nsresult,

    /* void remove (in nsIURI uri, in string type); */
    pub Remove: unsafe extern "system" fn (this: *const nsIPermissionManager, uri: *const nsIURI, type_: *const libc::c_char) -> nsresult,

    /* void removeFromPrincipal (in nsIPrincipal principal, in string type); */
    pub RemoveFromPrincipal: unsafe extern "system" fn (this: *const nsIPermissionManager, principal: *const nsIPrincipal, type_: *const libc::c_char) -> nsresult,

    /* void removePermission (in nsIPermission perm); */
    pub RemovePermission: unsafe extern "system" fn (this: *const nsIPermissionManager, perm: *const nsIPermission) -> nsresult,

    /* void removeAll (); */
    pub RemoveAll: unsafe extern "system" fn (this: *const nsIPermissionManager) -> nsresult,

    /* void removeAllSince (in int64_t since); */
    pub RemoveAllSince: unsafe extern "system" fn (this: *const nsIPermissionManager, since: int64_t) -> nsresult,

    /* uint32_t testPermission (in nsIURI uri, in string type); */
    pub TestPermission: unsafe extern "system" fn (this: *const nsIPermissionManager, uri: *const nsIURI, type_: *const libc::c_char, _retval: *mut uint32_t) -> nsresult,

    /* uint32_t testPermissionFromPrincipal (in nsIPrincipal principal, in string type); */
    pub TestPermissionFromPrincipal: unsafe extern "system" fn (this: *const nsIPermissionManager, principal: *const nsIPrincipal, type_: *const libc::c_char, _retval: *mut uint32_t) -> nsresult,

    /* uint32_t testPermissionFromWindow (in mozIDOMWindow window, in string type); */
    pub TestPermissionFromWindow: unsafe extern "system" fn (this: *const nsIPermissionManager, window: *const mozIDOMWindow, type_: *const libc::c_char, _retval: *mut uint32_t) -> nsresult,

    /* uint32_t testExactPermission (in nsIURI uri, in string type); */
    pub TestExactPermission: unsafe extern "system" fn (this: *const nsIPermissionManager, uri: *const nsIURI, type_: *const libc::c_char, _retval: *mut uint32_t) -> nsresult,

    /* uint32_t testExactPermissionFromPrincipal (in nsIPrincipal principal, in string type); */
    pub TestExactPermissionFromPrincipal: unsafe extern "system" fn (this: *const nsIPermissionManager, principal: *const nsIPrincipal, type_: *const libc::c_char, _retval: *mut uint32_t) -> nsresult,

    /* uint32_t testExactPermanentPermission (in nsIPrincipal principal, in string type); */
    pub TestExactPermanentPermission: unsafe extern "system" fn (this: *const nsIPermissionManager, principal: *const nsIPrincipal, type_: *const libc::c_char, _retval: *mut uint32_t) -> nsresult,

    /* nsIPermission getPermissionObjectForURI (in nsIURI uri, in string type, in boolean exactHost); */
    pub GetPermissionObjectForURI: unsafe extern "system" fn (this: *const nsIPermissionManager, uri: *const nsIURI, type_: *const libc::c_char, exactHost: bool, _retval: *mut *const nsIPermission) -> nsresult,

    /* nsIPermission getPermissionObject (in nsIPrincipal principal, in string type, in boolean exactHost); */
    pub GetPermissionObject: unsafe extern "system" fn (this: *const nsIPermissionManager, principal: *const nsIPrincipal, type_: *const libc::c_char, exactHost: bool, _retval: *mut *const nsIPermission) -> nsresult,

    /* readonly attribute nsISimpleEnumerator enumerator; */
    pub GetEnumerator: unsafe extern "system" fn (this: *const nsIPermissionManager, aEnumerator: *mut *const nsISimpleEnumerator) -> nsresult,

    /* void removePermissionsWithAttributes (in DOMString patternAsJSON); */
    pub RemovePermissionsWithAttributes: unsafe extern "system" fn (this: *const nsIPermissionManager, patternAsJSON: &::nsstring::nsAString) -> nsresult,

    /* void updateExpireTime (in nsIPrincipal principal, in string type, in boolean exactHost, in uint64_t sessionExpireTime, in uint64_t persistentExpireTime); */
    pub UpdateExpireTime: unsafe extern "system" fn (this: *const nsIPermissionManager, principal: *const nsIPrincipal, type_: *const libc::c_char, exactHost: bool, sessionExpireTime: uint64_t, persistentExpireTime: uint64_t) -> nsresult,

    /* void getPermissionsWithKey (in ACString permissionKey, out IPCPermissionArrayRef perms); */
    /// Unable to generate binding because `native type nsTArray<IPC::Permission> is unsupported`
    pub GetPermissionsWithKey: *const ::libc::c_void,

    /* void setPermissionsWithKey (in ACString permissionKey, in IPCPermissionArrayRef perms); */
    /// Unable to generate binding because `native type nsTArray<IPC::Permission> is unsupported`
    pub SetPermissionsWithKey: *const ::libc::c_void,

    /* void broadcastPermissionsForPrincipalToAllContentProcesses (in nsIPrincipal aPrincipal); */
    pub BroadcastPermissionsForPrincipalToAllContentProcesses: unsafe extern "system" fn (this: *const nsIPermissionManager, aPrincipal: *const nsIPrincipal) -> nsresult,

    /* void whenPermissionsAvailable (in nsIPrincipal aPrincipal, in nsIRunnable aRunnable); */
    pub WhenPermissionsAvailable: unsafe extern "system" fn (this: *const nsIPermissionManager, aPrincipal: *const nsIPrincipal, aRunnable: *const nsIRunnable) -> nsresult,

    /* [infallible] readonly attribute boolean hasPreloadPermissions; */
    pub GetHasPreloadPermissions: unsafe extern "system" fn (this: *const nsIPermissionManager, aHasPreloadPermissions: *mut bool) -> nsresult,
}


// The implementations of the function wrappers which are exposed to rust code.
// Call these methods rather than manually calling through the VTable struct.
impl nsIPermissionManager {
    /// ```text
    /// /**
    ///    * Predefined return values for the testPermission method and for
    ///    * the permission param of the add method
    ///    * NOTE: UNKNOWN_ACTION (0) is reserved to represent the
    ///    * default permission when no entry is found for a host, and
    ///    * should not be used by consumers to indicate otherwise.
    ///    */
    /// ```
    ///

    pub const UNKNOWN_ACTION: i64 = 0;


    pub const ALLOW_ACTION: i64 = 1;


    pub const DENY_ACTION: i64 = 2;


    pub const PROMPT_ACTION: i64 = 3;

    /// ```text
    /// /**
    ///    * Predefined expiration types for permissions.  Permissions can be permanent
    ///    * (never expire), expire at the end of the session, or expire at a specified
    ///    * time. Permissions that expire at the end of a session may also have a
    ///    * specified expiration time.
    ///    *
    ///    * EXPIRE_POLICY is a special expiration status. It is set when the permission
    ///    * is set by reading an enterprise policy. These permissions cannot be overridden.
    ///    */
    /// ```
    ///

    pub const EXPIRE_NEVER: i64 = 0;


    pub const EXPIRE_SESSION: i64 = 1;


    pub const EXPIRE_TIME: i64 = 2;


    pub const EXPIRE_POLICY: i64 = 3;

    /// ```text
    /// /**
    ///    * Add permission information for a given URI and permission type. This
    ///    * operation will cause the type string to be registered if it does not
    ///    * currently exist. If a permission already exists for a given type, it
    ///    * will be modified.
    ///    *
    ///    * @param uri         the uri to add the permission for
    ///    * @param type        a case-sensitive ASCII string, identifying the consumer.
    ///    *                    Consumers should choose this string to be unique, with
    ///    *                    respect to other consumers.
    ///    * @param permission  an integer representing the desired action (e.g. allow
        ///    *                    or deny). The interpretation of this number is up to the
    ///    *                    consumer, and may represent different actions for different
    ///    *                    types. Consumers may use one of the enumerated permission
    ///    *                    actions defined above, for convenience.
    ///    *                    NOTE: UNKNOWN_ACTION (0) is reserved to represent the
    ///    *                    default permission when no entry is found for a host, and
    ///    *                    should not be used by consumers to indicate otherwise.
    ///    * @param expiretype  a constant defining whether this permission should
    ///    *                    never expire (EXPIRE_NEVER), expire at the end of the
    ///    *                    session (EXPIRE_SESSION), or expire at a specified time
    ///    *                    (EXPIRE_TIME).
    ///    * @param expiretime  an integer representation of when this permission
    ///    *                    should be forgotten (milliseconds since Jan 1 1970 0:00:00).
    ///    */
    /// ```
    ///

    /// `void add (in nsIURI uri, in string type, in uint32_t permission, [optional] in uint32_t expireType, [optional] in int64_t expireTime);`
    #[inline]
    pub unsafe fn Add(&self, uri: *const nsIURI, type_: *const libc::c_char, permission: uint32_t, expireType: uint32_t, expireTime: int64_t) -> nsresult {
        ((*self.vtable).Add)(self, uri, type_, permission, expireType, expireTime)
    }


    /// ```text
    /// /**
    ///    * Get all custom permissions for a given URI. This will return
    ///    * an enumerator of all permissions which are not set to default
    ///    * and which belong to the matching prinicpal of the given URI.
    ///    *
    ///    * @param uri  the URI to get all permissions for
    ///    */
    /// ```
    ///

    /// `nsISimpleEnumerator getAllForURI (in nsIURI uri);`
    #[inline]
    pub unsafe fn GetAllForURI(&self, uri: *const nsIURI, _retval: *mut *const nsISimpleEnumerator) -> nsresult {
        ((*self.vtable).GetAllForURI)(self, uri, _retval)
    }


    /// ```text
    /// /**
    ///    * Add permission information for a given principal.
    ///    * It is internally calling the other add() method using the nsIURI from the
    ///    * principal.
    ///    * Passing a system principal will be a no-op because they will always be
    ///    * granted permissions.
    ///    */
    /// ```
    ///

    /// `void addFromPrincipal (in nsIPrincipal principal, in string typed, in uint32_t permission, [optional] in uint32_t expireType, [optional] in int64_t expireTime);`
    #[inline]
    pub unsafe fn AddFromPrincipal(&self, principal: *const nsIPrincipal, typed: *const libc::c_char, permission: uint32_t, expireType: uint32_t, expireTime: int64_t) -> nsresult {
        ((*self.vtable).AddFromPrincipal)(self, principal, typed, permission, expireType, expireTime)
    }


    /// ```text
    /// /**
    ///    * Remove permission information for a given URI and permission type. This will
    ///    * remove the permission for the entire host described by the uri, acting as the
    ///    * opposite operation to the add() method.
    ///    *
    ///    * @param uri    the uri to remove the permission for
    ///    * @param type   a case-sensitive ASCII string, identifying the consumer.
    ///    *               The type must have been previously registered using the
    ///    *               add() method.
    ///    */
    /// ```
    ///

    /// `void remove (in nsIURI uri, in string type);`
    #[inline]
    pub unsafe fn Remove(&self, uri: *const nsIURI, type_: *const libc::c_char) -> nsresult {
        ((*self.vtable).Remove)(self, uri, type_)
    }


    /// ```text
    /// /**
    ///    * Remove permission information for a given principal.
    ///    * This is internally calling remove() with the host from the principal's URI.
    ///    * Passing system principal will be a no-op because we never add them to the
    ///    * database.
    ///    */
    /// ```
    ///

    /// `void removeFromPrincipal (in nsIPrincipal principal, in string type);`
    #[inline]
    pub unsafe fn RemoveFromPrincipal(&self, principal: *const nsIPrincipal, type_: *const libc::c_char) -> nsresult {
        ((*self.vtable).RemoveFromPrincipal)(self, principal, type_)
    }


    /// ```text
    /// /**
    ///    * Remove the given permission from the permission manager.
    ///    *
    ///    * @param perm   a permission obtained from the permission manager.
    ///    */
    /// ```
    ///

    /// `void removePermission (in nsIPermission perm);`
    #[inline]
    pub unsafe fn RemovePermission(&self, perm: *const nsIPermission) -> nsresult {
        ((*self.vtable).RemovePermission)(self, perm)
    }


    /// ```text
    /// /**
    ///    * Clear permission information for all websites.
    ///    */
    /// ```
    ///

    /// `void removeAll ();`
    #[inline]
    pub unsafe fn RemoveAll(&self, ) -> nsresult {
        ((*self.vtable).RemoveAll)(self, )
    }


    /// ```text
    /// /**
    ///    * Clear all permission information added since the specified time.
    ///    */
    /// ```
    ///

    /// `void removeAllSince (in int64_t since);`
    #[inline]
    pub unsafe fn RemoveAllSince(&self, since: int64_t) -> nsresult {
        ((*self.vtable).RemoveAllSince)(self, since)
    }


    /// ```text
    /// /**
    ///    * Test whether a website has permission to perform the given action.
    ///    * This function will perform a pref lookup to permissions.default.<type>
    ///    * if the specific permission type is part of the whitelist for that functionality.
    ///    * @param uri     the uri to be tested
    ///    * @param type    a case-sensitive ASCII string, identifying the consumer
    ///    * @param return  see add(), param permission. returns UNKNOWN_ACTION when
    ///    *                there is no stored permission for this uri and / or type.
    ///    */
    /// ```
    ///

    /// `uint32_t testPermission (in nsIURI uri, in string type);`
    #[inline]
    pub unsafe fn TestPermission(&self, uri: *const nsIURI, type_: *const libc::c_char, _retval: *mut uint32_t) -> nsresult {
        ((*self.vtable).TestPermission)(self, uri, type_, _retval)
    }


    /// ```text
    /// /**
    ///    * Test whether the principal has the permission to perform a given action.
    ///    * System principals will always have permissions granted.
    ///    * This function will perform a pref lookup to permissions.default.<type>
    ///    * if the specific permission type is part of the whitelist for that functionality.
    ///    */
    /// ```
    ///

    /// `uint32_t testPermissionFromPrincipal (in nsIPrincipal principal, in string type);`
    #[inline]
    pub unsafe fn TestPermissionFromPrincipal(&self, principal: *const nsIPrincipal, type_: *const libc::c_char, _retval: *mut uint32_t) -> nsresult {
        ((*self.vtable).TestPermissionFromPrincipal)(self, principal, type_, _retval)
    }


    /// ```text
    /// /**
    ///    * Test whether the principal associated with the window's document has the
    ///    * permission to perform a given action.  System principals will always
    ///    * have permissions granted.
    ///    * This function will perform a pref lookup to permissions.default.<type>
    ///    * if the specific permission type is part of the whitelist for that functionality.
    ///    */
    /// ```
    ///

    /// `uint32_t testPermissionFromWindow (in mozIDOMWindow window, in string type);`
    #[inline]
    pub unsafe fn TestPermissionFromWindow(&self, window: *const mozIDOMWindow, type_: *const libc::c_char, _retval: *mut uint32_t) -> nsresult {
        ((*self.vtable).TestPermissionFromWindow)(self, window, type_, _retval)
    }


    /// ```text
    /// /**
    ///    * Test whether a website has permission to perform the given action.
    ///    * This requires an exact hostname match, subdomains are not a match.
    ///    * This function will perform a pref lookup to permissions.default.<type>
    ///    * if the specific permission type is part of the whitelist for that functionality.
    ///    * @param uri     the uri to be tested
    ///    * @param type    a case-sensitive ASCII string, identifying the consumer
    ///    * @param return  see add(), param permission. returns UNKNOWN_ACTION when
    ///    *                there is no stored permission for this uri and / or type.
    ///    */
    /// ```
    ///

    /// `uint32_t testExactPermission (in nsIURI uri, in string type);`
    #[inline]
    pub unsafe fn TestExactPermission(&self, uri: *const nsIURI, type_: *const libc::c_char, _retval: *mut uint32_t) -> nsresult {
        ((*self.vtable).TestExactPermission)(self, uri, type_, _retval)
    }


    /// ```text
    /// /**
    ///    * See testExactPermission() above.
    ///    * System principals will always have permissions granted.
    ///    * This function will perform a pref lookup to permissions.default.<type>
    ///    * if the specific permission type is part of the whitelist for that functionality.
    ///    */
    /// ```
    ///

    /// `uint32_t testExactPermissionFromPrincipal (in nsIPrincipal principal, in string type);`
    #[inline]
    pub unsafe fn TestExactPermissionFromPrincipal(&self, principal: *const nsIPrincipal, type_: *const libc::c_char, _retval: *mut uint32_t) -> nsresult {
        ((*self.vtable).TestExactPermissionFromPrincipal)(self, principal, type_, _retval)
    }


    /// ```text
    /// /**
    ///    * Test whether a website has permission to perform the given action
    ///    * ignoring active sessions.
    ///    * System principals will always have permissions granted.
    ///    * This function will perform a pref lookup to permissions.default.<type>
    ///    * if the specific permission type is part of the whitelist for that functionality.
    ///    *
    ///    * @param principal the principal
    ///    * @param type      a case-sensitive ASCII string, identifying the consumer
    ///    * @param return    see add(), param permission. returns UNKNOWN_ACTION when
    ///    *                  there is no stored permission for this uri and / or type.
    ///    */
    /// ```
    ///

    /// `uint32_t testExactPermanentPermission (in nsIPrincipal principal, in string type);`
    #[inline]
    pub unsafe fn TestExactPermanentPermission(&self, principal: *const nsIPrincipal, type_: *const libc::c_char, _retval: *mut uint32_t) -> nsresult {
        ((*self.vtable).TestExactPermanentPermission)(self, principal, type_, _retval)
    }


    /// ```text
    /// /**
    ///    * Get the permission object associated with the given URI and action.
    ///    * @param uri The URI
    ///    * @param type      A case-sensitive ASCII string identifying the consumer
    ///    * @param exactHost If true, only the specific host will be matched,
    ///    *                  @see testExactPermission. If false, subdomains will
    ///    *                  also be searched, @see testPermission.
    ///    * @returns The matching permission object, or null if no matching object
    ///    *          was found. No matching object is equivalent to UNKNOWN_ACTION.
    ///    * @note Clients in general should prefer the test* methods unless they
    ///    *       need to know the specific stored details.
    ///    * @note This method will always return null for the system principal.
    ///    */
    /// ```
    ///

    /// `nsIPermission getPermissionObjectForURI (in nsIURI uri, in string type, in boolean exactHost);`
    #[inline]
    pub unsafe fn GetPermissionObjectForURI(&self, uri: *const nsIURI, type_: *const libc::c_char, exactHost: bool, _retval: *mut *const nsIPermission) -> nsresult {
        ((*self.vtable).GetPermissionObjectForURI)(self, uri, type_, exactHost, _retval)
    }


    /// ```text
    /// /**
    ///    * Get the permission object associated with the given principal and action.
    ///    * @param principal The principal
    ///    * @param type      A case-sensitive ASCII string identifying the consumer
    ///    * @param exactHost If true, only the specific host will be matched,
    ///    *                  @see testExactPermission. If false, subdomains will
    ///    *                  also be searched, @see testPermission.
    ///    * @returns The matching permission object, or null if no matching object
    ///    *          was found. No matching object is equivalent to UNKNOWN_ACTION.
    ///    * @note Clients in general should prefer the test* methods unless they
    ///    *       need to know the specific stored details.
    ///    * @note This method will always return null for the system principal.
    ///    */
    /// ```
    ///

    /// `nsIPermission getPermissionObject (in nsIPrincipal principal, in string type, in boolean exactHost);`
    #[inline]
    pub unsafe fn GetPermissionObject(&self, principal: *const nsIPrincipal, type_: *const libc::c_char, exactHost: bool, _retval: *mut *const nsIPermission) -> nsresult {
        ((*self.vtable).GetPermissionObject)(self, principal, type_, exactHost, _retval)
    }


    /// ```text
    /// /**
    ///    * Allows enumeration of all stored permissions
    ///    * @return an nsISimpleEnumerator interface that allows access to
    ///    *         nsIPermission objects
    ///    */
    /// ```
    ///

    /// `readonly attribute nsISimpleEnumerator enumerator;`
    #[inline]
    pub unsafe fn GetEnumerator(&self, aEnumerator: *mut *const nsISimpleEnumerator) -> nsresult {
        ((*self.vtable).GetEnumerator)(self, aEnumerator)
    }


    /// ```text
    /// /**
    ///    * Remove all permissions that will match the origin pattern.
    ///    */
    /// ```
    ///

    /// `void removePermissionsWithAttributes (in DOMString patternAsJSON);`
    #[inline]
    pub unsafe fn RemovePermissionsWithAttributes(&self, patternAsJSON: &::nsstring::nsAString) -> nsresult {
        ((*self.vtable).RemovePermissionsWithAttributes)(self, patternAsJSON)
    }


    /// ```text
    /// /**
    ///    * If the current permission is set to expire, reset the expiration time. If
    ///    * there is no permission or the current permission does not expire, this
    ///    * method will silently return.
    ///    *
    ///    * @param sessionExpiretime  an integer representation of when this permission
    ///    *                           should be forgotten (milliseconds since
        ///    *                           Jan 1 1970 0:00:00), if it is currently
    ///    *                           EXPIRE_SESSION.
    ///    * @param sessionExpiretime  an integer representation of when this permission
    ///    *                           should be forgotten (milliseconds since
        ///    *                           Jan 1 1970 0:00:00), if it is currently
    ///    *                           EXPIRE_TIME.
    ///    */
    /// ```
    ///

    /// `void updateExpireTime (in nsIPrincipal principal, in string type, in boolean exactHost, in uint64_t sessionExpireTime, in uint64_t persistentExpireTime);`
    #[inline]
    pub unsafe fn UpdateExpireTime(&self, principal: *const nsIPrincipal, type_: *const libc::c_char, exactHost: bool, sessionExpireTime: uint64_t, persistentExpireTime: uint64_t) -> nsresult {
        ((*self.vtable).UpdateExpireTime)(self, principal, type_, exactHost, sessionExpireTime, persistentExpireTime)
    }


    /// ```text
    /// /**
    ///    * The content process doesn't have access to every permission. Instead, when
    ///    * LOAD_DOCUMENT_URI channels for http://, https://, and ftp:// URIs are
    ///    * opened, the permissions for those channels are sent down to the content
    ///    * process before the OnStartRequest message. Permissions for principals with
    ///    * other schemes are sent down at process startup.
    ///    *
    ///    * Permissions are keyed and grouped by "Permission Key"s.
    ///    * `nsPermissionManager::GetKeyForPrincipal` provides the mechanism for
    ///    * determining the permission key for a given principal.
    ///    *
    ///    * This method may only be called in the parent process. It fills the nsTArray
    ///    * argument with the IPC::Permission objects which have a matching permission
    ///    * key.
    ///    *
    ///    * @param permissionKey  The key to use to find the permissions of interest.
    ///    * @param perms  An array which will be filled with the permissions which
    ///    *               match the given permission key.
    ///    */
    /// ```
    ///

    /// `void getPermissionsWithKey (in ACString permissionKey, out IPCPermissionArrayRef perms);`
    const _GetPermissionsWithKey: () = ();

    /// ```text
    /// /**
    ///    * See `nsIPermissionManager::GetPermissionsWithKey` for more info on
    ///    * Permission keys.
    ///    *
    ///    * `SetPermissionsWithKey` may only be called in the Child process, and
    ///    * initializes the permission manager with the permissions for a given
    ///    * Permission key. marking permissions with that key as avaliable.
    ///    *
    ///    * @param permissionKey  The key for the permissions which have been sent over.
    ///    * @param perms  An array with the permissions which match the given key.
    ///    */
    /// ```
    ///

    /// `void setPermissionsWithKey (in ACString permissionKey, in IPCPermissionArrayRef perms);`
    const _SetPermissionsWithKey: () = ();

    /// ```text
    /// /**
    ///    * Broadcasts permissions for the given principal to all content processes.
    ///    *
    ///    * DO NOT USE THIS METHOD if you can avoid it. It was added in bug XXX to
    ///    * handle the current temporary implementation of ServiceWorker debugging. It
    ///    * will be removed when service worker debugging is fixed.
    ///    *
    ///    * @param aPrincipal The principal to broadcast permissions for.
    ///    */
    /// ```
    ///

    /// `void broadcastPermissionsForPrincipalToAllContentProcesses (in nsIPrincipal aPrincipal);`
    #[inline]
    pub unsafe fn BroadcastPermissionsForPrincipalToAllContentProcesses(&self, aPrincipal: *const nsIPrincipal) -> nsresult {
        ((*self.vtable).BroadcastPermissionsForPrincipalToAllContentProcesses)(self, aPrincipal)
    }


    /// ```text
    /// /**
    ///    * Add a callback which should be run when all permissions are available for
    ///    * the given nsIPrincipal. This method invokes the callback runnable
    ///    * synchronously when the permissions are already available. Otherwise the
    ///    * callback will be run asynchronously in SystemGroup when all permissions
    ///    * are available in the future.
    ///    *
    ///    * NOTE: This method will not request the permissions be sent by the parent
    ///    * process. This should only be used to wait for permissions which may not
    ///    * have arrived yet in order to ensure they are present.
    ///    *
    ///    * @param aPrincipal The principal to wait for permissions to be available for.
    ///    * @param aRunnable  The runnable to run when permissions are available for the
    ///    *                   given principal.
    ///    */
    /// ```
    ///

    /// `void whenPermissionsAvailable (in nsIPrincipal aPrincipal, in nsIRunnable aRunnable);`
    #[inline]
    pub unsafe fn WhenPermissionsAvailable(&self, aPrincipal: *const nsIPrincipal, aRunnable: *const nsIRunnable) -> nsresult {
        ((*self.vtable).WhenPermissionsAvailable)(self, aPrincipal, aRunnable)
    }


    /// ```text
    /// /**
    ///    * True if any "preload" permissions are present. This is used to avoid making
    ///    * potentially expensive permissions checks in nsContentBlocker.
    ///    */
    /// ```
    ///

    /// `[infallible] readonly attribute boolean hasPreloadPermissions;`
    #[inline]
    pub unsafe fn GetHasPreloadPermissions(&self) -> bool {
        let mut result = <bool as ::std::default::Default>::default();
        let _rv = ((*self.vtable).GetHasPreloadPermissions)(self, &mut result);
        debug_assert!(::nserror::NsresultExt::succeeded(_rv));
        result
    }


}