diff options
author | Shing Lyu <shing.lyu@gmail.com> | 2017-09-27 10:32:51 +0200 |
---|---|---|
committer | Shing Lyu <shing.lyu@gmail.com> | 2017-11-13 21:32:10 +0100 |
commit | c120234f0e8c71e4f9c217796266492ac2a013fa (patch) | |
tree | 12f51a708aa58d2a8a3188ae2a7afc5e99648061 /components/script/dom/screen.rs | |
parent | 657b2339a1e68f3a9c4525f35db023d3f149ffac (diff) | |
download | servo-c120234f0e8c71e4f9c217796266492ac2a013fa.tar.gz servo-c120234f0e8c71e4f9c217796266492ac2a013fa.zip |
Enable screen.availHeight/availWidth/Height/Width
Diffstat (limited to 'components/script/dom/screen.rs')
-rw-r--r-- | components/script/dom/screen.rs | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/components/script/dom/screen.rs b/components/script/dom/screen.rs index cfb827db6f0..bec082e9729 100644 --- a/components/script/dom/screen.rs +++ b/components/script/dom/screen.rs @@ -4,31 +4,73 @@ use dom::bindings::codegen::Bindings::ScreenBinding; use dom::bindings::codegen::Bindings::ScreenBinding::ScreenMethods; +use dom::bindings::inheritance::Castable; +use dom::bindings::num::Finite; use dom::bindings::reflector::{Reflector, reflect_dom_object}; -use dom::bindings::root::DomRoot; +use dom::bindings::root::{Dom, DomRoot}; +use dom::globalscope::GlobalScope; use dom::window::Window; use dom_struct::dom_struct; +use euclid::Size2D; +use ipc_channel::ipc; +use script_traits::ScriptMsg; #[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) -> DomRoot<Screen> { - reflect_dom_object(Box::new(Screen::new_inherited()), + reflect_dom_object(Box::new(Screen::new_inherited(window)), window, ScreenBinding::Wrap) } + + fn screen_size(&self) -> Size2D<u32> { + let (send, recv) = ipc::channel::<(Size2D<u32>)>().unwrap(); + self.window.upcast::<GlobalScope>() + .script_to_constellation_chan().send(ScriptMsg::GetScreenSize(send)).unwrap(); + recv.recv().unwrap_or((Size2D::zero())) + } + + fn screen_avail_size(&self) -> Size2D<u32> { + let (send, recv) = ipc::channel::<(Size2D<u32>)>().unwrap(); + self.window.upcast::<GlobalScope>() + .script_to_constellation_chan().send(ScriptMsg::GetScreenAvailSize(send)).unwrap(); + recv.recv().unwrap_or((Size2D::zero())) + } } 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 |