diff --git a/packages/desktop/build.rs b/packages/desktop/build.rs index f114ae084..8d1f4b3e5 100644 --- a/packages/desktop/build.rs +++ b/packages/desktop/build.rs @@ -51,15 +51,21 @@ fn main() { }"#; let polling_request = format!( r#"// Poll for requests - window.interpreter.wait_for_request = () => {{ + window.interpreter.wait_for_request = (headless) => {{ fetch(new Request("{EDITS_PATH}")) .then(response => {{ response.arrayBuffer() .then(bytes => {{ - requestAnimationFrame(() => {{ + // In headless mode, the requestAnimationFrame callback is never called, so we need to run the bytes directly + if (headless) {{ run_from_bytes(bytes); - }}); - window.interpreter.wait_for_request(); + }} + else {{ + requestAnimationFrame(() => {{ + run_from_bytes(bytes); + }}); + }} + window.interpreter.wait_for_request(headless); }}); }}) }}"# diff --git a/packages/desktop/headless_tests/events.rs b/packages/desktop/headless_tests/events.rs index bb3b46206..646b951e1 100644 --- a/packages/desktop/headless_tests/events.rs +++ b/packages/desktop/headless_tests/events.rs @@ -17,7 +17,7 @@ pub(crate) fn check_app_exits(app: Component) { dioxus_desktop::launch_cfg( app, - Config::new().with_window(WindowBuilder::new().with_visible(true)), + Config::new().with_window(WindowBuilder::new().with_visible(false)), ); // Stop deadman's switch diff --git a/packages/desktop/src/protocol.rs b/packages/desktop/src/protocol.rs index 1dca21759..8184821ba 100644 --- a/packages/desktop/src/protocol.rs +++ b/packages/desktop/src/protocol.rs @@ -12,7 +12,7 @@ use crate::desktop_context::EditQueue; static MINIFIED: &str = include_str!("./minified.js"); -fn module_loader(root_name: &str) -> String { +fn module_loader(root_name: &str, headless: bool) -> String { format!( r#" "# @@ -39,6 +39,7 @@ pub(super) fn desktop_handler( custom_index: Option, root_name: &str, edit_queue: &EditQueue, + headless: bool, ) { // If the request is for the root, we'll serve the index.html file. if request.uri().path() == "/" { @@ -46,7 +47,7 @@ pub(super) fn desktop_handler( // we'll look for the closing tag and insert our little module loader there. let body = match custom_index { Some(custom_index) => custom_index - .replace("", &format!("{}", module_loader(root_name))) + .replace("", &format!("{}", module_loader(root_name, headless))) .into_bytes(), None => { @@ -58,7 +59,7 @@ pub(super) fn desktop_handler( } template - .replace("", &module_loader(root_name)) + .replace("", &module_loader(root_name, headless)) .into_bytes() } }; diff --git a/packages/desktop/src/webview.rs b/packages/desktop/src/webview.rs index 426cc8706..d921a880f 100644 --- a/packages/desktop/src/webview.rs +++ b/packages/desktop/src/webview.rs @@ -33,6 +33,7 @@ pub(crate) fn build( let mut web_context = WebContext::new(cfg.data_dir.clone()); let edit_queue = EditQueue::default(); + let headless = !cfg.window.window.visible; let mut webview = WebViewBuilder::new(window) .unwrap() @@ -55,6 +56,7 @@ pub(crate) fn build( index_file.clone(), &root_name, &edit_queue, + headless ) } })