@@ -7,6 +7,12 @@ import {
77 matchingRegexes ,
88} from "../../../../utils/externalLinkHelper" ;
99import "../../../../assets/stylesheets/HtmlRunner.scss" ;
10+ import {
11+ allowedIframeHost ,
12+ MSG_HTML_PREVIEW_EVENT ,
13+ MSG_HTML_PREVIEW_READY ,
14+ MSG_HTML_PROJECT_UPDATE ,
15+ } from "../../../../utils/iframeUtils" ;
1016
1117const parentTag = ( node , tag ) =>
1218 node . parentNode ?. tagName && node . parentNode . tagName . toLowerCase ( ) === tag ;
@@ -55,7 +61,7 @@ const replaceHrefNodes = (indexPage, projectMedia, projectCode) => {
5561 } else {
5662 // eslint-disable-next-line no-script-url
5763 hrefNode . setAttribute ( "href" , "javascript:void(0)" ) ;
58- onClick = `window.parent.postMessage({msg: 'RELOAD', payload: { linkTo: '${ projectFile . name } ' }})` ;
64+ onClick = `window.parent.postMessage({type: ' ${ MSG_HTML_PREVIEW_EVENT } ', msg: 'RELOAD', payload: { linkTo: '${ projectFile . name } ' }})` ;
5965 }
6066 } else {
6167 const matchingExternalHref = matchingRegexes (
@@ -73,9 +79,9 @@ const replaceHrefNodes = (indexPage, projectMedia, projectCode) => {
7379 ) {
7480 // eslint-disable-next-line no-script-url
7581 hrefNode . setAttribute ( "href" , "javascript:void(0)" ) ;
76- onClick = " window.parent.postMessage({msg: 'ERROR: External link'})" ;
82+ onClick = ` window.parent.postMessage({type: ' ${ MSG_HTML_PREVIEW_EVENT } ', msg: 'ERROR: External link'})` ;
7783 } else if ( matchingExternalHref ) {
78- onClick = `window.parent.postMessage({msg: 'Allowed external link', payload: { linkTo: '${ hrefNode . attrs . href } ' }})` ;
84+ onClick = `window.parent.postMessage({type: ' ${ MSG_HTML_PREVIEW_EVENT } ', msg: 'Allowed external link', payload: { linkTo: '${ hrefNode . attrs . href } ' }})` ;
7985 }
8086 }
8187
@@ -125,10 +131,15 @@ export function HtmlRenderer() {
125131
126132 const handlePreviewUpdateFromHost = useCallback (
127133 ( event ) => {
128- // todo: validate message origin
129- // todo: use "type" to check what kind of message this is
134+ if ( ! allowedIframeHost ( event . origin ) ) {
135+ console . warn (
136+ "iFrame received message from unknown origin:" ,
137+ event . origin ,
138+ ) ;
139+ return ;
140+ }
130141 const message = event . data ;
131- if ( message ?. current ) {
142+ if ( message ?. type === MSG_HTML_PROJECT_UPDATE && message ?. current ) {
132143 const transformedHtml = parse ( message . current ) ;
133144
134145 replaceHrefNodes ( transformedHtml , message . media , message . code ) ;
@@ -149,8 +160,7 @@ export function HtmlRenderer() {
149160 const handleEventFromPreview = ( event ) => {
150161 // todo: validate message origin
151162 const message = event . data ;
152- // todo: use "type" to check what kind of message this is
153- if ( typeof event . data ?. msg === "string" ) {
163+ if ( message ?. type === MSG_HTML_PREVIEW_EVENT ) {
154164 // Forward events originating from the previewed code back to the host
155165 // todo: set appropriate target origin
156166 window . parent . postMessage ( message , "*" ) ;
@@ -164,7 +174,7 @@ export function HtmlRenderer() {
164174 const source = window . opener || window . parent ;
165175 if ( source ) {
166176 // todo: set appropriate target origin
167- source . postMessage ( { ready : true } , "*" ) ;
177+ source . postMessage ( { type : MSG_HTML_PREVIEW_READY } , "*" ) ;
168178 }
169179 return ( ) => {
170180 window . removeEventListener ( "message" , handlePreviewUpdateFromHost ) ;
0 commit comments