event_propagation.rs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. use dioxus::prelude::*;
  2. use dioxus_core::ElementId;
  3. use std::{rc::Rc, sync::Mutex};
  4. static CLICKS: Mutex<usize> = Mutex::new(0);
  5. #[test]
  6. fn events_propagate() {
  7. set_event_converter(Box::new(dioxus::html::SerializedHtmlEventConverter));
  8. let mut dom = VirtualDom::new(app);
  9. dom.rebuild(&mut dioxus_core::NoOpMutations);
  10. // Top-level click is registered
  11. dom.handle_event(
  12. "click",
  13. Rc::new(PlatformEventData::new(Box::<SerializedMouseData>::default())),
  14. ElementId(1),
  15. true,
  16. );
  17. assert_eq!(*CLICKS.lock().unwrap(), 1);
  18. // break reference....
  19. for _ in 0..5 {
  20. dom.mark_dirty(ScopeId(0));
  21. _ = dom.render_immediate_to_vec();
  22. }
  23. // Lower click is registered
  24. dom.handle_event(
  25. "click",
  26. Rc::new(PlatformEventData::new(Box::<SerializedMouseData>::default())),
  27. ElementId(2),
  28. true,
  29. );
  30. assert_eq!(*CLICKS.lock().unwrap(), 3);
  31. // break reference....
  32. for _ in 0..5 {
  33. dom.mark_dirty(ScopeId(0));
  34. _ = dom.render_immediate_to_vec();
  35. }
  36. // Stop propagation occurs
  37. dom.handle_event(
  38. "click",
  39. Rc::new(PlatformEventData::new(Box::<SerializedMouseData>::default())),
  40. ElementId(2),
  41. true,
  42. );
  43. assert_eq!(*CLICKS.lock().unwrap(), 3);
  44. }
  45. fn app() -> Element {
  46. rsx! {
  47. div { onclick: move |_| {
  48. println!("top clicked");
  49. *CLICKS.lock().unwrap() += 1;
  50. },
  51. {vec![
  52. rsx! {
  53. problematic_child {}
  54. }
  55. ].into_iter()}
  56. }
  57. }
  58. }
  59. fn problematic_child() -> Element {
  60. rsx! {
  61. button { onclick: move |evt| {
  62. println!("bottom clicked");
  63. let mut clicks = CLICKS.lock().unwrap();
  64. if *clicks == 3 {
  65. evt.stop_propagation();
  66. } else {
  67. *clicks += 1;
  68. }
  69. } }
  70. }
  71. }