From 1d8ee9c7454bd8030e6eb4be368fca5aac5e899e Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 16 Dec 2022 12:52:37 -0500 Subject: [PATCH 1/3] fix timeouts --- .../webview_flutter_test.dart | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart index 2265aeb4229c..0f332df382b9 100644 --- a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart @@ -144,12 +144,6 @@ Future main() async { PlatformNavigationDelegate( const PlatformNavigationDelegateCreationParams(), )..setOnPageFinished((String url) => pageLoads.add(url)), - ) - ..loadRequest( - LoadRequestParams( - uri: Uri.parse(headersUrl), - headers: headers, - ), ); await tester.pumpWidget( @@ -162,6 +156,10 @@ Future main() async { ), ); + controller.loadRequest( + LoadRequestParams(uri: Uri.parse(headersUrl), headers: headers), + ); + await pageLoads.stream.firstWhere((String url) => url == headersUrl); final String content = await controller.runJavaScriptReturningResult( @@ -699,9 +697,6 @@ Future main() async { ? NavigationDecision.prevent : NavigationDecision.navigate; }), - ) - ..loadRequest( - LoadRequestParams(uri: Uri.parse(blankPageEncoded)), ); await tester.pumpWidget(Builder( @@ -712,6 +707,10 @@ Future main() async { }, )); + controller.loadRequest( + LoadRequestParams(uri: Uri.parse(blankPageEncoded)), + ); + await pageLoads.stream.first; // Wait for initial page load. await controller.runJavaScript('location.href = "$secondaryUrl"'); @@ -816,8 +815,7 @@ Future main() async { ? NavigationDecision.prevent : NavigationDecision.navigate; }), - ) - ..loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -827,6 +825,10 @@ Future main() async { }, )); + controller.loadRequest( + LoadRequestParams(uri: Uri.parse(blankPageEncoded)), + ); + await pageLoads.stream.first; // Wait for initial page load. await controller .runJavaScript('location.href = "https://www.youtube.com/"'); @@ -861,8 +863,7 @@ Future main() async { () => NavigationDecision.navigate); return decision; }), - ) - ..loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); + ); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -872,6 +873,10 @@ Future main() async { }, )); + controller.loadRequest(LoadRequestParams( + uri: Uri.parse(blankPageEncoded), + )); + await pageLoads.stream.first; // Wait for initial page load. await controller.runJavaScript('location.href = "$secondaryUrl"'); From c3458ac97ffeaa27d7b8eada0609514886c4148a Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 16 Dec 2022 13:40:05 -0500 Subject: [PATCH 2/3] remove broadcast instead --- .../webview_flutter_test.dart | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart index 0f332df382b9..521092f5fd8d 100644 --- a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart @@ -144,6 +144,12 @@ Future main() async { PlatformNavigationDelegate( const PlatformNavigationDelegateCreationParams(), )..setOnPageFinished((String url) => pageLoads.add(url)), + ) + ..loadRequest( + LoadRequestParams( + uri: Uri.parse(headersUrl), + headers: headers, + ), ); await tester.pumpWidget( @@ -156,10 +162,6 @@ Future main() async { ), ); - controller.loadRequest( - LoadRequestParams(uri: Uri.parse(headersUrl), headers: headers), - ); - await pageLoads.stream.firstWhere((String url) => url == headersUrl); final String content = await controller.runJavaScriptReturningResult( @@ -680,8 +682,7 @@ Future main() async { '${base64Encode(const Utf8Encoder().convert(blankPage))}'; testWidgets('can allow requests', (WidgetTester tester) async { - final StreamController pageLoads = - StreamController.broadcast(); + final StreamController pageLoads = StreamController(); final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), @@ -697,6 +698,9 @@ Future main() async { ? NavigationDecision.prevent : NavigationDecision.navigate; }), + ) + ..loadRequest( + LoadRequestParams(uri: Uri.parse(blankPageEncoded)), ); await tester.pumpWidget(Builder( @@ -707,10 +711,6 @@ Future main() async { }, )); - controller.loadRequest( - LoadRequestParams(uri: Uri.parse(blankPageEncoded)), - ); - await pageLoads.stream.first; // Wait for initial page load. await controller.runJavaScript('location.href = "$secondaryUrl"'); @@ -798,8 +798,7 @@ Future main() async { }); testWidgets('can block requests', (WidgetTester tester) async { - final StreamController pageLoads = - StreamController.broadcast(); + final StreamController pageLoads = StreamController(); final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), @@ -815,7 +814,8 @@ Future main() async { ? NavigationDecision.prevent : NavigationDecision.navigate; }), - ); + ) + ..loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -825,10 +825,6 @@ Future main() async { }, )); - controller.loadRequest( - LoadRequestParams(uri: Uri.parse(blankPageEncoded)), - ); - await pageLoads.stream.first; // Wait for initial page load. await controller .runJavaScript('location.href = "https://www.youtube.com/"'); @@ -843,8 +839,7 @@ Future main() async { }); testWidgets('supports asynchronous decisions', (WidgetTester tester) async { - final StreamController pageLoads = - StreamController.broadcast(); + final StreamController pageLoads = StreamController(); final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), @@ -863,7 +858,8 @@ Future main() async { () => NavigationDecision.navigate); return decision; }), - ); + ) + ..loadRequest(LoadRequestParams(uri: Uri.parse(blankPageEncoded))); await tester.pumpWidget(Builder( builder: (BuildContext context) { @@ -873,10 +869,6 @@ Future main() async { }, )); - controller.loadRequest(LoadRequestParams( - uri: Uri.parse(blankPageEncoded), - )); - await pageLoads.stream.first; // Wait for initial page load. await controller.runJavaScript('location.href = "$secondaryUrl"'); From b13fee99ca08bbdd4b9d0a4999d2513ba1d29807 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Fri, 16 Dec 2022 14:15:18 -0500 Subject: [PATCH 3/3] just use completers like a lame person --- .../webview_flutter_test.dart | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart index 521092f5fd8d..6326f10fcc31 100644 --- a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart @@ -682,7 +682,7 @@ Future main() async { '${base64Encode(const Utf8Encoder().convert(blankPage))}'; testWidgets('can allow requests', (WidgetTester tester) async { - final StreamController pageLoads = StreamController(); + Completer pageLoaded = Completer(); final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), @@ -692,7 +692,7 @@ Future main() async { PlatformNavigationDelegate( const PlatformNavigationDelegateCreationParams(), ) - ..setOnPageFinished((String url) => pageLoads.add(url)) + ..setOnPageFinished((_) => pageLoaded.complete()) ..setOnNavigationRequest((NavigationRequest navigationRequest) { return (navigationRequest.url.contains('youtube.com')) ? NavigationDecision.prevent @@ -711,10 +711,12 @@ Future main() async { }, )); - await pageLoads.stream.first; // Wait for initial page load. + await pageLoaded.future; // Wait for initial page load. + + pageLoaded = Completer(); await controller.runJavaScript('location.href = "$secondaryUrl"'); + await pageLoaded.future; // Wait for the next page load. - await pageLoads.stream.first; // Wait for the next page load. final String? currentUrl = await controller.currentUrl(); expect(currentUrl, secondaryUrl); }); @@ -798,7 +800,7 @@ Future main() async { }); testWidgets('can block requests', (WidgetTester tester) async { - final StreamController pageLoads = StreamController(); + Completer pageLoaded = Completer(); final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), @@ -808,7 +810,7 @@ Future main() async { PlatformNavigationDelegate( const PlatformNavigationDelegateCreationParams(), ) - ..setOnPageFinished((String url) => pageLoads.add(url)) + ..setOnPageFinished((_) => pageLoaded.complete()) ..setOnNavigationRequest((NavigationRequest navigationRequest) { return (navigationRequest.url.contains('youtube.com')) ? NavigationDecision.prevent @@ -825,21 +827,23 @@ Future main() async { }, )); - await pageLoads.stream.first; // Wait for initial page load. + await pageLoaded.future; // Wait for initial page load. + + pageLoaded = Completer(); await controller .runJavaScript('location.href = "https://www.youtube.com/"'); // There should never be any second page load, since our new URL is // blocked. Still wait for a potential page change for some time in order // to give the test a chance to fail. - await pageLoads.stream.first - .timeout(const Duration(milliseconds: 500), onTimeout: () => ''); + await pageLoaded.future + .timeout(const Duration(milliseconds: 500), onTimeout: () => false); final String? currentUrl = await controller.currentUrl(); expect(currentUrl, isNot(contains('youtube.com'))); }); testWidgets('supports asynchronous decisions', (WidgetTester tester) async { - final StreamController pageLoads = StreamController(); + Completer pageLoaded = Completer(); final PlatformWebViewController controller = PlatformWebViewController( const PlatformWebViewControllerCreationParams(), @@ -849,7 +853,7 @@ Future main() async { PlatformNavigationDelegate( const PlatformNavigationDelegateCreationParams(), ) - ..setOnPageFinished((String url) => pageLoads.add(url)) + ..setOnPageFinished((_) => pageLoaded.complete()) ..setOnNavigationRequest( (NavigationRequest navigationRequest) async { NavigationDecision decision = NavigationDecision.prevent; @@ -869,10 +873,12 @@ Future main() async { }, )); - await pageLoads.stream.first; // Wait for initial page load. + await pageLoaded.future; // Wait for initial page load. + + pageLoaded = Completer(); await controller.runJavaScript('location.href = "$secondaryUrl"'); + await pageLoaded.future; // Wait for second page to load. - await pageLoads.stream.first; // Wait for second page to load. final String? currentUrl = await controller.currentUrl(); expect(currentUrl, secondaryUrl); });