@@ -11,10 +11,10 @@ use tauri_runtime::{
1111 } ,
1212 menu:: { CustomMenuItem , Menu , MenuEntry , MenuHash , MenuId , MenuItem , MenuUpdate } ,
1313 monitor:: Monitor ,
14- webview:: { FileDropEvent , FileDropHandler , WebviewIpcHandler , WindowBuilder , WindowBuilderBase } ,
14+ webview:: { WebviewIpcHandler , WindowBuilder , WindowBuilderBase } ,
1515 window:: {
1616 dpi:: { LogicalPosition , LogicalSize , PhysicalPosition , PhysicalSize , Position , Size } ,
17- DetachedWindow , JsEventListenerKey , PendingWindow , WindowEvent ,
17+ DetachedWindow , FileDropEvent , JsEventListenerKey , PendingWindow , WindowEvent ,
1818 } ,
1919 ClipboardManager , Dispatch , Error , ExitRequestedEventAction , GlobalShortcutManager , Result ,
2020 RunEvent , RunIteration , Runtime , RuntimeHandle , UserAttentionType , WindowIcon ,
@@ -2624,7 +2624,6 @@ fn create_webview(
26242624 uri_scheme_protocols,
26252625 mut window_builder,
26262626 ipc_handler,
2627- file_drop_handler,
26282627 label,
26292628 url,
26302629 menu_ids,
@@ -2663,17 +2662,11 @@ fn create_webview(
26632662 . with_url ( & url)
26642663 . unwrap ( ) // safe to unwrap because we validate the URL beforehand
26652664 . with_transparent ( is_window_transparent) ;
2665+ if webview_attributes. file_drop_handler_enabled {
2666+ webview_builder = webview_builder. with_file_drop_handler ( create_file_drop_handler ( & context) ) ;
2667+ }
26662668 if let Some ( handler) = ipc_handler {
26672669 webview_builder = webview_builder. with_ipc_handler ( create_ipc_handler (
2668- context. clone ( ) ,
2669- label. clone ( ) ,
2670- menu_ids. clone ( ) ,
2671- js_event_listeners. clone ( ) ,
2672- handler,
2673- ) ) ;
2674- }
2675- if let Some ( handler) = file_drop_handler {
2676- webview_builder = webview_builder. with_file_drop_handler ( create_file_drop_handler (
26772670 context,
26782671 label. clone ( ) ,
26792672 menu_ids,
@@ -2763,26 +2756,25 @@ fn create_ipc_handler(
27632756 } )
27642757}
27652758
2766- /// Create a wry file drop handler from a tauri file drop handler .
2759+ /// Create a wry file drop handler.
27672760fn create_file_drop_handler (
2768- context : Context ,
2769- label : String ,
2770- menu_ids : Arc < Mutex < HashMap < MenuHash , MenuId > > > ,
2771- js_event_listeners : Arc < Mutex < HashMap < JsEventListenerKey , HashSet < u64 > > > > ,
2772- handler : FileDropHandler < Wry > ,
2761+ context : & Context ,
27732762) -> Box < dyn Fn ( & Window , WryFileDropEvent ) -> bool + ' static > {
2763+ let window_event_listeners = context. window_event_listeners . clone ( ) ;
27742764 Box :: new ( move |window, event| {
2775- handler (
2776- FileDropEventWrapper ( event) . into ( ) ,
2777- DetachedWindow {
2778- dispatcher : WryDispatcher {
2779- window_id : window. id ( ) ,
2780- context : context. clone ( ) ,
2781- } ,
2782- label : label. clone ( ) ,
2783- menu_ids : menu_ids. clone ( ) ,
2784- js_event_listeners : js_event_listeners. clone ( ) ,
2785- } ,
2786- )
2765+ let event: FileDropEvent = FileDropEventWrapper ( event) . into ( ) ;
2766+ let window_event = WindowEvent :: FileDrop ( event) ;
2767+ let listeners = window_event_listeners. lock ( ) . unwrap ( ) ;
2768+ if let Some ( window_listeners) = listeners. get ( & window. id ( ) ) {
2769+ let listeners_map = window_listeners. lock ( ) . unwrap ( ) ;
2770+ let has_listener = !listeners_map. is_empty ( ) ;
2771+ for listener in listeners_map. values ( ) {
2772+ listener ( & window_event) ;
2773+ }
2774+ // block the default OS action on file drop if we had a listener
2775+ has_listener
2776+ } else {
2777+ false
2778+ }
27872779 } )
27882780}
0 commit comments