script/dom/webxr/
xrmediabinding.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;
7
8use crate::dom::bindings::codegen::Bindings::XRMediaBindingBinding::XRMediaBinding_Binding::XRMediaBindingMethods;
9use crate::dom::bindings::codegen::Bindings::XRMediaBindingBinding::XRMediaLayerInit;
10use crate::dom::bindings::error::{Error, Fallible};
11use crate::dom::bindings::reflector::{Reflector, reflect_dom_object_with_proto};
12use crate::dom::bindings::root::{Dom, DomRoot};
13use crate::dom::html::htmlvideoelement::HTMLVideoElement;
14use crate::dom::window::Window;
15use crate::dom::xrcylinderlayer::XRCylinderLayer;
16use crate::dom::xrequirectlayer::XREquirectLayer;
17use crate::dom::xrquadlayer::XRQuadLayer;
18use crate::dom::xrsession::XRSession;
19use crate::script_runtime::CanGc;
20
21#[dom_struct]
22pub(crate) struct XRMediaBinding {
23    reflector: Reflector,
24    session: Dom<XRSession>,
25}
26
27impl XRMediaBinding {
28    pub(crate) fn new_inherited(session: &XRSession) -> XRMediaBinding {
29        XRMediaBinding {
30            reflector: Reflector::new(),
31            session: Dom::from_ref(session),
32        }
33    }
34
35    fn new(
36        global: &Window,
37        proto: Option<HandleObject>,
38        session: &XRSession,
39        can_gc: CanGc,
40    ) -> DomRoot<XRMediaBinding> {
41        reflect_dom_object_with_proto(
42            Box::new(XRMediaBinding::new_inherited(session)),
43            global,
44            proto,
45            can_gc,
46        )
47    }
48}
49
50impl XRMediaBindingMethods<crate::DomTypeHolder> for XRMediaBinding {
51    /// <https://immersive-web.github.io/layers/#dom-xrmediabinding-xrmediabinding>
52    fn Constructor(
53        global: &Window,
54        proto: Option<HandleObject>,
55        can_gc: CanGc,
56        session: &XRSession,
57    ) -> Fallible<DomRoot<XRMediaBinding>> {
58        // Step 1.
59        if session.is_ended() {
60            return Err(Error::InvalidState);
61        }
62
63        // Step 2.
64        if !session.is_immersive() {
65            return Err(Error::InvalidState);
66        }
67
68        // Steps 3-5.
69        Ok(XRMediaBinding::new(global, proto, session, can_gc))
70    }
71
72    /// <https://immersive-web.github.io/layers/#dom-xrmediabinding-createquadlayer>
73    fn CreateQuadLayer(
74        &self,
75        _: &HTMLVideoElement,
76        _: &XRMediaLayerInit,
77    ) -> Fallible<DomRoot<XRQuadLayer>> {
78        // https://github.com/servo/servo/issues/27493
79        Err(Error::NotSupported)
80    }
81
82    /// <https://immersive-web.github.io/layers/#dom-xrmediabinding-createcylinderlayer>
83    fn CreateCylinderLayer(
84        &self,
85        _: &HTMLVideoElement,
86        _: &XRMediaLayerInit,
87    ) -> Fallible<DomRoot<XRCylinderLayer>> {
88        // https://github.com/servo/servo/issues/27493
89        Err(Error::NotSupported)
90    }
91
92    /// <https://immersive-web.github.io/layers/#dom-xrmediabinding-createequirectlayer>
93    fn CreateEquirectLayer(
94        &self,
95        _: &HTMLVideoElement,
96        _: &XRMediaLayerInit,
97    ) -> Fallible<DomRoot<XREquirectLayer>> {
98        // https://github.com/servo/servo/issues/27493
99        Err(Error::NotSupported)
100    }
101}