stdweb/webapi/events/
progress.rs

1use webcore::value::Reference;
2use webcore::try_from::TryInto;
3use webapi::event::{IEvent, Event};
4
5/// The `IProgressEvent` interface represents progress-related
6/// events.
7///
8/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/ProgressEvent)
9// https://xhr.spec.whatwg.org/#progressevent
10pub trait IProgressEvent: IEvent {
11    /// Indicates whether the progress is measureable.
12    ///
13    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/ProgressEvent/lengthComputable)
14    // https://xhr.spec.whatwg.org/#ref-for-dom-progressevent-lengthcomputable
15    #[inline]
16    fn length_computable( &self ) -> bool {
17        js!(
18            return @{self.as_ref()}.lengthComputable;
19        ).try_into().unwrap()
20    }
21
22    /// Returns the amount of work already performed by the underlying process.
23    ///
24    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/ProgressEvent/loaded)
25    // https://xhr.spec.whatwg.org/#ref-for-dom-progressevent-loaded
26    #[inline]
27    fn loaded( &self ) -> u64 {
28        js!(
29            return @{self.as_ref()}.loaded;
30        ).try_into().unwrap()
31    }
32
33    /// Returns the total amount of work that the underlying process will perform.
34    ///
35    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/ProgressEvent/total)
36    // https://xhr.spec.whatwg.org/#ref-for-dom-progressevent-total
37    #[inline]
38    fn total( &self ) -> u64 {
39        js!(
40            return @{self.as_ref()}.total;
41        ).try_into().unwrap()
42    }
43}
44
45/// A reference to a JavaScript object which implements the [IProgressEvent](trait.IProgressEvent.html)
46/// interface.
47///
48/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/ProgressEvent)
49// https://xhr.spec.whatwg.org/#progressevent
50#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
51#[reference(instance_of = "ProgressEvent")]
52#[reference(subclass_of(Event))]
53pub struct ProgressRelatedEvent( Reference );
54
55impl IEvent for ProgressRelatedEvent {}
56impl IProgressEvent for ProgressRelatedEvent {}
57
58/// The `ProgressEvent` is fired to indicate that an operation is in progress.
59///
60/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/progress)
61// https://xhr.spec.whatwg.org/#event-xhr-progress
62#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
63#[reference(instance_of = "ProgressEvent")]
64#[reference(event = "progress")]
65#[reference(subclass_of(Event, ProgressRelatedEvent))]
66pub struct ProgressEvent( Reference );
67
68impl IEvent for ProgressEvent {}
69impl IProgressEvent for ProgressEvent {}
70
71/// The `ProgressLoadEvent` is fired when progress has successful finished.
72///
73/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/load_(ProgressEvent))
74// https://xhr.spec.whatwg.org/#event-xhr-load
75#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
76#[reference(instance_of = "ProgressEvent")]
77#[reference(event = "load")]
78#[reference(subclass_of(Event, ProgressRelatedEvent))]
79pub struct ProgressLoadEvent( Reference );
80
81impl IEvent for ProgressLoadEvent {}
82impl IProgressEvent for ProgressLoadEvent {}
83
84/// The `LoadStartEvent` is fired when progress has begun.
85///
86/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/loadstart)
87// https://xhr.spec.whatwg.org/#event-xhr-loadstart
88#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
89#[reference(instance_of = "ProgressEvent")]
90#[reference(event = "loadstart")]
91#[reference(subclass_of(Event, ProgressRelatedEvent))]
92pub struct LoadStartEvent( Reference );
93
94impl IEvent for LoadStartEvent {}
95impl IProgressEvent for LoadStartEvent {}
96
97/// The `LoadEndEvent` is fired when progress has stopped,
98/// e.g. after `ProgressErrorEvent`, `ProgressAbortEvent`
99/// or `ProgressLoadEvent` have been dispatched.
100///
101/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/loadend)
102// https://xhr.spec.whatwg.org/#event-xhr-loadend
103#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
104#[reference(instance_of = "ProgressEvent")]
105#[reference(event = "loadend")]
106#[reference(subclass_of(Event, ProgressRelatedEvent))]
107pub struct LoadEndEvent( Reference );
108
109impl IEvent for LoadEndEvent {}
110impl IProgressEvent for LoadEndEvent {}
111
112/// The `ProgressAbortEvent` is fired when the progress has been aborted.
113///
114/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/abort_(ProgressEvent))
115// https://xhr.spec.whatwg.org/#event-xhr-abort
116#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
117#[reference(instance_of = "ProgressEvent")]
118#[reference(event = "abort")]
119#[reference(subclass_of(Event, ProgressRelatedEvent))]
120pub struct ProgressAbortEvent( Reference );
121
122impl IEvent for ProgressAbortEvent {}
123impl IProgressEvent for ProgressAbortEvent {}
124
125/// The `ProgressErrorEvent` is fired when the progress has failed.
126///
127/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/error_(ProgressEvent))
128// https://xhr.spec.whatwg.org/#event-xhr-error
129#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
130#[reference(instance_of = "ProgressEvent")]
131#[reference(event = "error")]
132#[reference(subclass_of(Event, ProgressRelatedEvent))]
133pub struct ProgressErrorEvent( Reference );
134
135impl IEvent for ProgressErrorEvent {}
136impl IProgressEvent for ProgressErrorEvent {}
137
138#[cfg(all(test, feature = "web_test"))]
139mod tests {
140    use super::*;
141    use webapi::event::ConcreteEvent;
142
143    #[test]
144    fn test_progress_event() {
145        let event: ProgressEvent = js!(
146            return new ProgressEvent(
147                @{ProgressEvent::EVENT_TYPE},
148                {
149                    lengthComputable: true,
150                    loaded: 10,
151                    total: 100,
152                }
153            );
154        ).try_into().unwrap();
155        assert_eq!( event.event_type(), ProgressEvent::EVENT_TYPE );
156        assert!( event.length_computable() );
157        assert_eq!( event.loaded(), 10 );
158        assert_eq!( event.total(), 100 );
159    }
160
161    #[test]
162    fn test_load_start_event() {
163        let event: LoadStartEvent = js!(
164            return new ProgressEvent( @{LoadStartEvent::EVENT_TYPE} );
165        ).try_into().unwrap();
166        assert_eq!( event.event_type(), LoadStartEvent::EVENT_TYPE );
167    }
168
169    #[test]
170    fn test_load_end_event() {
171        let event: LoadEndEvent = js!(
172            return new ProgressEvent( @{LoadEndEvent::EVENT_TYPE} );
173        ).try_into().unwrap();
174        assert_eq!( event.event_type(), LoadEndEvent::EVENT_TYPE );
175    }
176}