@@ -10,7 +10,7 @@ mod state;
1010
1111use std:: str:: FromStr ;
1212use std:: sync:: atomic:: Ordering ;
13- use std:: sync:: Arc ;
13+ use std:: sync:: { Arc , OnceLock , RwLock } ;
1414
1515use wry:: cookie:: time:: OffsetDateTime ;
1616use wry:: cookie:: { Cookie , Expiration , SameSite } ;
@@ -159,14 +159,46 @@ pub fn set_log_enabled(enabled: bool) {
159159 LOG_ENABLED . store ( enabled, Ordering :: Relaxed ) ;
160160}
161161
162+ #[ uniffi:: export( callback_interface) ]
163+ pub trait NativeLogger : Send + Sync {
164+ fn handle_log ( & self , data : String ) ;
165+ }
166+
167+ static GLOBAL_LOGGER : OnceLock < RwLock < Option < Box < dyn NativeLogger > > > > = OnceLock :: new ( ) ;
168+
169+ fn get_logger_registry ( ) -> & ' static RwLock < Option < Box < dyn NativeLogger > > > {
170+ GLOBAL_LOGGER . get_or_init ( || RwLock :: new ( None ) )
171+ }
172+
173+ #[ uniffi:: export]
174+ pub fn set_native_logger ( logger : Box < dyn NativeLogger > ) {
175+ let mut lock = get_logger_registry ( ) . write ( ) . unwrap ( ) ;
176+ * lock = Some ( logger) ;
177+ }
178+
179+ #[ macro_export]
162180macro_rules! wry_log {
163181 ( $( $arg: tt) * ) => {
164- if log_enabled( ) {
165- eprintln!( $( $arg) * ) ;
166- }
182+ $crate:: do_internal_log( format_args!( $( $arg) * ) ) ;
167183 } ;
168184}
169185
186+ #[ doc( hidden) ]
187+ pub fn do_internal_log ( args : std:: fmt:: Arguments ) {
188+ if !log_enabled ( ) {
189+ return ;
190+ }
191+ let log_string = args. to_string ( ) ;
192+
193+ if let Ok ( lock) = crate :: get_logger_registry ( ) . read ( ) {
194+ if let Some ( ref logger) = * lock {
195+ logger. handle_log ( log_string) ;
196+ return ;
197+ }
198+ }
199+ eprintln ! ( "{}" , log_string) ;
200+ }
201+
170202// ============================================================================
171203// WebView Creation
172204// ============================================================================
@@ -364,12 +396,10 @@ pub fn create_webview_with_user_agent(
364396// ============================================================================
365397
366398fn set_bounds_inner ( id : u64 , x : i32 , y : i32 , width : i32 , height : i32 ) -> Result < ( ) , WebViewError > {
367- if log_enabled ( ) {
368- wry_log ! (
369- "[wrywebview] set_bounds id={} pos=({}, {}) size={}x{}" ,
370- id, x, y, width, height
371- ) ;
372- }
399+ wry_log ! (
400+ "[wrywebview] set_bounds id={} pos=({}, {}) size={}x{}" ,
401+ id, x, y, width, height
402+ ) ;
373403 let bounds = make_bounds ( x, y, width, height) ;
374404 with_webview ( id, |webview| webview. set_bounds ( bounds) . map_err ( WebViewError :: from) )
375405}
0 commit comments