diff --git a/flutter_inappwebview/example/integration_test/headless_in_app_webview/convert_to_inappwebview.dart b/flutter_inappwebview/example/integration_test/headless_in_app_webview/convert_to_inappwebview.dart index af88f38f4..17c853d0d 100644 --- a/flutter_inappwebview/example/integration_test/headless_in_app_webview/convert_to_inappwebview.dart +++ b/flutter_inappwebview/example/integration_test/headless_in_app_webview/convert_to_inappwebview.dart @@ -26,6 +26,7 @@ void convertToInAppWebView() { expect(headlessWebView.isRunning(), true); final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); await pageLoaded.future; final String? url = (await controller.getUrl())?.toString(); @@ -55,6 +56,7 @@ void convertToInAppWebView() { ); final InAppWebViewController widgetController = await widgetControllerCompleter.future; + await tester.pump(); expect(headlessWebView.isRunning(), false); diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/get_content_height.dart b/flutter_inappwebview/example/integration_test/in_app_webview/get_content_height.dart index 1e1635fc9..570e8eba8 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/get_content_height.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/get_content_height.dart @@ -33,9 +33,8 @@ void getContentHeight() { ); final InAppWebViewController controller = await controllerCompleter.future; - await pageLoaded.future; - await tester.pump(); + await pageLoaded.future; final contentHeight = await controller.getContentHeight(); expect(contentHeight, isNonZero); diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/get_favicons.dart b/flutter_inappwebview/example/integration_test/in_app_webview/get_favicons.dart index d2ff44a21..402e61b06 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/get_favicons.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/get_favicons.dart @@ -33,6 +33,7 @@ void getFavicons() { ); final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); await pageLoaded.future; final List? favicons = await controller.getFavicons(); diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/get_html.dart b/flutter_inappwebview/example/integration_test/in_app_webview/get_html.dart index a6230478f..bd405621d 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/get_html.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/get_html.dart @@ -33,6 +33,8 @@ void getHtml() { ); final InAppWebViewController controller = await controllerCompleter.future; + // Platform view creation happens asynchronously. + await tester.pump(); await pageLoaded.future; final String? html = await controller.getHtml(); diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/get_meta_tags.dart b/flutter_inappwebview/example/integration_test/in_app_webview/get_meta_tags.dart index e30b703e8..c6bc57394 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/get_meta_tags.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/get_meta_tags.dart @@ -33,6 +33,7 @@ void getMetaTags() { ); final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); await pageLoaded.future; List metaTags = await controller.getMetaTags(); diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/get_meta_theme_color.dart b/flutter_inappwebview/example/integration_test/in_app_webview/get_meta_theme_color.dart index 15f8fe863..b3cfcbfa2 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/get_meta_theme_color.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/get_meta_theme_color.dart @@ -33,6 +33,7 @@ void getMetaThemeColor() { ); final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); await pageLoaded.future; expect(await controller.getMetaThemeColor(), isNotNull); diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/get_original_url.dart b/flutter_inappwebview/example/integration_test/in_app_webview/get_original_url.dart index 635e95d91..182a4d1d4 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/get_original_url.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/get_original_url.dart @@ -33,6 +33,7 @@ void getOriginalUrl() { ); final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); await pageLoaded.future; var originUrl = (await controller.getOriginalUrl())?.toString(); expect(originUrl, url.toString()); diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/get_title.dart b/flutter_inappwebview/example/integration_test/in_app_webview/get_title.dart index dcd492244..78de31c0e 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/get_title.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/get_title.dart @@ -50,6 +50,7 @@ void getTitle() { ); final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); await pageStarted.future; await pageLoaded.future; diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/initial_url_request.dart b/flutter_inappwebview/example/integration_test/in_app_webview/initial_url_request.dart index 792467b3c..bb93e4bbe 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/initial_url_request.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/initial_url_request.dart @@ -80,6 +80,8 @@ void initialUrlRequest() { ), ), ); + // Platform view creation happens asynchronously. + await tester.pump(); await pageLoaded.future; final InAppWebViewController controller = diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/inject_css.dart b/flutter_inappwebview/example/integration_test/in_app_webview/inject_css.dart index cb5563941..108a0bdc2 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/inject_css.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/inject_css.dart @@ -35,6 +35,7 @@ void injectCSS() { final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); await pageLoaded.future; await controller.injectCSSCode(source: """ @@ -74,6 +75,7 @@ void injectCSS() { final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); await pageLoaded.future; await controller.injectCSSFileFromUrl( @@ -110,6 +112,7 @@ void injectCSS() { final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); await pageLoaded.future; await controller.injectCSSFileFromAsset( diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/inject_javascript_file.dart b/flutter_inappwebview/example/integration_test/in_app_webview/inject_javascript_file.dart index 1f60b5c02..b85c28790 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/inject_javascript_file.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/inject_javascript_file.dart @@ -37,6 +37,7 @@ void injectJavascriptFile() { final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); await pageLoaded.future; await controller.injectJavascriptFileFromUrl( @@ -97,6 +98,7 @@ void injectJavascriptFile() { final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); await pageLoaded.future; await controller.injectJavascriptFileFromAsset( diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/is_secure_context.dart b/flutter_inappwebview/example/integration_test/in_app_webview/is_secure_context.dart index 3c5d8a6cc..8457aff11 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/is_secure_context.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/is_secure_context.dart @@ -34,6 +34,7 @@ void isSecureContext() { ); final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); await pageLoads.stream.first; expect(await controller.isSecureContext(), true); diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/javascript_code_evaluation.dart b/flutter_inappwebview/example/integration_test/in_app_webview/javascript_code_evaluation.dart index 8f9a683f2..4ac6f3a6f 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/javascript_code_evaluation.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/javascript_code_evaluation.dart @@ -40,6 +40,7 @@ void javascriptCodeEvaluation() { ); final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); await pageLoaded.future; var result = await controller.evaluateJavascript(source: """ diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/load_data.dart b/flutter_inappwebview/example/integration_test/in_app_webview/load_data.dart index e5fb32ee9..4ada282aa 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/load_data.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/load_data.dart @@ -32,6 +32,8 @@ void loadData() { ); final InAppWebViewController controller = await controllerCompleter.future; + // do not wait for pump to not miss the load event + tester.pump(); await pageLoads.stream.first; final data = """ diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/load_file.dart b/flutter_inappwebview/example/integration_test/in_app_webview/load_file.dart index 09dbbcc85..df857e569 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/load_file.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/load_file.dart @@ -32,6 +32,8 @@ void loadFile() { ); final InAppWebViewController controller = await controllerCompleter.future; + // do not wait for pump to not miss the load event + tester.pump(); await pageLoads.stream.first; await controller.loadFile( diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/load_url.dart b/flutter_inappwebview/example/integration_test/in_app_webview/load_url.dart index bdb1f5bea..4fca15158 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/load_url.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/load_url.dart @@ -39,6 +39,7 @@ void loadUrl() { ), ); final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); expect(await firstUrlLoad.future, initialUrl.toString()); await controller.loadUrl( diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/on_console_message.dart b/flutter_inappwebview/example/integration_test/in_app_webview/on_console_message.dart index 495d12c4b..a09ceb3ff 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/on_console_message.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/on_console_message.dart @@ -33,7 +33,7 @@ void onConsoleMessage() { ), ), ); - + await tester.pump(); final ConsoleMessage consoleMessage = await onConsoleMessageCompleter.future; expect(consoleMessage.message, 'message'); diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/on_scroll_changed.dart b/flutter_inappwebview/example/integration_test/in_app_webview/on_scroll_changed.dart index 6903cbc89..7d4fe106d 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/on_scroll_changed.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/on_scroll_changed.dart @@ -38,9 +38,8 @@ void onScrollChanged() { ); final InAppWebViewController controller = await controllerCompleter.future; - await pageLoaded.future; - await tester.pump(); + await pageLoaded.future; controller.scrollTo(x: 0, y: 500); diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/on_title_changed.dart b/flutter_inappwebview/example/integration_test/in_app_webview/on_title_changed.dart index d0f6fb5a2..cbcd342a9 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/on_title_changed.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/on_title_changed.dart @@ -41,8 +41,8 @@ void onTitleChanged() { ); final InAppWebViewController controller = await controllerCompleter.future; - await pageLoaded.future; await tester.pump(); + await pageLoaded.future; await controller.evaluateJavascript( source: "document.title = 'title test';"); await expectLater(onTitleChangedCompleter.future, completes); diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/on_update_visited_history.dart b/flutter_inappwebview/example/integration_test/in_app_webview/on_update_visited_history.dart index 9976e81e4..a43f1e4b9 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/on_update_visited_history.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/on_update_visited_history.dart @@ -43,6 +43,7 @@ void onUpdateVisitedHistory() { ); final InAppWebViewController controller = await controllerCompleter.future; + await tester.pump(); await pageLoaded.future; await controller.evaluateJavascript(source: """ diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/on_window_blur.dart b/flutter_inappwebview/example/integration_test/in_app_webview/on_window_blur.dart index cb7b3282f..0b1fe9c3d 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/on_window_blur.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/on_window_blur.dart @@ -29,6 +29,7 @@ void onWindowBlur() { ), ), ); + await tester.pump(); await expectLater(onWindowBlurCompleter.future, completes); }, skip: shouldSkip); } diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/on_window_focus.dart b/flutter_inappwebview/example/integration_test/in_app_webview/on_window_focus.dart index c07fe5282..ded782e10 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/on_window_focus.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/on_window_focus.dart @@ -29,6 +29,7 @@ void onWindowFocus() { ), ), ); + await tester.pump(); await expectLater(onWindowFocusCompleter.future, completes); }, skip: shouldSkip); } diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/print_current_page.dart b/flutter_inappwebview/example/integration_test/in_app_webview/print_current_page.dart index 13a11c0fd..d38e206cb 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/print_current_page.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/print_current_page.dart @@ -33,8 +33,8 @@ void printCurrentPage() { ); final InAppWebViewController controller = await controllerCompleter.future; - await pageLoaded.future; await tester.pump(); + await pageLoaded.future; await expectLater(controller.printCurrentPage(), completes); }, skip: shouldSkip); } diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/programmatic_scroll.dart b/flutter_inappwebview/example/integration_test/in_app_webview/programmatic_scroll.dart index 640e7129d..582c808af 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/programmatic_scroll.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/programmatic_scroll.dart @@ -69,9 +69,8 @@ void programmaticScroll() { final InAppWebViewController controller = await controllerCompleter.future; - await pageLoaded.future; - await tester.pump(); + await pageLoaded.future; await controller.scrollTo(x: 0, y: 0); diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/reload.dart b/flutter_inappwebview/example/integration_test/in_app_webview/reload.dart index 5cdb218da..b01c7fa28 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/reload.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/reload.dart @@ -71,6 +71,8 @@ void reload() { ); final InAppWebViewController controller = await controllerCompleter.future; + // do not wait for pump to not miss the load event + tester.pump(); String? reloadUrl = await pageLoads.stream.first; expect(reloadUrl, url.toString()); diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/set_get_settings.dart b/flutter_inappwebview/example/integration_test/in_app_webview/set_get_settings.dart index 2c5a6d0fa..5bea368ca 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/set_get_settings.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/set_get_settings.dart @@ -32,6 +32,8 @@ void setGetSettings() { ), ), ); + // Platform view creation happens asynchronously. + await tester.pumpAndSettle(); final InAppWebViewController controller = await controllerCompleter.future; await pageLoaded.future; diff --git a/flutter_inappwebview/example/integration_test/in_app_webview/webview_windows.dart b/flutter_inappwebview/example/integration_test/in_app_webview/webview_windows.dart index 1db16a354..cc6eb3338 100644 --- a/flutter_inappwebview/example/integration_test/in_app_webview/webview_windows.dart +++ b/flutter_inappwebview/example/integration_test/in_app_webview/webview_windows.dart @@ -49,7 +49,7 @@ void webViewWindows() { ), ), ); - + await tester.pump(); await expectLater(pageLoaded.future, completes); }, skip: shouldSkipTest1); diff --git a/flutter_inappwebview/example/pubspec.yaml b/flutter_inappwebview/example/pubspec.yaml index 5ce1591da..0efca4a07 100755 --- a/flutter_inappwebview/example/pubspec.yaml +++ b/flutter_inappwebview/example/pubspec.yaml @@ -12,8 +12,8 @@ version: 1.0.0+1 publish_to: none environment: - sdk: ">=2.17.0 <4.0.0" - flutter: ">=3.0.0" + sdk: ">=3.3.0 <4.0.0" + flutter: ">=3.19.0" dependencies: flutter: diff --git a/flutter_inappwebview_web/CHANGELOG.md b/flutter_inappwebview_web/CHANGELOG.md index 144265ff8..78f197c88 100644 --- a/flutter_inappwebview_web/CHANGELOG.md +++ b/flutter_inappwebview_web/CHANGELOG.md @@ -1,5 +1,6 @@ ## 1.1.0 +- Migrates package to `package:web`. - Updates minimum supported SDK version to Flutter 3.24/Dart 3.5. ## 1.0.8 diff --git a/flutter_inappwebview_web/example/pubspec.lock b/flutter_inappwebview_web/example/pubspec.lock index 2baabd989..2d29ddfaa 100644 --- a/flutter_inappwebview_web/example/pubspec.lock +++ b/flutter_inappwebview_web/example/pubspec.lock @@ -45,10 +45,10 @@ packages: dependency: "direct main" description: name: cupertino_icons - sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "1.0.8" fake_async: dependency: transitive description: @@ -57,6 +57,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + url: "https://pub.dev" + source: hosted + version: "2.1.3" file: dependency: transitive description: @@ -70,11 +78,33 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_downloader: + dependency: "direct main" + description: + name: flutter_downloader + sha256: b6da5495b6258aa7c243d0f0a5281e3430b385bccac11cc508f981e653b25aa6 + url: "https://pub.dev" + source: hosted + version: "1.11.8" flutter_driver: - dependency: transitive + dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + flutter_inappwebview: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "6.1.0" + flutter_inappwebview_android: + dependency: "direct overridden" + description: + path: "../../flutter_inappwebview_android" + relative: true + source: path + version: "1.1.0" flutter_inappwebview_internal_annotations: dependency: transitive description: @@ -83,29 +113,49 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + flutter_inappwebview_ios: + dependency: "direct overridden" + description: + path: "../../flutter_inappwebview_ios" + relative: true + source: path + version: "1.1.0" + flutter_inappwebview_macos: + dependency: "direct overridden" + description: + path: "../../flutter_inappwebview_macos" + relative: true + source: path + version: "1.1.0" flutter_inappwebview_platform_interface: - dependency: transitive + dependency: "direct overridden" description: - name: flutter_inappwebview_platform_interface - sha256: "545fd4c25a07d2775f7d5af05a979b2cac4fbf79393b0a7f5d33ba39ba4f6187" - url: "https://pub.dev" - source: hosted - version: "1.0.10" + path: "../../flutter_inappwebview_platform_interface" + relative: true + source: path + version: "1.1.0" flutter_inappwebview_web: - dependency: "direct main" + dependency: "direct overridden" description: - path: ".." + path: "../../flutter_inappwebview_web" relative: true source: path version: "1.1.0" + flutter_inappwebview_windows: + dependency: "direct overridden" + description: + path: "../../flutter_inappwebview_windows" + relative: true + source: path + version: "0.1.0" flutter_lints: dependency: "direct dev" description: name: flutter_lints - sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "4.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -162,10 +212,10 @@ packages: dependency: transitive description: name: lints - sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "4.0.0" matcher: dependency: transitive description: @@ -198,6 +248,102 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.0" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 + url: "https://pub.dev" + source: hosted + version: "2.1.4" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" + url: "https://pub.dev" + source: hosted + version: "2.2.10" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 + url: "https://pub.dev" + source: hosted + version: "2.4.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" + url: "https://pub.dev" + source: hosted + version: "11.3.1" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "76e4ab092c1b240d31177bb64d2b0bea43f43d0e23541ec866151b9f7b2490fa" + url: "https://pub.dev" + source: hosted + version: "12.0.12" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 + url: "https://pub.dev" + source: hosted + version: "9.4.5" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851 + url: "https://pub.dev" + source: hosted + version: "0.1.3+2" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9 + url: "https://pub.dev" + source: hosted + version: "4.2.3" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" platform: dependency: transitive description: @@ -210,10 +356,42 @@ packages: dependency: transitive description: name: plugin_platform_interface - sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pointer_interceptor: + dependency: "direct main" + description: + name: pointer_interceptor + sha256: "57210410680379aea8b1b7ed6ae0c3ad349bfd56fe845b8ea934a53344b9d523" + url: "https://pub.dev" + source: hosted + version: "0.10.1+2" + pointer_interceptor_ios: + dependency: transitive + description: + name: pointer_interceptor_ios + sha256: a6906772b3205b42c44614fcea28f818b1e5fdad73a4ca742a7bd49818d9c917 + url: "https://pub.dev" + source: hosted + version: "0.10.1" + pointer_interceptor_platform_interface: + dependency: transitive + description: + name: pointer_interceptor_platform_interface + sha256: "0597b0560e14354baeb23f8375cd612e8bd4841bf8306ecb71fcd0bb78552506" + url: "https://pub.dev" + source: hosted + version: "0.10.0+1" + pointer_interceptor_web: + dependency: transitive + description: + name: pointer_interceptor_web + sha256: "7a7087782110f8c1827170660b09f8aa893e0e9a61431dbbe2ac3fc482e8c044" url: "https://pub.dev" source: hosted - version: "2.1.6" + version: "0.10.2+1" process: dependency: transitive description: @@ -283,6 +461,70 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.2" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" + url: "https://pub.dev" + source: hosted + version: "6.3.0" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: e35a698ac302dd68e41f73250bd9517fe3ab5fa4f18fe4647a0872db61bacbab + url: "https://pub.dev" + source: hosted + version: "6.3.10" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e + url: "https://pub.dev" + source: hosted + version: "6.3.1" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af + url: "https://pub.dev" + source: hosted + version: "3.2.0" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" + url: "https://pub.dev" + source: hosted + version: "2.3.3" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" + url: "https://pub.dev" + source: hosted + version: "3.1.2" vector_math: dependency: transitive description: @@ -299,6 +541,14 @@ packages: url: "https://pub.dev" source: hosted version: "14.2.5" + web: + dependency: transitive + description: + name: web + sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 + url: "https://pub.dev" + source: hosted + version: "1.0.0" webdriver: dependency: transitive description: @@ -307,6 +557,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + url: "https://pub.dev" + source: hosted + version: "1.0.4" sdks: dart: ">=3.5.0 <4.0.0" flutter: ">=3.24.0" diff --git a/flutter_inappwebview_web/lib/assets/web/web_support.js b/flutter_inappwebview_web/lib/assets/web/web_support.js index 031222d0b..e3893d874 100644 --- a/flutter_inappwebview_web/lib/assets/web/web_support.js +++ b/flutter_inappwebview_web/lib/assets/web/web_support.js @@ -1,6 +1,12 @@ window.flutter_inappwebview = { webViews: {}, - createFlutterInAppWebView: function(viewId, iframeId) { + /** + * @param viewId {number | string} + * @param iframe {HTMLIFrameElement} + * @param iframeContainer {HTMLDivElement} + */ + createFlutterInAppWebView: function(viewId, iframe, iframeContainer) { + const iframeId = iframe.id; var webView = { viewId: viewId, iframeId: iframeId, @@ -19,8 +25,6 @@ window.flutter_inappwebview = { }, prepare: function(settings) { webView.settings = settings; - var iframe = document.getElementById(iframeId); - var iframeContainer = document.getElementById(iframeId + '-container'); document.addEventListener('fullscreenchange', function(event) { // document.fullscreenElement will point to the element that diff --git a/flutter_inappwebview_web/lib/web/headless_inappwebview_manager.dart b/flutter_inappwebview_web/lib/web/headless_inappwebview_manager.dart index 8a4dc5c94..9d0ab7f14 100644 --- a/flutter_inappwebview_web/lib/web/headless_inappwebview_manager.dart +++ b/flutter_inappwebview_web/lib/web/headless_inappwebview_manager.dart @@ -1,4 +1,4 @@ -import 'dart:html'; +import 'package:web/web.dart'; import 'package:flutter/services.dart'; import 'package:flutter_inappwebview_platform_interface/flutter_inappwebview_platform_interface.dart'; diff --git a/flutter_inappwebview_web/lib/web/in_app_web_view_web_element.dart b/flutter_inappwebview_web/lib/web/in_app_web_view_web_element.dart index 22fd79f8f..9cb3da6df 100644 --- a/flutter_inappwebview_web/lib/web/in_app_web_view_web_element.dart +++ b/flutter_inappwebview_web/lib/web/in_app_web_view_web_element.dart @@ -3,18 +3,25 @@ import 'dart:typed_data'; import 'dart:ui'; import 'package:flutter/services.dart'; import 'package:flutter_inappwebview_platform_interface/flutter_inappwebview_platform_interface.dart'; -import 'dart:html'; -import 'dart:js' as js; +import 'dart:js_interop'; import 'dart:developer'; +import 'package:web/web.dart'; import 'headless_inappwebview_manager.dart'; import 'web_platform_manager.dart'; +import 'js_bridge.dart'; + +extension on HTMLIFrameElement { + // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/csp + external set csp(String? value); + external String? get csp; +} class InAppWebViewWebElement implements Disposable { late dynamic _viewId; late BinaryMessenger _messenger; - late DivElement iframeContainer; - late IFrameElement iframe; + late HTMLDivElement iframeContainer; + late HTMLIFrameElement iframe; late MethodChannel? _channel; InAppWebViewSettings? initialSettings; URLRequest? initialUrlRequest; @@ -23,19 +30,19 @@ class InAppWebViewWebElement implements Disposable { String? headlessWebViewId; InAppWebViewSettings? settings; - late js.JsObject bridgeJsObject; + JSWebView? jsWebView; bool isLoading = false; InAppWebViewWebElement( {required dynamic viewId, required BinaryMessenger messenger}) { this._viewId = viewId; this._messenger = messenger; - iframeContainer = DivElement() + iframeContainer = HTMLDivElement() ..id = 'flutter_inappwebview-$_viewId-container' ..style.height = '100%' ..style.width = '100%' ..style.border = 'none'; - iframe = IFrameElement() + iframe = HTMLIFrameElement() ..id = 'flutter_inappwebview-$_viewId' ..style.height = '100%' ..style.width = '100%' @@ -57,10 +64,7 @@ class InAppWebViewWebElement implements Disposable { } }); - bridgeJsObject = js.JsObject.fromBrowserObject( - js.context[WebPlatformManager.BRIDGE_JS_OBJECT_NAME]); - bridgeJsObject['webViews'][_viewId] = bridgeJsObject - .callMethod("createFlutterInAppWebView", [_viewId, iframe.id]); + jsWebView = flutterInAppWebView?.createFlutterInAppWebView(_viewId, iframe, iframeContainer); } /// Handles method calls over the MethodChannel of this plugin. @@ -202,8 +206,7 @@ class InAppWebViewWebElement implements Disposable { initialData = webView.initialData; initialFile = webView.initialFile; - bridgeJsObject['webViews'][_viewId] = bridgeJsObject - .callMethod("createFlutterInAppWebView", [_viewId, iframe.id]); + jsWebView = flutterInAppWebView?.createFlutterInAppWebView(_viewId, iframe, iframeContainer); } } } @@ -239,16 +242,7 @@ class InAppWebViewWebElement implements Disposable { } } - _callMethod("prepare", [js.JsObject.jsify(settings!.toMap())]); - } - - dynamic _callMethod(Object method, [List? args]) { - var webViews = bridgeJsObject['webViews'] as js.JsObject; - if (webViews.hasProperty(_viewId)) { - var webview = bridgeJsObject['webViews'][_viewId] as js.JsObject; - return webview.callMethod(method, args); - } - return null; + jsWebView?.prepare(settings?.toMap().jsify()); } void makeInitialLoad() async { @@ -261,7 +255,7 @@ class InAppWebViewWebElement implements Disposable { } } - Future _makeRequest(URLRequest urlRequest, + Future _makeRequest(URLRequest urlRequest, {bool? withCredentials, String? responseType, String? mimeType, @@ -276,11 +270,11 @@ class InAppWebViewWebElement implements Disposable { onProgress: onProgress); } - String _convertHttpResponseToData(HttpRequest httpRequest) { + String _convertHttpResponseToData(XMLHttpRequest httpRequest) { final String contentType = httpRequest.getResponseHeader('content-type') ?? 'text/html'; return 'data:$contentType,' + - Uri.encodeComponent(httpRequest.responseText ?? ''); + Uri.encodeComponent(httpRequest.responseText); } String getIFrameId() { @@ -316,31 +310,31 @@ class InAppWebViewWebElement implements Disposable { } Future reload() async { - _callMethod("reload"); + jsWebView?.reload(); } Future goBack() async { - _callMethod("goBack"); + jsWebView?.goBack(); } Future goForward() async { - _callMethod("goForward"); + jsWebView?.goForward(); } Future goBackOrForward({required int steps}) async { - _callMethod("goBackOrForward", [steps]); + jsWebView?.goBackOrForward(steps.toJS); } Future evaluateJavascript({required String source}) async { - return _callMethod("evaluateJavascript", [source]); + return jsWebView?.evaluateJavascript(source.toJS)?.toDart; } Future stopLoading() async { - _callMethod("stopLoading"); + jsWebView?.stopLoading(); } Future getUrl() async { - String? url = _callMethod("getUrl"); + String? url = jsWebView?.getUrl()?.toDart; if (url == null || url.isEmpty || url == 'about:blank') { url = iframe.src; } @@ -348,7 +342,7 @@ class InAppWebViewWebElement implements Disposable { } Future getTitle() async { - return _callMethod("getTitle"); + return jsWebView?.getTitle()?.toDart; } Future postUrl( @@ -361,49 +355,39 @@ class InAppWebViewWebElement implements Disposable { Future injectJavascriptFileFromUrl( {required String urlFile, Map? scriptHtmlTagAttributes}) async { - _callMethod("injectJavascriptFileFromUrl", [ - urlFile, - scriptHtmlTagAttributes != null - ? js.JsObject.jsify(scriptHtmlTagAttributes) - : null - ]); + jsWebView?.injectJavascriptFileFromUrl(urlFile.toJS, scriptHtmlTagAttributes?.jsify()); } Future injectCSSCode({required String source}) async { - _callMethod("injectCSSCode", [source]); + jsWebView?.injectCSSCode(source.toJS); } Future injectCSSFileFromUrl( {required String urlFile, Map? cssLinkHtmlTagAttributes}) async { - _callMethod("injectCSSFileFromUrl", [ - urlFile, - cssLinkHtmlTagAttributes != null - ? js.JsObject.jsify(cssLinkHtmlTagAttributes) - : null - ]); + jsWebView?.injectCSSFileFromUrl(urlFile.toJS, cssLinkHtmlTagAttributes?.jsify()); } Future scrollTo( {required int x, required int y, bool animated = false}) async { - _callMethod('scrollTo', [x, y, animated]); + jsWebView?.scrollTo(x.toJS, y.toJS, animated.toJS); } Future scrollBy( {required int x, required int y, bool animated = false}) async { - _callMethod('scrollBy', [x, y, animated]); + jsWebView?.scrollBy(x.toJS, y.toJS, animated.toJS); } Future printCurrentPage() async { - _callMethod('printCurrentPage'); + jsWebView?.printCurrentPage(); } Future getContentHeight() async { - return (_callMethod('getContentHeight') as num?)?.toInt(); + return jsWebView?.getContentHeight()?.toDartInt; } Future getContentWidth() async { - return (_callMethod('getContentWidth') as num?)?.toInt(); + return jsWebView?.getContentWidth()?.toDartInt; } Future getOriginalUrl() async { @@ -411,46 +395,48 @@ class InAppWebViewWebElement implements Disposable { } Future getSelectedText() async { - return _callMethod('getSelectedText'); + final jsPromise = jsWebView?.getSelectedText(); + if (jsPromise != null) { + return jsPromise.toDart.then((value) => value?.toDart); + } + return null; } Future getScrollX() async { - return (_callMethod('getScrollX') as num?)?.toInt(); + return jsWebView?.getScrollX()?.toDartInt; } Future getScrollY() async { - return (_callMethod('getScrollY') as num?)?.toInt(); + return jsWebView?.getScrollY()?.toDartInt; } Future isSecureContext() async { - return _callMethod('isSecureContext'); + return jsWebView?.isSecureContext().toDart ?? false; } Future canScrollVertically() async { - return _callMethod('canScrollVertically'); + return jsWebView?.canScrollVertically().toDart ?? false; } Future canScrollHorizontally() async { - return _callMethod('canScrollHorizontally'); + return jsWebView?.canScrollHorizontally().toDart ?? false; } Set getSandbox() { var sandbox = iframe.sandbox; Set values = Set(); - if (sandbox != null) { - for (int i = 0; i < sandbox.length; i++) { - var token = Sandbox.fromNativeValue(sandbox.item(i)); - if (token != null) { - values.add(token); - } + for (int i = 0; i < sandbox.length; i++) { + var token = Sandbox.fromNativeValue(sandbox.item(i)); + if (token != null) { + values.add(token); } } return values.isEmpty ? Set.from(Sandbox.values) : values; } Size getSize() { - var size = _callMethod("getSize") as js.JsObject; - return Size(size["width"]!.toDouble(), size["height"]!.toDouble()); + var size = jsWebView?.getSize(); + return Size(size!.width!.toDartDouble, size.height!.toDartDouble); } Future setSettings(InAppWebViewSettings newSettings) async { @@ -466,16 +452,16 @@ class InAppWebViewWebElement implements Disposable { } if (settings!.iframeAllow != newSettings.iframeAllow) { - iframe.allow = newSettings.iframeAllow; + iframe.allow = newSettings.iframeAllow ?? ''; } if (settings!.iframeAllowFullscreen != newSettings.iframeAllowFullscreen) { - iframe.allowFullscreen = newSettings.iframeAllowFullscreen; + iframe.allowFullscreen = newSettings.iframeAllowFullscreen ?? false; } if (settings!.iframeReferrerPolicy != newSettings.iframeReferrerPolicy) { - iframe.referrerPolicy = newSettings.iframeReferrerPolicy?.toNativeValue(); + iframe.referrerPolicy = newSettings.iframeReferrerPolicy?.toNativeValue() ?? ''; } if (settings!.iframeName != newSettings.iframeName) { - iframe.name = newSettings.iframeName; + iframe.name = newSettings.iframeName ?? ''; } if (settings!.iframeCsp != newSettings.iframeCsp) { iframe.csp = newSettings.iframeCsp; @@ -495,7 +481,7 @@ class InAppWebViewWebElement implements Disposable { } newSettings.iframeSandbox = sandbox; - _callMethod("setSettings", [js.JsObject.jsify(newSettings.toMap())]); + jsWebView?.setSettings(newSettings.toMap().jsify()); settings = newSettings; } @@ -625,11 +611,5 @@ class InAppWebViewWebElement implements Disposable { if (WebPlatformManager.webViews.containsKey(_viewId)) { WebPlatformManager.webViews.remove(_viewId); } - bridgeJsObject = js.JsObject.fromBrowserObject( - js.context[WebPlatformManager.BRIDGE_JS_OBJECT_NAME]); - var webViews = bridgeJsObject['webViews'] as js.JsObject; - if (webViews.hasProperty(_viewId)) { - webViews.deleteProperty(_viewId); - } } } diff --git a/flutter_inappwebview_web/lib/web/js_bridge.dart b/flutter_inappwebview_web/lib/web/js_bridge.dart new file mode 100644 index 000000000..18ce729b0 --- /dev/null +++ b/flutter_inappwebview_web/lib/web/js_bridge.dart @@ -0,0 +1,50 @@ +import 'dart:js_interop'; +import 'package:web/web.dart'; + +extension type JSSize._(JSObject _) implements JSObject { + external JSNumber? get height; + external JSNumber? get width; +} + +extension type JSWebView._(JSObject _) implements JSObject { + external JSAny get viewId; + external JSString get iframeId; + external HTMLIFrameElement get iframe; + external HTMLDivElement get iframeContainer; + external void prepare(JSAny? settings); + external void setSettings(JSAny? newSettings); + external void reload(); + external void goBack(); + external void goForward(); + external void goBackOrForward(JSNumber steps); + external JSString? evaluateJavascript(JSString source); + external void stopLoading(); + external JSString? getUrl(); + external JSString? getTitle(); + external void injectJavascriptFileFromUrl(JSString urlFile, JSAny? scriptHtmlTagAttributes); + external void injectCSSCode(JSString source); + external void injectCSSFileFromUrl(JSString urlFile, JSAny? cssLinkHtmlTagAttributes); + external void scrollTo(JSNumber x, JSNumber y, JSBoolean animated); + external void scrollBy(JSNumber x, JSNumber y, JSBoolean animated); + external void printCurrentPage(); + external JSNumber? getContentHeight(); + external JSNumber? getContentWidth(); + external JSPromise? getSelectedText(); + external JSNumber? getScrollX(); + external JSNumber? getScrollY(); + external JSBoolean isSecureContext(); + external JSBoolean canScrollVertically(); + external JSBoolean canScrollHorizontally(); + external JSSize getSize(); +} + +@JS('window.flutter_inappwebview') +external FlutterInAppWebViewBridge? get flutterInAppWebView; + +extension type FlutterInAppWebViewBridge._(JSObject _) implements JSObject { + external JSObject webViews; + external JSWebView createFlutterInAppWebView(JSAny viewId, HTMLIFrameElement iframe, HTMLDivElement iframeContainer); + external JSString getCookieExpirationDate(num timestamp); + /// Allows assigning a function to be callable from `window.flutter_inappwebview.nativeCommunication()` + external JSFunction nativeCommunication; +} diff --git a/flutter_inappwebview_web/lib/web/platform_util.dart b/flutter_inappwebview_web/lib/web/platform_util.dart index 294503c82..710479c1b 100644 --- a/flutter_inappwebview_web/lib/web/platform_util.dart +++ b/flutter_inappwebview_web/lib/web/platform_util.dart @@ -1,10 +1,9 @@ import 'dart:async'; +import 'dart:js_interop'; import 'package:flutter/services.dart'; import 'package:flutter_inappwebview_platform_interface/flutter_inappwebview_platform_interface.dart'; -import 'dart:js' as js; - -import 'web_platform_manager.dart'; +import 'js_bridge.dart'; class PlatformUtil extends ChannelController { late BinaryMessenger _messenger; @@ -36,9 +35,7 @@ class PlatformUtil extends ChannelController { } String getWebCookieExpirationDate(int timestamp) { - var bridgeJsObject = js.JsObject.fromBrowserObject( - js.context[WebPlatformManager.BRIDGE_JS_OBJECT_NAME]); - return bridgeJsObject.callMethod("getCookieExpirationDate", [timestamp]); + return flutterInAppWebView!.getCookieExpirationDate(timestamp).toDart; } @override diff --git a/flutter_inappwebview_web/lib/web/shims/platform_view_registry.dart b/flutter_inappwebview_web/lib/web/shims/platform_view_registry.dart deleted file mode 100644 index 900a2e0b9..000000000 --- a/flutter_inappwebview_web/lib/web/shims/platform_view_registry.dart +++ /dev/null @@ -1,2 +0,0 @@ -export 'platform_view_registry_dart_ui.dart' - if (dart.library.ui_web) 'platform_view_registry_dart_ui_web.dart'; diff --git a/flutter_inappwebview_web/lib/web/shims/platform_view_registry_dart_ui.dart b/flutter_inappwebview_web/lib/web/shims/platform_view_registry_dart_ui.dart deleted file mode 100644 index 1aaddc014..000000000 --- a/flutter_inappwebview_web/lib/web/shims/platform_view_registry_dart_ui.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'dart:html' as html; -import 'dart:ui' as ui; - -class platformViewRegistry { - static bool registerViewFactory( - String viewTypeId, html.Element Function(int viewId) viewFactory) { - // ignore: undefined_prefixed_name - return ui.platformViewRegistry.registerViewFactory(viewTypeId, viewFactory); - } -} diff --git a/flutter_inappwebview_web/lib/web/shims/platform_view_registry_dart_ui_web.dart b/flutter_inappwebview_web/lib/web/shims/platform_view_registry_dart_ui_web.dart deleted file mode 100644 index 5d069c3dd..000000000 --- a/flutter_inappwebview_web/lib/web/shims/platform_view_registry_dart_ui_web.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'dart:html' as html; -// ignore: uri_does_not_exist -import 'dart:ui_web' as ui_web; - -class platformViewRegistry { - static bool registerViewFactory( - String viewTypeId, html.Element Function(int viewId) viewFactory) { - return ui_web.platformViewRegistry - .registerViewFactory(viewTypeId, viewFactory); - } -} diff --git a/flutter_inappwebview_web/lib/web/web_platform.dart b/flutter_inappwebview_web/lib/web/web_platform.dart index de74ea718..a2c5293e5 100644 --- a/flutter_inappwebview_web/lib/web/web_platform.dart +++ b/flutter_inappwebview_web/lib/web/web_platform.dart @@ -1,14 +1,14 @@ import 'dart:async'; +import 'dart:js_interop'; +import 'dart:ui_web' as ui_web; import '../src/inappwebview_platform.dart'; import 'headless_inappwebview_manager.dart'; +import 'js_bridge.dart'; import 'web_platform_manager.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; import 'in_app_web_view_web_element.dart'; import 'platform_util.dart'; -import 'package:js/js.dart'; - -import 'shims/platform_view_registry.dart' show platformViewRegistry; /// Builds an iframe based WebView. /// @@ -16,7 +16,7 @@ import 'shims/platform_view_registry.dart' show platformViewRegistry; class InAppWebViewFlutterPlugin { /// Constructs a new instance of [InAppWebViewFlutterPlugin]. InAppWebViewFlutterPlugin(Registrar registrar) { - platformViewRegistry.registerViewFactory( + ui_web.platformViewRegistry.registerViewFactory( 'com.pichillilorenzo/flutter_inappwebview', (int viewId) { var webView = InAppWebViewWebElement(viewId: viewId, messenger: registrar); @@ -33,21 +33,13 @@ class InAppWebViewFlutterPlugin { final platformUtil = PlatformUtil(messenger: registrar); // ignore: unused_local_variable final headlessManager = HeadlessInAppWebViewManager(messenger: registrar); - _nativeCommunication = allowInterop(_dartNativeCommunication); + flutterInAppWebView?.nativeCommunication = ( + (String method, JSAny viewId, [JSArray? args]) => _dartNativeCommunication(method, viewId, args?.toDart).toJS + ).toJS; } } -/// Allows assigning a function to be callable from `window.flutter_inappwebview.nativeCommunication()` -@JS('flutter_inappwebview.nativeCommunication') -external set _nativeCommunication( - Future Function(String method, dynamic viewId, [List? args]) f); - -/// Allows calling the assigned function from Dart as well. -@JS() -external Future nativeCommunication(String method, dynamic viewId, - [List? args]); - -Future _dartNativeCommunication(String method, dynamic viewId, +Future _dartNativeCommunication(String method, dynamic viewId, [List? args]) async { if (WebPlatformManager.webViews.containsKey(viewId)) { var webViewHtmlElement = @@ -80,8 +72,8 @@ Future _dartNativeCommunication(String method, dynamic viewId, String url = args[1] ?? 'about:blank'; String? target = args[2]; String? windowFeatures = args[3]; - return await webViewHtmlElement.onCreateWindow( - windowId, url, target, windowFeatures); + return (await webViewHtmlElement.onCreateWindow( + windowId, url, target, windowFeatures))?.toJS; case 'onWindowFocus': webViewHtmlElement.onWindowFocus(); break; @@ -117,4 +109,5 @@ Future _dartNativeCommunication(String method, dynamic viewId, break; } } + return null; } diff --git a/flutter_inappwebview_web/lib/web/web_platform_manager.dart b/flutter_inappwebview_web/lib/web/web_platform_manager.dart index 5f08e528d..13cba5010 100644 --- a/flutter_inappwebview_web/lib/web/web_platform_manager.dart +++ b/flutter_inappwebview_web/lib/web/web_platform_manager.dart @@ -1,4 +1,3 @@ abstract class WebPlatformManager { - static final String BRIDGE_JS_OBJECT_NAME = "flutter_inappwebview"; static final Map webViews = {}; } diff --git a/flutter_inappwebview_web/pubspec.yaml b/flutter_inappwebview_web/pubspec.yaml index 3aacda032..cc2fa96c5 100644 --- a/flutter_inappwebview_web/pubspec.yaml +++ b/flutter_inappwebview_web/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: sdk: flutter flutter_web_plugins: sdk: flutter - js: ^0.7.1 + web: ^0.5.1 flutter_inappwebview_platform_interface: ^1.0.10 dev_dependencies: