1use 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 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 fn AvailWidth(&self) -> Finite<f64> {
50 Finite::wrap(self.screen_metrics().available_size.width as f64)
51 }
52
53 fn AvailHeight(&self) -> Finite<f64> {
55 Finite::wrap(self.screen_metrics().available_size.height as f64)
56 }
57
58 fn Width(&self) -> Finite<f64> {
60 Finite::wrap(self.screen_metrics().screen_size.width as f64)
61 }
62
63 fn Height(&self) -> Finite<f64> {
65 Finite::wrap(self.screen_metrics().screen_size.height as f64)
66 }
67
68 fn ColorDepth(&self) -> u32 {
70 24
71 }
72
73 fn PixelDepth(&self) -> u32 {
75 24
76 }
77}