script/dom/webxr/
xrreferencespaceevent.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use dom_struct::dom_struct;
6use js::rust::HandleObject;
7use stylo_atoms::Atom;
8
9use crate::dom::bindings::codegen::Bindings::EventBinding::Event_Binding::EventMethods;
10use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceEventBinding::{
11    XRReferenceSpaceEventInit, XRReferenceSpaceEventMethods,
12};
13use crate::dom::bindings::error::Fallible;
14use crate::dom::bindings::inheritance::Castable;
15use crate::dom::bindings::reflector::reflect_dom_object_with_proto;
16use crate::dom::bindings::root::{Dom, DomRoot};
17use crate::dom::bindings::str::DOMString;
18use crate::dom::event::Event;
19use crate::dom::window::Window;
20use crate::dom::xrreferencespace::XRReferenceSpace;
21use crate::dom::xrrigidtransform::XRRigidTransform;
22use crate::script_runtime::CanGc;
23
24#[dom_struct]
25pub(crate) struct XRReferenceSpaceEvent {
26    event: Event,
27    space: Dom<XRReferenceSpace>,
28    transform: Option<Dom<XRRigidTransform>>,
29}
30
31impl XRReferenceSpaceEvent {
32    #[cfg_attr(crown, allow(crown::unrooted_must_root))]
33    fn new_inherited(
34        space: &XRReferenceSpace,
35        transform: Option<&XRRigidTransform>,
36    ) -> XRReferenceSpaceEvent {
37        XRReferenceSpaceEvent {
38            event: Event::new_inherited(),
39            space: Dom::from_ref(space),
40            transform: transform.map(Dom::from_ref),
41        }
42    }
43
44    pub(crate) fn new(
45        window: &Window,
46        type_: Atom,
47        bubbles: bool,
48        cancelable: bool,
49        space: &XRReferenceSpace,
50        transform: Option<&XRRigidTransform>,
51        can_gc: CanGc,
52    ) -> DomRoot<XRReferenceSpaceEvent> {
53        Self::new_with_proto(
54            window, None, type_, bubbles, cancelable, space, transform, can_gc,
55        )
56    }
57
58    #[allow(clippy::too_many_arguments)]
59    fn new_with_proto(
60        window: &Window,
61        proto: Option<HandleObject>,
62        type_: Atom,
63        bubbles: bool,
64        cancelable: bool,
65        space: &XRReferenceSpace,
66        transform: Option<&XRRigidTransform>,
67        can_gc: CanGc,
68    ) -> DomRoot<XRReferenceSpaceEvent> {
69        let trackevent = reflect_dom_object_with_proto(
70            Box::new(XRReferenceSpaceEvent::new_inherited(space, transform)),
71            window,
72            proto,
73            can_gc,
74        );
75        {
76            let event = trackevent.upcast::<Event>();
77            event.init_event(type_, bubbles, cancelable);
78        }
79        trackevent
80    }
81}
82
83impl XRReferenceSpaceEventMethods<crate::DomTypeHolder> for XRReferenceSpaceEvent {
84    /// <https://www.w3.org/TR/webxr/#dom-xrreferencespaceevent-xrreferencespaceevent>
85    fn Constructor(
86        window: &Window,
87        proto: Option<HandleObject>,
88        can_gc: CanGc,
89        type_: DOMString,
90        init: &XRReferenceSpaceEventInit,
91    ) -> Fallible<DomRoot<XRReferenceSpaceEvent>> {
92        Ok(XRReferenceSpaceEvent::new_with_proto(
93            window,
94            proto,
95            Atom::from(type_),
96            init.parent.bubbles,
97            init.parent.cancelable,
98            &init.referenceSpace,
99            init.transform.as_deref(),
100            can_gc,
101        ))
102    }
103
104    /// <https://www.w3.org/TR/webxr/#dom-xrreferencespaceeventinit-session>
105    fn ReferenceSpace(&self) -> DomRoot<XRReferenceSpace> {
106        DomRoot::from_ref(&*self.space)
107    }
108
109    /// <https://www.w3.org/TR/webxr/#dom-xrreferencespaceevent-transform>
110    fn GetTransform(&self) -> Option<DomRoot<XRRigidTransform>> {
111        self.transform
112            .as_ref()
113            .map(|transform| DomRoot::from_ref(&**transform))
114    }
115
116    /// <https://dom.spec.whatwg.org/#dom-event-istrusted>
117    fn IsTrusted(&self) -> bool {
118        self.event.IsTrusted()
119    }
120}