From 5b5b6e30ba07031766d7378002954bc0bad0839c Mon Sep 17 00:00:00 2001 From: Frank Koenders Date: Mon, 3 Apr 2023 12:10:04 +0200 Subject: [PATCH] feat: add support for JavaScript channels --- .../lib/src/web_webview_controller.dart | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/webview_flutter/webview_flutter_web/lib/src/web_webview_controller.dart b/packages/webview_flutter/webview_flutter_web/lib/src/web_webview_controller.dart index 52f93f911e40..45bdd74ccc34 100644 --- a/packages/webview_flutter/webview_flutter_web/lib/src/web_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_web/lib/src/web_webview_controller.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:collection'; import 'dart:convert'; import 'dart:html' as html; @@ -57,6 +58,10 @@ class WebWebViewController extends PlatformWebViewController { WebWebViewControllerCreationParams get _webWebViewParams => params as WebWebViewControllerCreationParams; + /// Mapping between channel names and message event handlers. + HashMap javascriptChannels = + HashMap(); + @override Future loadHtmlString(String html, {String? baseUrl}) async { // ignore: unsafe_html @@ -106,6 +111,31 @@ class WebWebViewController extends PlatformWebViewController { encoding: encoding, ).toString(); } + + @override + Future addJavaScriptChannel( + JavaScriptChannelParams javaScriptChannelParams, + ) async { + final Null Function(html.Event) handler = (html.Event event) { + if (event is html.MessageEvent) { + javaScriptChannelParams.onMessageReceived( + JavaScriptMessage(message: event.data.toString())); + } + }; + + javascriptChannels[javaScriptChannelParams.name] = handler; + html.window.addEventListener('message', handler); + } + + @override + Future removeJavaScriptChannel(String javaScriptChannelName) async { + final Null Function(html.Event)? handler = + javascriptChannels[javaScriptChannelName]; + + if (handler != null) { + html.window.removeEventListener('message', handler); + } + } } /// An implementation of [PlatformWebViewWidget] using Flutter the for Web API.