script/dom/
screen.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 base::generic_channel;
6use dom_struct::dom_struct;
7use embedder_traits::{EmbedderMsg, ScreenMetrics};
8
9use crate::dom::bindings::codegen::Bindings::ScreenBinding::ScreenMethods;
10use crate::dom::bindings::num::Finite;
11use crate::dom::bindings::reflector::{Reflector, reflect_dom_object};
12use crate::dom::bindings::root::{Dom, DomRoot};
13use crate::dom::window::Window;
14use crate::script_runtime::CanGc;
15
16#[dom_struct]
17pub(crate) struct Screen {
18    reflector_: Reflector,
19    window: Dom<Window>,
20}
21
22impl Screen {
23    fn new_inherited(window: &Window) -> Screen {
24        Screen {
25            reflector_: Reflector::new(),
26            window: Dom::from_ref(window),
27        }
28    }
29
30    pub(crate) fn new(window: &Window, can_gc: CanGc) -> DomRoot<Screen> {
31        reflect_dom_object(Box::new(Screen::new_inherited(window)), window, can_gc)
32    }
33
34    /// Retrives [`ScreenMetrics`] from the embedder.
35    fn screen_metrics(&self) -> ScreenMetrics {
36        let (sender, receiver) = generic_channel::channel().expect("Failed to create IPC channel!");
37
38        self.window.send_to_embedder(EmbedderMsg::GetScreenMetrics(
39            self.window.webview_id(),
40            sender,
41        ));
42
43        receiver.recv().unwrap_or_default()
44    }
45}
46
47impl ScreenMethods<crate::DomTypeHolder> for Screen {
48    // https://drafts.csswg.org/cssom-view/#dom-screen-availwidth
49    fn AvailWidth(&self) -> Finite<f64> {
50        Finite::wrap(self.screen_metrics().available_size.width as f64)
51    }
52
53    // https://drafts.csswg.org/cssom-view/#dom-screen-availheight
54    fn AvailHeight(&self) -> Finite<f64> {
55        Finite::wrap(self.screen_metrics().available_size.height as f64)
56    }
57
58    // https://drafts.csswg.org/cssom-view/#dom-screen-width
59    fn Width(&self) -> Finite<f64> {
60        Finite::wrap(self.screen_metrics().screen_size.width as f64)
61    }
62
63    // https://drafts.csswg.org/cssom-view/#dom-screen-height
64    fn Height(&self) -> Finite<f64> {
65        Finite::wrap(self.screen_metrics().screen_size.height as f64)
66    }
67
68    // https://drafts.csswg.org/cssom-view/#dom-screen-colordepth
69    fn ColorDepth(&self) -> u32 {
70        24
71    }
72
73    // https://drafts.csswg.org/cssom-view/#dom-screen-pixeldepth
74    fn PixelDepth(&self) -> u32 {
75        24
76    }
77}