Skip to main content

script/dom/media/
mediametadata.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::context::JSContext;
7use js::rust::HandleObject;
8use script_bindings::cell::DomRefCell;
9use script_bindings::reflector::{Reflector, reflect_dom_object_with_proto};
10
11use crate::dom::bindings::codegen::Bindings::MediaMetadataBinding::{
12    MediaMetadataInit, MediaMetadataMethods,
13};
14use crate::dom::bindings::error::Fallible;
15use crate::dom::bindings::root::{DomRoot, MutNullableDom};
16use crate::dom::bindings::str::DOMString;
17use crate::dom::media::mediasession::MediaSession;
18use crate::dom::window::Window;
19use crate::script_runtime::CanGc;
20
21#[dom_struct]
22pub(crate) struct MediaMetadata {
23    reflector_: Reflector,
24    session: MutNullableDom<MediaSession>,
25    title: DomRefCell<DOMString>,
26    artist: DomRefCell<DOMString>,
27    album: DomRefCell<DOMString>,
28}
29
30impl MediaMetadata {
31    fn new_inherited(init: &MediaMetadataInit) -> MediaMetadata {
32        MediaMetadata {
33            reflector_: Reflector::new(),
34            session: Default::default(),
35            title: DomRefCell::new(init.title.clone()),
36            artist: DomRefCell::new(init.artist.clone()),
37            album: DomRefCell::new(init.album.clone()),
38        }
39    }
40
41    pub(crate) fn new(
42        global: &Window,
43        init: &MediaMetadataInit,
44        can_gc: CanGc,
45    ) -> DomRoot<MediaMetadata> {
46        Self::new_with_proto(global, None, init, can_gc)
47    }
48
49    fn new_with_proto(
50        global: &Window,
51        proto: Option<HandleObject>,
52        init: &MediaMetadataInit,
53        can_gc: CanGc,
54    ) -> DomRoot<MediaMetadata> {
55        reflect_dom_object_with_proto(
56            Box::new(MediaMetadata::new_inherited(init)),
57            global,
58            proto,
59            can_gc,
60        )
61    }
62
63    fn queue_update_metadata_algorithm(&self) {
64        if self.session.get().is_none() {}
65    }
66
67    pub(crate) fn set_session(&self, session: &MediaSession) {
68        self.session.set(Some(session));
69    }
70}
71
72impl MediaMetadataMethods<crate::DomTypeHolder> for MediaMetadata {
73    /// <https://w3c.github.io/mediasession/#dom-mediametadata-mediametadata>
74    fn Constructor(
75        cx: &mut JSContext,
76        window: &Window,
77        proto: Option<HandleObject>,
78        init: &MediaMetadataInit,
79    ) -> Fallible<DomRoot<MediaMetadata>> {
80        Ok(MediaMetadata::new_with_proto(
81            window,
82            proto,
83            init,
84            CanGc::from_cx(cx),
85        ))
86    }
87
88    /// <https://w3c.github.io/mediasession/#dom-mediametadata-title>
89    fn Title(&self) -> DOMString {
90        self.title.borrow().clone()
91    }
92
93    /// <https://w3c.github.io/mediasession/#dom-mediametadata-title>
94    fn SetTitle(&self, value: DOMString) {
95        *self.title.borrow_mut() = value;
96        self.queue_update_metadata_algorithm();
97    }
98
99    /// <https://w3c.github.io/mediasession/#dom-mediametadata-artist>
100    fn Artist(&self) -> DOMString {
101        self.artist.borrow().clone()
102    }
103
104    /// <https://w3c.github.io/mediasession/#dom-mediametadata-artist>
105    fn SetArtist(&self, value: DOMString) {
106        *self.artist.borrow_mut() = value;
107        self.queue_update_metadata_algorithm();
108    }
109
110    /// <https://w3c.github.io/mediasession/#dom-mediametadata-album>
111    fn Album(&self) -> DOMString {
112        self.album.borrow().clone()
113    }
114
115    /// <https://w3c.github.io/mediasession/#dom-mediametadata-album>
116    fn SetAlbum(&self, value: DOMString) {
117        *self.album.borrow_mut() = value;
118        self.queue_update_metadata_algorithm();
119    }
120}