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 8a3477d4031..6307f311b19 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 @@ -204,46 +204,8 @@ Future main() async { }); group('Video playback policy', () { - late String videoTestBase64; - setUpAll(() async { - final ByteData videoData = - await rootBundle.load('assets/sample_video.mp4'); - final String base64VideoData = - base64Encode(Uint8List.view(videoData.buffer)); - final String videoTest = ''' - - Video auto play - - - - - - - '''; - videoTestBase64 = base64Encode(const Utf8Encoder().convert(videoTest)); - }); - testWidgets('Auto media playback', (WidgetTester tester) async { + final String videoTestBase64 = await getTestVideoBase64(); Completer pageLoaded = Completer(); late PlatformWebViewControllerCreationParams params; @@ -306,6 +268,7 @@ Future main() async { }); testWidgets('Video plays inline', (WidgetTester tester) async { + final String videoTestBase64 = await getTestVideoBase64(); final Completer pageLoaded = Completer(); final Completer videoPlaying = Completer(); @@ -1062,3 +1025,39 @@ class ResizableWebViewState extends State { ); } } + +Future getTestVideoBase64() async { + final ByteData videoData = await rootBundle.load('assets/sample_video.mp4'); + final String base64VideoData = base64Encode(Uint8List.view(videoData.buffer)); + final String videoTest = ''' + + Video auto play + + + + + + + '''; + return base64Encode(const Utf8Encoder().convert(videoTest)); +} diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test_legacy.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test_legacy.dart index 46349b202e6..734fc102e75 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test_legacy.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test_legacy.dart @@ -318,162 +318,139 @@ Future main() async { }); group('Video playback policy', () { - late String videoTestBase64; - setUpAll(() async { - final ByteData videoData = - await rootBundle.load('assets/sample_video.mp4'); - final String base64VideoData = - base64Encode(Uint8List.view(videoData.buffer)); - final String videoTest = ''' - - Video auto play - - - - - - - '''; - videoTestBase64 = base64Encode(const Utf8Encoder().convert(videoTest)); - }); - - testWidgets('Auto media playback', (WidgetTester tester) async { - Completer controllerCompleter = - Completer(); - Completer pageLoaded = Completer(); + testWidgets( + 'Auto media playback', + (WidgetTester tester) async { + final String videoTestBase64 = await getTestVideoBase64(); + Completer controllerCompleter = + Completer(); + Completer pageLoaded = Completer(); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: GlobalKey(), - initialUrl: 'data:text/html;charset=utf-8;base64,$videoTestBase64', - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - javascriptMode: JavascriptMode.unrestricted, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, - initialMediaPlaybackPolicy: AutoMediaPlaybackPolicy.always_allow, + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + initialUrl: + 'data:text/html;charset=utf-8;base64,$videoTestBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + initialMediaPlaybackPolicy: AutoMediaPlaybackPolicy.always_allow, + ), ), - ), - ); - WebViewController controller = await controllerCompleter.future; - await pageLoaded.future; + ); + WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; - String isPaused = - await controller.runJavascriptReturningResult('isPaused();'); - expect(isPaused, _webviewBool(false)); + String isPaused = + await controller.runJavascriptReturningResult('isPaused();'); + expect(isPaused, _webviewBool(false)); - controllerCompleter = Completer(); - pageLoaded = Completer(); + controllerCompleter = Completer(); + pageLoaded = Completer(); - // We change the key to re-create a new webview as we change the initialMediaPlaybackPolicy - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: GlobalKey(), - initialUrl: 'data:text/html;charset=utf-8;base64,$videoTestBase64', - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - javascriptMode: JavascriptMode.unrestricted, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, + // We change the key to re-create a new webview as we change the initialMediaPlaybackPolicy + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: GlobalKey(), + initialUrl: + 'data:text/html;charset=utf-8;base64,$videoTestBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + ), ), - ), - ); + ); - controller = await controllerCompleter.future; - await pageLoaded.future; + controller = await controllerCompleter.future; + await pageLoaded.future; - isPaused = await controller.runJavascriptReturningResult('isPaused();'); - expect(isPaused, _webviewBool(true)); - }); + isPaused = await controller.runJavascriptReturningResult('isPaused();'); + expect(isPaused, _webviewBool(true)); + }, + // Flakes on iOS: https://github.com/flutter/flutter/issues/164632 + skip: Platform.isIOS, + ); - testWidgets('Changes to initialMediaPlaybackPolicy are ignored', - (WidgetTester tester) async { - final Completer controllerCompleter = - Completer(); - Completer pageLoaded = Completer(); + testWidgets( + 'Changes to initialMediaPlaybackPolicy are ignored', + (WidgetTester tester) async { + final String videoTestBase64 = await getTestVideoBase64(); + final Completer controllerCompleter = + Completer(); + Completer pageLoaded = Completer(); - final GlobalKey key = GlobalKey(); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: key, - initialUrl: 'data:text/html;charset=utf-8;base64,$videoTestBase64', - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - javascriptMode: JavascriptMode.unrestricted, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, - initialMediaPlaybackPolicy: AutoMediaPlaybackPolicy.always_allow, + final GlobalKey key = GlobalKey(); + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: key, + initialUrl: + 'data:text/html;charset=utf-8;base64,$videoTestBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + initialMediaPlaybackPolicy: AutoMediaPlaybackPolicy.always_allow, + ), ), - ), - ); - final WebViewController controller = await controllerCompleter.future; - await pageLoaded.future; + ); + final WebViewController controller = await controllerCompleter.future; + await pageLoaded.future; - String isPaused = - await controller.runJavascriptReturningResult('isPaused();'); - expect(isPaused, _webviewBool(false)); + String isPaused = + await controller.runJavascriptReturningResult('isPaused();'); + expect(isPaused, _webviewBool(false)); - pageLoaded = Completer(); + pageLoaded = Completer(); - await tester.pumpWidget( - Directionality( - textDirection: TextDirection.ltr, - child: WebView( - key: key, - initialUrl: 'data:text/html;charset=utf-8;base64,$videoTestBase64', - onWebViewCreated: (WebViewController controller) { - controllerCompleter.complete(controller); - }, - javascriptMode: JavascriptMode.unrestricted, - onPageFinished: (String url) { - pageLoaded.complete(null); - }, + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: WebView( + key: key, + initialUrl: + 'data:text/html;charset=utf-8;base64,$videoTestBase64', + onWebViewCreated: (WebViewController controller) { + controllerCompleter.complete(controller); + }, + javascriptMode: JavascriptMode.unrestricted, + onPageFinished: (String url) { + pageLoaded.complete(null); + }, + ), ), - ), - ); + ); - await controller.reload(); + await controller.reload(); - await pageLoaded.future; + await pageLoaded.future; - isPaused = await controller.runJavascriptReturningResult('isPaused();'); - expect(isPaused, _webviewBool(false)); - }); + isPaused = await controller.runJavascriptReturningResult('isPaused();'); + expect(isPaused, _webviewBool(false)); + }, + // Flakes on iOS: https://github.com/flutter/flutter/issues/164632 + skip: Platform.isIOS, + ); testWidgets('Video plays inline when allowsInlineMediaPlayback is true', (WidgetTester tester) async { + final String videoTestBase64 = await getTestVideoBase64(); final Completer controllerCompleter = Completer(); final Completer pageLoaded = Completer(); @@ -1210,13 +1187,13 @@ Future main() async { ); } -// JavaScript booleans evaluate to different string values on Android and iOS. -// This utility method returns the string boolean value of the current platform. -String _webviewBool(bool value) { - if (defaultTargetPlatform == TargetPlatform.iOS) { - return value ? '1' : '0'; +// JavaScript booleans evaluate to different string values on different devices. +// This utility method returns a matcher that match on either representation. +Matcher _webviewBool(bool value) { + if (value) { + return anyOf('true', '1'); } - return value ? 'true' : 'false'; + return anyOf('false', '0'); } // JavaScript `null` evaluate to different string values on Android and iOS. @@ -1325,3 +1302,39 @@ class ResizableWebViewState extends State { ); } } + +Future getTestVideoBase64() async { + final ByteData videoData = await rootBundle.load('assets/sample_video.mp4'); + final String base64VideoData = base64Encode(Uint8List.view(videoData.buffer)); + final String videoTest = ''' + + Video auto play + + + + + + + '''; + return base64Encode(const Utf8Encoder().convert(videoTest)); +} diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/legacy/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/legacy/webview_flutter_test.dart index f03859f0f53..19d64038d75 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/legacy/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/legacy/webview_flutter_test.dart @@ -340,46 +340,8 @@ Future main() async { }); group('Video playback policy', () { - late String videoTestBase64; - setUpAll(() async { - final ByteData videoData = - await rootBundle.load('assets/sample_video.mp4'); - final String base64VideoData = - base64Encode(Uint8List.view(videoData.buffer)); - final String videoTest = ''' - - Video auto play - - - - - - - '''; - videoTestBase64 = base64Encode(const Utf8Encoder().convert(videoTest)); - }); - testWidgets('Auto media playback', (WidgetTester tester) async { + final String videoTestBase64 = await getTestVideoBase64(); Completer controllerCompleter = Completer(); Completer pageLoaded = Completer(); @@ -438,6 +400,7 @@ Future main() async { testWidgets('Changes to initialMediaPlaybackPolicy are ignored', (WidgetTester tester) async { + final String videoTestBase64 = await getTestVideoBase64(); final Completer controllerCompleter = Completer(); Completer pageLoaded = Completer(); @@ -496,6 +459,7 @@ Future main() async { testWidgets('Video plays inline when allowsInlineMediaPlayback is true', (WidgetTester tester) async { + final String videoTestBase64 = await getTestVideoBase64(); final Completer controllerCompleter = Completer(); final Completer pageLoaded = Completer(); @@ -547,6 +511,7 @@ Future main() async { testWidgets( 'Video plays full screen when allowsInlineMediaPlayback is false', (WidgetTester tester) async { + final String videoTestBase64 = await getTestVideoBase64(); final Completer controllerCompleter = Completer(); final Completer pageLoaded = Completer(); @@ -1201,13 +1166,13 @@ Future main() async { ); } -// JavaScript booleans evaluate to different string values on Android and iOS. -// This utility method returns the string boolean value of the current platform. -String _webviewBool(bool value) { - if (defaultTargetPlatform == TargetPlatform.iOS) { - return value ? '1' : '0'; +// JavaScript booleans evaluate to different string values on different devices. +// This utility method returns a matcher that match on either representation. +Matcher _webviewBool(bool value) { + if (value) { + return anyOf('true', '1'); } - return value ? 'true' : 'false'; + return anyOf('false', '0'); } /// Returns the value used for the HTTP User-Agent: request header in subsequent HTTP requests. @@ -1317,3 +1282,39 @@ class ClassWithCallbackClass { late final CopyableObjectWithCallback callbackClass; } + +Future getTestVideoBase64() async { + final ByteData videoData = await rootBundle.load('assets/sample_video.mp4'); + final String base64VideoData = base64Encode(Uint8List.view(videoData.buffer)); + final String videoTest = ''' + + Video auto play + + + + + + + '''; + return base64Encode(const Utf8Encoder().convert(videoTest)); +} 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 24e70d775b1..3b89028754e 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 @@ -342,46 +342,8 @@ Future main() async { }); group('Video playback policy', () { - late String videoTestBase64; - setUpAll(() async { - final ByteData videoData = - await rootBundle.load('assets/sample_video.mp4'); - final String base64VideoData = - base64Encode(Uint8List.view(videoData.buffer)); - final String videoTest = ''' - - Video auto play - - - - - - - '''; - videoTestBase64 = base64Encode(const Utf8Encoder().convert(videoTest)); - }); - testWidgets('Auto media playback', (WidgetTester tester) async { + final String videoTestBase64 = await getTestVideoBase64(); Completer pageLoaded = Completer(); WebKitWebViewController controller = WebKitWebViewController( @@ -454,6 +416,7 @@ Future main() async { testWidgets('Video plays inline when allowsInlineMediaPlayback is true', (WidgetTester tester) async { + final String videoTestBase64 = await getTestVideoBase64(); final Completer pageLoaded = Completer(); final Completer videoPlaying = Completer(); @@ -513,6 +476,7 @@ Future main() async { testWidgets( 'Video plays full screen when allowsInlineMediaPlayback is false', (WidgetTester tester) async { + final String videoTestBase64 = await getTestVideoBase64(); final Completer pageLoaded = Completer(); final Completer videoPlaying = Completer(); @@ -1725,3 +1689,39 @@ class ClassWithCallbackClass { late final CopyableObjectWithCallback callbackClass; } + +Future getTestVideoBase64() async { + final ByteData videoData = await rootBundle.load('assets/sample_video.mp4'); + final String base64VideoData = base64Encode(Uint8List.view(videoData.buffer)); + final String videoTest = ''' + + Video auto play + + + + + + + '''; + return base64Encode(const Utf8Encoder().convert(videoTest)); +}