"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 (n) {
|
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 (t) {
|
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) {
|
return window.CP.PenTimer.shouldStopLoop(o)
|
},
|
window.CP.exitedLoop = function (o) {
|
window.CP.PenTimer.exitedLoop(o)
|
};
|