@@ -886,6 +886,38 @@ public void OnNotFoundSubscriptionIsTriggeredWhenNotFoundCalled()
886886 // Assert
887887 Assert . True ( notFoundTriggered , "The OnNotFound event was not triggered as expected." ) ;
888888 }
889+
890+ [ Fact ]
891+ public void OnNavigateToCallback_WhenThrows_ShouldBeHandledGracefully ( )
892+ {
893+ // Arrange
894+ var baseUri = "scheme://host/" ;
895+ var uri = "scheme://host/test" ;
896+ var testNavManager = new TestNavigationManagerWithCallback ( ) ;
897+ var exceptionThrown = false ;
898+ var expectedException = new InvalidOperationException ( "Test exception from OnNavigateTo" ) ;
899+
900+ // Configure the onNavigateTo callback to throw an exception
901+ testNavManager . ConfigureOnNavigateToCallback ( throwingUri =>
902+ {
903+ exceptionThrown = true ;
904+ throw expectedException ;
905+ } ) ;
906+
907+ // Act
908+ // Initialize the navigation manager with the callback
909+ testNavManager . Initialize ( baseUri , uri , testNavManager . GetOnNavigateToCallback ( ) ) ;
910+
911+ // Assert
912+ Assert . True ( testNavManager . IsInitialized ) ;
913+
914+ // When navigation is triggered, the exception should be handled gracefully
915+ var thrownException = testNavManager . TriggerOnNavigateToCallback ( uri ) ;
916+
917+ // Assert
918+ Assert . True ( exceptionThrown , "The OnNavigateTo callback should have been called and thrown an exception." ) ;
919+ Assert . Same ( expectedException , thrownException ) ;
920+ }
889921
890922 private class TestNavigationManager : NavigationManager
891923 {
@@ -932,4 +964,64 @@ protected override void HandleLocationChangingHandlerException(Exception ex, Loc
932964 _exceptionsThrownFromLocationChangingHandlers . Add ( ex ) ;
933965 }
934966 }
967+
968+ private class TestNavigationManagerWithCallback : TestNavigationManager , IHostEnvironmentNavigationManager
969+ {
970+ private Func < string , Task > _onNavigateToCallback ;
971+
972+ public TestNavigationManagerWithCallback ( )
973+ {
974+ }
975+
976+ public void Initialize ( string baseUri , string uri , Func < string , Task > onNavigateTo )
977+ {
978+ _onNavigateToCallback = onNavigateTo ;
979+ base . Initialize ( baseUri , uri ) ;
980+ }
981+
982+ public void ConfigureOnNavigateToCallback ( Func < string , Task > callback )
983+ {
984+ _onNavigateToCallback = callback ;
985+ }
986+
987+ public Func < string , Task > GetOnNavigateToCallback ( )
988+ {
989+ return _onNavigateToCallback ;
990+ }
991+
992+ public Exception TriggerOnNavigateToCallback ( string uri )
993+ {
994+ if ( _onNavigateToCallback == null )
995+ {
996+ return null ;
997+ }
998+
999+ try
1000+ {
1001+ // Simulate the fire-and-forget pattern used in RemoteNavigationManager
1002+ _ = _onNavigateToCallback ( uri ) ;
1003+ return null ;
1004+ }
1005+ catch ( Exception ex )
1006+ {
1007+ return ex ;
1008+ }
1009+ }
1010+
1011+ public bool IsInitialized
1012+ {
1013+ get
1014+ {
1015+ try
1016+ {
1017+ _ = BaseUri ; // This will throw if not initialized
1018+ return true ;
1019+ }
1020+ catch ( InvalidOperationException )
1021+ {
1022+ return false ;
1023+ }
1024+ }
1025+ }
1026+ }
9351027}
0 commit comments