Created
October 9, 2020 08:45
-
-
Save utopianfool/90e73c36c90c8e9e2b8c04d4d8bde200 to your computer and use it in GitHub Desktop.
Fix window.CP.shouldStopExecution used in some codepen scripts to prevent infinite loops - unminified
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
"object" != typeof window.CP && (window.CP = {}), window.CP.PenTimer = { | |
programNoLongerBeingMonitored: !1, | |
timeOfFirstCallToShouldStopLoop: 0, | |
_loopExits: {}, | |
_loopTimers: {}, | |
START_MONITORING_AFTER: 2e3, | |
STOP_ALL_MONITORING_TIMEOUT: 5e3, | |
MAX_TIME_IN_LOOP_WO_EXIT: 2200, | |
exitedLoop: function(o) { | |
this._loopExits[o] = !0 | |
}, | |
shouldStopLoop: function(o) { | |
if (this.programKilledSoStopMonitoring) return !0; | |
if (this.programNoLongerBeingMonitored) return !1; | |
if (this._loopExits[o]) return !1; | |
var t = this._getTime(); | |
if (0 === this.timeOfFirstCallToShouldStopLoop) return this.timeOfFirstCallToShouldStopLoop = t, !1; | |
var i = t - this.timeOfFirstCallToShouldStopLoop; | |
if (i < this.START_MONITORING_AFTER) return !1; | |
if (i > this.STOP_ALL_MONITORING_TIMEOUT) return this.programNoLongerBeingMonitored = !0, !1; | |
try { | |
this._checkOnInfiniteLoop(o, t) | |
} catch (o) { | |
return this._sendErrorMessageToEditor(), this.programKilledSoStopMonitoring = !0, !0 | |
} | |
return !1 | |
}, | |
_sendErrorMessageToEditor: function() { | |
try { | |
if (this._shouldPostMessage()) { | |
var o = { | |
action: "infinite-loop", | |
line: this._findAroundLineNumber() | |
}; | |
parent.postMessage(JSON.stringify(o), "*") | |
} else this._throwAnErrorToStopPen() | |
} catch (o) { | |
this._throwAnErrorToStopPen() | |
} | |
}, | |
_shouldPostMessage: function() { | |
return document.location.href.match(/boomerang/) | |
}, | |
_throwAnErrorToStopPen: function() { | |
throw "We found an infinite loop in your Pen. We've stopped the Pen from running. Please correct it or contact support@codepen.io." | |
}, | |
_findAroundLineNumber: function() { | |
var o = new Error, | |
t = 0; | |
if (o.stack) { | |
var i = o.stack.match(/boomerang\S+:(\d+):\d+/); | |
i && (t = i[1]) | |
} | |
return t | |
}, | |
_checkOnInfiniteLoop: function(o, t) { | |
if (!this._loopTimers[o]) return this._loopTimers[o] = t, !1; | |
var i = t - this._loopTimers[o]; | |
if (i > this.MAX_TIME_IN_LOOP_WO_EXIT) throw "Infinite Loop found on loop: " + o | |
}, | |
_getTime: function() { | |
return +new Date | |
} | |
}, window.CP.shouldStopExecution = function(o) { | |
var t = window.CP.PenTimer.shouldStopLoop(o); | |
return t === !0 && console.warn("[CodePen]: An infinite loop (or a loop taking too long) was detected, so we stopped its execution. Sorry!"), t | |
}, window.CP.exitedLoop = function(o) { | |
window.CP.PenTimer.exitedLoop(o) | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment