From 5783663a80926b6154d5c900a3a5645be7bd53bb Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Thu, 17 Mar 2016 11:22:09 -0700 Subject: [PATCH] fix(patching): call native cancel method Fixes #278 Closes #279 --- lib/browser/browser.ts | 13 +++++++++---- test/browser/setTimeout.spec.ts | 5 +++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/browser/browser.ts b/lib/browser/browser.ts index be8c4f36c..714b10ec2 100644 --- a/lib/browser/browser.ts +++ b/lib/browser/browser.ts @@ -66,7 +66,7 @@ function patchTimer( return clearNative((task.data).handleId); } - var setNative = patchMethod(window, setName, () => function(self: any, args: any[]) { + var setNative = patchMethod(window, setName, (delegate: Function) => function(self: any, args: any[]) { if (typeof args[0] === 'function') { var zone = Zone.current; var options:TimerOptions = { @@ -78,13 +78,18 @@ function patchTimer( return zone.scheduleMacroTask(setName, args[0], options, scheduleTask, clearTask); } else { // cause an error by calling it directly. - return setNative.apply(window, args); + return delegate.apply(window, args); } }); - var clearNative = patchMethod(window, cancelName, () => function(self: any, args: any[]) { + var clearNative = patchMethod(window, cancelName, (delegate: Function) => function(self: any, args: any[]) { var task: Task = args[0]; - task.zone.cancelTask(task); + if (task && typeof task.type == 'string') { + task.zone.cancelTask(task); + } else { + // cause an error by calling it directly. + delegate.apply(window, args); + } }); } diff --git a/test/browser/setTimeout.spec.ts b/test/browser/setTimeout.spec.ts index dc4f347fd..e40910b54 100644 --- a/test/browser/setTimeout.spec.ts +++ b/test/browser/setTimeout.spec.ts @@ -40,4 +40,9 @@ describe('setTimeout', function () { }); }); + it('should pass invalid values through', function () { + clearTimeout(null); + clearTimeout({}); + }); + });