fix(zone.js): fix zone for Jasmine 3.3. (#31497)

If zonejs is sent undefined callbacks it proceeds to attempt to call them, then fails, catches it own fail, rewrites the stack to hide the mistake, and reports a TypeError with a callstack unrelated to inputs.

Throw early if the callback is undefined (as can happen if JS or any-ified TS calls zone invokeTask).

Check for undefined onCommplete callback to zonejs jasmine wrapper.

PR Close #31497
This commit is contained in:
vikerman 2019-07-10 15:40:31 -07:00 committed by Matias Niemelä
parent 32aa18be78
commit c4c340a7c4
2 changed files with 11 additions and 6 deletions

View File

@ -204,12 +204,14 @@
(jasmine as any).QueueRunner = (function(_super) {
__extends(ZoneQueueRunner, _super);
function ZoneQueueRunner(attrs: QueueRunnerAttrs) {
attrs.onComplete = (fn => () => {
// All functions are done, clear the test zone.
this.testProxyZone = null;
this.testProxyZoneSpec = null;
ambientZone.scheduleMicroTask('jasmine.onComplete', fn);
})(attrs.onComplete);
if (attrs.onComplete) {
attrs.onComplete = (fn => () => {
// All functions are done, clear the test zone.
this.testProxyZone = null;
this.testProxyZoneSpec = null;
ambientZone.scheduleMicroTask('jasmine.onComplete', fn);
})(attrs.onComplete);
}
const nativeSetTimeout = _global[Zone.__symbol__('setTimeout')];
const nativeClearTimeout = _global[Zone.__symbol__('clearTimeout')];

View File

@ -1217,6 +1217,9 @@ const Zone: ZoneType = (function(global: any) {
this.data = options;
this.scheduleFn = scheduleFn;
this.cancelFn = cancelFn;
if (!callback) {
throw new Error('callback is not defined');
}
this.callback = callback;
const self = this;
// TODO: @JiaLiPassion options should have interface