Separate clear stack and run it after each spec

[finishes #50197985][fix #109418332]
- Fixes #985
- Fixes #945
- Fixes #366
This commit is contained in:
Gregg Van Hove
2016-10-14 09:21:49 -07:00
parent d85d6dd4b8
commit 17c89c69d6
7 changed files with 125 additions and 25 deletions

36
src/core/ClearStack.js Normal file
View File

@@ -0,0 +1,36 @@
getJasmineRequireObj().clearStack = function(j$) {
function messageChannelImpl(global) {
var channel = new global.MessageChannel(),
head = {},
tail = head;
channel.port1.onmessage = function() {
head = head.next;
var task = head.task;
delete head.task;
task();
};
return function clearStack(fn) {
tail = tail.next = { task: fn };
channel.port2.postMessage(0);
};
}
function getClearStack(global) {
if (global && global.process && j$.isFunction_(global.process.nextTick)) {
return global.process.nextTick;
} else if (j$.isFunction_(global.setImmediate)) {
return global.setImmediate;
} else if (!j$.util.isUndefined(global.MessageChannel)) {
return messageChannelImpl(global);
} else if (j$.isFunction_(global.setTimeout)) {
var realSetTimeout = global.setTimeout;
return function clearStack(fn) {
realSetTimeout(fn, 0);
}
}
}
return getClearStack;
};

View File

@@ -11,6 +11,7 @@ getJasmineRequireObj().Env = function(j$) {
var realSetTimeout = j$.getGlobal().setTimeout;
var realClearTimeout = j$.getGlobal().clearTimeout;
var clearStack = j$.getClearStack(j$.getGlobal());
this.clock = new j$.Clock(global, function () { return new j$.DelayedFunctionScheduler(); }, new j$.MockDate(global));
var runnableResources = {};
@@ -154,16 +155,6 @@ getJasmineRequireObj().Env = function(j$) {
var maximumSpecCallbackDepth = 20;
var currentSpecCallbackDepth = 0;
function clearStack(fn) {
currentSpecCallbackDepth++;
if (currentSpecCallbackDepth >= maximumSpecCallbackDepth) {
currentSpecCallbackDepth = 0;
realSetTimeout(fn, 0);
} else {
fn();
}
}
var catchException = function(e) {
return j$.Spec.isPendingSpecException(e) || catchExceptions;
};

View File

@@ -42,11 +42,7 @@ getJasmineRequireObj().QueueRunner = function(j$) {
}
}
var runnerDone = iterativeIndex >= length;
if (runnerDone) {
this.clearStack(this.onComplete);
}
this.clearStack(this.onComplete);
function attemptSync(queueableFn) {
try {

View File

@@ -30,6 +30,7 @@ var getJasmineRequireObj = (function (jasmineGlobal) {
j$.Anything = jRequire.Anything(j$);
j$.CallTracker = jRequire.CallTracker(j$);
j$.MockDate = jRequire.MockDate();
j$.getClearStack = jRequire.clearStack(j$);
j$.Clock = jRequire.Clock();
j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler();
j$.Env = jRequire.Env(j$);