rendering.rs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. use dioxus::prelude::*;
  2. use dioxus_core::Element;
  3. use dioxus_desktop::DesktopContext;
  4. fn main() {
  5. check_app_exits(check_html_renders);
  6. }
  7. pub(crate) fn check_app_exits(app: Component) {
  8. use dioxus_desktop::Config;
  9. use tao::window::WindowBuilder;
  10. // This is a deadman's switch to ensure that the app exits
  11. let should_panic = std::sync::Arc::new(std::sync::atomic::AtomicBool::new(true));
  12. let should_panic_clone = should_panic.clone();
  13. std::thread::spawn(move || {
  14. std::thread::sleep(std::time::Duration::from_secs(100));
  15. if should_panic_clone.load(std::sync::atomic::Ordering::SeqCst) {
  16. std::process::exit(exitcode::SOFTWARE);
  17. }
  18. });
  19. dioxus_desktop::launch_cfg(
  20. app,
  21. Config::new().with_window(WindowBuilder::new().with_visible(true)),
  22. );
  23. should_panic.store(false, std::sync::atomic::Ordering::SeqCst);
  24. }
  25. fn use_inner_html(d: &'static str) -> Option<String> {
  26. let value: Signal<Option<String>> = use_signal(|| None);
  27. use_effect(|| async move {
  28. tokio::time::sleep(std::time::Duration::from_millis(100)).await;
  29. window().eval();
  30. let html = eval_provider(&format!(
  31. r#"let element = document.getElementById('{}');
  32. return element.innerHTML"#,
  33. id
  34. ))
  35. .unwrap();
  36. if let Ok(serde_json::Value::String(html)) = html.await {
  37. println!("html: {}", html);
  38. value.set(Some(html));
  39. }
  40. });
  41. value.read().clone()
  42. }
  43. const EXPECTED_HTML: &str = r#"<div id="5" style="width: 100px; height: 100px; color: rgb(0, 0, 0);"><input type="checkbox"><h1>text</h1><div><p>hello world</p></div></div>"#;
  44. fn check_html_renders() -> Element {
  45. let inner_html = use_inner_html("main_div");
  46. let desktop_context: DesktopContext = cx.consume_context().unwrap();
  47. if let Some(raw_html) = inner_html {
  48. println!("{}", raw_html);
  49. let fragment = &raw_html;
  50. let expected = EXPECTED_HTML;
  51. // let fragment = scraper::Html::parse_fragment(&raw_html);
  52. // println!("fragment: {}", fragment.html());
  53. // let expected = scraper::Html::parse_fragment(EXPECTED_HTML);
  54. // println!("expected: {}", expected.html());
  55. assert_eq!(raw_html, EXPECTED_HTML);
  56. if fragment == expected {
  57. println!("html matches");
  58. desktop_context.close();
  59. }
  60. }
  61. let dyn_value = 0;
  62. let dyn_element = rsx! {
  63. div {
  64. dangerous_inner_html: "<p>hello world</p>",
  65. }
  66. };
  67. rsx! {
  68. div {
  69. id: "main_div",
  70. div {
  71. width: "100px",
  72. height: "100px",
  73. color: "rgb({dyn_value}, {dyn_value}, {dyn_value})",
  74. id: 5,
  75. input {
  76. "type": "checkbox",
  77. },
  78. h1 {
  79. "text"
  80. }
  81. {dyn_element}
  82. }
  83. }
  84. }
  85. }