diff --git a/lib/web_ui/lib/src/engine/window.dart b/lib/web_ui/lib/src/engine/window.dart index 11af5ef1bb3f0..f48f7909a089e 100644 --- a/lib/web_ui/lib/src/engine/window.dart +++ b/lib/web_ui/lib/src/engine/window.dart @@ -191,8 +191,23 @@ class EngineFlutterWindow extends ui.SingletonFlutterWindow { return true; case 'routeInformationUpdated': assert(arguments != null); + final String? uriString = arguments!.tryString('uri'); + final String path; + if (uriString != null) { + final Uri uri = Uri.parse(uriString); + // Need to remove scheme and authority. + path = Uri.decodeComponent( + Uri( + path: uri.path.isEmpty ? '/' : uri.path, + queryParameters: uri.queryParametersAll.isEmpty ? null : uri.queryParametersAll, + fragment: uri.fragment.isEmpty ? null : uri.fragment, + ).toString(), + ); + } else { + path = arguments.tryString('location')!; + } browserHistory.setRouteName( - arguments!.tryString('location'), + path, state: arguments['state'], replace: arguments.tryBool('replace') ?? false, ); diff --git a/lib/web_ui/test/window_test.dart b/lib/web_ui/test/window_test.dart index b356b6fba11df..d37bdbdc2b335 100644 --- a/lib/web_ui/test/window_test.dart +++ b/lib/web_ui/test/window_test.dart @@ -301,6 +301,30 @@ void testMain() { expect(actualState['state4']['substate2'], 'string2'); }); + test('routeInformationUpdated can handle uri', + () async { + await window.debugInitializeHistory(TestUrlStrategy.fromEntry( + const TestHistoryEntry('initial state', null, '/initial'), + ), useSingle: false); + expect(window.browserHistory, isA()); + + // routeInformationUpdated does not + final Completer callback = Completer(); + window.sendPlatformMessage( + 'flutter/navigation', + const JSONMethodCodec().encodeMethodCall(const MethodCall( + 'routeInformationUpdated', + { + 'uri': 'http://myhostname.com/baz?abc=def#fragment', + }, + )), + (_) { callback.complete(); }, + ); + await callback.future; + expect(window.browserHistory, isA()); + expect(window.browserHistory.urlStrategy!.getPath(), '/baz?abc=def#fragment'); + }); + test('can replace in MultiEntriesBrowserHistory', () async { await window.debugInitializeHistory(TestUrlStrategy.fromEntry(