diff --git a/packages/youtube_player_iframe_web/lib/src/web_youtube_player_iframe_controller.dart b/packages/youtube_player_iframe_web/lib/src/web_youtube_player_iframe_controller.dart index 5b99942a..720e970d 100644 --- a/packages/youtube_player_iframe_web/lib/src/web_youtube_player_iframe_controller.dart +++ b/packages/youtube_player_iframe_web/lib/src/web_youtube_player_iframe_controller.dart @@ -83,9 +83,8 @@ class WebYoutubePlayerIframeController extends PlatformWebViewController { final completer = Completer(); final subscription = window.onMessage.listen( (event) { - final data = jsonDecode(event.data.dartify() as String); - - if (data is Map && data.containsKey(key)) { + final data = handleJsMessageToMap(event.data.dartify()); + if (data.containsKey(key)) { completer.complete(data[key].toString()); } }, @@ -206,9 +205,9 @@ class YoutubePlayerIframeWeb extends PlatformWebViewWidget { if (channelParams != null) { window.onMessage.listen( (event) { - channelParams.onMessageReceived( - JavaScriptMessage(message: event.data.dartify() as String), - ); + channelParams.onMessageReceived(JavaScriptMessage( + message: handleJsMessageToString(event.data.dartify()), + )); }, ); } @@ -217,6 +216,26 @@ class YoutubePlayerIframeWeb extends PlatformWebViewWidget { } } +Map handleJsMessageToMap(Object? jsMessage) { + return switch (jsMessage) { + String message => jsonDecode(message), + Map map => map, + Object? data => { + 'error': + '[$YoutubePlayerIframeWeb] Invalid message type "${data.runtimeType}": $data' + }, + }; +} + +String handleJsMessageToString(Object? jsMessage) { + return switch (jsMessage) { + String message => message, + Map map => jsonEncode(map), + Object? data => + '[$YoutubePlayerIframeWeb] Invalid message type "${data.runtimeType}": $data', + }; +} + extension type YoutubeIframeElement._(HTMLIFrameElement element) { /// A class that represents a YouTube iframe element. YoutubeIframeElement({required int id})