diff --git a/src/index.html b/src/index.html index 8291467..660c250 100644 --- a/src/index.html +++ b/src/index.html @@ -535,6 +535,16 @@ Code blast!
+ ++ +
diff --git a/src/script.js b/src/script.js index d255f03..9f64bc8 100644 --- a/src/script.js +++ b/src/script.js @@ -40,7 +40,8 @@ loginModal, profileModal, profileAvatarImg, profileUserName, openItemsBtn, askTo autoComplete: true, preserveConsoleLogs: true, lightVersion: false, - lineWrap: true + lineWrap: true, + infiniteLoopTimeout: 1000 }; var HtmlModes = { HTML: 'html', @@ -914,7 +915,9 @@ loginModal, profileModal, profileAvatarImg, profileUserName, openItemsBtn, askTo ]); } finally { if (shouldPreventInfiniteLoops !== false) { - code = utils.addInfiniteLoopProtection(code); + code = utils.addInfiniteLoopProtection(code, { + timeout: prefs.infiniteLoopTimeout + }); } d.resolve(code); } @@ -931,7 +934,9 @@ loginModal, profileModal, profileAvatarImg, profileUserName, openItemsBtn, askTo ]); } finally { if (shouldPreventInfiniteLoops !== false) { - code = utils.addInfiniteLoopProtection(code); + code = utils.addInfiniteLoopProtection(code, { + timeout: prefs.infiniteLoopTimeout + }); } d.resolve(code); } @@ -954,7 +959,9 @@ loginModal, profileModal, profileAvatarImg, profileUserName, openItemsBtn, askTo presets: ['latest', 'stage-2', 'react'] }).code; if (shouldPreventInfiniteLoops !== false) { - code = utils.addInfiniteLoopProtection(code); + code = utils.addInfiniteLoopProtection(code, { + timeout: prefs.infiniteLoopTimeout + }); } d.resolve(code); } @@ -983,7 +990,9 @@ loginModal, profileModal, profileAvatarImg, profileUserName, openItemsBtn, askTo }; } if (shouldPreventInfiniteLoops !== false) { - code = utils.addInfiniteLoopProtection(code.outputText); + code = utils.addInfiniteLoopProtection(code.outputText, { + timeout: prefs.infiniteLoopTimeout + }); } d.resolve(code); } catch (e) { @@ -1753,6 +1762,8 @@ loginModal, profileModal, profileAvatarImg, profileUserName, openItemsBtn, askTo $('[data-setting=preserveConsoleLogs]').checked = prefs.preserveConsoleLogs; $('[data-setting=lightVersion]').checked = prefs.lightVersion; $('[data-setting=lineWrap]').checked = prefs.lineWrap; + $('[data-setting=infiniteLoopTimeout]').value = + prefs.infiniteLoopTimeout; } /** diff --git a/src/utils.js b/src/utils.js index 6e76ad4..b7692b8 100644 --- a/src/utils.js +++ b/src/utils.js @@ -87,13 +87,12 @@ * Contributed by Ariya Hidayat! * @param code {string} Code to be protected from infinite loops. */ - function addInfiniteLoopProtection(code) { + function addInfiniteLoopProtection(code, { timeout }) { var loopId = 1; var patches = []; var varPrefix = '_wmloopvar'; var varStr = 'var %d = Date.now();\n'; - var checkStr = - '\nif (Date.now() - %d > 1000) { window.top.previewException(new Error("Infinite loop")); break;}\n'; + var checkStr = `\nif (Date.now() - %d > ${timeout}) { window.top.previewException(new Error("Infinite loop")); break;}\n`; esprima.parse(code, { tolerant: true, range: true, jsx: true }, function( node