From 21a6fa413c852703f8bd3f7957739ddc4e03fa75 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Tue, 28 Mar 2023 18:03:59 +0900 Subject: [PATCH] [webview_flutter] Clean up integration test and unused code - Remove unnecessary integration test. "loadRequest with headers" - Currently, requests with headers are not supported. "Video playback policy", "Audio playback policy" - Doesn't work normally. (When there are multimedia elements, onPageFinished is not called from the ewk.) "target _blank opens in same window" - Tizen ewk is not supported. "clearLocalStorage" - TizenWebViewController has no implementation. - Remove unused code in webview.cc --- packages/webview_flutter/CHANGELOG.md | 5 + .../webview_flutter_test.dart | 391 +----------------- .../lib/src/tizen_webview_controller.dart | 8 + packages/webview_flutter/tizen/src/webview.cc | 32 -- 4 files changed, 15 insertions(+), 421 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 56cff5980..13028e68f 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,8 @@ +## NEXT + +* Remove unnecessary integration test. +* Remove unused code. + ## 0.7.0 * Update webivew_flutter to 4.0.2. diff --git a/packages/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/example/integration_test/webview_flutter_test.dart index d3b43bf44..e92333058 100644 --- a/packages/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -9,13 +9,9 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; -// TODO(a14n): remove this import once Flutter 3.1 or later reaches stable (including flutter/flutter#104231) -// ignore: unnecessary_import -import 'dart:typed_data'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; import 'package:webview_flutter/webview_flutter.dart'; @@ -41,7 +37,6 @@ Future main() async { final String prefixUrl = 'http://${server.address.address}:${server.port}'; final String primaryUrl = '$prefixUrl/hello.txt'; final String secondaryUrl = '$prefixUrl/secondary.txt'; - final String headersUrl = '$prefixUrl/headers'; testWidgets('loadRequest', (WidgetTester tester) async { final Completer pageFinished = Completer(); @@ -80,31 +75,6 @@ Future main() async { ); }); - testWidgets('loadRequest with headers', (WidgetTester tester) async { - final Map headers = { - 'test_header': 'flutter_test_header' - }; - - final StreamController pageLoads = StreamController(); - - final WebViewController controller = WebViewController() - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setNavigationDelegate( - NavigationDelegate(onPageFinished: (String url) => pageLoads.add(url)), - ); - - await tester.pumpWidget(WebViewWidget(controller: controller)); - - controller.loadRequest(Uri.parse(headersUrl), headers: headers); - - await pageLoads.stream.firstWhere((String url) => url == headersUrl); - - final String content = await controller.runJavaScriptReturningResult( - 'document.documentElement.innerText', - ) as String; - expect(content.contains('flutter_test_header'), isTrue); - }); - testWidgets('JavascriptChannel', (WidgetTester tester) async { final Completer pageFinished = Completer(); final WebViewController controller = WebViewController() @@ -184,252 +154,6 @@ Future main() async { expect(customUserAgent, 'Custom_User_Agent1'); }); - 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 pageLoaded = Completer(); - - late PlatformWebViewControllerCreationParams params; - params = const PlatformWebViewControllerCreationParams(); - - WebViewController controller = - WebViewController.fromPlatformCreationParams(params) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setNavigationDelegate( - NavigationDelegate(onPageFinished: (_) => pageLoaded.complete()), - ); - - await controller.loadRequest( - Uri.parse('data:text/html;charset=utf-8;base64,$videoTestBase64'), - ); - - await tester.pumpWidget(WebViewWidget(controller: controller)); - - await pageLoaded.future; - - bool isPaused = - await controller.runJavaScriptReturningResult('isPaused();') as bool; - expect(isPaused, false); - - pageLoaded = Completer(); - controller = WebViewController() - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setNavigationDelegate( - NavigationDelegate(onPageFinished: (_) => pageLoaded.complete()), - ) - ..loadRequest( - Uri.parse('data:text/html;charset=utf-8;base64,$videoTestBase64'), - ); - - await tester.pumpWidget(WebViewWidget(controller: controller)); - - await pageLoaded.future; - - isPaused = - await controller.runJavaScriptReturningResult('isPaused();') as bool; - expect(isPaused, true); - }); - - testWidgets('Video plays inline', (WidgetTester tester) async { - final Completer pageLoaded = Completer(); - final Completer videoPlaying = Completer(); - - late PlatformWebViewControllerCreationParams params; - params = const PlatformWebViewControllerCreationParams(); - final WebViewController controller = - WebViewController.fromPlatformCreationParams(params) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setNavigationDelegate( - NavigationDelegate(onPageFinished: (_) => pageLoaded.complete()), - ) - ..addJavaScriptChannel( - 'VideoTestTime', - onMessageReceived: (JavaScriptMessage message) { - final double currentTime = double.parse(message.message); - // Let it play for at least 1 second to make sure the related video's properties are set. - if (currentTime > 1 && !videoPlaying.isCompleted) { - videoPlaying.complete(null); - } - }, - ); - - await controller.loadRequest( - Uri.parse('data:text/html;charset=utf-8;base64,$videoTestBase64'), - ); - - await tester.pumpWidget(WebViewWidget(controller: controller)); - await tester.pumpAndSettle(); - - await pageLoaded.future; - - // Makes sure we get the correct event that indicates the video is actually playing. - await videoPlaying.future; - - final bool fullScreen = await controller - .runJavaScriptReturningResult('isFullScreen();') as bool; - expect(fullScreen, false); - }); - - // allowsInlineMediaPlayback is a noop on Android, so it is skipped. - testWidgets( - 'Video plays full screen when allowsInlineMediaPlayback is false', - (WidgetTester tester) async { - final Completer pageLoaded = Completer(); - final Completer videoPlaying = Completer(); - - final WebViewController controller = - WebViewController.fromPlatformCreationParams( - const PlatformWebViewControllerCreationParams()) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setNavigationDelegate( - NavigationDelegate(onPageFinished: (_) => pageLoaded.complete()), - ) - ..addJavaScriptChannel( - 'VideoTestTime', - onMessageReceived: (JavaScriptMessage message) { - final double currentTime = double.parse(message.message); - // Let it play for at least 1 second to make sure the related video's properties are set. - if (currentTime > 1 && !videoPlaying.isCompleted) { - videoPlaying.complete(null); - } - }, - ) - ..loadRequest( - Uri.parse( - 'data:text/html;charset=utf-8;base64,$videoTestBase64', - ), - ); - - await tester.pumpWidget(WebViewWidget(controller: controller)); - await tester.pumpAndSettle(); - - await pageLoaded.future; - - // Makes sure we get the correct event that indicates the video is actually playing. - await videoPlaying.future; - - final bool fullScreen = await controller - .runJavaScriptReturningResult('isFullScreen();') as bool; - expect(fullScreen, true); - }, skip: Platform.isAndroid); - }); - - group('Audio playback policy', () { - late String audioTestBase64; - setUpAll(() async { - final ByteData audioData = - await rootBundle.load('assets/sample_audio.ogg'); - final String base64AudioData = - base64Encode(Uint8List.view(audioData.buffer)); - final String audioTest = ''' - - Audio auto play - - - - - - - '''; - audioTestBase64 = base64Encode(const Utf8Encoder().convert(audioTest)); - }); - - testWidgets('Auto media playback', (WidgetTester tester) async { - Completer pageLoaded = Completer(); - - late PlatformWebViewControllerCreationParams params; - params = const PlatformWebViewControllerCreationParams(); - - WebViewController controller = - WebViewController.fromPlatformCreationParams(params) - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setNavigationDelegate( - NavigationDelegate(onPageFinished: (_) => pageLoaded.complete()), - ); - - await controller.loadRequest( - Uri.parse('data:text/html;charset=utf-8;base64,$audioTestBase64'), - ); - - await tester.pumpWidget(WebViewWidget(controller: controller)); - await tester.pumpAndSettle(); - - await pageLoaded.future; - - bool isPaused = - await controller.runJavaScriptReturningResult('isPaused();') as bool; - expect(isPaused, false); - - pageLoaded = Completer(); - controller = WebViewController() - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setNavigationDelegate( - NavigationDelegate(onPageFinished: (_) => pageLoaded.complete()), - ) - ..loadRequest( - Uri.parse('data:text/html;charset=utf-8;base64,$audioTestBase64'), - ); - - await tester.pumpWidget(WebViewWidget(controller: controller)); - await tester.pumpAndSettle(); - - await pageLoaded.future; - - isPaused = - await controller.runJavaScriptReturningResult('isPaused();') as bool; - expect(isPaused, true); - }); - }); - testWidgets('getTitle', (WidgetTester tester) async { const String getTitleTest = ''' @@ -668,118 +392,6 @@ Future main() async { expect(currentUrl, secondaryUrl); }); }); - - testWidgets('target _blank opens in same window', - (WidgetTester tester) async { - final Completer pageLoaded = Completer(); - - final WebViewController controller = WebViewController() - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setNavigationDelegate(NavigationDelegate( - onPageFinished: (_) => pageLoaded.complete(), - )); - - await tester.pumpWidget(WebViewWidget(controller: controller)); - - 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', - (WidgetTester tester) async { - Completer pageLoaded = Completer(); - - final WebViewController controller = WebViewController() - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setNavigationDelegate(NavigationDelegate( - onPageFinished: (_) => pageLoaded.complete(), - )) - ..loadRequest(Uri.parse(primaryUrl)); - - await tester.pumpWidget(WebViewWidget(controller: controller)); - - expect(controller.currentUrl(), completion(primaryUrl)); - await pageLoaded.future; - pageLoaded = Completer(); - - await controller.runJavaScript('window.open("$secondaryUrl")'); - await pageLoaded.future; - pageLoaded = Completer(); - expect(controller.currentUrl(), completion(secondaryUrl)); - - expect(controller.canGoBack(), completion(true)); - await controller.goBack(); - await pageLoaded.future; - await expectLater(controller.currentUrl(), completion(primaryUrl)); - }, - ); - - testWidgets( - 'clearLocalStorage', - (WidgetTester tester) async { - Completer pageLoadCompleter = Completer(); - - final WebViewController controller = WebViewController() - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..setNavigationDelegate(NavigationDelegate( - onPageFinished: (_) => pageLoadCompleter.complete(), - )) - ..loadRequest(Uri.parse(primaryUrl)); - - await tester.pumpWidget(WebViewWidget(controller: controller)); - - await pageLoadCompleter.future; - pageLoadCompleter = Completer(); - - await controller.runJavaScript('localStorage.setItem("myCat", "Tom");'); - final String myCatItem = await controller.runJavaScriptReturningResult( - 'localStorage.getItem("myCat");', - ) as String; - expect(myCatItem, _webViewString('Tom')); - - await controller.clearLocalStorage(); - - // Reload page to have changes take effect. - await controller.reload(); - await pageLoadCompleter.future; - - late final String? nullItem; - try { - nullItem = await controller.runJavaScriptReturningResult( - 'localStorage.getItem("myCat");', - ) as String; - } 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()); - }, - ); -} - -// JavaScript `null` evaluate to different string values on Android and iOS. -// This utility method returns the string boolean value of the current platform. -String _webViewNull() { - if (defaultTargetPlatform == TargetPlatform.iOS) { - return ''; - } - return 'null'; -} - -// JavaScript String evaluate to different string values on Android and iOS. -// This utility method returns the string boolean value of the current platform. -String _webViewString(String value) { - if (defaultTargetPlatform == TargetPlatform.iOS) { - return value; - } - return '"$value"'; } /// Returns the value used for the HTTP User-Agent: request header in subsequent HTTP requests. @@ -791,7 +403,8 @@ Future _runJavascriptReturningResult( WebViewController controller, String js, ) async { - if (defaultTargetPlatform == TargetPlatform.iOS) { + if (defaultTargetPlatform == TargetPlatform.iOS || + defaultTargetPlatform == TargetPlatform.linux) { return await controller.runJavaScriptReturningResult(js) as String; } return jsonDecode(await controller.runJavaScriptReturningResult(js) as String) diff --git a/packages/webview_flutter/lib/src/tizen_webview_controller.dart b/packages/webview_flutter/lib/src/tizen_webview_controller.dart index 707c2dbc1..124e3a750 100644 --- a/packages/webview_flutter/lib/src/tizen_webview_controller.dart +++ b/packages/webview_flutter/lib/src/tizen_webview_controller.dart @@ -62,6 +62,14 @@ class TizenWebViewController extends PlatformWebViewController { 'LoadRequestParams#uri is required to have a scheme.'); } + if (params.headers.isNotEmpty) { + throw ArgumentError('LoadRequestParams#headers is not supported.'); + } + + if (params.body != null) { + throw ArgumentError('LoadRequestParams#body is not supported.'); + } + switch (params.method) { case LoadRequestMethod.get: return _webview.loadRequest(params.uri.toString()); diff --git a/packages/webview_flutter/tizen/src/webview.cc b/packages/webview_flutter/tizen/src/webview.cc index 5ae7d252e..3ea9caa38 100644 --- a/packages/webview_flutter/tizen/src/webview.cc +++ b/packages/webview_flutter/tizen/src/webview.cc @@ -59,36 +59,6 @@ class NavigationRequestResult : public FlMethodResult { WebView* webview_; }; -std::string ErrorCodeToString(int error_code) { - switch (error_code) { - case EWK_ERROR_CODE_AUTHENTICATION: - return "authentication"; - case EWK_ERROR_CODE_BAD_URL: - return "badUrl"; - case EWK_ERROR_CODE_CANT_CONNECT: - return "connect"; - case EWK_ERROR_CODE_FAILED_TLS_HANDSHAKE: - return "failedSslHandshake"; - case EWK_ERROR_CODE_FAILED_FILE_IO: - return "file"; - case EWK_ERROR_CODE_CANT_LOOKUP_HOST: - return "hostLookup"; - case EWK_ERROR_CODE_TOO_MANY_REDIRECTS: - return "redirectLoop"; - case EWK_ERROR_CODE_REQUEST_TIMEOUT: - return "timeout"; - case EWK_ERROR_CODE_TOO_MANY_REQUESTS: - return "tooManyRequests"; - case EWK_ERROR_CODE_UNKNOWN: - return "unknown"; - case EWK_ERROR_CODE_UNSUPPORTED_SCHEME: - return "unsupportedScheme"; - default: - LOG_ERROR("Unknown error type: %d", error_code); - return "unknown"; - } -} - template bool GetValueFromEncodableMap(const flutter::EncodableValue* arguments, std::string key, T* out) { @@ -601,8 +571,6 @@ void WebView::OnLoadError(void* data, Evas_Object* obj, void* event_info) { flutter::EncodableValue(ewk_error_code_get(error))}, {flutter::EncodableValue("description"), flutter::EncodableValue(ewk_error_description_get(error))}, - {flutter::EncodableValue("errorType"), - flutter::EncodableValue(ErrorCodeToString(ewk_error_code_get(error)))}, {flutter::EncodableValue("failingUrl"), flutter::EncodableValue(ewk_error_url_get(error))}, };