mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-14 05:45:37 +00:00
servo: Merge #18183 - Enable screen.width/height/availWidth/availHeight (from shinglyu:availheight); r=asajeffrey
<!-- Please describe your changes on the following line: --> Support screen.width/height/availWidth/availHeight using information from glutin. r?@paulrouget Since glutin don't have `availWidth` and `availHeight` information, I let them fallback to `width` and `height`. If that's not acceptable in terms of webcompat, I can remove that part. There are some test failures on wpt css about mutating screen.width/height should throw exception, but I can't reproduce that behavior on other major browser, so I keep them disabled. Also there are some media query issues, but I believe that's due to some test harness problem on my test machine. --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #18062 (github issue number if applicable). <!-- Either: --> - [x] There are tests for these changes in wpt cssom-view - [ ] These changes do not require tests because _____ <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> Source-Repo: https://github.com/servo/servo Source-Revision: 504ad4de2a426c2bc70161a9190fddaa8728ead2 --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : 09bb1362ce078c58576f767ec94cedcf660c7277
This commit is contained in:
parent
bb3c45d880
commit
b13dfc0bb4
@ -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"),
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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,
|
||||
}
|
||||
|
@ -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),
|
||||
|
@ -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
|
||||
|
@ -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")]
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user