stdweb/webapi/
window.rs

1use webcore::value::Reference;
2use webcore::try_from::TryInto;
3use webapi::event_target::{IEventTarget, EventTarget};
4use webapi::window_or_worker::IWindowOrWorker;
5use webapi::storage::Storage;
6use webapi::location::Location;
7use webapi::history::History;
8use webapi::selection::Selection;
9use webcore::once::Once;
10use webcore::value::Value;
11
12/// A handle to a pending animation frame request.
13#[derive(Debug)]
14pub struct RequestAnimationFrameHandle(Value);
15
16impl RequestAnimationFrameHandle {
17    /// Cancels an animation frame request.
18    ///
19    /// [(Javascript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window/cancelAnimationFrame)
20    pub fn cancel( self ) {
21        js! { @(no_return)
22            var val = @{&self.0};
23            val.window.cancelAnimationFrame(val.request);
24            val.callback.drop();
25        }
26    }
27}
28
29/// The `Window` object represents a window containing a DOM document.
30///
31/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window)
32// https://html.spec.whatwg.org/#window
33#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
34#[reference(instance_of = "Window")]
35#[reference(subclass_of(EventTarget))]
36pub struct Window( Reference );
37
38impl IEventTarget for Window {}
39impl IWindowOrWorker for Window {}
40
41/// A global instance of [Window](struct.Window.html).
42///
43/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window)
44pub fn window() -> Window {
45    unsafe { js!( return window; ).into_reference_unchecked() }.unwrap()
46}
47
48impl Window {
49    /// The Window.alert() method displays an alert dialog
50    /// with the optional specified content and an OK button.
51    ///
52    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window/alert)
53    // https://html.spec.whatwg.org/#the-window-object:dom-alert
54    pub fn alert( &self, message: &str ) {
55        js!( @(no_return)
56            @{self}.alert( @{message} );
57        );
58    }
59
60    /// The Window.confirm() method displays a modal dialog
61    /// with an optional message and two buttons: OK and Cancel.
62    ///
63    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window/confirm)
64    // https://html.spec.whatwg.org/#the-window-object:dom-confirm
65    pub fn confirm( &self, message: &str ) -> bool {
66        js!(
67            return @{self}.confirm( @{message} );
68        ).try_into().unwrap()
69    }
70
71    /// The `local_storage` property allows you to access a local [Storage](struct.Storage.html)
72    /// object.
73    ///
74    /// It is similar to the [Window::session_storage](struct.Window.html#method.session_storage).
75    /// The only difference is that, while data stored in `local_storage` has
76    /// no expiration time, data stored in `session_storage` gets cleared when
77    /// the browsing session ends - that is, when the browser is closed.
78    ///
79    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage)
80    // https://html.spec.whatwg.org/#the-localstorage-attribute:dom-localstorage
81    pub fn local_storage( &self ) -> Storage {
82        unsafe {
83            js!(
84                return @{self.as_ref()}.localStorage;
85            ).into_reference_unchecked().unwrap()
86        }
87    }
88
89    /// The `session_storage` property allows you to access a session [Storage](struct.Storage.html)
90    /// object for the current origin.
91    ///
92    /// It is similar to the [Window::local_storage](struct.Window.html#method.local_storage),
93    /// The only difference is that, while data stored in `local_storage` has
94    /// no expiration time, data stored in `session_storage` gets cleared when
95    /// the browsing session ends.
96    ///
97    /// A page session lasts for as long as the browser is open and survives over
98    /// page reloads and restores. Opening a page in a new tab or window will cause
99    /// a new session to be initiated, which differs from how session cookies work.
100    ///
101    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage)
102    // https://html.spec.whatwg.org/#the-sessionstorage-attribute:dom-sessionstorage
103    pub fn session_storage( &self ) -> Storage {
104        unsafe {
105            js!(
106                return @{self.as_ref()}.sessionStorage;
107            ).into_reference_unchecked().unwrap()
108        }
109    }
110
111    /// Returns a [Location](struct.Location.html) object which contains
112    /// information about the URL of the document and provides methods
113    /// for changing that URL and loading another URL.
114    ///
115    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window/location)
116    // https://html.spec.whatwg.org/#the-window-object:dom-location
117    pub fn location( &self ) -> Option< Location > {
118        unsafe {
119            js!(
120                return @{self}.location;
121            ).into_reference_unchecked()
122        }
123    }
124
125    /// You should call this method whenever you're ready to update your animation onscreen.
126    /// This will request that your animation function be called before the browser performs the next repaint.
127    /// The number of callbacks is usually 60 times per second, but will generally match the display refresh
128    /// rate in most web browsers as per W3C recommendation. request_animation_frame() calls are paused in most browsers
129    /// when running in background tabs or hidden iframes in order to improve performance and battery life.
130    ///
131    /// The callback method is passed a single argument, a f64, which indicates the current time when
132    /// callbacks queued by requestAnimationFrame() begin to fire. Multiple callbacks in a single frame, therefore,
133    /// each receive the same timestamp even though time has passed during the computation of every previous callback's workload.
134    /// This timestamp is a decimal number, in milliseconds, but with a minimal precision of 1ms (1000 µs).
135    ///
136    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame)
137    // https://html.spec.whatwg.org/#the-window-object:dom-window-requestanimationframe
138    pub fn request_animation_frame< F: FnOnce(f64) + 'static>( &self, callback: F) -> RequestAnimationFrameHandle {
139        let values: Value = js!{
140            var callback = @{Once(callback)};
141            var request = @{self}.requestAnimationFrame(callback);
142            return { request: request, callback: callback, window: @{self} };
143        };
144        RequestAnimationFrameHandle(values)
145    }
146
147    /// Returns the global [History](struct.History.html) object, which provides methods to
148    /// manipulate the browser history.
149    ///
150    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window/history)
151    // https://html.spec.whatwg.org/#the-window-object:dom-history
152    pub fn history(&self) -> History {
153        unsafe {
154            js!(
155                return @{self}.history;
156            ).into_reference_unchecked().unwrap()
157        }
158    }
159
160    /// Returns the width (in pixels) of the browser window viewport including, if rendered,
161    /// the vertical scrollbar.
162    ///
163    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/window/innerWidth)
164    // https://drafts.csswg.org/cssom-view/#ref-for-dom-window-innerwidth
165    pub fn inner_width(&self) -> i32 {
166        js!(
167            return @{self}.innerWidth;
168        ).try_into().unwrap()
169    }
170
171    /// Returns the height (in pixels) of the browser window viewport including, if rendered,
172    /// the horizontal scrollbar.
173    ///
174    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/window/innerHeight)
175    // https://drafts.csswg.org/cssom-view/#ref-for-dom-window-innerheight
176    pub fn inner_height(&self) -> i32 {
177        js!(
178            return @{self}.innerHeight;
179        ).try_into().unwrap()
180    }
181
182    /// Returns the width of the outside of the browser window. It represents the width
183    /// of the whole browser window including sidebar (if expanded), window chrome
184    /// and window resizing borders/handles.
185    ///
186    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window/outerWidth)
187    // https://drafts.csswg.org/cssom-view/#ref-for-dom-window-outerheight
188    pub fn outer_width(&self) -> i32 {
189        js!(
190            return @{self}.outerWidth;
191        ).try_into().unwrap()
192    }
193
194    /// Returns the height of the outside of the browser window. It represents the height
195    /// of the whole browser window including sidebar (if expanded), window chrome
196    /// and window resizing borders/handles.
197    ///
198    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window/outerHeight)
199    // https://drafts.csswg.org/cssom-view/#ref-for-dom-window-outerheight
200    pub fn outer_height(&self) -> i32 {
201        js!(
202            return @{self}.outerHeight;
203        ).try_into().unwrap()
204    }
205
206    /// The read-only Window property pageYOffset is an alias for scrollY; as such, it returns
207    /// the number of pixels the document is currently scrolled along the vertical axis (that is,
208    /// up or down), with a value of 0.0 indicating that the top edge of the Document is currently
209    /// aligned with the top edge of the window's content area.
210    ///
211    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window/pageYOffset)
212    // https://drafts.csswg.org/cssom-view/#ref-for-dom-window-pageyoffset
213    pub fn page_y_offset(&self) -> f64 {
214        js!(
215            return @{self}.pageYOffset;
216        ).try_into().unwrap()
217    }
218
219    /// This is an alias for scrollX.
220    ///
221    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window/pageXOffset)
222    // https://drafts.csswg.org/cssom-view/#ref-for-dom-window-pagexoffset
223    pub fn page_x_offset(&self) -> f64 {
224        js!(
225            return @{self}.pageXOffset;
226        ).try_into().unwrap()
227    }
228
229    /// The ratio in resolution from physical pixels to CSS pixels
230    ///
231    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio)
232    // https://drafts.csswg.org/cssom-view/#ref-for-dom-window-devicepixelratio
233    pub fn device_pixel_ratio(&self) -> f64 {
234        js! (
235            return @{self}.devicePixelRatio;
236        ).try_into().unwrap()
237    }
238
239    /// Returns a [Selection](struct.Selection.html) object representing the range of text selected
240    /// by the user or the current position of the caret.
241    /// [(Javascript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Window/getSelection)
242    // https://w3c.github.io/selection-api/#dom-document-getselection
243    pub fn get_selection(&self) -> Option<Selection> {
244        unsafe {
245            js!(
246                return @{self}.getSelection();
247            ).into_reference_unchecked()
248        }
249    }
250}