1use crate::{
2 error::AtspiError,
3 events::{BusProperties, EventBodyOwned, HasMatchRule, HasRegistryEventString, ObjectRef},
4 Event, EventProperties, EventTypeProperties,
5};
6use zbus_names::UniqueName;
7use zvariant::{ObjectPath, OwnedValue};
8
9#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq, Hash)]
10pub enum DocumentEvents {
11 /// See: [`LoadCompleteEvent`].
12 LoadComplete(LoadCompleteEvent),
13 /// See: [`ReloadEvent`].
14 Reload(ReloadEvent),
15 /// See: [`LoadStoppedEvent`].
16 LoadStopped(LoadStoppedEvent),
17 /// See: [`ContentChangedEvent`].
18 ContentChanged(ContentChangedEvent),
19 /// See: [`AttributesChangedEvent`].
20 AttributesChanged(AttributesChangedEvent),
21 /// See: [`PageChangedEvent`].
22 PageChanged(PageChangedEvent),
23}
24
25impl EventTypeProperties for DocumentEvents {
26 fn member(&self) -> &'static str {
27 match self {
28 Self::LoadComplete(inner) => inner.member(),
29 Self::Reload(inner) => inner.member(),
30 Self::LoadStopped(inner) => inner.member(),
31 Self::ContentChanged(inner) => inner.member(),
32 Self::AttributesChanged(inner) => inner.member(),
33 Self::PageChanged(inner) => inner.member(),
34 }
35 }
36 fn interface(&self) -> &'static str {
37 match self {
38 Self::LoadComplete(inner) => inner.interface(),
39 Self::Reload(inner) => inner.interface(),
40 Self::LoadStopped(inner) => inner.interface(),
41 Self::ContentChanged(inner) => inner.interface(),
42 Self::AttributesChanged(inner) => inner.interface(),
43 Self::PageChanged(inner) => inner.interface(),
44 }
45 }
46 fn match_rule(&self) -> &'static str {
47 match self {
48 Self::LoadComplete(inner) => inner.match_rule(),
49 Self::Reload(inner) => inner.match_rule(),
50 Self::LoadStopped(inner) => inner.match_rule(),
51 Self::ContentChanged(inner) => inner.match_rule(),
52 Self::AttributesChanged(inner) => inner.match_rule(),
53 Self::PageChanged(inner) => inner.match_rule(),
54 }
55 }
56 fn registry_string(&self) -> &'static str {
57 match self {
58 Self::LoadComplete(inner) => inner.registry_string(),
59 Self::Reload(inner) => inner.registry_string(),
60 Self::LoadStopped(inner) => inner.registry_string(),
61 Self::ContentChanged(inner) => inner.registry_string(),
62 Self::AttributesChanged(inner) => inner.registry_string(),
63 Self::PageChanged(inner) => inner.registry_string(),
64 }
65 }
66}
67
68impl EventProperties for DocumentEvents {
69 fn path(&self) -> ObjectPath<'_> {
70 match self {
71 Self::LoadComplete(inner: &LoadCompleteEvent) => inner.path(),
72 Self::Reload(inner: &ReloadEvent) => inner.path(),
73 Self::LoadStopped(inner: &LoadStoppedEvent) => inner.path(),
74 Self::ContentChanged(inner: &ContentChangedEvent) => inner.path(),
75 Self::AttributesChanged(inner: &AttributesChangedEvent) => inner.path(),
76 Self::PageChanged(inner: &PageChangedEvent) => inner.path(),
77 }
78 }
79 fn sender(&self) -> UniqueName<'_> {
80 match self {
81 Self::LoadComplete(inner: &LoadCompleteEvent) => inner.sender(),
82 Self::Reload(inner: &ReloadEvent) => inner.sender(),
83 Self::LoadStopped(inner: &LoadStoppedEvent) => inner.sender(),
84 Self::ContentChanged(inner: &ContentChangedEvent) => inner.sender(),
85 Self::AttributesChanged(inner: &AttributesChangedEvent) => inner.sender(),
86 Self::PageChanged(inner: &PageChangedEvent) => inner.sender(),
87 }
88 }
89}
90
91impl_from_interface_event_enum_for_event!(DocumentEvents, Event::Document);
92impl_try_from_event_for_user_facing_event_type!(DocumentEvents, Event::Document);
93event_wrapper_test_cases!(DocumentEvents, LoadCompleteEvent);
94
95impl HasMatchRule for DocumentEvents {
96 const MATCH_RULE_STRING: &'static str =
97 "type='signal',interface='org.a11y.atspi.Event.Document'";
98}
99
100/// An event triggered by the completion of a document load action.
101/// For example: a web page has finished loading its initial payload, or
102/// `LibreOffice` has loaded a document from disk.
103#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
104pub struct LoadCompleteEvent {
105 /// The [`ObjectRef`] which the event applies to.
106 pub item: crate::events::ObjectRef,
107}
108
109/// An event triggered by a reloading of a document.
110/// For example: pressing F5, or `Control + r` will reload a page in a web browser.
111#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
112pub struct ReloadEvent {
113 /// The [`ObjectRef`] which the event applies to.
114 pub item: crate::events::ObjectRef,
115}
116
117/// An event triggered by the cancelling of a document load.
118/// For example: during the loading of a large web page, a user may press `Escape` to stop loading the page.
119#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
120pub struct LoadStoppedEvent {
121 /// The [`ObjectRef`] which the event applies to.
122 pub item: crate::events::ObjectRef,
123}
124
125#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
126pub struct ContentChangedEvent {
127 /// The [`ObjectRef`] which the event applies to.
128 pub item: crate::events::ObjectRef,
129}
130
131#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
132pub struct AttributesChangedEvent {
133 /// The [`ObjectRef`] which the event applies to.
134 pub item: crate::events::ObjectRef,
135}
136
137#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
138pub struct PageChangedEvent {
139 /// The [`ObjectRef`] which the event applies to.
140 pub item: crate::events::ObjectRef,
141}
142
143impl BusProperties for LoadCompleteEvent {
144 const DBUS_MEMBER: &'static str = "LoadComplete";
145 const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Document";
146 const MATCH_RULE_STRING: &'static str =
147 "type='signal',interface='org.a11y.atspi.Event.Document',member='LoadComplete'";
148 const REGISTRY_EVENT_STRING: &'static str = "Document:";
149
150 type Body = EventBodyOwned;
151
152 fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> {
153 Ok(Self { item })
154 }
155 fn body(&self) -> Self::Body {
156 let copy: LoadCompleteEvent = self.clone();
157 copy.into()
158 }
159}
160
161impl BusProperties for ReloadEvent {
162 const DBUS_MEMBER: &'static str = "Reload";
163 const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Document";
164 const MATCH_RULE_STRING: &'static str =
165 "type='signal',interface='org.a11y.atspi.Event.Document',member='Reload'";
166 const REGISTRY_EVENT_STRING: &'static str = "Document:";
167
168 type Body = EventBodyOwned;
169
170 fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> {
171 Ok(Self { item })
172 }
173 fn body(&self) -> Self::Body {
174 let copy: ReloadEvent = self.clone();
175 copy.into()
176 }
177}
178
179impl BusProperties for LoadStoppedEvent {
180 const DBUS_MEMBER: &'static str = "LoadStopped";
181 const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Document";
182 const MATCH_RULE_STRING: &'static str =
183 "type='signal',interface='org.a11y.atspi.Event.Document',member='LoadStopped'";
184 const REGISTRY_EVENT_STRING: &'static str = "Document:";
185
186 type Body = EventBodyOwned;
187
188 fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> {
189 Ok(Self { item })
190 }
191 fn body(&self) -> Self::Body {
192 let copy: LoadStoppedEvent = self.clone();
193 copy.into()
194 }
195}
196
197impl BusProperties for ContentChangedEvent {
198 const DBUS_MEMBER: &'static str = "ContentChanged";
199 const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Document";
200 const MATCH_RULE_STRING: &'static str =
201 "type='signal',interface='org.a11y.atspi.Event.Document',member='ContentChanged'";
202 const REGISTRY_EVENT_STRING: &'static str = "Document:";
203
204 type Body = EventBodyOwned;
205
206 fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> {
207 Ok(Self { item })
208 }
209 fn body(&self) -> Self::Body {
210 let copy: ContentChangedEvent = self.clone();
211 copy.into()
212 }
213}
214
215impl BusProperties for AttributesChangedEvent {
216 const DBUS_MEMBER: &'static str = "AttributesChanged";
217 const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Document";
218 const MATCH_RULE_STRING: &'static str =
219 "type='signal',interface='org.a11y.atspi.Event.Document',member='AttributesChanged'";
220 const REGISTRY_EVENT_STRING: &'static str = "Document:";
221
222 type Body = EventBodyOwned;
223
224 fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> {
225 Ok(Self { item })
226 }
227 fn body(&self) -> Self::Body {
228 let copy: AttributesChangedEvent = self.clone();
229 copy.into()
230 }
231}
232
233impl BusProperties for PageChangedEvent {
234 const DBUS_MEMBER: &'static str = "PageChanged";
235 const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Document";
236 const MATCH_RULE_STRING: &'static str =
237 "type='signal',interface='org.a11y.atspi.Event.Document',member='PageChanged'";
238 const REGISTRY_EVENT_STRING: &'static str = "Document:";
239
240 type Body = EventBodyOwned;
241
242 fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> {
243 Ok(Self { item })
244 }
245 fn body(&self) -> Self::Body {
246 let copy: PageChangedEvent = self.clone();
247 copy.into()
248 }
249}
250
251#[cfg(feature = "zbus")]
252impl TryFrom<&zbus::Message> for DocumentEvents {
253 type Error = AtspiError;
254 fn try_from(ev: &zbus::Message) -> Result<Self, Self::Error> {
255 let header: Header<'_> = ev.header();
256 let member: &MemberName<'_> = header
257 .member()
258 .ok_or(err:AtspiError::MemberMatch("Event without member".into()))?;
259 match member.as_str() {
260 "LoadComplete" => Ok(DocumentEvents::LoadComplete(ev.try_into()?)),
261 "Reload" => Ok(DocumentEvents::Reload(ev.try_into()?)),
262 "LoadStopped" => Ok(DocumentEvents::LoadStopped(ev.try_into()?)),
263 "ContentChanged" => Ok(DocumentEvents::ContentChanged(ev.try_into()?)),
264 "AttributesChanged" => Ok(DocumentEvents::AttributesChanged(ev.try_into()?)),
265 "PageChanged" => Ok(DocumentEvents::PageChanged(ev.try_into()?)),
266 _ => Err(AtspiError::MemberMatch("No matching member for Document".into())),
267 }
268 }
269}
270
271impl_from_user_facing_event_for_interface_event_enum!(
272 LoadCompleteEvent,
273 DocumentEvents,
274 DocumentEvents::LoadComplete
275);
276impl_from_user_facing_type_for_event_enum!(LoadCompleteEvent, Event::Document);
277impl_try_from_event_for_user_facing_type!(
278 LoadCompleteEvent,
279 DocumentEvents::LoadComplete,
280 Event::Document
281);
282
283event_test_cases!(LoadCompleteEvent);
284impl_to_dbus_message!(LoadCompleteEvent);
285impl_from_dbus_message!(LoadCompleteEvent);
286impl_event_properties!(LoadCompleteEvent);
287impl From<LoadCompleteEvent> for EventBodyOwned {
288 fn from(_event: LoadCompleteEvent) -> Self {
289 EventBodyOwned {
290 properties: std::collections::HashMap::new(),
291 kind: String::default(),
292 detail1: i32::default(),
293 detail2: i32::default(),
294 any_data: OwnedValue::from(0u8),
295 }
296 }
297}
298
299impl_from_user_facing_event_for_interface_event_enum!(
300 ReloadEvent,
301 DocumentEvents,
302 DocumentEvents::Reload
303);
304impl_from_user_facing_type_for_event_enum!(ReloadEvent, Event::Document);
305impl_try_from_event_for_user_facing_type!(ReloadEvent, DocumentEvents::Reload, Event::Document);
306
307event_test_cases!(ReloadEvent);
308impl_to_dbus_message!(ReloadEvent);
309impl_from_dbus_message!(ReloadEvent);
310impl_event_properties!(ReloadEvent);
311impl From<ReloadEvent> for EventBodyOwned {
312 fn from(_event: ReloadEvent) -> Self {
313 EventBodyOwned {
314 properties: std::collections::HashMap::new(),
315 kind: String::default(),
316 detail1: i32::default(),
317 detail2: i32::default(),
318 any_data: OwnedValue::from(0u8),
319 }
320 }
321}
322
323impl_from_user_facing_event_for_interface_event_enum!(
324 LoadStoppedEvent,
325 DocumentEvents,
326 DocumentEvents::LoadStopped
327);
328impl_from_user_facing_type_for_event_enum!(LoadStoppedEvent, Event::Document);
329impl_try_from_event_for_user_facing_type!(
330 LoadStoppedEvent,
331 DocumentEvents::LoadStopped,
332 Event::Document
333);
334
335event_test_cases!(LoadStoppedEvent);
336impl_to_dbus_message!(LoadStoppedEvent);
337impl_from_dbus_message!(LoadStoppedEvent);
338impl_event_properties!(LoadStoppedEvent);
339impl From<LoadStoppedEvent> for EventBodyOwned {
340 fn from(_event: LoadStoppedEvent) -> Self {
341 EventBodyOwned {
342 properties: std::collections::HashMap::new(),
343 kind: String::default(),
344 detail1: i32::default(),
345 detail2: i32::default(),
346 any_data: OwnedValue::from(0u8),
347 }
348 }
349}
350
351impl_from_user_facing_event_for_interface_event_enum!(
352 ContentChangedEvent,
353 DocumentEvents,
354 DocumentEvents::ContentChanged
355);
356impl_from_user_facing_type_for_event_enum!(ContentChangedEvent, Event::Document);
357impl_try_from_event_for_user_facing_type!(
358 ContentChangedEvent,
359 DocumentEvents::ContentChanged,
360 Event::Document
361);
362
363event_test_cases!(ContentChangedEvent);
364impl_to_dbus_message!(ContentChangedEvent);
365impl_from_dbus_message!(ContentChangedEvent);
366impl_event_properties!(ContentChangedEvent);
367impl From<ContentChangedEvent> for EventBodyOwned {
368 fn from(_event: ContentChangedEvent) -> Self {
369 EventBodyOwned {
370 properties: std::collections::HashMap::new(),
371 kind: String::default(),
372 detail1: i32::default(),
373 detail2: i32::default(),
374 any_data: OwnedValue::from(0u8),
375 }
376 }
377}
378
379impl_from_user_facing_event_for_interface_event_enum!(
380 AttributesChangedEvent,
381 DocumentEvents,
382 DocumentEvents::AttributesChanged
383);
384impl_from_user_facing_type_for_event_enum!(AttributesChangedEvent, Event::Document);
385impl_try_from_event_for_user_facing_type!(
386 AttributesChangedEvent,
387 DocumentEvents::AttributesChanged,
388 Event::Document
389);
390
391event_test_cases!(AttributesChangedEvent);
392impl_to_dbus_message!(AttributesChangedEvent);
393impl_from_dbus_message!(AttributesChangedEvent);
394impl_event_properties!(AttributesChangedEvent);
395impl From<AttributesChangedEvent> for EventBodyOwned {
396 fn from(_event: AttributesChangedEvent) -> Self {
397 EventBodyOwned {
398 properties: std::collections::HashMap::new(),
399 kind: String::default(),
400 detail1: i32::default(),
401 detail2: i32::default(),
402 any_data: OwnedValue::from(0u8),
403 }
404 }
405}
406
407impl_from_user_facing_event_for_interface_event_enum!(
408 PageChangedEvent,
409 DocumentEvents,
410 DocumentEvents::PageChanged
411);
412impl_from_user_facing_type_for_event_enum!(PageChangedEvent, Event::Document);
413impl_try_from_event_for_user_facing_type!(
414 PageChangedEvent,
415 DocumentEvents::PageChanged,
416 Event::Document
417);
418
419event_test_cases!(PageChangedEvent);
420impl_to_dbus_message!(PageChangedEvent);
421impl_from_dbus_message!(PageChangedEvent);
422impl_event_properties!(PageChangedEvent);
423impl From<PageChangedEvent> for EventBodyOwned {
424 fn from(_event: PageChangedEvent) -> Self {
425 EventBodyOwned {
426 properties: std::collections::HashMap::new(),
427 kind: String::default(),
428 detail1: i32::default(),
429 detail2: i32::default(),
430 any_data: OwnedValue::from(0u8),
431 }
432 }
433}
434
435impl HasRegistryEventString for DocumentEvents {
436 const REGISTRY_EVENT_STRING: &'static str = "Document:";
437}
438