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    fn new_inherited(
33        space: &XRReferenceSpace,
34        transform: Option<&XRRigidTransform>,
35    ) -> XRReferenceSpaceEvent {
36        XRReferenceSpaceEvent {
37            event: Event::new_inherited(),
38            space: Dom::from_ref(space),
39            transform: transform.map(Dom::from_ref),
40        }
41    }
42
43    pub(crate) fn new(
44        window: &Window,
45        type_: Atom,
46        bubbles: bool,
47        cancelable: bool,
48        space: &XRReferenceSpace,
49        transform: Option<&XRRigidTransform>,
50        can_gc: CanGc,
51    ) -> DomRoot<XRReferenceSpaceEvent> {
52        Self::new_with_proto(
53            window, None, type_, bubbles, cancelable, space, transform, can_gc,
54        )
55    }
56
57    #[expect(clippy::too_many_arguments)]
58    fn new_with_proto(
59        window: &Window,
60        proto: Option<HandleObject>,
61        type_: Atom,
62        bubbles: bool,
63        cancelable: bool,
64        space: &XRReferenceSpace,
65        transform: Option<&XRRigidTransform>,
66        can_gc: CanGc,
67    ) -> DomRoot<XRReferenceSpaceEvent> {
68        let trackevent = reflect_dom_object_with_proto(
69            Box::new(XRReferenceSpaceEvent::new_inherited(space, transform)),
70            window,
71            proto,
72            can_gc,
73        );
74        {
75            let event = trackevent.upcast::<Event>();
76            event.init_event(type_, bubbles, cancelable);
77        }
78        trackevent
79    }
80}
81
82impl XRReferenceSpaceEventMethods<crate::DomTypeHolder> for XRReferenceSpaceEvent {
83    /// <https://www.w3.org/TR/webxr/#dom-xrreferencespaceevent-xrreferencespaceevent>
84    fn Constructor(
85        window: &Window,
86        proto: Option<HandleObject>,
87        can_gc: CanGc,
88        type_: DOMString,
89        init: &XRReferenceSpaceEventInit,
90    ) -> Fallible<DomRoot<XRReferenceSpaceEvent>> {
91        Ok(XRReferenceSpaceEvent::new_with_proto(
92            window,
93            proto,
94            Atom::from(type_),
95            init.parent.bubbles,
96            init.parent.cancelable,
97            &init.referenceSpace,
98            init.transform.as_deref(),
99            can_gc,
100        ))
101    }
102
103    /// <https://www.w3.org/TR/webxr/#dom-xrreferencespaceeventinit-session>
104    fn ReferenceSpace(&self) -> DomRoot<XRReferenceSpace> {
105        DomRoot::from_ref(&*self.space)
106    }
107
108    /// <https://www.w3.org/TR/webxr/#dom-xrreferencespaceevent-transform>
109    fn GetTransform(&self) -> Option<DomRoot<XRRigidTransform>> {
110        self.transform
111            .as_ref()
112            .map(|transform| DomRoot::from_ref(&**transform))
113    }
114
115    /// <https://dom.spec.whatwg.org/#dom-event-istrusted>
116    fn IsTrusted(&self) -> bool {
117        self.event.IsTrusted()
118    }
119}