Implement Window.screen.

This commit is contained in:
Ms2ger 2014-07-24 12:51:06 +02:00
parent 800b5e0f4a
commit 27f92239b0
6 changed files with 112 additions and 1 deletions

View file

@ -0,0 +1,51 @@
/* 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/. */
use dom::bindings::codegen::Bindings::ScreenBinding;
use dom::bindings::global::Window;
use dom::bindings::js::{JSRef, Temporary};
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
use dom::window::Window;
use serialize::{Encoder, Encodable};
#[deriving(Encodable)]
pub struct Screen {
reflector_: Reflector,
}
impl Screen {
pub fn new_inherited() -> Screen {
Screen {
reflector_: Reflector::new(),
}
}
pub fn new(window: &JSRef<Window>) -> Temporary<Screen> {
reflect_dom_object(box Screen::new_inherited(),
&Window(*window),
ScreenBinding::Wrap)
}
}
pub trait ScreenMethods {
fn ColorDepth(&self) -> u32;
fn PixelDepth(&self) -> u32;
}
impl<'a> ScreenMethods for JSRef<'a, Screen> {
fn ColorDepth(&self) -> u32 {
24
}
fn PixelDepth(&self) -> u32 {
24
}
}
impl Reflectable for Screen {
fn reflector<'a>(&'a self) -> &'a Reflector {
&self.reflector_
}
}

View file

@ -0,0 +1,14 @@
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/. */
// http://dev.w3.org/csswg/cssom-view/#the-screen-interface
interface Screen {
//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;
};

View file

@ -78,6 +78,38 @@ partial interface Window {
/*[Replaceable]*/ readonly attribute Performance performance; /*[Replaceable]*/ readonly attribute Performance performance;
}; };
// http://dev.w3.org/csswg/cssom-view/#extensions-to-the-window-interface
partial interface Window {
//MediaQueryList matchMedia(DOMString query);
[SameObject] readonly attribute Screen screen;
// browsing context
//void moveTo(double x, double y);
//void moveBy(double x, double y);
//void resizeTo(double x, double y);
//void resizeBy(double x, double y);
// viewport
//readonly attribute double innerWidth;
//readonly attribute double innerHeight;
// viewport scrolling
//readonly attribute double scrollX;
//readonly attribute double pageXOffset;
//readonly attribute double scrollY;
//readonly attribute double pageYOffset;
//void scroll(double x, double y, optional ScrollOptions options);
//void scrollTo(double x, double y, optional ScrollOptions options);
//void scrollBy(double x, double y, optional ScrollOptions options);
// client
//readonly attribute double screenX;
//readonly attribute double screenY;
//readonly attribute double outerWidth;
//readonly attribute double outerHeight;
//readonly attribute double devicePixelRatio;
};
// Proprietary extensions. // Proprietary extensions.
partial interface Window { partial interface Window {
readonly attribute Console console; readonly attribute Console console;

View file

@ -16,10 +16,11 @@ use dom::eventtarget::{EventTarget, WindowTypeId, EventTargetHelpers};
use dom::location::Location; use dom::location::Location;
use dom::navigator::Navigator; use dom::navigator::Navigator;
use dom::performance::Performance; use dom::performance::Performance;
use dom::screen::Screen;
use layout_interface::{ReflowForDisplay, DocumentDamageLevel}; use layout_interface::{ReflowForDisplay, DocumentDamageLevel};
use page::Page; use page::Page;
use script_task::{ExitWindowMsg, FireTimerMsg, ScriptChan, TriggerLoadMsg, TriggerFragmentMsg}; use script_task::{ExitWindowMsg, FireTimerMsg, ScriptChan, TriggerLoadMsg, TriggerFragmentMsg};
use servo_msg::compositor_msg::ScriptListener; use servo_msg::compositor_msg::ScriptListener;
use servo_net::image_cache_task::ImageCacheTask; use servo_net::image_cache_task::ImageCacheTask;
use servo_util::str::DOMString; use servo_util::str::DOMString;
@ -86,6 +87,7 @@ pub struct Window {
performance: Cell<Option<JS<Performance>>>, performance: Cell<Option<JS<Performance>>>,
pub navigationStart: u64, pub navigationStart: u64,
pub navigationStartPrecise: f64, pub navigationStartPrecise: f64,
screen: Cell<Option<JS<Screen>>>,
} }
impl Window { impl Window {
@ -142,6 +144,7 @@ pub trait WindowMethods {
fn SetOnunload(&self, listener: Option<EventHandlerNonNull>); fn SetOnunload(&self, listener: Option<EventHandlerNonNull>);
fn GetOnerror(&self) -> Option<OnErrorEventHandlerNonNull>; fn GetOnerror(&self) -> Option<OnErrorEventHandlerNonNull>;
fn SetOnerror(&self, listener: Option<OnErrorEventHandlerNonNull>); fn SetOnerror(&self, listener: Option<OnErrorEventHandlerNonNull>);
fn Screen(&self) -> Temporary<Screen>;
fn Debug(&self, message: DOMString); fn Debug(&self, message: DOMString);
fn Gc(&self); fn Gc(&self);
} }
@ -265,6 +268,14 @@ impl<'a> WindowMethods for JSRef<'a, Window> {
eventtarget.set_event_handler_common("error", listener) eventtarget.set_event_handler_common("error", listener)
} }
fn Screen(&self) -> Temporary<Screen> {
if self.screen.get().is_none() {
let screen = Screen::new(self);
self.screen.assign(Some(screen));
}
Temporary::new(self.screen.get().get_ref().clone())
}
fn Debug(&self, message: DOMString) { fn Debug(&self, message: DOMString) {
debug!("{:s}", message); debug!("{:s}", message);
} }
@ -433,6 +444,7 @@ impl Window {
performance: Cell::new(None), performance: Cell::new(None),
navigationStart: time::get_time().sec as u64, navigationStart: time::get_time().sec as u64,
navigationStartPrecise: time::precise_time_s(), navigationStartPrecise: time::precise_time_s(),
screen: Cell::new(None),
}; };
WindowBinding::Wrap(cx, win) WindowBinding::Wrap(cx, win)

View file

@ -170,6 +170,7 @@ pub mod dom {
pub mod performance; pub mod performance;
pub mod performancetiming; pub mod performancetiming;
pub mod progressevent; pub mod progressevent;
pub mod screen;
pub mod text; pub mod text;
pub mod uievent; pub mod uievent;
pub mod urlsearchparams; pub mod urlsearchparams;

View file

@ -151,6 +151,7 @@ var interfaceNamesInGlobalScope = [
"PerformanceTiming", "PerformanceTiming",
"ProcessingInstruction", "ProcessingInstruction",
"ProgressEvent", "ProgressEvent",
"Screen",
"TestBinding", // XXX "TestBinding", // XXX
"Text", "Text",
"UIEvent", "UIEvent",