From 9d2743231f0233417b0477b444fcdbeb2df066d2 Mon Sep 17 00:00:00 2001 From: Jovansonlee Cesar Date: Mon, 19 Feb 2024 05:51:13 +0800 Subject: [PATCH] feat: make Handles clonable --- crates/sauron-core/src/dom/raf.rs | 6 ++++-- crates/sauron-core/src/dom/ric.rs | 8 ++++++-- crates/sauron-core/src/dom/timeout.rs | 7 ++++--- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/crates/sauron-core/src/dom/raf.rs b/crates/sauron-core/src/dom/raf.rs index f16ad46f2..3cb6e4134 100644 --- a/crates/sauron-core/src/dom/raf.rs +++ b/crates/sauron-core/src/dom/raf.rs @@ -1,11 +1,13 @@ use crate::dom::window; use wasm_bindgen::closure::Closure; use wasm_bindgen::{JsCast, JsValue}; +use std::rc::Rc; /// request animation frame handle +#[derive(Clone)] pub struct AnimationFrameHandle { handle: i32, - _closure: Closure, + _closure: Rc>, } impl Drop for AnimationFrameHandle { fn drop(&mut self) { @@ -24,6 +26,6 @@ where let handle = window().request_animation_frame(closure.as_ref().unchecked_ref())?; Ok(AnimationFrameHandle { handle, - _closure: closure, + _closure: Rc::new(closure), }) } diff --git a/crates/sauron-core/src/dom/ric.rs b/crates/sauron-core/src/dom/ric.rs index e03a73546..ac750ed6a 100644 --- a/crates/sauron-core/src/dom/ric.rs +++ b/crates/sauron-core/src/dom/ric.rs @@ -1,11 +1,13 @@ use crate::dom::{now, request_timeout_callback, window, TimeoutCallbackHandle}; use wasm_bindgen::closure::Closure; use wasm_bindgen::{JsCast, JsValue}; +use std::rc::Rc; /// request idle callback handle +#[derive(Clone)] pub struct IdleCallbackHandleReal { handle: u32, - _closure: Closure, + _closure: Rc>, } /// when dropped, cancel the idle callback @@ -30,12 +32,13 @@ where let handle = window().request_idle_callback(closure.as_ref().unchecked_ref())?; Ok(IdleCallbackHandleReal { handle, - _closure: closure, + _closure: Rc::new(closure), }) } /// Idle deadline interface which could be the real idle deadline if supported, otherwise the /// polyfill +#[derive(Clone)] pub enum IdleDeadline { /// the web native IdleDeadline object wrap together with polyfill version Real(web_sys::IdleDeadline), @@ -47,6 +50,7 @@ pub enum IdleDeadline { } /// +#[derive(Clone)] pub enum IdleCallbackHandle { /// wrapper to the real web native IdleCallbackHandle Real(IdleCallbackHandleReal), diff --git a/crates/sauron-core/src/dom/timeout.rs b/crates/sauron-core/src/dom/timeout.rs index c76fdbd94..8fe67f33d 100644 --- a/crates/sauron-core/src/dom/timeout.rs +++ b/crates/sauron-core/src/dom/timeout.rs @@ -3,12 +3,13 @@ use js_sys::Promise; use wasm_bindgen::closure::Closure; use wasm_bindgen::{JsCast, JsValue}; use wasm_bindgen_futures::JsFuture; +use std::rc::Rc; /// handle for request_idle_callback calls -#[derive(Debug)] +#[derive(Debug,Clone)] pub struct TimeoutCallbackHandle { handle: i32, - _closure: Closure, + _closure: Rc>, } impl Drop for TimeoutCallbackHandle { @@ -29,7 +30,7 @@ where )?; Ok(TimeoutCallbackHandle { handle, - _closure: closure, + _closure: Rc::new(closure), }) }