diff options
-rw-r--r-- | components/compositing/compositor_thread.rs | 6 | ||||
-rw-r--r-- | components/compositing/windowing.rs | 4 | ||||
-rw-r--r-- | components/constellation/constellation.rs | 8 | ||||
-rw-r--r-- | components/script/dom/screen.rs | 48 | ||||
-rw-r--r-- | components/script/dom/webidls/Screen.webidl | 8 | ||||
-rw-r--r-- | components/script_traits/script_msg.rs | 4 | ||||
-rw-r--r-- | components/servo/lib.rs | 16 | ||||
-rw-r--r-- | ports/cef/types.rs | 2 | ||||
-rw-r--r-- | ports/cef/window.rs | 25 | ||||
-rw-r--r-- | ports/glutin/window.rs | 25 | ||||
-rw-r--r-- | tests/wpt/metadata/css/cssom-view/cssom-view-window-screen-interface.html.ini | 26 | ||||
-rw-r--r-- | tests/wpt/metadata/css/cssom-view/interfaces.html.ini | 24 | ||||
-rw-r--r-- | tests/wpt/metadata/css/cssom-view/window-screen-height-immutable.html.ini | 5 | ||||
-rw-r--r-- | tests/wpt/metadata/css/cssom-view/window-screen-height.html.ini | 8 | ||||
-rw-r--r-- | tests/wpt/metadata/css/cssom-view/window-screen-width-immutable.html.ini | 5 | ||||
-rw-r--r-- | tests/wpt/metadata/css/cssom-view/window-screen-width.html.ini | 8 |
16 files changed, 138 insertions, 84 deletions
diff --git a/components/compositing/compositor_thread.rs b/components/compositing/compositor_thread.rs index 2870a619075..31ac2f32783 100644 --- a/components/compositing/compositor_thread.rs +++ b/components/compositing/compositor_thread.rs @@ -124,6 +124,10 @@ pub enum EmbedderMsg { ResizeTo(TopLevelBrowsingContextId, Size2D<u32>), /// Get Window Informations size and position GetClientWindow(TopLevelBrowsingContextId, IpcSender<(Size2D<u32>, Point2D<i32>)>), + /// Get screen size (pixel) + GetScreenSize(TopLevelBrowsingContextId, IpcSender<(Size2D<u32>)>), + /// Get screen available size (pixel) + GetScreenAvailSize(TopLevelBrowsingContextId, IpcSender<(Size2D<u32>)>), /// Wether or not to follow a link AllowNavigation(TopLevelBrowsingContextId, ServoUrl, IpcSender<bool>), /// Sends an unconsumed key event back to the embedder. @@ -222,6 +226,8 @@ impl Debug for EmbedderMsg { EmbedderMsg::MoveTo(..) => write!(f, "MoveTo"), EmbedderMsg::ResizeTo(..) => write!(f, "ResizeTo"), EmbedderMsg::GetClientWindow(..) => write!(f, "GetClientWindow"), + EmbedderMsg::GetScreenSize(..) => write!(f, "GetScreenSize"), + EmbedderMsg::GetScreenAvailSize(..) => write!(f, "GetScreenAvailSize"), EmbedderMsg::AllowNavigation(..) => write!(f, "AllowNavigation"), EmbedderMsg::KeyEvent(..) => write!(f, "KeyEvent"), EmbedderMsg::SetCursor(..) => write!(f, "SetCursor"), diff --git a/components/compositing/windowing.rs b/components/compositing/windowing.rs index 1d1768c6204..9abae232383 100644 --- a/components/compositing/windowing.rs +++ b/components/compositing/windowing.rs @@ -133,6 +133,10 @@ pub trait WindowMethods { /// Return the size of the window with head and borders and position of the window values fn client_window(&self, ctx: TopLevelBrowsingContextId) -> (Size2D<u32>, Point2D<i32>); + /// Return the size of the screen (pixel) + fn screen_size(&self, ctx: TopLevelBrowsingContextId) -> Size2D<u32>; + /// Return the available size of the screen (pixel) + fn screen_avail_size(&self, ctx: TopLevelBrowsingContextId) -> Size2D<u32>; /// Set the size inside of borders and head fn set_inner_size(&self, ctx: TopLevelBrowsingContextId, size: Size2D<u32>); /// Set the window position diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 3262308c3ef..ea73dca4c40 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -1261,6 +1261,14 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF> self.embedder_proxy.send(EmbedderMsg::ResizeTo(source_top_ctx_id, size)); } + FromScriptMsg::GetScreenSize(send) => { + self.embedder_proxy.send(EmbedderMsg::GetScreenSize(source_top_ctx_id, send)); + } + + FromScriptMsg::GetScreenAvailSize(send) => { + self.embedder_proxy.send(EmbedderMsg::GetScreenAvailSize(source_top_ctx_id, send)); + } + FromScriptMsg::Exit => { self.compositor_proxy.send(ToCompositorMsg::Exit); } 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 diff --git a/components/script/dom/webidls/Screen.webidl b/components/script/dom/webidls/Screen.webidl index dfc81221d76..aa80e79248c 100644 --- a/components/script/dom/webidls/Screen.webidl +++ b/components/script/dom/webidls/Screen.webidl @@ -5,10 +5,10 @@ // http://dev.w3.org/csswg/cssom-view/#the-screen-interface [Exposed=Window] interface Screen { - //readonly attribute double availWidth; - //readonly attribute double availHeight; - //readonly attribute double width; - //readonly attribute double height; + readonly attribute double availWidth; + readonly attribute double availHeight; + readonly attribute double width; + readonly attribute double height; readonly attribute unsigned long colorDepth; readonly attribute unsigned long pixelDepth; }; diff --git a/components/script_traits/script_msg.rs b/components/script_traits/script_msg.rs index a26eccec958..92254b3aabd 100644 --- a/components/script_traits/script_msg.rs +++ b/components/script_traits/script_msg.rs @@ -157,6 +157,10 @@ pub enum ScriptMsg { RegisterServiceWorker(ScopeThings, ServoUrl), /// Enter or exit fullscreen SetFullscreenState(bool), + /// Get the screen size (pixel) + GetScreenSize(IpcSender<(Size2D<u32>)>), + /// Get the available screen size (pixel) + GetScreenAvailSize(IpcSender<(Size2D<u32>)>), /// Requests that the compositor shut down. Exit, } diff --git a/components/servo/lib.rs b/components/servo/lib.rs index 8f6188c46cc..1542b429f0d 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -395,6 +395,22 @@ impl<Window> Servo<Window> where Window: WindowMethods + 'static { } }, + (EmbedderMsg::GetScreenSize(top_level_browsing_context, send), + ShutdownState::NotShuttingDown) => { + let rect = self.compositor.window.screen_size(top_level_browsing_context); + if let Err(e) = send.send(rect) { + warn!("Sending response to get screen size failed ({}).", e); + } + }, + + (EmbedderMsg::GetScreenAvailSize(top_level_browsing_context, send), + ShutdownState::NotShuttingDown) => { + let rect = self.compositor.window.screen_avail_size(top_level_browsing_context); + if let Err(e) = send.send(rect) { + warn!("Sending response to get screen available size failed ({}).", e); + } + }, + (EmbedderMsg::AllowNavigation(top_level_browsing_context, url, response_chan), diff --git a/ports/cef/types.rs b/ports/cef/types.rs index 3cba9bf950c..2c7738d741d 100644 --- a/ports/cef/types.rs +++ b/ports/cef/types.rs @@ -373,6 +373,7 @@ pub struct cef_point { // // Structure representing a rectangle. // +#[derive(Default)] pub struct cef_rect { pub x: c_int, pub y: c_int, @@ -1599,6 +1600,7 @@ pub enum cef_cursor_type_t { // passed as a parameter to CefRenderHandler::GetScreenInfo and should be filled // in by the client. /// +#[derive(Default)] pub struct _cef_screen_info { /// // Device scale factor. Specifies the ratio between physical and logical diff --git a/ports/cef/window.rs b/ports/cef/window.rs index bfc9339cf7b..ea4b99285d6 100644 --- a/ports/cef/window.rs +++ b/ports/cef/window.rs @@ -14,7 +14,7 @@ use eutil::Downcast; use interfaces::CefApp; use interfaces::CefBrowser; use render_handler::CefRenderHandlerExtensions; -use types::{cef_cursor_handle_t, cef_cursor_type_t, cef_rect_t}; +use types::{cef_cursor_handle_t, cef_cursor_type_t, cef_rect_t, CefScreenInfo}; use wrappers::CefWrap; use compositing::compositor_thread::EventLoopWaker; @@ -169,6 +169,19 @@ impl Window { fn cursor_handle_for_cursor(&self, _: Cursor) -> cef_cursor_handle_t { 0 } + + fn screen_info(&self) -> CefScreenInfo { + let mut screen_info = CefScreenInfo::default(); + let browser = self.cef_browser.borrow(); + if let Some(ref browser) = *browser { + browser.get_host() + .get_client() + .get_render_handler() + .get_screen_info(browser.clone(), &mut screen_info); + } + screen_info + } + } impl WindowMethods for Window { @@ -501,6 +514,16 @@ impl WindowMethods for Window { fn supports_clipboard(&self) -> bool { false } + + fn screen_size(&self, _: BrowserId) -> Size2D<u32> { + let screen_info = self.screen_info(); + Size2D::new(screen_info.rect.width as u32, screen_info.rect.height as u32) + } + + fn screen_avail_size(&self, _: BrowserId) -> Size2D<u32> { + let screen_info = self.screen_info(); + Size2D::new(screen_info.available_rect.width as u32, screen_info.available_rect.height as u32) + } } #[cfg(target_os="macos")] diff --git a/ports/glutin/window.rs b/ports/glutin/window.rs index ce892cb06d5..f2f16b06005 100644 --- a/ports/glutin/window.rs +++ b/ports/glutin/window.rs @@ -1033,6 +1033,31 @@ impl WindowMethods for Window { } + fn screen_size(&self, _: BrowserId) -> Size2D<u32> { + match self.kind { + WindowKind::Window(_) => { + let (width, height) = glutin::get_primary_monitor().get_dimensions(); + Size2D::new(width, height) + } + WindowKind::Headless(ref context) => { + Size2D::new(context.width, context.height) + } + } + } + + fn screen_avail_size(&self, _: BrowserId) -> Size2D<u32> { + // FIXME: Glutin doesn't have API for available size. Fallback to screen size + match self.kind { + WindowKind::Window(_) => { + let (width, height) = glutin::get_primary_monitor().get_dimensions(); + Size2D::new(width, height) + } + WindowKind::Headless(ref context) => { + Size2D::new(context.width, context.height) + } + } + } + fn set_animation_state(&self, state: AnimationState) { self.animation_state.set(state); } diff --git a/tests/wpt/metadata/css/cssom-view/cssom-view-window-screen-interface.html.ini b/tests/wpt/metadata/css/cssom-view/cssom-view-window-screen-interface.html.ini deleted file mode 100644 index 52eefb41a42..00000000000 --- a/tests/wpt/metadata/css/cssom-view/cssom-view-window-screen-interface.html.ini +++ /dev/null @@ -1,26 +0,0 @@ -[cssom-view-window-screen-interface.html] - type: testharness - [Screen.availWidth is readonly] - expected: FAIL - - [Screen.availHeight is readonly] - expected: FAIL - - [Screen.width is readonly] - expected: FAIL - - [Screen.height is readonly] - expected: FAIL - - [window.screen.width >= 0 && window.screen.width < 6000000] - expected: FAIL - - [window.screen.height >= 0 && window.screen.height < 6000000] - expected: FAIL - - [window.screen.availWidth >= 0 && window.screen.availWidth <= window.screen.width] - expected: FAIL - - [window.screen.availHeight >= 0 && window.screen.availHeight <= window.screen.height] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom-view/interfaces.html.ini b/tests/wpt/metadata/css/cssom-view/interfaces.html.ini index f6dfe79ea04..8442fe2b897 100644 --- a/tests/wpt/metadata/css/cssom-view/interfaces.html.ini +++ b/tests/wpt/metadata/css/cssom-view/interfaces.html.ini @@ -465,30 +465,6 @@ [Range interface: new Range() must inherit property "getBoundingClientRect()" with the proper type] expected: FAIL - [Screen interface: attribute availWidth] - expected: FAIL - - [Screen interface: attribute availHeight] - expected: FAIL - - [Screen interface: attribute width] - expected: FAIL - - [Screen interface: attribute height] - expected: FAIL - - [Screen interface: screen must inherit property "availWidth" with the proper type] - expected: FAIL - - [Screen interface: screen must inherit property "availHeight" with the proper type] - expected: FAIL - - [Screen interface: screen must inherit property "width" with the proper type] - expected: FAIL - - [Screen interface: screen must inherit property "height" with the proper type] - expected: FAIL - [CaretPosition interface: existence and properties of interface object] expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/window-screen-height-immutable.html.ini b/tests/wpt/metadata/css/cssom-view/window-screen-height-immutable.html.ini deleted file mode 100644 index 44e7d0817df..00000000000 --- a/tests/wpt/metadata/css/cssom-view/window-screen-height-immutable.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[window-screen-height-immutable.html] - type: testharness - [immutability test] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom-view/window-screen-height.html.ini b/tests/wpt/metadata/css/cssom-view/window-screen-height.html.ini deleted file mode 100644 index a844d504a9c..00000000000 --- a/tests/wpt/metadata/css/cssom-view/window-screen-height.html.ini +++ /dev/null @@ -1,8 +0,0 @@ -[window-screen-height.html] - type: testharness - [positive check] - expected: FAIL - - [upper bound check] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom-view/window-screen-width-immutable.html.ini b/tests/wpt/metadata/css/cssom-view/window-screen-width-immutable.html.ini deleted file mode 100644 index ea1efc7fead..00000000000 --- a/tests/wpt/metadata/css/cssom-view/window-screen-width-immutable.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[window-screen-width-immutable.html] - type: testharness - [immutability test] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom-view/window-screen-width.html.ini b/tests/wpt/metadata/css/cssom-view/window-screen-width.html.ini deleted file mode 100644 index 95ae1243a6f..00000000000 --- a/tests/wpt/metadata/css/cssom-view/window-screen-width.html.ini +++ /dev/null @@ -1,8 +0,0 @@ -[window-screen-width.html] - type: testharness - [positive check] - expected: FAIL - - [upper bound check] - expected: FAIL - |