11import 'dart:async' ;
2- import 'dart:convert' ;
32import 'dart:math' ;
43import 'dart:ui_web' as ui;
54import 'package:ensemble/framework/error_handling.dart' ;
@@ -10,6 +9,7 @@ import 'package:ensemble/util/utils.dart';
109import 'package:ensemble/widget/helpers/box_wrapper.dart' ;
1110import 'package:ensemble/widget/helpers/widgets.dart' ;
1211import 'package:ensemble/widget/lottie/lottie.dart' ;
12+ import 'package:ensemble/widget/lottie/lottie_post_message.dart' ;
1313import 'package:ensemble/widget/widget_util.dart' ;
1414import 'package:flutter/material.dart' ;
1515import 'package:flutter/widgets.dart' ;
@@ -50,14 +50,18 @@ class LottieState extends EWidgetState<EnsembleLottie>
5050 widget.controller.lottieAction = this ;
5151 }
5252
53+ String get _postMessageOrigin => html.window.location.origin;
54+
5355 @override
54- void forward () => html.window.postMessage ('forward_$divId ' , "*" );
56+ void forward () =>
57+ html.window.postMessage ('forward_$divId ' , _postMessageOrigin);
5558 @override
56- void reset () => html.window.postMessage ('reset_$divId ' , "*" );
59+ void reset () => html.window.postMessage ('reset_$divId ' , _postMessageOrigin );
5760 @override
58- void reverse () => html.window.postMessage ('reverse_$divId ' , "*" );
61+ void reverse () =>
62+ html.window.postMessage ('reverse_$divId ' , _postMessageOrigin);
5963 @override
60- void stop () => html.window.postMessage ('stop_$divId ' , "*" );
64+ void stop () => html.window.postMessage ('stop_$divId ' , _postMessageOrigin );
6165 @override
6266 void dispose () {
6367 html.window.close (); // To prevent memory leaks
@@ -115,6 +119,7 @@ class LottieState extends EWidgetState<EnsembleLottie>
115119 // the image will throw exception. We have to use a permanent placeholder
116120 // until the binding engages
117121 // HTML & JS code for the web html renderer
122+ final parentOriginLiteral = lottieParentOriginLiteral (_postMessageOrigin);
118123 final htmlString = '''
119124<html>
120125 <body>
@@ -127,6 +132,7 @@ class LottieState extends EWidgetState<EnsembleLottie>
127132 <script type="text/javascript">
128133 let direction = 1; // Variable to define the direction ie to run animation forward or backward
129134 let player_$divId = document.getElementById("$divId ");
135+ const parentOrigin = $parentOriginLiteral ;
130136 // A counter variable which increments upon each event and thus making each event unique and allowing to segregate from old events
131137 let counter = 0;
132138 player_$divId .load("$source ");
@@ -135,6 +141,9 @@ class LottieState extends EWidgetState<EnsembleLottie>
135141
136142 // Function to handle all the messages that are received from dart to js
137143 function handleMessage(e) {
144+ if (e.origin !== parentOrigin) {
145+ return;
146+ }
138147 var data = e.data;
139148 if (data == "forward_$divId ") {
140149 direction = 1;
@@ -149,7 +158,7 @@ class LottieState extends EWidgetState<EnsembleLottie>
149158 }
150159 if (data == "stop_$divId ") {
151160 player_$divId .pause();
152- window.parent.postMessage('{"data": "onStop", "id": ' + counter + ', "tag": "$divId "}', "*" );
161+ window.parent.postMessage('{"data": "onStop", "id": ' + counter + ', "tag": "$divId "}', parentOrigin );
153162 counter++;
154163 }
155164 if (data == "reset_$divId ") {
@@ -158,20 +167,20 @@ class LottieState extends EWidgetState<EnsembleLottie>
158167 }
159168 // Event Listener for specific actions for animation like onComplete, onStart, onLoad and so on
160169 player_$divId .addEventListener("play", () => {
161- if (direction == 1) window.parent.postMessage('{"data": "onForward", "id": ' + counter + ', "tag": "$divId "}', "*" );
162- else window.parent.postMessage('{"data": "onReverse", "id": ' + counter + ', "tag": "$divId "}', "*" );
170+ if (direction == 1) window.parent.postMessage('{"data": "onForward", "id": ' + counter + ', "tag": "$divId "}', parentOrigin );
171+ else window.parent.postMessage('{"data": "onReverse", "id": ' + counter + ', "tag": "$divId "}', parentOrigin );
163172 counter++;
164173 });
165174 player_$divId .addEventListener("complete", () => {
166- window.parent.postMessage('{"data": "onComplete", "id": ' + counter + ', "tag": "$divId "}', "*" );
175+ window.parent.postMessage('{"data": "onComplete", "id": ' + counter + ', "tag": "$divId "}', parentOrigin );
167176 counter++;
168177 });
169178 player_$divId .addEventListener("pause", () => {
170- window.parent.postMessage('{"data": "onStop", "id": ' + counter + ', "tag": "$divId "}', "*" );
179+ window.parent.postMessage('{"data": "onStop", "id": ' + counter + ', "tag": "$divId "}', parentOrigin );
171180 counter++;
172181 });
173182 player_$divId .addEventListener("stop", () => {
174- window.parent.postMessage('{"data": "onStop", "id": ' + counter + ', "tag": "$divId "}', "*" );
183+ window.parent.postMessage('{"data": "onStop", "id": ' + counter + ', "tag": "$divId "}', parentOrigin );
175184 counter++;
176185 });
177186 </script>
@@ -188,13 +197,17 @@ class LottieState extends EWidgetState<EnsembleLottie>
188197 // Event listener for the messages that are sent from JS to Dart
189198 html.window.onMessage.listen (
190199 (event) async {
200+ if (! isAllowedLottiePostMessageOrigin (
201+ event.origin, _postMessageOrigin)) {
202+ return ;
203+ }
191204 final String data = event.data;
192- // Need to check if the data is in json format as there are also other events from JS
193- if (data. contains ( '{' ) ) {
194- final json = jsonDecode (data) ;
195- // Segregating the latest event from old events using then html tag and the id which is just a counter which increments by 1 for each event
196- if (lastEventId != json['id' ] && divId == json[ 'tag ' ]) {
197- lastEventId = json['id' ];
205+ final json = parseLottieCallbackMessage (rawData : data, tag : divId);
206+ if (json == null ) {
207+ return ;
208+ }
209+ if (lastEventId != json['id' ]) {
210+ lastEventId = json['id' ];
198211 // Mapping the events to their respective callbacks
199212 if (json['data' ] == "onForward" &&
200213 widget.controller.onForward != null ) {
@@ -228,7 +241,6 @@ class LottieState extends EWidgetState<EnsembleLottie>
228241 event: EnsembleEvent (widget),
229242 );
230243 }
231- }
232244 }
233245 },
234246 );
0 commit comments