mirror of
https://github.com/zaphar/wasm-web-components.git
synced 2025-07-21 19:40:30 -04:00
Clean up the WebComponentHandle closure.
Had a misunderstanding regarding closure lifetimes.
This commit is contained in:
parent
7ffcab1416
commit
94e8ee07c6
@ -109,7 +109,7 @@ fn expand_struct_trait_shim(struct_name: &Ident, observed_attrs: Literal) -> syn
|
||||
<Self as #trait_path>::class_name()
|
||||
}
|
||||
|
||||
pub fn define() -> std::result::Result<#handle_path<#struct_name>, JsValue> {
|
||||
pub fn define() -> std::result::Result<#handle_path, JsValue> {
|
||||
use wasm_bindgen::JsCast;
|
||||
use web_sys::{window, Element, HtmlElement};
|
||||
let registry = web_sys::window().unwrap().custom_elements();
|
||||
@ -151,21 +151,20 @@ return element;",
|
||||
element_name = Self::element_name(),
|
||||
observed_attributes = #observed_attrs,
|
||||
);
|
||||
let fun = Function::new_with_args("impl", &body);
|
||||
let fun = js_sys::Function::new_with_args("impl", &body);
|
||||
let f: Box<dyn FnMut() -> Self> = Box::new(|| {
|
||||
let obj = Self::new();
|
||||
obj
|
||||
});
|
||||
let constructor_handle = Closure::wrap(f);
|
||||
let constructor_handle = wasm_bindgen::prelude::Closure::wrap(f).into_js_value().unchecked_into::<js_sys::Function>();
|
||||
let element = fun
|
||||
.call1(
|
||||
&window().unwrap(),
|
||||
constructor_handle.as_ref().unchecked_ref::<Function>(),
|
||||
constructor_handle.as_ref(),
|
||||
)?
|
||||
.dyn_into()?;
|
||||
Ok(WebComponentHandle {
|
||||
Ok(#handle_path {
|
||||
element_constructor: element,
|
||||
impl_handle: constructor_handle,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
use js_sys::Function;
|
||||
use wasm_bindgen::{convert::IntoWasmAbi, prelude::Closure, JsValue};
|
||||
use wasm_bindgen::{convert::IntoWasmAbi, JsValue};
|
||||
use web_sys::{window, Element, Event, HtmlElement, Window};
|
||||
|
||||
/// This attribute proc-macro will generate the following trait implementations
|
||||
@ -73,13 +73,9 @@ pub trait WebComponentBinding: WebComponentDef {
|
||||
/// of the callback functions for the component.
|
||||
pub trait WebComponent: WebComponentBinding {}
|
||||
|
||||
/// A handle for your WebComponent Definition. It is important that this
|
||||
/// handle is live for as long as your Web-Component might be used.
|
||||
pub struct WebComponentHandle<T> {
|
||||
/// The handle for the closure that is used to construct your Rust instance
|
||||
/// in the Javascript shim constructor. If this is dropped then your web component
|
||||
/// will not be able to be constructed properly.
|
||||
pub impl_handle: Closure<dyn FnMut() -> T>,
|
||||
/// A handle for your WebComponent Definition. Offers easy access to construct your
|
||||
/// element.
|
||||
pub struct WebComponentHandle {
|
||||
/// A javascript function that can construct your element.
|
||||
pub element_constructor: Function,
|
||||
}
|
||||
@ -164,7 +160,7 @@ mod tests {
|
||||
}
|
||||
|
||||
Timer::new("custom-element::timing");
|
||||
let handle = BenchElement::define();
|
||||
let _ = BenchElement::define();
|
||||
|
||||
let body = window().unwrap().document().unwrap().body().unwrap();
|
||||
for _ in 1..100000 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user