stdweb/webapi/events/
dom.rs

1use webcore::value::Reference;
2use webapi::event::{IEvent, IUiEvent, UiEvent, Event};
3
4/// The `ChangeEvent` is fired for input, select, and textarea
5/// elements when a change to the element's value is committed
6/// by the user. Unlike the input event, the change event is not
7/// necessarily fired for each change to an element's value.
8///
9/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/change)
10// https://html.spec.whatwg.org/#event-change
11#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
12#[reference(instance_of = "Event")]
13#[reference(event = "change")]
14#[reference(subclass_of(Event))]
15pub struct ChangeEvent( Reference );
16
17impl IEvent for ChangeEvent {}
18
19/// The `InputEvent` is fired synchronously when the value of an
20/// input, select, or textarea element is changed. For input elements
21/// with type=checkbox or type=radio, the input event should fire when
22/// a user toggles the control (via touch, mouse or keyboard) per the
23/// HTML5 specification, but historically, this has not been the case.
24/// Check compatibility, or attach to the change event instead for
25/// elements of these types.
26///
27/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/input)
28// https://html.spec.whatwg.org/#event-input
29#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
30#[reference(instance_of = "Event")]
31#[reference(event = "input")]
32#[reference(subclass_of(Event))]
33pub struct InputEvent( Reference );
34
35impl IEvent for InputEvent {}
36
37/// The `ResourceLoadEvent` is fired when a resource and its dependent resources have finished loading.
38///
39/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/load)
40// https://w3c.github.io/uievents/#load
41#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
42#[reference(instance_of = "UIEvent")]
43#[reference(event = "load")]
44#[reference(subclass_of(Event, UiEvent))]
45pub struct ResourceLoadEvent( Reference );
46
47impl IEvent for ResourceLoadEvent {}
48impl IUiEvent for ResourceLoadEvent {}
49
50/// The `ResourceAbortEvent` is fired when the loading of a resource has been aborted.
51///
52/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/abort)
53// https://w3c.github.io/uievents/#event-type-abort
54#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
55#[reference(instance_of = "UIEvent")]
56#[reference(event = "abort")]
57#[reference(subclass_of(Event, UiEvent))]
58pub struct ResourceAbortEvent( Reference );
59
60impl IEvent for ResourceAbortEvent {}
61impl IUiEvent for ResourceAbortEvent {}
62
63/// The `ResourceErrorEvent` is fired when an error occurred; the exact circumstances vary,
64/// since this event is used from a variety of APIs.
65///
66/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/error)
67// https://w3c.github.io/uievents/#event-type-error
68#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
69#[reference(instance_of = "UIEvent")]
70#[reference(event = "error")]
71#[reference(subclass_of(Event, UiEvent))]
72pub struct ResourceErrorEvent( Reference );
73
74impl IEvent for ResourceErrorEvent {}
75impl IUiEvent for ResourceErrorEvent {}
76
77/// The resize event is fired when the document view has been resized.
78///
79/// MDN incorrectly documents this as a UIEvent, but in browsers it is actually
80/// just an Event.
81/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/resize)
82// https://drafts.csswg.org/cssom-view/#eventdef-window-resize
83#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
84#[reference(instance_of = "Event")]
85#[reference(event = "resize")]
86#[reference(subclass_of(Event))]
87pub struct ResizeEvent( Reference );
88
89impl IEvent for ResizeEvent {}
90
91/// The scroll event is fired when the document view or an element has been scrolled.
92///
93/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/scroll)
94// https://drafts.csswg.org/cssom-view/#eventdef-document-scroll
95#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
96#[reference(instance_of = "Event")]
97#[reference(event = "scroll")]
98#[reference(subclass_of(Event))]
99pub struct ScrollEvent( Reference );
100
101impl IEvent for ScrollEvent {}
102
103/// The readystatechange event is fired when the readyState attribute of a document has changed.
104///
105/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/readystatechange)
106// https://html.spec.whatwg.org/#event-readystatechange
107#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
108#[reference(instance_of = "Event")]
109#[reference(event = "readystatechange")]
110#[reference(subclass_of(Event))]
111pub struct ReadyStateChangeEvent( Reference );
112
113impl IEvent for ReadyStateChangeEvent {}
114
115/// The submit event is fired when a form is submitted.
116///
117/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/submit)
118// https://html.spec.whatwg.org/#event-submit
119#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
120#[reference(instance_of = "Event")]
121#[reference(event = "submit")]
122#[reference(subclass_of(Event))]
123pub struct SubmitEvent( Reference );
124
125impl IEvent for SubmitEvent {}
126
127/// The selectionchange event of the Selection API is fired when the current text selection on a
128/// document is changed.
129///
130/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/Events/selectionchange)
131// https://w3c.github.io/selection-api/#selectionchange-event
132#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
133#[reference(instance_of = "Event")]
134#[reference(event = "selectionchange")]
135#[reference(subclass_of(Event))]
136pub struct SelectionChangeEvent( Reference );
137
138impl IEvent for SelectionChangeEvent {}
139
140#[cfg(all(test, feature = "web_test"))]
141mod tests {
142    use super::*;
143    use webcore::try_from::TryInto;
144    use webapi::event::ConcreteEvent;
145
146    #[test]
147    fn test_change_event() {
148        let event: ChangeEvent = js!(
149            return new Event( @{ChangeEvent::EVENT_TYPE} );
150        ).try_into().unwrap();
151        assert_eq!( event.event_type(), ChangeEvent::EVENT_TYPE );
152    }
153
154    #[test]
155    fn test_input_event() {
156        let event: InputEvent = js!(
157            return new Event( @{InputEvent::EVENT_TYPE} );
158        ).try_into().unwrap();
159        assert_eq!( event.event_type(), InputEvent::EVENT_TYPE );
160    }
161
162    #[test]
163    fn test_resource_load_event() {
164        let event: ResourceLoadEvent = js!(
165            return new UIEvent( @{ResourceLoadEvent::EVENT_TYPE} );
166        ).try_into().unwrap();
167        assert_eq!( event.event_type(), ResourceLoadEvent::EVENT_TYPE );
168    }
169
170    #[test]
171    fn test_resource_abort_event() {
172        let event: ResourceAbortEvent = js!(
173            return new UIEvent( @{ResourceAbortEvent::EVENT_TYPE} );
174        ).try_into().unwrap();
175        assert_eq!( event.event_type(), ResourceAbortEvent::EVENT_TYPE );
176    }
177
178    #[test]
179    fn test_scroll_event() {
180        let event: ScrollEvent = js!(
181            return new Event( @{ScrollEvent::EVENT_TYPE} );
182        ).try_into().unwrap();
183        assert_eq!( event.event_type(), ScrollEvent::EVENT_TYPE );
184    }
185
186    #[test]
187    fn test_ready_state_change_event() {
188        let event: ReadyStateChangeEvent = js!(
189            return new Event( @{ReadyStateChangeEvent::EVENT_TYPE} );
190        ).try_into().unwrap();
191        assert_eq!( event.event_type(), ReadyStateChangeEvent::EVENT_TYPE);
192    }
193
194    #[test]
195    fn test_submit_event() {
196        let event: SubmitEvent = js!(
197            return new Event( @{SubmitEvent::EVENT_TYPE} );
198        ).try_into().unwrap();
199        assert_eq!( event.event_type(), SubmitEvent::EVENT_TYPE);
200    }
201
202    #[test]
203    fn test_selectionchange_event() {
204        let event: SelectionChangeEvent = js!(
205            return new Event( @{SelectionChangeEvent::EVENT_TYPE} );
206        ).try_into().unwrap();
207        assert_eq!( event.event_type(), SelectionChangeEvent::EVENT_TYPE);
208    }
209}