From 8a4a61b6fc8d570336f1433f6f3bf82aea4c5b32 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 4 Aug 2022 14:44:00 -0700 Subject: [PATCH 01/11] some test setup --- .../webview_flutter_test.dart | 772 +++++++++--------- .../lib/src/android_webview.dart | 2 + .../webview_flutter_android/run_test.dart | 3 + 3 files changed, 395 insertions(+), 382 deletions(-) create mode 100644 packages/webview_flutter/webview_flutter_android/run_test.dart 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 c5bf76d2c6cb..11fd7832c46f 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 @@ -28,8 +28,6 @@ import 'package:webview_flutter_platform_interface/webview_flutter_platform_inte Future main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - const bool _skipDueToIssue86757 = true; - final HttpServer server = await HttpServer.bind(InternetAddress.anyIPv4, 0); server.forEach((HttpRequest request) { if (request.uri.path == '/hello.txt') { @@ -50,12 +48,38 @@ Future main() async { final String secondaryUrl = '$prefixUrl/secondary.txt'; final String headersUrl = '$prefixUrl/headers'; - testWidgets('initialUrl', (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - await tester.pumpWidget( - MaterialApp( - home: Directionality( + testWidgets( + 'initialUrl', + (WidgetTester tester) async { + final Completer controllerCompleter = + Completer(); + await tester.pumpWidget( + MaterialApp( + home: Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + initialUrl: primaryUrl, + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + ), + ), + ), + ); + final WebViewController controller = await controllerCompleter.future; + final String? currentUrl = await controller.currentUrl(); + expect(currentUrl, primaryUrl); + }, + ); + + testWidgets( + 'loadUrl', + (WidgetTester tester) async { + final Completer controllerCompleter = + Completer(); + await tester.pumpWidget( + Directionality( textDirection: TextDirection.ltr, child: WebView( key: GlobalKey(), @@ -65,34 +89,13 @@ Future main() async { }, ), ), - ), - ); - final WebViewController controller = await controllerCompleter.future; - final String? currentUrl = await controller.currentUrl(); - expect(currentUrl, primaryUrl); - }, skip: _skipDueToIssue86757); - - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 - testWidgets('loadUrl', (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: GlobalKey(), - initialUrl: primaryUrl, - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - ), - ), - ); - final WebViewController controller = await controllerCompleter.future; - await controller.loadUrl(secondaryUrl); - final String? currentUrl = await controller.currentUrl(); - expect(currentUrl, secondaryUrl); - }, skip: _skipDueToIssue86757); + ); + final WebViewController controller = await controllerCompleter.future; + await controller.loadUrl(secondaryUrl); + final String? currentUrl = await controller.currentUrl(); + expect(currentUrl, secondaryUrl); + }, + ); testWidgets('evaluateJavascript', (WidgetTester tester) async { final Completer controllerCompleter = @@ -115,91 +118,96 @@ Future main() async { expect(result, equals('2')); }); - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 - testWidgets('loadUrl with headers', (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - final StreamController pageStarts = StreamController(); - final StreamController pageLoads = StreamController(); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: GlobalKey(), - initialUrl: primaryUrl, - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - javascriptMode: JavascriptMode.unrestricted, - onPageStarted: (String url) { - pageStarts.add(url); - }, - onPageFinished: (String url) { - pageLoads.add(url); - }, + testWidgets( + 'loadUrl with headers', + (WidgetTester tester) async { + final Completer controllerCompleter = + Completer(); + final StreamController pageStarts = StreamController(); + final StreamController pageLoads = StreamController(); + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + initialUrl: primaryUrl, + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + onPageStarted: (String url) { + pageStarts.add(url); + }, + onPageFinished: (String url) { + pageLoads.add(url); + }, + ), ), - ), - ); - final WebViewController controller = await controllerCompleter.future; - final Map headers = { - 'test_header': 'flutter_test_header' - }; - await controller.loadUrl(headersUrl, headers: headers); - final String? currentUrl = await controller.currentUrl(); - expect(currentUrl, headersUrl); + ); + final WebViewController controller = await controllerCompleter.future; + final Map headers = { + 'test_header': 'flutter_test_header' + }; + await controller.loadUrl(headersUrl, headers: headers); + final String? currentUrl = await controller.currentUrl(); + expect(currentUrl, headersUrl); - await pageStarts.stream.firstWhere((String url) => url == currentUrl); - await pageLoads.stream.firstWhere((String url) => url == currentUrl); + await pageStarts.stream.firstWhere((String url) => url == currentUrl); + await pageLoads.stream.firstWhere((String url) => url == currentUrl); - final String content = await controller - .runJavascriptReturningResult('document.documentElement.innerText'); - expect(content.contains('flutter_test_header'), isTrue); - }, skip: _skipDueToIssue86757); + final String content = await controller + .runJavascriptReturningResult('document.documentElement.innerText'); + expect(content.contains('flutter_test_header'), isTrue); + }, + ); - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 - testWidgets('JavascriptChannel', (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - final Completer pageStarted = Completer(); - final Completer pageLoaded = Completer(); - final List messagesReceived = []; - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: GlobalKey(), - // This is the data URL for: '' - initialUrl: - 'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+', - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - javascriptMode: JavascriptMode.unrestricted, - javascriptChannels: { - JavascriptChannel( - name: 'Echo', - onMessageReceived: (JavascriptMessage message) { - messagesReceived.add(message.message); - }, - ), - }, - onPageStarted: (String url) { - pageStarted.complete(null); - }, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, + testWidgets( + 'JavascriptChannel', + (WidgetTester tester) async { + final Completer controllerCompleter = + Completer(); + final Completer pageStarted = Completer(); + final Completer pageLoaded = Completer(); + final List messagesReceived = []; + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + // This is the data URL for: '' + initialUrl: + 'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + javascriptChannels: { + JavascriptChannel( + name: 'Echo', + onMessageReceived: (JavascriptMessage message) { + print('Message received later'); + messagesReceived.add(message.message); + }, + ), + }, + onPageStarted: (String url) { + pageStarted.complete(null); + }, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + ), ), - ), - ); - final WebViewController controller = await controllerCompleter.future; - await pageStarted.future; - await pageLoaded.future; + ); + final WebViewController controller = await controllerCompleter.future; + await pageStarted.future; + await pageLoaded.future; - expect(messagesReceived, isEmpty); - await controller.runJavascript('Echo.postMessage("hello");'); - expect(messagesReceived, equals(['hello'])); - }, skip: _skipDueToIssue86757); + expect(messagesReceived, isEmpty); + await controller.runJavascript('Echo.postMessage("hello");'); + expect(messagesReceived, equals(['hello'])); + }, + ); testWidgets('resize webview', (WidgetTester tester) async { final Completer initialResizeCompleter = Completer(); @@ -268,57 +276,58 @@ Future main() async { expect(customUserAgent2, 'Custom_User_Agent2'); }); - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 - testWidgets('use default platform userAgent after webView is rebuilt', - (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - final GlobalKey _globalKey = GlobalKey(); - // Build the webView with no user agent to get the default platform user agent. - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: _globalKey, - initialUrl: primaryUrl, - javascriptMode: JavascriptMode.unrestricted, - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, + testWidgets( + 'use default platform userAgent after webView is rebuilt', + (WidgetTester tester) async { + final Completer controllerCompleter = + Completer(); + final GlobalKey _globalKey = GlobalKey(); + // Build the webView with no user agent to get the default platform user agent. + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: _globalKey, + initialUrl: primaryUrl, + javascriptMode: JavascriptMode.unrestricted, + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + ), ), - ), - ); - final WebViewController controller = await controllerCompleter.future; - final String defaultPlatformUserAgent = await _getUserAgent(controller); - // rebuild the WebView with a custom user agent. - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: _globalKey, - initialUrl: 'about:blank', - javascriptMode: JavascriptMode.unrestricted, - userAgent: 'Custom_User_Agent', + ); + final WebViewController controller = await controllerCompleter.future; + final String defaultPlatformUserAgent = await _getUserAgent(controller); + // rebuild the WebView with a custom user agent. + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: _globalKey, + initialUrl: 'about:blank', + javascriptMode: JavascriptMode.unrestricted, + userAgent: 'Custom_User_Agent', + ), ), - ), - ); - final String customUserAgent = await _getUserAgent(controller); - expect(customUserAgent, 'Custom_User_Agent'); - // rebuilds the WebView with no user agent. - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: _globalKey, - initialUrl: 'about:blank', - javascriptMode: JavascriptMode.unrestricted, + ); + final String customUserAgent = await _getUserAgent(controller); + expect(customUserAgent, 'Custom_User_Agent'); + // rebuilds the WebView with no user agent. + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: _globalKey, + initialUrl: 'about:blank', + javascriptMode: JavascriptMode.unrestricted, + ), ), - ), - ); + ); - final String customUserAgent2 = await _getUserAgent(controller); - expect(customUserAgent2, defaultPlatformUserAgent); - }, skip: _skipDueToIssue86757); + final String customUserAgent2 = await _getUserAgent(controller); + expect(customUserAgent2, defaultPlatformUserAgent); + }, + ); group('Video playback policy', () { late String videoTestBase64; @@ -744,9 +753,10 @@ Future main() async { }); group('Programmatic Scroll', () { - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 - testWidgets('setAndGetScrollPosition', (WidgetTester tester) async { - const String scrollTestPage = ''' + testWidgets( + 'setAndGetScrollPosition', + (WidgetTester tester) async { + const String scrollTestPage = ''' @@ -767,59 +777,60 @@ Future main() async { '''; - final String scrollTestPageBase64 = - base64Encode(const Utf8Encoder().convert(scrollTestPage)); + final String scrollTestPageBase64 = + base64Encode(const Utf8Encoder().convert(scrollTestPage)); - final Completer pageLoaded = Completer(); - final Completer controllerCompleter = - Completer(); + final Completer pageLoaded = Completer(); + final Completer controllerCompleter = + Completer(); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - initialUrl: - 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + initialUrl: + 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + ), ), - ), - ); - - final WebViewController controller = await controllerCompleter.future; - await pageLoaded.future; + ); - await tester.pumpAndSettle(const Duration(seconds: 3)); - - int scrollPosX = await controller.getScrollX(); - int scrollPosY = await controller.getScrollY(); - - // Check scrollTo() - const int X_SCROLL = 123; - const int Y_SCROLL = 321; - // Get the initial position; this ensures that scrollTo is actually - // changing something, but also gives the native view's scroll position - // time to settle. - expect(scrollPosX, isNot(X_SCROLL)); - expect(scrollPosX, isNot(Y_SCROLL)); - - await controller.scrollTo(X_SCROLL, Y_SCROLL); - scrollPosX = await controller.getScrollX(); - scrollPosY = await controller.getScrollY(); - expect(scrollPosX, X_SCROLL); - expect(scrollPosY, Y_SCROLL); - - // Check scrollBy() (on top of scrollTo()) - await controller.scrollBy(X_SCROLL, Y_SCROLL); - scrollPosX = await controller.getScrollX(); - scrollPosY = await controller.getScrollY(); - expect(scrollPosX, X_SCROLL * 2); - expect(scrollPosY, Y_SCROLL * 2); - }, skip: _skipDueToIssue86757); + final WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; + + await tester.pumpAndSettle(const Duration(seconds: 3)); + + int scrollPosX = await controller.getScrollX(); + int scrollPosY = await controller.getScrollY(); + + // Check scrollTo() + const int X_SCROLL = 123; + const int Y_SCROLL = 321; + // Get the initial position; this ensures that scrollTo is actually + // changing something, but also gives the native view's scroll position + // time to settle. + expect(scrollPosX, isNot(X_SCROLL)); + expect(scrollPosX, isNot(Y_SCROLL)); + + await controller.scrollTo(X_SCROLL, Y_SCROLL); + scrollPosX = await controller.getScrollX(); + scrollPosY = await controller.getScrollY(); + expect(scrollPosX, X_SCROLL); + expect(scrollPosY, Y_SCROLL); + + // Check scrollBy() (on top of scrollTo()) + await controller.scrollBy(X_SCROLL, Y_SCROLL); + scrollPosX = await controller.getScrollX(); + scrollPosY = await controller.getScrollY(); + expect(scrollPosX, X_SCROLL * 2); + expect(scrollPosY, Y_SCROLL * 2); + }, + ); }); group('SurfaceAndroidWebView', () { @@ -831,9 +842,10 @@ Future main() async { WebView.platform = AndroidWebView(); }); - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 - testWidgets('setAndGetScrollPosition', (WidgetTester tester) async { - const String scrollTestPage = ''' + testWidgets( + 'setAndGetScrollPosition', + (WidgetTester tester) async { + const String scrollTestPage = ''' @@ -854,56 +866,57 @@ Future main() async { '''; - final String scrollTestPageBase64 = - base64Encode(const Utf8Encoder().convert(scrollTestPage)); + final String scrollTestPageBase64 = + base64Encode(const Utf8Encoder().convert(scrollTestPage)); - final Completer pageLoaded = Completer(); - final Completer controllerCompleter = - Completer(); + final Completer pageLoaded = Completer(); + final Completer controllerCompleter = + Completer(); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - initialUrl: - 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + initialUrl: + 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + ), ), - ), - ); + ); - final WebViewController controller = await controllerCompleter.future; - await pageLoaded.future; + final WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; - await tester.pumpAndSettle(const Duration(seconds: 3)); + await tester.pumpAndSettle(const Duration(seconds: 3)); - // Check scrollTo() - const int X_SCROLL = 123; - const int Y_SCROLL = 321; + // Check scrollTo() + const int X_SCROLL = 123; + const int Y_SCROLL = 321; - await controller.scrollTo(X_SCROLL, Y_SCROLL); - int scrollPosX = await controller.getScrollX(); - int scrollPosY = await controller.getScrollY(); - expect(X_SCROLL, scrollPosX); - expect(Y_SCROLL, scrollPosY); + await controller.scrollTo(X_SCROLL, Y_SCROLL); + int scrollPosX = await controller.getScrollX(); + int scrollPosY = await controller.getScrollY(); + expect(X_SCROLL, scrollPosX); + expect(Y_SCROLL, scrollPosY); - // Check scrollBy() (on top of scrollTo()) - await controller.scrollBy(X_SCROLL, Y_SCROLL); - scrollPosX = await controller.getScrollX(); - scrollPosY = await controller.getScrollY(); - expect(X_SCROLL * 2, scrollPosX); - expect(Y_SCROLL * 2, scrollPosY); - }, skip: _skipDueToIssue86757); + // Check scrollBy() (on top of scrollTo()) + await controller.scrollBy(X_SCROLL, Y_SCROLL); + scrollPosX = await controller.getScrollX(); + scrollPosY = await controller.getScrollY(); + expect(X_SCROLL * 2, scrollPosX); + expect(Y_SCROLL * 2, scrollPosY); + }, + ); - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 - testWidgets('inputs are scrolled into view when focused', - (WidgetTester tester) async { - const String scrollTestPage = ''' + testWidgets( + 'inputs are scrolled into view when focused', + (WidgetTester tester) async { + const String scrollTestPage = ''' @@ -927,86 +940,87 @@ Future main() async { '''; - final String scrollTestPageBase64 = - base64Encode(const Utf8Encoder().convert(scrollTestPage)); - - final Completer pageLoaded = Completer(); - final Completer controllerCompleter = - Completer(); - - await tester.runAsync(() async { - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: SizedBox( - width: 200, - height: 200, - child: WebView( - initialUrl: - 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, - javascriptMode: JavascriptMode.unrestricted, + final String scrollTestPageBase64 = + base64Encode(const Utf8Encoder().convert(scrollTestPage)); + + final Completer pageLoaded = Completer(); + final Completer controllerCompleter = + Completer(); + + await tester.runAsync(() async { + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: SizedBox( + width: 200, + height: 200, + child: WebView( + initialUrl: + 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + javascriptMode: JavascriptMode.unrestricted, + ), ), ), - ), - ); - await Future.delayed(const Duration(milliseconds: 20)); - await tester.pump(); - }); - - final WebViewController controller = await controllerCompleter.future; - await pageLoaded.future; - final String viewportRectJSON = await _runJavaScriptReturningResult( - controller, 'JSON.stringify(viewport.getBoundingClientRect())'); - final Map viewportRectRelativeToViewport = - jsonDecode(viewportRectJSON) as Map; - - // Check that the input is originally outside of the viewport. - - final String initialInputClientRectJSON = - await _runJavaScriptReturningResult( - controller, 'JSON.stringify(inputEl.getBoundingClientRect())'); - final Map initialInputClientRectRelativeToViewport = - jsonDecode(initialInputClientRectJSON) as Map; - - expect( - initialInputClientRectRelativeToViewport['bottom'] <= - viewportRectRelativeToViewport['bottom'], - isFalse); - - await controller.runJavascript('inputEl.focus()'); - - // Check that focusing the input brought it into view. - - final String lastInputClientRectJSON = - await _runJavaScriptReturningResult( - controller, 'JSON.stringify(inputEl.getBoundingClientRect())'); - final Map lastInputClientRectRelativeToViewport = - jsonDecode(lastInputClientRectJSON) as Map; - - expect( - lastInputClientRectRelativeToViewport['top'] >= - viewportRectRelativeToViewport['top'], - isTrue); - expect( - lastInputClientRectRelativeToViewport['bottom'] <= - viewportRectRelativeToViewport['bottom'], - isTrue); - - expect( - lastInputClientRectRelativeToViewport['left'] >= - viewportRectRelativeToViewport['left'], - isTrue); - expect( - lastInputClientRectRelativeToViewport['right'] <= - viewportRectRelativeToViewport['right'], - isTrue); - }, skip: _skipDueToIssue86757); + ); + await Future.delayed(const Duration(milliseconds: 20)); + await tester.pump(); + }); + + final WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; + final String viewportRectJSON = await _runJavaScriptReturningResult( + controller, 'JSON.stringify(viewport.getBoundingClientRect())'); + final Map viewportRectRelativeToViewport = + jsonDecode(viewportRectJSON) as Map; + + // Check that the input is originally outside of the viewport. + + final String initialInputClientRectJSON = + await _runJavaScriptReturningResult( + controller, 'JSON.stringify(inputEl.getBoundingClientRect())'); + final Map initialInputClientRectRelativeToViewport = + jsonDecode(initialInputClientRectJSON) as Map; + + expect( + initialInputClientRectRelativeToViewport['bottom'] <= + viewportRectRelativeToViewport['bottom'], + isFalse); + + await controller.runJavascript('inputEl.focus()'); + + // Check that focusing the input brought it into view. + + final String lastInputClientRectJSON = + await _runJavaScriptReturningResult( + controller, 'JSON.stringify(inputEl.getBoundingClientRect())'); + final Map lastInputClientRectRelativeToViewport = + jsonDecode(lastInputClientRectJSON) as Map; + + expect( + lastInputClientRectRelativeToViewport['top'] >= + viewportRectRelativeToViewport['top'], + isTrue); + expect( + lastInputClientRectRelativeToViewport['bottom'] <= + viewportRectRelativeToViewport['bottom'], + isTrue); + + expect( + lastInputClientRectRelativeToViewport['left'] >= + viewportRectRelativeToViewport['left'], + isTrue); + expect( + lastInputClientRectRelativeToViewport['right'] <= + viewportRectRelativeToViewport['right'], + isTrue); + }, + ); }); group('NavigationDelegate', () { @@ -1241,36 +1255,35 @@ Future main() async { expect(currentUrl, primaryUrl); }); - testWidgets('target _blank opens in same window', - (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - final Completer pageLoaded = Completer(); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: GlobalKey(), - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - javascriptMode: JavascriptMode.unrestricted, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, + testWidgets( + 'target _blank opens in same window', + (WidgetTester tester) async { + final Completer controllerCompleter = + Completer(); + final Completer pageLoaded = Completer(); + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + ), ), - ), - ); - final WebViewController controller = await controllerCompleter.future; - await controller.runJavascript('window.open("$primaryUrl", "_blank")'); - await pageLoaded.future; - final String? currentUrl = await controller.currentUrl(); - expect(currentUrl, primaryUrl); - }, - // Flaky on Android: https://github.com/flutter/flutter/issues/86757 - skip: _skipDueToIssue86757); + ); + final WebViewController controller = await controllerCompleter.future; + await controller.runJavascript('window.open("$primaryUrl", "_blank")'); + await pageLoaded.future; + final String? currentUrl = await controller.currentUrl(); + expect(currentUrl, primaryUrl); + }, + ); - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 testWidgets( 'can open new window and go back', (WidgetTester tester) async { @@ -1308,7 +1321,6 @@ Future main() async { await pageLoaded.future; expect(controller.currentUrl(), completion(primaryUrl)); }, - skip: _skipDueToIssue86757, ); testWidgets( @@ -1369,13 +1381,14 @@ Future main() async { final WebViewController controller = await controllerCompleter.future; await pageLoadCompleter.future; - expect(controller.runJavascriptReturningResult('iframeLoaded'), - completion('true')); - expect( - controller.runJavascriptReturningResult( - 'document.querySelector("p") && document.querySelector("p").textContent'), - completion('null'), + final String iframeLoaded = + await controller.runJavascriptReturningResult('iframeLoaded'); + expect(iframeLoaded, 'true'); + + final String elementText = await controller.runJavascriptReturningResult( + 'document.querySelector("p") && document.querySelector("p").textContent', ); + expect(elementText, 'null'); }, ); @@ -1405,21 +1418,16 @@ Future main() async { await controller.runJavascript('localStorage.setItem("myCat", "Tom");'); - expect( - controller.runJavascriptReturningResult( - 'localStorage.getItem("myCat");', - ), - completion('"Tom"'), + final String myCatItem = await controller.runJavascriptReturningResult( + 'localStorage.getItem("myCat");', ); + expect(myCatItem, '"Tom"'); await controller.clearCache(); - - expect( - controller.runJavascriptReturningResult( - 'localStorage.getItem("myCat");', - ), - completion('null'), + final String nullItem = await controller.runJavascriptReturningResult( + 'localStorage.getItem("myCat");', ); + expect(nullItem, 'null'); }, ); } diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart index f2e305fe85c5..a2abf3bbca4f 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart @@ -192,6 +192,7 @@ class WebView extends JavaObject { /// /// Also see compatibility note on [evaluateJavascript]. Future loadUrl(String url, Map headers) { + // print('Calling load URL'); return api.loadUrlFromInstance(this, url, headers); } @@ -210,6 +211,7 @@ class WebView extends JavaObject { /// /// Returns null if no page has been loaded. Future getUrl() { + // print('Calling `getURL`'); return api.getUrlFromInstance(this); } diff --git a/packages/webview_flutter/webview_flutter_android/run_test.dart b/packages/webview_flutter/webview_flutter_android/run_test.dart new file mode 100644 index 000000000000..f3d44c8bc6cd --- /dev/null +++ b/packages/webview_flutter/webview_flutter_android/run_test.dart @@ -0,0 +1,3 @@ +void main() { + +} \ No newline at end of file From 0b7276c17a07026405f3c74fcaf12cc8c74a88f0 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 9 Aug 2022 18:10:53 -0700 Subject: [PATCH 02/11] multi run test code --- .../example/run_test.dart | 41 +++++++++++++++++++ .../webview_flutter_android/run_test.dart | 3 -- 2 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 packages/webview_flutter/webview_flutter_android/example/run_test.dart delete mode 100644 packages/webview_flutter/webview_flutter_android/run_test.dart diff --git a/packages/webview_flutter/webview_flutter_android/example/run_test.dart b/packages/webview_flutter/webview_flutter_android/example/run_test.dart new file mode 100644 index 000000000000..bd2866f2ec6e --- /dev/null +++ b/packages/webview_flutter/webview_flutter_android/example/run_test.dart @@ -0,0 +1,41 @@ +import 'dart:io'; + +final Map failedTests = {}; + +const int runCount = 2; + +void main() async { + for (int i = 0; i < runCount; i++) { + final Process process = await Process.start( + '/Users/bmparr/Development/flutter/bin/flutter', + '--no-color test -d emulator-5554 --timeout 240s integration_test/webview_flutter_test.dart' + .split(' '), + ); + + process.stdout.forEach((List data) { + stdout.add(data); + final String output = String.fromCharCodes(data); + + //00:43 +1 -2: test 3 [E] + if (output.contains('[E]')) { + final String? testName = RegExp( + r'(?<=\d+:\d+ [0-9\+\-\s]+: ).+(?= \[E\])', + ).stringMatch(output); + + if (testName == null) { + print('FAILED TO PARSE TEST NAME: $output'); + } else { + failedTests.putIfAbsent(testName, () => 0); + failedTests[testName] = failedTests[testName]! + 1; + } + } + }); + process.stderr.forEach((List data) { + stderr.add(data); + }); + await process.exitCode; + + print('CURRENT TEST FAILURE COUNTS:'); + print(failedTests); + } +} diff --git a/packages/webview_flutter/webview_flutter_android/run_test.dart b/packages/webview_flutter/webview_flutter_android/run_test.dart deleted file mode 100644 index f3d44c8bc6cd..000000000000 --- a/packages/webview_flutter/webview_flutter_android/run_test.dart +++ /dev/null @@ -1,3 +0,0 @@ -void main() { - -} \ No newline at end of file From 60747fd91a7a9d2183c96f1b03d12d2020805ee0 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 10 Aug 2022 10:34:15 -0700 Subject: [PATCH 03/11] try to fix some tests --- .../webview_flutter_test.dart | 19 ++++++++++++++----- .../example/run_test.dart | 2 +- 2 files changed, 15 insertions(+), 6 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 11fd7832c46f..15ec9e067388 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 @@ -53,6 +53,7 @@ Future main() async { (WidgetTester tester) async { final Completer controllerCompleter = Completer(); + final Completer pageFinishedCompleter = Completer(); await tester.pumpWidget( MaterialApp( home: Directionality( @@ -63,11 +64,15 @@ Future main() async { onWebViewCreated: (WebViewController controller) { controllerCompleter.complete(controller); }, + onPageFinished: pageFinishedCompleter.complete, ), ), ), ); + final WebViewController controller = await controllerCompleter.future; + await pageFinishedCompleter.future; + final String? currentUrl = await controller.currentUrl(); expect(currentUrl, primaryUrl); }, @@ -78,6 +83,7 @@ Future main() async { (WidgetTester tester) async { final Completer controllerCompleter = Completer(); + final Completer pageFinishedCompleter = Completer(); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, @@ -87,11 +93,14 @@ Future main() async { onWebViewCreated: (WebViewController controller) { controllerCompleter.complete(controller); }, + onPageFinished: pageFinishedCompleter.complete, ), ), ); final WebViewController controller = await controllerCompleter.future; await controller.loadUrl(secondaryUrl); + await pageFinishedCompleter.future; + final String? currentUrl = await controller.currentUrl(); expect(currentUrl, secondaryUrl); }, @@ -168,7 +177,7 @@ Future main() async { Completer(); final Completer pageStarted = Completer(); final Completer pageLoaded = Completer(); - final List messagesReceived = []; + final Completer channelCompleter = Completer(); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, @@ -185,8 +194,7 @@ Future main() async { JavascriptChannel( name: 'Echo', onMessageReceived: (JavascriptMessage message) { - print('Message received later'); - messagesReceived.add(message.message); + channelCompleter.complete(message.message); }, ), }, @@ -203,9 +211,10 @@ Future main() async { await pageStarted.future; await pageLoaded.future; - expect(messagesReceived, isEmpty); + expect(channelCompleter.isCompleted, isFalse); await controller.runJavascript('Echo.postMessage("hello");'); - expect(messagesReceived, equals(['hello'])); + + await expectLater(channelCompleter.future, completion('hello')); }, ); diff --git a/packages/webview_flutter/webview_flutter_android/example/run_test.dart b/packages/webview_flutter/webview_flutter_android/example/run_test.dart index bd2866f2ec6e..abc6895c5015 100644 --- a/packages/webview_flutter/webview_flutter_android/example/run_test.dart +++ b/packages/webview_flutter/webview_flutter_android/example/run_test.dart @@ -2,7 +2,7 @@ import 'dart:io'; final Map failedTests = {}; -const int runCount = 2; +const int runCount = 5; void main() async { for (int i = 0; i < runCount; i++) { From a4720182e04847797abb9df865574a9f3042961b Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 10 Aug 2022 10:35:23 -0700 Subject: [PATCH 04/11] remove tests --- .../webview_flutter_android/lib/src/android_webview.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart index a2abf3bbca4f..f2e305fe85c5 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart @@ -192,7 +192,6 @@ class WebView extends JavaObject { /// /// Also see compatibility note on [evaluateJavascript]. Future loadUrl(String url, Map headers) { - // print('Calling load URL'); return api.loadUrlFromInstance(this, url, headers); } @@ -211,7 +210,6 @@ class WebView extends JavaObject { /// /// Returns null if no page has been loaded. Future getUrl() { - // print('Calling `getURL`'); return api.getUrlFromInstance(this); } From b9ab10c89917a67fe59080b5691d60db05e9a1c2 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 10 Aug 2022 10:44:12 -0700 Subject: [PATCH 05/11] fix loadUrl test and remove script --- .../webview_flutter_test.dart | 15 ++++--- .../example/run_test.dart | 41 ------------------- 2 files changed, 9 insertions(+), 47 deletions(-) delete mode 100644 packages/webview_flutter/webview_flutter_android/example/run_test.dart 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 15ec9e067388..f81720beb866 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 @@ -83,7 +83,7 @@ Future main() async { (WidgetTester tester) async { final Completer controllerCompleter = Completer(); - final Completer pageFinishedCompleter = Completer(); + final StreamController pageLoads = StreamController(); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, @@ -93,16 +93,19 @@ Future main() async { onWebViewCreated: (WebViewController controller) { controllerCompleter.complete(controller); }, - onPageFinished: pageFinishedCompleter.complete, + onPageFinished: (String url) { + pageLoads.add(url); + }, ), ), ); final WebViewController controller = await controllerCompleter.future; - await controller.loadUrl(secondaryUrl); - await pageFinishedCompleter.future; - final String? currentUrl = await controller.currentUrl(); - expect(currentUrl, secondaryUrl); + await controller.loadUrl(secondaryUrl); + await expectLater( + pageLoads.stream.firstWhere((String url) => url == secondaryUrl), + completion(secondaryUrl), + ); }, ); diff --git a/packages/webview_flutter/webview_flutter_android/example/run_test.dart b/packages/webview_flutter/webview_flutter_android/example/run_test.dart deleted file mode 100644 index abc6895c5015..000000000000 --- a/packages/webview_flutter/webview_flutter_android/example/run_test.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'dart:io'; - -final Map failedTests = {}; - -const int runCount = 5; - -void main() async { - for (int i = 0; i < runCount; i++) { - final Process process = await Process.start( - '/Users/bmparr/Development/flutter/bin/flutter', - '--no-color test -d emulator-5554 --timeout 240s integration_test/webview_flutter_test.dart' - .split(' '), - ); - - process.stdout.forEach((List data) { - stdout.add(data); - final String output = String.fromCharCodes(data); - - //00:43 +1 -2: test 3 [E] - if (output.contains('[E]')) { - final String? testName = RegExp( - r'(?<=\d+:\d+ [0-9\+\-\s]+: ).+(?= \[E\])', - ).stringMatch(output); - - if (testName == null) { - print('FAILED TO PARSE TEST NAME: $output'); - } else { - failedTests.putIfAbsent(testName, () => 0); - failedTests[testName] = failedTests[testName]! + 1; - } - } - }); - process.stderr.forEach((List data) { - stderr.add(data); - }); - await process.exitCode; - - print('CURRENT TEST FAILURE COUNTS:'); - print(failedTests); - } -} From 99f929348c5f7601410ac55e45d5f78796abeba4 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 10 Aug 2022 13:14:33 -0700 Subject: [PATCH 06/11] try and fix cache test --- .../integration_test/webview_flutter_test.dart | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 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 f81720beb866..614c1e6747d1 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 @@ -1409,7 +1409,9 @@ Future main() async { (WidgetTester tester) async { final Completer controllerCompleter = Completer(); - final Completer onPageFinished = Completer(); + + Completer pageLoadCompleter = Completer(); + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, @@ -1417,7 +1419,7 @@ Future main() async { key: GlobalKey(), initialUrl: primaryUrl, javascriptMode: JavascriptMode.unrestricted, - onPageFinished: (_) => onPageFinished.complete(), + onPageFinished: (_) => pageLoadCompleter.complete(), onWebViewCreated: (WebViewController controller) { controllerCompleter.complete(controller); }, @@ -1425,17 +1427,19 @@ Future main() async { ), ); - final WebViewController controller = await controllerCompleter.future; - await onPageFinished.future; + await pageLoadCompleter.future; + pageLoadCompleter = Completer(); + final WebViewController controller = await controllerCompleter.future; await controller.runJavascript('localStorage.setItem("myCat", "Tom");'); - final String myCatItem = await controller.runJavascriptReturningResult( 'localStorage.getItem("myCat");', ); expect(myCatItem, '"Tom"'); await controller.clearCache(); + await pageLoadCompleter.future; + final String nullItem = await controller.runJavascriptReturningResult( 'localStorage.getItem("myCat");', ); From 6c9041f2622a37b415c4d8037b4c8288d837fa7a Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 10 Aug 2022 13:45:11 -0700 Subject: [PATCH 07/11] formatting and update webview_flutter --- .../webview_flutter_test.dart | 106 ++-- .../webview_flutter_test.dart | 584 +++++++++--------- 2 files changed, 332 insertions(+), 358 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart index 17548901bcb8..580bbf829216 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -23,8 +23,6 @@ import 'package:webview_flutter/webview_flutter.dart'; Future main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - const bool _skipDueToIssue86757 = true; - final HttpServer server = await HttpServer.bind(InternetAddress.anyIPv4, 0); server.forEach((HttpRequest request) { if (request.uri.path == '/hello.txt') { @@ -45,7 +43,6 @@ Future main() async { final String secondaryUrl = '$prefixUrl/secondary.txt'; final String headersUrl = '$prefixUrl/headers'; - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 testWidgets('initialUrl', (WidgetTester tester) async { final Completer controllerCompleter = Completer(); @@ -64,12 +61,12 @@ Future main() async { final WebViewController controller = await controllerCompleter.future; final String? currentUrl = await controller.currentUrl(); expect(currentUrl, primaryUrl); - }, skip: _skipDueToIssue86757); + }); - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 testWidgets('loadUrl', (WidgetTester tester) async { final Completer controllerCompleter = Completer(); + final StreamController pageLoads = StreamController(); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, @@ -79,14 +76,20 @@ Future main() async { onWebViewCreated: (WebViewController controller) { controllerCompleter.complete(controller); }, + onPageFinished: (String url) { + pageLoads.add(url); + }, ), ), ); final WebViewController controller = await controllerCompleter.future; + await controller.loadUrl(secondaryUrl); - final String? currentUrl = await controller.currentUrl(); - expect(currentUrl, secondaryUrl); - }, skip: _skipDueToIssue86757); + await expectLater( + pageLoads.stream.firstWhere((String url) => url == secondaryUrl), + completion(secondaryUrl), + ); + }); testWidgets('evaluateJavascript', (WidgetTester tester) async { final Completer controllerCompleter = @@ -110,7 +113,6 @@ Future main() async { expect(result, equals('2')); }); - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 testWidgets('loadUrl with headers', (WidgetTester tester) async { final Completer controllerCompleter = Completer(); @@ -149,15 +151,14 @@ Future main() async { final String content = await controller .runJavascriptReturningResult('document.documentElement.innerText'); expect(content.contains('flutter_test_header'), isTrue); - }, skip: Platform.isAndroid && _skipDueToIssue86757); + }); - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 testWidgets('JavascriptChannel', (WidgetTester tester) async { final Completer controllerCompleter = Completer(); final Completer pageStarted = Completer(); final Completer pageLoaded = Completer(); - final List messagesReceived = []; + final Completer channelCompleter = Completer(); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, @@ -174,7 +175,7 @@ Future main() async { JavascriptChannel( name: 'Echo', onMessageReceived: (JavascriptMessage message) { - messagesReceived.add(message.message); + channelCompleter.complete(message.message); }, ), }, @@ -191,10 +192,11 @@ Future main() async { await pageStarted.future; await pageLoaded.future; - expect(messagesReceived, isEmpty); + expect(channelCompleter.isCompleted, isFalse); await controller.runJavascript('Echo.postMessage("hello");'); - expect(messagesReceived, equals(['hello'])); - }, skip: Platform.isAndroid && _skipDueToIssue86757); + + await expectLater(channelCompleter.future, completion('hello')); + }); testWidgets('resize webview', (WidgetTester tester) async { final Completer initialResizeCompleter = Completer(); @@ -263,7 +265,6 @@ Future main() async { expect(customUserAgent2, 'Custom_User_Agent2'); }); - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 testWidgets('use default platform userAgent after webView is rebuilt', (WidgetTester tester) async { final Completer controllerCompleter = @@ -313,7 +314,7 @@ Future main() async { final String customUserAgent2 = await _getUserAgent(controller); expect(customUserAgent2, defaultPlatformUserAgent); - }, skip: Platform.isAndroid && _skipDueToIssue86757); + }); group('Video playback policy', () { late String videoTestBase64; @@ -798,7 +799,6 @@ Future main() async { }); group('Programmatic Scroll', () { - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 testWidgets('setAndGetScrollPosition', (WidgetTester tester) async { const String scrollTestPage = ''' @@ -873,7 +873,7 @@ Future main() async { scrollPosY = await controller.getScrollY(); expect(scrollPosX, X_SCROLL * 2); expect(scrollPosY, Y_SCROLL * 2); - }, skip: Platform.isAndroid && _skipDueToIssue86757); + }); }); // Minimial end-to-end testing of the legacy Android implementation. @@ -889,28 +889,30 @@ Future main() async { testWidgets('initialUrl', (WidgetTester tester) async { final Completer controllerCompleter = Completer(); - final Completer loadCompleter = Completer(); + final Completer pageFinishedCompleter = Completer(); await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: GlobalKey(), - initialUrl: primaryUrl, - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - onPageFinished: (String url) { - loadCompleter.complete(); - }, + MaterialApp( + home: Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + initialUrl: primaryUrl, + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + onPageFinished: pageFinishedCompleter.complete, + ), ), ), ); + final WebViewController controller = await controllerCompleter.future; - await loadCompleter.future; + await pageFinishedCompleter.future; + final String? currentUrl = await controller.currentUrl(); expect(currentUrl, primaryUrl); }); - }, skip: !Platform.isAndroid || _skipDueToIssue86757); + }); group('NavigationDelegate', () { const String blankPage = ''; @@ -1149,7 +1151,6 @@ Future main() async { expect(currentUrl, primaryUrl); }); - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 testWidgets('target _blank opens in same window', (WidgetTester tester) async { final Completer controllerCompleter = @@ -1175,9 +1176,8 @@ Future main() async { await pageLoaded.future; final String? currentUrl = await controller.currentUrl(); expect(currentUrl, primaryUrl); - }, skip: Platform.isAndroid && _skipDueToIssue86757); + }); - // TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757 testWidgets( 'can open new window and go back', (WidgetTester tester) async { @@ -1215,7 +1215,6 @@ Future main() async { await pageLoaded.future; expect(controller.currentUrl(), completion(primaryUrl)); }, - skip: _skipDueToIssue86757, ); testWidgets( @@ -1223,7 +1222,9 @@ Future main() async { (WidgetTester tester) async { final Completer controllerCompleter = Completer(); - final Completer onPageFinished = Completer(); + + Completer pageLoadCompleter = Completer(); + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, @@ -1231,7 +1232,7 @@ Future main() async { key: GlobalKey(), initialUrl: primaryUrl, javascriptMode: JavascriptMode.unrestricted, - onPageFinished: (_) => onPageFinished.complete(), + onPageFinished: (_) => pageLoadCompleter.complete(), onWebViewCreated: (WebViewController controller) { controllerCompleter.complete(controller); }, @@ -1239,29 +1240,24 @@ Future main() async { ), ); - final WebViewController controller = await controllerCompleter.future; - await onPageFinished.future; + await pageLoadCompleter.future; + pageLoadCompleter = Completer(); + final WebViewController controller = await controllerCompleter.future; await controller.runJavascript('localStorage.setItem("myCat", "Tom");'); - - expect( - controller.runJavascriptReturningResult( - 'localStorage.getItem("myCat");', - ), - completion(_webviewString('Tom')), + final String myCatItem = await controller.runJavascriptReturningResult( + 'localStorage.getItem("myCat");', ); + expect(myCatItem, '"Tom"'); await controller.clearCache(); + await pageLoadCompleter.future; - expect( - controller.runJavascriptReturningResult( - 'localStorage.getItem("myCat");', - ), - completion(_webviewNull()), + final String nullItem = await controller.runJavascriptReturningResult( + 'localStorage.getItem("myCat");', ); + expect(nullItem, _webviewNull()); }, - // TODO(bparrishMines): Unskip once https://github.com/flutter/plugins/pull/5086 lands and is published. - skip: Platform.isAndroid, ); } 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 614c1e6747d1..9aa91f2db2fc 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 @@ -48,44 +48,13 @@ Future main() async { final String secondaryUrl = '$prefixUrl/secondary.txt'; final String headersUrl = '$prefixUrl/headers'; - testWidgets( - 'initialUrl', - (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - final Completer pageFinishedCompleter = Completer(); - await tester.pumpWidget( - MaterialApp( - home: Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: GlobalKey(), - initialUrl: primaryUrl, - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - onPageFinished: pageFinishedCompleter.complete, - ), - ), - ), - ); - - final WebViewController controller = await controllerCompleter.future; - await pageFinishedCompleter.future; - - final String? currentUrl = await controller.currentUrl(); - expect(currentUrl, primaryUrl); - }, - ); - - testWidgets( - 'loadUrl', - (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - final StreamController pageLoads = StreamController(); - await tester.pumpWidget( - Directionality( + testWidgets('initialUrl', (WidgetTester tester) async { + final Completer controllerCompleter = + Completer(); + final Completer pageFinishedCompleter = Completer(); + await tester.pumpWidget( + MaterialApp( + home: Directionality( textDirection: TextDirection.ltr, child: WebView( key: GlobalKey(), @@ -93,21 +62,46 @@ Future main() async { onWebViewCreated: (WebViewController controller) { controllerCompleter.complete(controller); }, - onPageFinished: (String url) { - pageLoads.add(url); - }, + onPageFinished: pageFinishedCompleter.complete, ), ), - ); - final WebViewController controller = await controllerCompleter.future; + ), + ); - await controller.loadUrl(secondaryUrl); - await expectLater( - pageLoads.stream.firstWhere((String url) => url == secondaryUrl), - completion(secondaryUrl), - ); - }, - ); + final WebViewController controller = await controllerCompleter.future; + await pageFinishedCompleter.future; + + final String? currentUrl = await controller.currentUrl(); + expect(currentUrl, primaryUrl); + }); + + testWidgets('loadUrl', (WidgetTester tester) async { + final Completer controllerCompleter = + Completer(); + final StreamController pageLoads = StreamController(); + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + initialUrl: primaryUrl, + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + onPageFinished: (String url) { + pageLoads.add(url); + }, + ), + ), + ); + final WebViewController controller = await controllerCompleter.future; + + await controller.loadUrl(secondaryUrl); + await expectLater( + pageLoads.stream.firstWhere((String url) => url == secondaryUrl), + completion(secondaryUrl), + ); + }); testWidgets('evaluateJavascript', (WidgetTester tester) async { final Completer controllerCompleter = @@ -130,96 +124,90 @@ Future main() async { expect(result, equals('2')); }); - testWidgets( - 'loadUrl with headers', - (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - final StreamController pageStarts = StreamController(); - final StreamController pageLoads = StreamController(); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: GlobalKey(), - initialUrl: primaryUrl, - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - javascriptMode: JavascriptMode.unrestricted, - onPageStarted: (String url) { - pageStarts.add(url); - }, - onPageFinished: (String url) { - pageLoads.add(url); - }, - ), + testWidgets('loadUrl with headers', (WidgetTester tester) async { + final Completer controllerCompleter = + Completer(); + final StreamController pageStarts = StreamController(); + final StreamController pageLoads = StreamController(); + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + initialUrl: primaryUrl, + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + onPageStarted: (String url) { + pageStarts.add(url); + }, + onPageFinished: (String url) { + pageLoads.add(url); + }, ), - ); - final WebViewController controller = await controllerCompleter.future; - final Map headers = { - 'test_header': 'flutter_test_header' - }; - await controller.loadUrl(headersUrl, headers: headers); - final String? currentUrl = await controller.currentUrl(); - expect(currentUrl, headersUrl); + ), + ); + final WebViewController controller = await controllerCompleter.future; + final Map headers = { + 'test_header': 'flutter_test_header' + }; + await controller.loadUrl(headersUrl, headers: headers); + final String? currentUrl = await controller.currentUrl(); + expect(currentUrl, headersUrl); - await pageStarts.stream.firstWhere((String url) => url == currentUrl); - await pageLoads.stream.firstWhere((String url) => url == currentUrl); + await pageStarts.stream.firstWhere((String url) => url == currentUrl); + await pageLoads.stream.firstWhere((String url) => url == currentUrl); - final String content = await controller - .runJavascriptReturningResult('document.documentElement.innerText'); - expect(content.contains('flutter_test_header'), isTrue); - }, - ); + final String content = await controller + .runJavascriptReturningResult('document.documentElement.innerText'); + expect(content.contains('flutter_test_header'), isTrue); + }); - testWidgets( - 'JavascriptChannel', - (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - final Completer pageStarted = Completer(); - final Completer pageLoaded = Completer(); - final Completer channelCompleter = Completer(); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: GlobalKey(), - // This is the data URL for: '' - initialUrl: - 'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+', - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - javascriptMode: JavascriptMode.unrestricted, - javascriptChannels: { - JavascriptChannel( - name: 'Echo', - onMessageReceived: (JavascriptMessage message) { - channelCompleter.complete(message.message); - }, - ), - }, - onPageStarted: (String url) { - pageStarted.complete(null); - }, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, - ), + testWidgets('JavascriptChannel', (WidgetTester tester) async { + final Completer controllerCompleter = + Completer(); + final Completer pageStarted = Completer(); + final Completer pageLoaded = Completer(); + final Completer channelCompleter = Completer(); + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + // This is the data URL for: '' + initialUrl: + 'data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + javascriptChannels: { + JavascriptChannel( + name: 'Echo', + onMessageReceived: (JavascriptMessage message) { + channelCompleter.complete(message.message); + }, + ), + }, + onPageStarted: (String url) { + pageStarted.complete(null); + }, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, ), - ); - final WebViewController controller = await controllerCompleter.future; - await pageStarted.future; - await pageLoaded.future; + ), + ); + final WebViewController controller = await controllerCompleter.future; + await pageStarted.future; + await pageLoaded.future; - expect(channelCompleter.isCompleted, isFalse); - await controller.runJavascript('Echo.postMessage("hello");'); + expect(channelCompleter.isCompleted, isFalse); + await controller.runJavascript('Echo.postMessage("hello");'); - await expectLater(channelCompleter.future, completion('hello')); - }, - ); + await expectLater(channelCompleter.future, completion('hello')); + }); testWidgets('resize webview', (WidgetTester tester) async { final Completer initialResizeCompleter = Completer(); @@ -288,58 +276,56 @@ Future main() async { expect(customUserAgent2, 'Custom_User_Agent2'); }); - testWidgets( - 'use default platform userAgent after webView is rebuilt', - (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - final GlobalKey _globalKey = GlobalKey(); - // Build the webView with no user agent to get the default platform user agent. - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: _globalKey, - initialUrl: primaryUrl, - javascriptMode: JavascriptMode.unrestricted, - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - ), + testWidgets('use default platform userAgent after webView is rebuilt', + (WidgetTester tester) async { + final Completer controllerCompleter = + Completer(); + final GlobalKey _globalKey = GlobalKey(); + // Build the webView with no user agent to get the default platform user agent. + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: _globalKey, + initialUrl: primaryUrl, + javascriptMode: JavascriptMode.unrestricted, + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, ), - ); - final WebViewController controller = await controllerCompleter.future; - final String defaultPlatformUserAgent = await _getUserAgent(controller); - // rebuild the WebView with a custom user agent. - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: _globalKey, - initialUrl: 'about:blank', - javascriptMode: JavascriptMode.unrestricted, - userAgent: 'Custom_User_Agent', - ), + ), + ); + final WebViewController controller = await controllerCompleter.future; + final String defaultPlatformUserAgent = await _getUserAgent(controller); + // rebuild the WebView with a custom user agent. + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: _globalKey, + initialUrl: 'about:blank', + javascriptMode: JavascriptMode.unrestricted, + userAgent: 'Custom_User_Agent', ), - ); - final String customUserAgent = await _getUserAgent(controller); - expect(customUserAgent, 'Custom_User_Agent'); - // rebuilds the WebView with no user agent. - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: _globalKey, - initialUrl: 'about:blank', - javascriptMode: JavascriptMode.unrestricted, - ), + ), + ); + final String customUserAgent = await _getUserAgent(controller); + expect(customUserAgent, 'Custom_User_Agent'); + // rebuilds the WebView with no user agent. + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: _globalKey, + initialUrl: 'about:blank', + javascriptMode: JavascriptMode.unrestricted, ), - ); + ), + ); - final String customUserAgent2 = await _getUserAgent(controller); - expect(customUserAgent2, defaultPlatformUserAgent); - }, - ); + final String customUserAgent2 = await _getUserAgent(controller); + expect(customUserAgent2, defaultPlatformUserAgent); + }); group('Video playback policy', () { late String videoTestBase64; @@ -765,10 +751,8 @@ Future main() async { }); group('Programmatic Scroll', () { - testWidgets( - 'setAndGetScrollPosition', - (WidgetTester tester) async { - const String scrollTestPage = ''' + testWidgets('setAndGetScrollPosition', (WidgetTester tester) async { + const String scrollTestPage = ''' @@ -789,60 +773,59 @@ Future main() async { '''; - final String scrollTestPageBase64 = - base64Encode(const Utf8Encoder().convert(scrollTestPage)); + final String scrollTestPageBase64 = + base64Encode(const Utf8Encoder().convert(scrollTestPage)); - final Completer pageLoaded = Completer(); - final Completer controllerCompleter = - Completer(); + final Completer pageLoaded = Completer(); + final Completer controllerCompleter = + Completer(); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - initialUrl: - 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, - ), + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + initialUrl: + 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, ), - ); + ), + ); - final WebViewController controller = await controllerCompleter.future; - await pageLoaded.future; + final WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; - await tester.pumpAndSettle(const Duration(seconds: 3)); - - int scrollPosX = await controller.getScrollX(); - int scrollPosY = await controller.getScrollY(); - - // Check scrollTo() - const int X_SCROLL = 123; - const int Y_SCROLL = 321; - // Get the initial position; this ensures that scrollTo is actually - // changing something, but also gives the native view's scroll position - // time to settle. - expect(scrollPosX, isNot(X_SCROLL)); - expect(scrollPosX, isNot(Y_SCROLL)); - - await controller.scrollTo(X_SCROLL, Y_SCROLL); - scrollPosX = await controller.getScrollX(); - scrollPosY = await controller.getScrollY(); - expect(scrollPosX, X_SCROLL); - expect(scrollPosY, Y_SCROLL); - - // Check scrollBy() (on top of scrollTo()) - await controller.scrollBy(X_SCROLL, Y_SCROLL); - scrollPosX = await controller.getScrollX(); - scrollPosY = await controller.getScrollY(); - expect(scrollPosX, X_SCROLL * 2); - expect(scrollPosY, Y_SCROLL * 2); - }, - ); + await tester.pumpAndSettle(const Duration(seconds: 3)); + + int scrollPosX = await controller.getScrollX(); + int scrollPosY = await controller.getScrollY(); + + // Check scrollTo() + const int X_SCROLL = 123; + const int Y_SCROLL = 321; + // Get the initial position; this ensures that scrollTo is actually + // changing something, but also gives the native view's scroll position + // time to settle. + expect(scrollPosX, isNot(X_SCROLL)); + expect(scrollPosX, isNot(Y_SCROLL)); + + await controller.scrollTo(X_SCROLL, Y_SCROLL); + scrollPosX = await controller.getScrollX(); + scrollPosY = await controller.getScrollY(); + expect(scrollPosX, X_SCROLL); + expect(scrollPosY, Y_SCROLL); + + // Check scrollBy() (on top of scrollTo()) + await controller.scrollBy(X_SCROLL, Y_SCROLL); + scrollPosX = await controller.getScrollX(); + scrollPosY = await controller.getScrollY(); + expect(scrollPosX, X_SCROLL * 2); + expect(scrollPosY, Y_SCROLL * 2); + }); }); group('SurfaceAndroidWebView', () { @@ -854,10 +837,8 @@ Future main() async { WebView.platform = AndroidWebView(); }); - testWidgets( - 'setAndGetScrollPosition', - (WidgetTester tester) async { - const String scrollTestPage = ''' + testWidgets('setAndGetScrollPosition', (WidgetTester tester) async { + const String scrollTestPage = ''' @@ -878,52 +859,51 @@ Future main() async { '''; - final String scrollTestPageBase64 = - base64Encode(const Utf8Encoder().convert(scrollTestPage)); + final String scrollTestPageBase64 = + base64Encode(const Utf8Encoder().convert(scrollTestPage)); - final Completer pageLoaded = Completer(); - final Completer controllerCompleter = - Completer(); + final Completer pageLoaded = Completer(); + final Completer controllerCompleter = + Completer(); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - initialUrl: - 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, - ), + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + initialUrl: + 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, ), - ); + ), + ); - final WebViewController controller = await controllerCompleter.future; - await pageLoaded.future; + final WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; - await tester.pumpAndSettle(const Duration(seconds: 3)); + await tester.pumpAndSettle(const Duration(seconds: 3)); - // Check scrollTo() - const int X_SCROLL = 123; - const int Y_SCROLL = 321; + // Check scrollTo() + const int X_SCROLL = 123; + const int Y_SCROLL = 321; - await controller.scrollTo(X_SCROLL, Y_SCROLL); - int scrollPosX = await controller.getScrollX(); - int scrollPosY = await controller.getScrollY(); - expect(X_SCROLL, scrollPosX); - expect(Y_SCROLL, scrollPosY); + await controller.scrollTo(X_SCROLL, Y_SCROLL); + int scrollPosX = await controller.getScrollX(); + int scrollPosY = await controller.getScrollY(); + expect(X_SCROLL, scrollPosX); + expect(Y_SCROLL, scrollPosY); - // Check scrollBy() (on top of scrollTo()) - await controller.scrollBy(X_SCROLL, Y_SCROLL); - scrollPosX = await controller.getScrollX(); - scrollPosY = await controller.getScrollY(); - expect(X_SCROLL * 2, scrollPosX); - expect(Y_SCROLL * 2, scrollPosY); - }, - ); + // Check scrollBy() (on top of scrollTo()) + await controller.scrollBy(X_SCROLL, Y_SCROLL); + scrollPosX = await controller.getScrollX(); + scrollPosY = await controller.getScrollY(); + expect(X_SCROLL * 2, scrollPosX); + expect(Y_SCROLL * 2, scrollPosY); + }); testWidgets( 'inputs are scrolled into view when focused', @@ -1267,34 +1247,32 @@ Future main() async { expect(currentUrl, primaryUrl); }); - testWidgets( - 'target _blank opens in same window', - (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - final Completer pageLoaded = Completer(); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: GlobalKey(), - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - javascriptMode: JavascriptMode.unrestricted, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, - ), + testWidgets('target _blank opens in same window', + (WidgetTester tester) async { + final Completer controllerCompleter = + Completer(); + final Completer pageLoaded = Completer(); + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, ), - ); - final WebViewController controller = await controllerCompleter.future; - await controller.runJavascript('window.open("$primaryUrl", "_blank")'); - await pageLoaded.future; - final String? currentUrl = await controller.currentUrl(); - expect(currentUrl, primaryUrl); - }, - ); + ), + ); + final WebViewController controller = await controllerCompleter.future; + await controller.runJavascript('window.open("$primaryUrl", "_blank")'); + await pageLoaded.future; + final String? currentUrl = await controller.currentUrl(); + expect(currentUrl, primaryUrl); + }); testWidgets( 'can open new window and go back', From 46fbd5f88e276f3f432b44c1bca5e5c024d43e26 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 10 Aug 2022 13:53:36 -0700 Subject: [PATCH 08/11] use string modifier --- .../example/integration_test/webview_flutter_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart index 580bbf829216..5bc7da7eaa64 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -1248,7 +1248,7 @@ Future main() async { final String myCatItem = await controller.runJavascriptReturningResult( 'localStorage.getItem("myCat");', ); - expect(myCatItem, '"Tom"'); + expect(myCatItem, _webviewString('Tom')); await controller.clearCache(); await pageLoadCompleter.future; From 292d4b969fc38235a886364c077f85572f25990b Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 10 Aug 2022 14:09:45 -0700 Subject: [PATCH 09/11] formatting --- .../webview_flutter_test.dart | 27 +-- .../webview_flutter_test.dart | 164 +++++++++--------- 2 files changed, 96 insertions(+), 95 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart index 5bc7da7eaa64..90bf5802947a 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -46,6 +46,7 @@ Future main() async { testWidgets('initialUrl', (WidgetTester tester) async { final Completer controllerCompleter = Completer(); + final Completer pageFinishedCompleter = Completer(); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, @@ -55,10 +56,14 @@ Future main() async { onWebViewCreated: (WebViewController controller) { controllerCompleter.complete(controller); }, + onPageFinished: pageFinishedCompleter.complete, ), ), ); + final WebViewController controller = await controllerCompleter.future; + await pageFinishedCompleter.future; + final String? currentUrl = await controller.currentUrl(); expect(currentUrl, primaryUrl); }); @@ -891,17 +896,15 @@ Future main() async { Completer(); final Completer pageFinishedCompleter = Completer(); await tester.pumpWidget( - MaterialApp( - home: Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: GlobalKey(), - initialUrl: primaryUrl, - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - onPageFinished: pageFinishedCompleter.complete, - ), + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + initialUrl: primaryUrl, + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + onPageFinished: pageFinishedCompleter.complete, ), ), ); @@ -912,7 +915,7 @@ Future main() async { final String? currentUrl = await controller.currentUrl(); expect(currentUrl, primaryUrl); }); - }); + }, skip: !Platform.isAndroid); group('NavigationDelegate', () { const String blankPage = ''; 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 9aa91f2db2fc..6a4a2b89fd71 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 @@ -905,10 +905,9 @@ Future main() async { expect(Y_SCROLL * 2, scrollPosY); }); - testWidgets( - 'inputs are scrolled into view when focused', - (WidgetTester tester) async { - const String scrollTestPage = ''' + testWidgets('inputs are scrolled into view when focused', + (WidgetTester tester) async { + const String scrollTestPage = ''' @@ -932,87 +931,86 @@ Future main() async { '''; - final String scrollTestPageBase64 = - base64Encode(const Utf8Encoder().convert(scrollTestPage)); - - final Completer pageLoaded = Completer(); - final Completer controllerCompleter = - Completer(); - - await tester.runAsync(() async { - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: SizedBox( - width: 200, - height: 200, - child: WebView( - initialUrl: - 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, - javascriptMode: JavascriptMode.unrestricted, - ), + final String scrollTestPageBase64 = + base64Encode(const Utf8Encoder().convert(scrollTestPage)); + + final Completer pageLoaded = Completer(); + final Completer controllerCompleter = + Completer(); + + await tester.runAsync(() async { + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: SizedBox( + width: 200, + height: 200, + child: WebView( + initialUrl: + 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + javascriptMode: JavascriptMode.unrestricted, ), ), - ); - await Future.delayed(const Duration(milliseconds: 20)); - await tester.pump(); - }); - - final WebViewController controller = await controllerCompleter.future; - await pageLoaded.future; - final String viewportRectJSON = await _runJavaScriptReturningResult( - controller, 'JSON.stringify(viewport.getBoundingClientRect())'); - final Map viewportRectRelativeToViewport = - jsonDecode(viewportRectJSON) as Map; - - // Check that the input is originally outside of the viewport. - - final String initialInputClientRectJSON = - await _runJavaScriptReturningResult( - controller, 'JSON.stringify(inputEl.getBoundingClientRect())'); - final Map initialInputClientRectRelativeToViewport = - jsonDecode(initialInputClientRectJSON) as Map; - - expect( - initialInputClientRectRelativeToViewport['bottom'] <= - viewportRectRelativeToViewport['bottom'], - isFalse); - - await controller.runJavascript('inputEl.focus()'); - - // Check that focusing the input brought it into view. - - final String lastInputClientRectJSON = - await _runJavaScriptReturningResult( - controller, 'JSON.stringify(inputEl.getBoundingClientRect())'); - final Map lastInputClientRectRelativeToViewport = - jsonDecode(lastInputClientRectJSON) as Map; - - expect( - lastInputClientRectRelativeToViewport['top'] >= - viewportRectRelativeToViewport['top'], - isTrue); - expect( - lastInputClientRectRelativeToViewport['bottom'] <= - viewportRectRelativeToViewport['bottom'], - isTrue); - - expect( - lastInputClientRectRelativeToViewport['left'] >= - viewportRectRelativeToViewport['left'], - isTrue); - expect( - lastInputClientRectRelativeToViewport['right'] <= - viewportRectRelativeToViewport['right'], - isTrue); - }, - ); + ), + ); + await Future.delayed(const Duration(milliseconds: 20)); + await tester.pump(); + }); + + final WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; + final String viewportRectJSON = await _runJavaScriptReturningResult( + controller, 'JSON.stringify(viewport.getBoundingClientRect())'); + final Map viewportRectRelativeToViewport = + jsonDecode(viewportRectJSON) as Map; + + // Check that the input is originally outside of the viewport. + + final String initialInputClientRectJSON = + await _runJavaScriptReturningResult( + controller, 'JSON.stringify(inputEl.getBoundingClientRect())'); + final Map initialInputClientRectRelativeToViewport = + jsonDecode(initialInputClientRectJSON) as Map; + + expect( + initialInputClientRectRelativeToViewport['bottom'] <= + viewportRectRelativeToViewport['bottom'], + isFalse); + + await controller.runJavascript('inputEl.focus()'); + + // Check that focusing the input brought it into view. + + final String lastInputClientRectJSON = + await _runJavaScriptReturningResult( + controller, 'JSON.stringify(inputEl.getBoundingClientRect())'); + final Map lastInputClientRectRelativeToViewport = + jsonDecode(lastInputClientRectJSON) as Map; + + expect( + lastInputClientRectRelativeToViewport['top'] >= + viewportRectRelativeToViewport['top'], + isTrue); + expect( + lastInputClientRectRelativeToViewport['bottom'] <= + viewportRectRelativeToViewport['bottom'], + isTrue); + + expect( + lastInputClientRectRelativeToViewport['left'] >= + viewportRectRelativeToViewport['left'], + isTrue); + expect( + lastInputClientRectRelativeToViewport['right'] <= + viewportRectRelativeToViewport['right'], + isTrue); + }); }); group('NavigationDelegate', () { From 7181ddf670c85e93073707270cb1da271a252d16 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 10 Aug 2022 14:24:14 -0700 Subject: [PATCH 10/11] handle argument error for null value --- .../integration_test/webview_flutter_test.dart | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart index 90bf5802947a..a225e7e6fc52 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -1256,9 +1256,19 @@ Future main() async { await controller.clearCache(); await pageLoadCompleter.future; - final String nullItem = await controller.runJavascriptReturningResult( - 'localStorage.getItem("myCat");', - ); + late final String? nullItem; + try { + nullItem = await controller.runJavascriptReturningResult( + 'localStorage.getItem("myCat");', + ); + } catch (exception) { + if (defaultTargetPlatform == TargetPlatform.iOS && + exception is ArgumentError && + (exception.message as String).contains( + 'Result of JavaScript execution returned a `null` value.')) { + nullItem = ''; + } + } expect(nullItem, _webviewNull()); }, ); From 8041045e74ad0a9b0467beb7fafa680ec7acf547 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 10 Aug 2022 15:06:55 -0700 Subject: [PATCH 11/11] try fix ios --- .../webview_flutter_test.dart | 2 +- .../webview_flutter_test.dart | 2 +- .../webview_flutter_test.dart | 32 +++++++++++++------ 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart index a225e7e6fc52..e4facaf160f8 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -1216,7 +1216,7 @@ Future main() async { expect(controller.canGoBack(), completion(true)); await controller.goBack(); await pageLoaded.future; - expect(controller.currentUrl(), completion(primaryUrl)); + await expectLater(controller.currentUrl(), completion(primaryUrl)); }, ); 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 6a4a2b89fd71..87507b424a7c 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 @@ -1307,7 +1307,7 @@ Future main() async { expect(controller.canGoBack(), completion(true)); await controller.goBack(); await pageLoaded.future; - expect(controller.currentUrl(), completion(primaryUrl)); + await expectLater(controller.currentUrl(), completion(primaryUrl)); }, ); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart index 1119f7457bc9..dd642b373124 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart @@ -51,6 +51,7 @@ Future main() async { testWidgets('initialUrl', (WidgetTester tester) async { final Completer controllerCompleter = Completer(); + final Completer pageFinishedCompleter = Completer(); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, @@ -60,10 +61,14 @@ Future main() async { onWebViewCreated: (WebViewController controller) { controllerCompleter.complete(controller); }, + onPageFinished: pageFinishedCompleter.complete, ), ), ); + final WebViewController controller = await controllerCompleter.future; + await pageFinishedCompleter.future; + final String? currentUrl = await controller.currentUrl(); expect(currentUrl, primaryUrl); }); @@ -86,12 +91,14 @@ Future main() async { await tester.pumpAndSettle(); }); - expect(gcCompleter.future, completion(0)); + final int gcIdentifier = await gcCompleter.future; + expect(gcIdentifier, 0); }, timeout: const Timeout(Duration(seconds: 10))); testWidgets('loadUrl', (WidgetTester tester) async { final Completer controllerCompleter = Completer(); + final StreamController pageLoads = StreamController(); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, @@ -101,13 +108,19 @@ Future main() async { onWebViewCreated: (WebViewController controller) { controllerCompleter.complete(controller); }, + onPageFinished: (String url) { + pageLoads.add(url); + }, ), ), ); final WebViewController controller = await controllerCompleter.future; + await controller.loadUrl(secondaryUrl); - final String? currentUrl = await controller.currentUrl(); - expect(currentUrl, secondaryUrl); + await expectLater( + pageLoads.stream.firstWhere((String url) => url == secondaryUrl), + completion(secondaryUrl), + ); }); testWidgets('evaluateJavascript', (WidgetTester tester) async { @@ -176,7 +189,7 @@ Future main() async { Completer(); final Completer pageStarted = Completer(); final Completer pageLoaded = Completer(); - final List messagesReceived = []; + final Completer channelCompleter = Completer(); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, @@ -193,7 +206,7 @@ Future main() async { JavascriptChannel( name: 'Echo', onMessageReceived: (JavascriptMessage message) { - messagesReceived.add(message.message); + channelCompleter.complete(message.message); }, ), }, @@ -210,9 +223,10 @@ Future main() async { await pageStarted.future; await pageLoaded.future; - expect(messagesReceived, isEmpty); + expect(channelCompleter.isCompleted, isFalse); await controller.runJavascript('Echo.postMessage("hello");'); - expect(messagesReceived, equals(['hello'])); + + await expectLater(channelCompleter.future, completion('hello')); }); testWidgets('resize webview', (WidgetTester tester) async { @@ -1183,10 +1197,8 @@ Future main() async { expect(controller.canGoBack(), completion(true)); await controller.goBack(); await pageLoaded.future; - expect(controller.currentUrl(), completion(primaryUrl)); + await expectLater(controller.currentUrl(), completion(primaryUrl)); }, - // Flaky; see https://github.com/flutter/flutter/issues/90976 - skip: true, ); }