1
0

event_propagation.rs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. use dioxus::prelude::*;
  2. use dioxus_core::ElementId;
  3. use std::{any::Any, 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. let event = Event::new(
  12. Rc::new(PlatformEventData::new(Box::<SerializedMouseData>::default())) as Rc<dyn Any>,
  13. true,
  14. );
  15. dom.runtime().handle_event("click", event, ElementId(1));
  16. assert_eq!(*CLICKS.lock().unwrap(), 1);
  17. // break reference....
  18. for _ in 0..5 {
  19. dom.mark_dirty(ScopeId(0));
  20. _ = dom.render_immediate_to_vec();
  21. }
  22. // Lower click is registered
  23. let event = Event::new(
  24. Rc::new(PlatformEventData::new(Box::<SerializedMouseData>::default())) as Rc<dyn Any>,
  25. true,
  26. );
  27. dom.runtime().handle_event("click", event, ElementId(2));
  28. assert_eq!(*CLICKS.lock().unwrap(), 3);
  29. // break reference....
  30. for _ in 0..5 {
  31. dom.mark_dirty(ScopeId(0));
  32. _ = dom.render_immediate_to_vec();
  33. }
  34. // Stop propagation occurs
  35. let event = Event::new(
  36. Rc::new(PlatformEventData::new(Box::<SerializedMouseData>::default())) as Rc<dyn Any>,
  37. true,
  38. );
  39. dom.runtime().handle_event("click", event, ElementId(2));
  40. assert_eq!(*CLICKS.lock().unwrap(), 3);
  41. }
  42. fn app() -> Element {
  43. rsx! {
  44. div { onclick: move |_| {
  45. println!("top clicked");
  46. *CLICKS.lock().unwrap() += 1;
  47. },
  48. {vec![
  49. rsx! {
  50. problematic_child {}
  51. }
  52. ].into_iter()}
  53. }
  54. }
  55. }
  56. fn problematic_child() -> Element {
  57. rsx! {
  58. button { onclick: move |evt| {
  59. println!("bottom clicked");
  60. let mut clicks = CLICKS.lock().unwrap();
  61. if *clicks == 3 {
  62. evt.stop_propagation();
  63. } else {
  64. *clicks += 1;
  65. }
  66. } }
  67. }
  68. }