@@ -140,7 +140,7 @@ function init(formEl, data, loadErrors = []) {
140
140
if ( loadErrors . length > 0 ) {
141
141
throw loadErrors ;
142
142
}
143
-
143
+ form . view . html . dispatchEvent ( events . FormInitialized ( ) ) ;
144
144
return form ;
145
145
} ) ;
146
146
}
@@ -821,17 +821,16 @@ function _setEventHandlers(survey) {
821
821
} ) ;
822
822
823
823
if ( inIframe ( ) && settings . parentWindowOrigin ) {
824
- document . addEventListener (
825
- events . SubmissionSuccess ( ) . type ,
826
- postEventAsMessageToParentWindow
827
- ) ;
828
- document . addEventListener (
829
- events . Edited ( ) . type ,
830
- postEventAsMessageToParentWindow
831
- ) ;
832
- document . addEventListener (
833
- events . Close ( ) . type ,
834
- postEventAsMessageToParentWindow
824
+ Object . keys ( events ) . forEach ( ( eventName ) => {
825
+ document . addEventListener (
826
+ events [ eventName ] ( ) . type ,
827
+ postEventAsMessageToParentWindow
828
+ ) ;
829
+ } ) ;
830
+ window . addEventListener (
831
+ 'message' ,
832
+ processMessageFromParentWindow ,
833
+ false
835
834
) ;
836
835
}
837
836
@@ -918,9 +917,50 @@ function postEventAsMessageToParentWindow(event) {
918
917
}
919
918
}
920
919
920
+ /**
921
+ * Handles messages from parent window when in iframe.
922
+ * https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event
923
+ *
924
+ * @param {Object } event The dispatched event object for the message
925
+ * @param {String } event.origin The origin of the window that sent the message
926
+ * @param {Object } event.source The window object that sent the message
927
+ * @param {Object } event.data The object passed from the other window
928
+ * @param {String } event.data.type The type (or command) of the message passed. Currently the only supported type is 'setfields'
929
+ * @param {Object } event.data.content Type specific content of the message.
930
+ * For the setfields type, it is expected to be a key / value map of field paths and their URI encoded values that should be set.
931
+ */
932
+ function processMessageFromParentWindow ( event ) {
933
+ const { origin, data : payload } = event ;
934
+
935
+ if ( origin !== settings . parentWindowOrigin ) {
936
+ // bail, if the message is not sent from the expected origin
937
+ return ;
938
+ }
939
+
940
+ const { type, content } = payload ;
941
+
942
+ switch ( type ) {
943
+ case 'setfields' :
944
+ Object . keys ( content ) . forEach ( ( fieldName ) => {
945
+ const inputs = document . getElementsByName ( fieldName ) ;
946
+ inputs . forEach ( ( inputElement ) => {
947
+ form . input . setVal (
948
+ inputElement ,
949
+ decodeURIComponent ( content [ fieldName ] )
950
+ ) ;
951
+ inputElement . dispatchEvent ( events . Change ( ) ) ;
952
+ } ) ;
953
+ } ) ;
954
+ break ;
955
+ default :
956
+ break ;
957
+ }
958
+ }
959
+
921
960
export default {
922
961
init,
923
962
setLogoutLinkVisibility,
924
963
inIframe,
925
964
postEventAsMessageToParentWindow,
965
+ processMessageFromParentWindow,
926
966
} ;
0 commit comments