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


/// `interface nsIEventTarget : 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 nsIEventTarget {
    vtable: *const nsIEventTargetVTable,

    /// 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 nsIEventTarget.
unsafe impl XpCom for nsIEventTarget {
    const IID: nsIID = nsID(0xa03b8b63, 0xaf8b, 0x4164,
        [0xb0, 0xe5, 0xc4, 0x1e, 0x8b, 0x2b, 0x7c, 0xfa]);
}

// 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 nsIEventTarget {
    #[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 nsIEventTarget.
// 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 nsIEventTargetCoerce {
    /// Cheaply cast a value of this type from a `nsIEventTarget`.
    fn coerce_from(v: &nsIEventTarget) -> &Self;
}

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

impl nsIEventTarget {
    /// Cast this `nsIEventTarget` to one of its base interfaces.
    #[inline]
    pub fn coerce<T: nsIEventTargetCoerce>(&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 nsIEventTarget {
    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> nsIEventTargetCoerce for T {
    #[inline]
    fn coerce_from(v: &nsIEventTarget) -> &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 nsIEventTarget
// 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 nsIEventTargetVTable {
    /// We need to include the members from the base interface's vtable at the start
    /// of the VTable definition.
    pub __base: nsISupportsVTable,

    /* [noscript,notxpcom] boolean isOnCurrentThreadInfallible (); */
    pub IsOnCurrentThreadInfallible: unsafe extern "system" fn (this: *const nsIEventTarget) -> bool,

    /* boolean isOnCurrentThread (); */
    pub IsOnCurrentThread: unsafe extern "system" fn (this: *const nsIEventTarget, _retval: *mut bool) -> nsresult,

    /* [binaryname(Dispatch),noscript] void dispatchFromC (in alreadyAddRefed_nsIRunnable event, [default (DISPATCH_NORMAL)] in unsigned long flags); */
    /// Unable to generate binding because `native type already_AddRefed<nsIRunnable> is unsupported`
    pub Dispatch: *const ::libc::c_void,

    /* [binaryname(DispatchFromScript)] void dispatch (in nsIRunnable event, in unsigned long flags); */
    pub DispatchFromScript: unsafe extern "system" fn (this: *const nsIEventTarget, event: *const nsIRunnable, flags: libc::uint32_t) -> nsresult,

    /* [noscript] void delayedDispatch (in alreadyAddRefed_nsIRunnable event, in unsigned long delay); */
    /// Unable to generate binding because `native type already_AddRefed<nsIRunnable> is unsupported`
    pub DelayedDispatch: *const ::libc::c_void,
}


// The implementations of the function wrappers which are exposed to rust code.
// Call these methods rather than manually calling through the VTable struct.
impl nsIEventTarget {
    /// ```text
    /// /**
    ///    * This flag specifies the default mode of event dispatch, whereby the event
    ///    * is simply queued for later processing.  When this flag is specified,
    ///    * dispatch returns immediately after the event is queued.
    ///    */
    /// ```
    ///

    pub const DISPATCH_NORMAL: i64 = 0;

    /// ```text
    /// /**
    ///    * This flag specifies the synchronous mode of event dispatch, in which the
    ///    * dispatch method does not return until the event has been processed.
    ///    *
    ///    * NOTE: passing this flag to dispatch may have the side-effect of causing
    ///    * other events on the current thread to be processed while waiting for the
    ///    * given event to be processed.
    ///    */
    /// ```
    ///

    pub const DISPATCH_SYNC: i64 = 1;

    /// ```text
    /// /**
    ///    * This flag specifies that the dispatch is occurring from a running event
    ///    * that was dispatched to the same event target, and that event is about to
    ///    * finish.
    ///    *
    ///    * A thread pool can use this as an optimization hint to not spin up
    ///    * another thread, since the current thread is about to become idle.
    ///    *
    ///    * These events are always async.
    ///    */
    /// ```
    ///

    pub const DISPATCH_AT_END: i64 = 2;

    /// ```text
    /// /**
    ///    * IsOnCurrentThread() should return true if events dispatched to this target
    ///    * can possibly run on the current thread, and false otherwise. In the case
    ///    * of an nsIEventTarget for a thread pool, it should return true on all
    ///    * threads in the pool. In the case of a non-thread nsIEventTarget such as
    ///    * ThrottledEventQueue, it should return true on the thread where events are
    ///    * expected to be processed, even if no events from the queue are actually
    ///    * being processed right now.
    ///    *
    ///    * When called on an nsISerialEventTarget, IsOnCurrentThread can be used to
    ///    * ensure that no other thread has "ownership" of the event target. As such,
    ///    * it's useful for asserting that an object is only used on a particular
    ///    * thread. IsOnCurrentThread can't guarantee that the current event has been
    ///    * dispatched through a particular event target.
    ///    *
    ///    * The infallible version of IsOnCurrentThread() is optimized to avoid a
    ///    * virtual call for non-thread event targets. Thread targets should set
    ///    * mVirtualThread to their virtual PRThread. Non-thread targets should leave
    ///    * mVirtualThread null and implement IsOnCurrentThreadInfallible() to
    ///    * return the correct answer.
    ///    *
    ///    * The fallible version of IsOnCurrentThread may return errors, such as during
    ///    * shutdown. If it does not return an error, it should return the same result
    ///    * as the infallible version. The infallible method should return the correct
    ///    * result regardless of whether the fallible method returns an error.
    ///    */
    /// ```
    ///

    /// `[noscript,notxpcom] boolean isOnCurrentThreadInfallible ();`
    #[inline]
    pub unsafe fn IsOnCurrentThreadInfallible(&self, ) -> bool {
        ((*self.vtable).IsOnCurrentThreadInfallible)(self, )
    }



    /// `boolean isOnCurrentThread ();`
    #[inline]
    pub unsafe fn IsOnCurrentThread(&self, _retval: *mut bool) -> nsresult {
        ((*self.vtable).IsOnCurrentThread)(self, _retval)
    }


    /// ```text
    /// /**
    ///    * Dispatch an event to this event target.  This function may be called from
    ///    * any thread, and it may be called re-entrantly.
    ///    *
    ///    * @param event
    ///    *   The alreadyAddRefed<> event to dispatch.
    ///    *   NOTE that the event will be leaked if it fails to dispatch.
    ///    * @param flags
    ///    *   The flags modifying event dispatch.  The flags are described in detail
    ///    *   below.
    ///    *
    ///    * @throws NS_ERROR_INVALID_ARG
    ///    *   Indicates that event is null.
    ///    * @throws NS_ERROR_UNEXPECTED
    ///    *   Indicates that the thread is shutting down and has finished processing
    ///    * events, so this event would never run and has not been dispatched.
    ///    */
    /// ```
    ///

    /// `[binaryname(Dispatch),noscript] void dispatchFromC (in alreadyAddRefed_nsIRunnable event, [default (DISPATCH_NORMAL)] in unsigned long flags);`
    const _Dispatch: () = ();

    /// ```text
    /// /**
    ///    * Version of Dispatch to expose to JS, which doesn't require an alreadyAddRefed<>
    ///    * (it will be converted to that internally)
    ///    *
    ///    * @param event
    ///    *   The (raw) event to dispatch.
    ///    * @param flags
    ///    *   The flags modifying event dispatch.  The flags are described in detail
    ///    *   below.
    ///    *
    ///    * @throws NS_ERROR_INVALID_ARG
    ///    *   Indicates that event is null.
    ///    * @throws NS_ERROR_UNEXPECTED
    ///    *   Indicates that the thread is shutting down and has finished processing
    ///    * events, so this event would never run and has not been dispatched.
    ///    */
    /// ```
    ///

    /// `[binaryname(DispatchFromScript)] void dispatch (in nsIRunnable event, in unsigned long flags);`
    #[inline]
    pub unsafe fn DispatchFromScript(&self, event: *const nsIRunnable, flags: libc::uint32_t) -> nsresult {
        ((*self.vtable).DispatchFromScript)(self, event, flags)
    }


    /// ```text
    /// /**
    ///    * Dispatch an event to this event target, but do not run it before delay
    ///    * milliseconds have passed.  This function may be called from any thread.
    ///    *
    ///    * @param event
    ///    *   The alreadyAddrefed<> event to dispatch.
    ///    * @param delay
    ///    *   The delay (in ms) before running the event.  If event does not rise to
    ///    *   the top of the event queue before the delay has passed, it will be set
    ///    *   aside to execute once the delay has passed.  Otherwise, it will be
    ///    *   executed immediately.
    ///    *
    ///    * @throws NS_ERROR_INVALID_ARG
    ///    *   Indicates that event is null.
    ///    * @throws NS_ERROR_UNEXPECTED
    ///    *   Indicates that the thread is shutting down and has finished processing
    ///    * events, so this event would never run and has not been dispatched, or
    ///    * that delay is zero.
    ///    */
    /// ```
    ///

    /// `[noscript] void delayedDispatch (in alreadyAddRefed_nsIRunnable event, in unsigned long delay);`
    const _DelayedDispatch: () = ();

}