dioxus/packages/core/tests/event_propagation.rs

83 lines
2 KiB
Rust
Raw Normal View History

2023-08-23 13:01:37 -05:00
use dioxus::prelude::*;
use dioxus_core::ElementId;
use std::{rc::Rc, sync::Mutex};
static CLICKS: Mutex<usize> = Mutex::new(0);
#[test]
fn events_propagate() {
2024-01-04 19:36:10 -06:00
set_event_converter(Box::new(dioxus_html::SerializedHtmlEventConverter));
2023-08-23 13:01:37 -05:00
let mut dom = VirtualDom::new(app);
2024-01-11 12:40:36 -06:00
_ = dom.rebuild(&mut dioxus_core::NoOpMutations);
2023-08-23 13:01:37 -05:00
// Top-level click is registered
dom.handle_event(
"click",
Rc::new(PlatformEventData::new(Box::<SerializedMouseData>::default())),
ElementId(1),
true,
);
2023-08-23 13:01:37 -05:00
assert_eq!(*CLICKS.lock().unwrap(), 1);
// break reference....
for _ in 0..5 {
dom.mark_dirty(ScopeId(0));
2024-01-10 19:21:15 -06:00
_ = dom.render_immediate_to_vec();
2023-08-23 13:01:37 -05:00
}
// Lower click is registered
dom.handle_event(
"click",
Rc::new(PlatformEventData::new(Box::<SerializedMouseData>::default())),
ElementId(2),
true,
);
2023-08-23 13:01:37 -05:00
assert_eq!(*CLICKS.lock().unwrap(), 3);
// break reference....
for _ in 0..5 {
dom.mark_dirty(ScopeId(0));
2024-01-10 19:21:15 -06:00
_ = dom.render_immediate_to_vec();
2023-08-23 13:01:37 -05:00
}
// Stop propagation occurs
dom.handle_event(
"click",
Rc::new(PlatformEventData::new(Box::<SerializedMouseData>::default())),
ElementId(2),
true,
);
2023-08-23 13:01:37 -05:00
assert_eq!(*CLICKS.lock().unwrap(), 3);
}
fn app() -> Element {
2023-08-23 13:01:37 -05:00
render! {
2024-01-04 19:36:10 -06:00
div { onclick: move |_| {
2023-08-23 13:01:37 -05:00
println!("top clicked");
*CLICKS.lock().unwrap() += 1;
},
2023-09-05 21:21:54 -05:00
vec![
render! {
problematic_child {}
}
].into_iter()
2023-08-23 13:01:37 -05:00
}
}
}
2024-01-11 11:11:44 -06:00
fn problematic_child() -> Element {
2023-08-23 13:01:37 -05:00
render! {
2024-01-04 19:36:10 -06:00
button { onclick: move |evt| {
2023-09-11 16:16:16 -05:00
println!("bottom clicked");
2023-08-23 13:01:37 -05:00
let mut clicks = CLICKS.lock().unwrap();
if *clicks == 3 {
evt.stop_propagation();
} else {
*clicks += 1;
}
2024-01-04 19:36:10 -06:00
} }
2023-08-23 13:01:37 -05:00
}
}