From 5cf8eedc9b9b1be8e0e9c533b323e84a6f6ea70e Mon Sep 17 00:00:00 2001 From: Sam Day Date: Thu, 28 Mar 2019 14:18:14 +0100 Subject: [PATCH] gloo-timers: Use raw bindings to (set|clear)(Timeout|Interval) instead of the Window API, since window isn't always present (e.g Web Workers) --- crates/timers/src/callback.rs | 26 +++++++++++--------------- crates/timers/src/lib.rs | 16 ++++++++++++++-- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/crates/timers/src/callback.rs b/crates/timers/src/callback.rs index b83372d9..409b5f62 100644 --- a/crates/timers/src/callback.rs +++ b/crates/timers/src/callback.rs @@ -1,6 +1,6 @@ //! Callback-style timer APIs. -use super::window; +use super::{clear_interval, clear_timeout, set_interval, set_timeout}; use std::fmt; use wasm_bindgen::prelude::*; use wasm_bindgen::JsCast; @@ -20,7 +20,7 @@ pub struct Timeout { impl Drop for Timeout { fn drop(&mut self) { if let Some(id) = self.id { - window().clear_timeout_with_handle(id); + clear_timeout(id); } } } @@ -50,12 +50,10 @@ impl Timeout { { let closure = Closure::once(callback); - let id = window() - .set_timeout_with_callback_and_timeout_and_arguments_0( - closure.as_ref().unchecked_ref::(), - millis as i32, - ) - .unwrap_throw(); + let id = set_timeout( + closure.as_ref().unchecked_ref::(), + millis as i32, + ); Timeout { id: Some(id), @@ -125,7 +123,7 @@ pub struct Interval { impl Drop for Interval { fn drop(&mut self) { if let Some(id) = self.id { - window().clear_interval_with_handle(id); + clear_interval(id); } } } @@ -158,12 +156,10 @@ impl Interval { callback(); }) as Box); - let id = window() - .set_interval_with_callback_and_timeout_and_arguments_0( - closure.as_ref().unchecked_ref::(), - millis as i32, - ) - .unwrap_throw(); + let id = set_interval( + closure.as_ref().unchecked_ref::(), + millis as i32, + ); Interval { id: Some(id), diff --git a/crates/timers/src/lib.rs b/crates/timers/src/lib.rs index 8797947e..d9ff4934 100644 --- a/crates/timers/src/lib.rs +++ b/crates/timers/src/lib.rs @@ -67,10 +67,22 @@ TODO #[cfg(feature = "futures")] extern crate futures_rs as futures; +use js_sys::Function; use wasm_bindgen::prelude::*; -fn window() -> web_sys::Window { - web_sys::window().unwrap_throw() +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen(js_name = "setTimeout")] + pub fn set_timeout(handler: &Function, timeout: i32) -> i32; + + #[wasm_bindgen(js_name = "clearTimeout")] + pub fn clear_timeout(token: i32); + + #[wasm_bindgen(js_name = "setInterval")] + pub fn set_interval(handler: &Function, timeout: i32) -> i32; + + #[wasm_bindgen(js_name = "clearInterval")] + pub fn clear_interval(token: i32); } pub mod callback;