diff --git a/client/modules/IDE/components/PreviewFrame.jsx b/client/modules/IDE/components/PreviewFrame.jsx index 5627a7a9..6f28cc99 100644 --- a/client/modules/IDE/components/PreviewFrame.jsx +++ b/client/modules/IDE/components/PreviewFrame.jsx @@ -4,6 +4,7 @@ import ReactDOM from 'react-dom'; import srcDoc from 'srcdoc-polyfill'; import loopProtect from 'loop-protect'; +import { JSHINT } from 'jshint'; import { getBlobUrl } from '../actions/files'; import { resolvePathToFile } from '../../../../server/utils/filePath'; @@ -157,10 +158,26 @@ class PreviewFrame extends React.Component { const scriptsInHTML = sketchDoc.getElementsByTagName('script'); const scriptsInHTMLArray = Array.prototype.slice.call(scriptsInHTML); scriptsInHTMLArray.forEach((script) => { - script.innerHTML = loopProtect(script.innerHTML); // eslint-disable-line + script.innerHTML = this.jsPreprocess(script.innerHTML); // eslint-disable-line }); } + jsPreprocess(jsText) { + let newContent = jsText; + // check the code for js errors before sending it to strip comments + // or loops. + JSHINT(newContent); + + if (!JSHINT.errors) { + newContent = decomment(newContent, { + ignore: /noprotect/g, + space: true + }); + newContent = loopProtect(newContent); + } + return newContent; + } + injectLocalFiles() { const htmlFile = this.props.htmlFile.content; let scriptOffs = []; @@ -289,12 +306,8 @@ class PreviewFrame extends React.Component { } } }); - newContent = decomment(newContent, { - ignore: /noprotect/g, - space: true - }); - newContent = loopProtect(newContent); - return newContent; + + return this.jsPreprocess(newContent); } resolveCSSLinksInString(content, files) {