diff --git a/desktop/src-tauri/src/macos_file_panel.rs b/desktop/src-tauri/src/macos_file_panel.rs index 165420e7456..a6f2d2a336a 100644 --- a/desktop/src-tauri/src/macos_file_panel.rs +++ b/desktop/src-tauri/src/macos_file_panel.rs @@ -35,6 +35,10 @@ mod tests { env!("CARGO_MANIFEST_DIR"), "/vendor/rfd/src/backend/macos/file_dialog/panel_ffi.rs" )); + const RFD_MODAL: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/vendor/rfd/src/backend/macos/modal_future.rs" + )); #[test] fn patched_wry_cancels_when_nsopenpanel_is_nil() { @@ -67,4 +71,16 @@ mod tests { "typed NSSavePanel::savePanel panics on nil" ); } + + #[test] + fn patched_rfd_nil_panel_returns_cancelled_future() { + assert!( + RFD_MODAL.contains("NSModalResponseCancel"), + "nil panel must complete the modal future as cancelled" + ); + assert!( + RFD_MODAL.contains("return Self { state }"), + "ModalFuture::new returns Self; a bare `return;` on the sync nil-panel path is E0069" + ); + } } diff --git a/desktop/src-tauri/vendor/rfd/src/backend/macos/modal_future.rs b/desktop/src-tauri/vendor/rfd/src/backend/macos/modal_future.rs index 0a43be110ca..828fa249b7d 100644 --- a/desktop/src-tauri/vendor/rfd/src/backend/macos/modal_future.rs +++ b/desktop/src-tauri/vendor/rfd/src/backend/macos/modal_future.rs @@ -109,8 +109,10 @@ impl ModalFuture { if let Some(mtm) = MainThreadMarker::new() { let Some(modal) = build_modal(mtm) else { - dialog_callback(state, NSModalResponseCancel); - return; + // Constructor returns Self. Complete as cancelled when + // NSOpenPanel/NSSavePanel is nil (E0069 on a unit return). + dialog_callback(state.clone(), NSModalResponseCancel); + return Self { state }; }; let inner = modal.inner_modal().retain();