diff --git a/packages/core/src/diff.rs b/packages/core/src/diff.rs index 6a0f5a372..07f0794e4 100644 --- a/packages/core/src/diff.rs +++ b/packages/core/src/diff.rs @@ -567,6 +567,7 @@ impl<'bump> DiffState<'bump> { return; } + self.scopes.update_reservation(new_node, root); new.dom_id.set(Some(root)); // todo: attributes currently rely on the element on top of the stack, but in theory, we only need the id of the diff --git a/packages/core/src/scopearena.rs b/packages/core/src/scopearena.rs index 3ae7c091c..0b4fca9f5 100644 --- a/packages/core/src/scopearena.rs +++ b/packages/core/src/scopearena.rs @@ -369,6 +369,7 @@ impl ScopeArena { let mut cur_el = Some(element); while let Some(id) = cur_el.take() { + log::debug!("checking element {:?} for listeners", id); if let Some(el) = nodes.get(id.0) { let real_el = unsafe { &**el }; if let VNode::Element(real_el) = real_el { diff --git a/packages/desktop/src/events.rs b/packages/desktop/src/events.rs index 377964b7c..59ad9c28d 100644 --- a/packages/desktop/src/events.rs +++ b/packages/desktop/src/events.rs @@ -39,69 +39,69 @@ pub fn trigger_from_serialized(val: serde_json::Value) -> UserEvent { } } -fn make_synthetic_event(name: &str, val: serde_json::Value) -> Box { +fn make_synthetic_event(name: &str, val: serde_json::Value) -> Arc { match name { "copy" | "cut" | "paste" => { // - Box::new(ClipboardEvent {}) + Arc::new(ClipboardEvent {}) } "compositionend" | "compositionstart" | "compositionupdate" => { - Box::new(serde_json::from_value::(val).unwrap()) + Arc::new(serde_json::from_value::(val).unwrap()) } "keydown" | "keypress" | "keyup" => { let evt = serde_json::from_value::(val).unwrap(); - Box::new(evt) + Arc::new(evt) } "focus" | "blur" => { // - Box::new(FocusEvent {}) + Arc::new(FocusEvent {}) } // todo: these handlers might get really slow if the input box gets large and allocation pressure is heavy // don't have a good solution with the serialized event problem "change" | "input" | "invalid" | "reset" | "submit" => { - Box::new(serde_json::from_value::(val).unwrap()) + Arc::new(serde_json::from_value::(val).unwrap()) } "click" | "contextmenu" | "doubleclick" | "drag" | "dragend" | "dragenter" | "dragexit" | "dragleave" | "dragover" | "dragstart" | "drop" | "mousedown" | "mouseenter" | "mouseleave" | "mousemove" | "mouseout" | "mouseover" | "mouseup" => { - Box::new(serde_json::from_value::(val).unwrap()) + Arc::new(serde_json::from_value::(val).unwrap()) } "pointerdown" | "pointermove" | "pointerup" | "pointercancel" | "gotpointercapture" | "lostpointercapture" | "pointerenter" | "pointerleave" | "pointerover" | "pointerout" => { - Box::new(serde_json::from_value::(val).unwrap()) + Arc::new(serde_json::from_value::(val).unwrap()) } "select" => { // - Box::new(serde_json::from_value::(val).unwrap()) + Arc::new(serde_json::from_value::(val).unwrap()) } "touchcancel" | "touchend" | "touchmove" | "touchstart" => { - Box::new(serde_json::from_value::(val).unwrap()) + Arc::new(serde_json::from_value::(val).unwrap()) } - "scroll" => Box::new(()), + "scroll" => Arc::new(()), - "wheel" => Box::new(serde_json::from_value::(val).unwrap()), + "wheel" => Arc::new(serde_json::from_value::(val).unwrap()), "animationstart" | "animationend" | "animationiteration" => { - Box::new(serde_json::from_value::(val).unwrap()) + Arc::new(serde_json::from_value::(val).unwrap()) } - "transitionend" => Box::new(serde_json::from_value::(val).unwrap()), + "transitionend" => Arc::new(serde_json::from_value::(val).unwrap()), "abort" | "canplay" | "canplaythrough" | "durationchange" | "emptied" | "encrypted" | "ended" | "error" | "loadeddata" | "loadedmetadata" | "loadstart" | "pause" | "play" | "playing" | "progress" | "ratechange" | "seeked" | "seeking" | "stalled" | "suspend" | "timeupdate" | "volumechange" | "waiting" => { // - Box::new(MediaEvent {}) + Arc::new(MediaEvent {}) } - "toggle" => Box::new(ToggleEvent {}), + "toggle" => Arc::new(ToggleEvent {}), - _ => Box::new(()), + _ => Arc::new(()), } } diff --git a/packages/html/src/events.rs b/packages/html/src/events.rs index 5dae615f5..0ede805f7 100644 --- a/packages/html/src/events.rs +++ b/packages/html/src/events.rs @@ -24,7 +24,7 @@ pub mod on { c: NodeFactory<'a>, mut callback: F, ) -> Listener<'a> - where F: FnMut(&$wrapper) + 'a + where F: FnMut(Arc<$wrapper>) + 'a { let bump = &c.bump(); @@ -32,7 +32,7 @@ pub mod on { // safety: this is essentially the same as calling Box::new() but manually // The box is attached to the lifetime of the bumpalo allocator let cb: &mut dyn FnMut(Arc) = bump.alloc(move |evt: Arc| { - let event = evt.downcast_ref::<$wrapper>().unwrap(); + let event = evt.downcast::<$wrapper>().unwrap(); callback(event) });