aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/screen.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/screen.rs')
-rw-r--r--components/script/dom/screen.rs76
1 files changed, 65 insertions, 11 deletions
diff --git a/components/script/dom/screen.rs b/components/script/dom/screen.rs
index 80e5bf8d5c6..18e137346e5 100644
--- a/components/script/dom/screen.rs
+++ b/components/script/dom/screen.rs
@@ -1,34 +1,88 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-use dom::bindings::codegen::Bindings::ScreenBinding;
-use dom::bindings::codegen::Bindings::ScreenBinding::ScreenMethods;
-use dom::bindings::js::Root;
-use dom::bindings::reflector::{Reflector, reflect_dom_object};
-use dom::window::Window;
+use crate::dom::bindings::codegen::Bindings::ScreenBinding::ScreenMethods;
+use crate::dom::bindings::inheritance::Castable;
+use crate::dom::bindings::num::Finite;
+use crate::dom::bindings::reflector::DomObject;
+use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
+use crate::dom::bindings::root::{Dom, DomRoot};
+use crate::dom::globalscope::GlobalScope;
+use crate::dom::window::Window;
use dom_struct::dom_struct;
+use euclid::Size2D;
+use profile_traits::ipc;
+use script_traits::ScriptMsg;
+use style_traits::CSSPixel;
+use webrender_api::units::DeviceIntSize;
#[dom_struct]
pub struct Screen {
reflector_: Reflector,
+ window: Dom<Window>,
}
impl Screen {
- fn new_inherited() -> Screen {
+ fn new_inherited(window: &Window) -> Screen {
Screen {
reflector_: Reflector::new(),
+ window: Dom::from_ref(&window),
}
}
- pub fn new(window: &Window) -> Root<Screen> {
- reflect_dom_object(box Screen::new_inherited(),
- window,
- ScreenBinding::Wrap)
+ pub fn new(window: &Window) -> DomRoot<Screen> {
+ reflect_dom_object(Box::new(Screen::new_inherited(window)), window)
+ }
+
+ fn screen_size(&self) -> Size2D<u32, CSSPixel> {
+ let (send, recv) =
+ ipc::channel::<DeviceIntSize>(self.global().time_profiler_chan().clone()).unwrap();
+ self.window
+ .upcast::<GlobalScope>()
+ .script_to_constellation_chan()
+ .send(ScriptMsg::GetScreenSize(send))
+ .unwrap();
+ let dpr = self.window.device_pixel_ratio();
+ let screen = recv.recv().unwrap_or(Size2D::zero());
+ (screen.to_f32() / dpr).to_u32()
+ }
+
+ fn screen_avail_size(&self) -> Size2D<u32, CSSPixel> {
+ let (send, recv) =
+ ipc::channel::<DeviceIntSize>(self.global().time_profiler_chan().clone()).unwrap();
+ self.window
+ .upcast::<GlobalScope>()
+ .script_to_constellation_chan()
+ .send(ScriptMsg::GetScreenAvailSize(send))
+ .unwrap();
+ let dpr = self.window.device_pixel_ratio();
+ let screen = recv.recv().unwrap_or(Size2D::zero());
+ (screen.to_f32() / dpr).to_u32()
}
}
impl ScreenMethods for Screen {
+ // https://drafts.csswg.org/cssom-view/#dom-screen-availwidth
+ fn AvailWidth(&self) -> Finite<f64> {
+ Finite::wrap(self.screen_avail_size().width as f64)
+ }
+
+ // https://drafts.csswg.org/cssom-view/#dom-screen-availheight
+ fn AvailHeight(&self) -> Finite<f64> {
+ Finite::wrap(self.screen_avail_size().height as f64)
+ }
+
+ // https://drafts.csswg.org/cssom-view/#dom-screen-width
+ fn Width(&self) -> Finite<f64> {
+ Finite::wrap(self.screen_size().width as f64)
+ }
+
+ // https://drafts.csswg.org/cssom-view/#dom-screen-height
+ fn Height(&self) -> Finite<f64> {
+ Finite::wrap(self.screen_size().height as f64)
+ }
+
// https://drafts.csswg.org/cssom-view/#dom-screen-colordepth
fn ColorDepth(&self) -> u32 {
24