diff --git a/lib/browser/browser.ts b/lib/browser/browser.ts index 385869a4b..ed009ee01 100644 --- a/lib/browser/browser.ts +++ b/lib/browser/browser.ts @@ -3,6 +3,7 @@ import {eventTargetPatch} from './event-target'; import {propertyPatch} from './define-property'; import {registerElementPatch} from './register-element'; import {propertyDescriptorPatch} from './property-descriptor'; +import {patchTimer} from '../common/timers'; import {patchMethod, patchPrototype, patchClass, zoneSymbol} from "../common/utils"; const set = 'set'; @@ -112,59 +113,3 @@ if (_global['navigator'] && _global['navigator'].geolocation) { 'watchPosition' ]); } - -interface TimerOptions extends TaskData { - handleId: number; - args: any[]; -} - -function patchTimer( - window: any, - setName: string, - cancelName: string, - nameSuffix: string) -{ - setName += nameSuffix; - cancelName += nameSuffix; - - function scheduleTask(task: Task) { - var data = task.data; - data.args[0] = task.invoke; - data.handleId = setNative.apply(window, data.args); - return task; - } - - function clearTask(task: Task) { - return clearNative((task.data).handleId); - } - - var setNative = patchMethod(window, setName, (delegate: Function) => function(self: any, args: any[]) { - if (typeof args[0] === 'function') { - var zone = Zone.current; - var options:TimerOptions = { - handleId: null, - isPeriodic: nameSuffix == 'Interval', - delay: (nameSuffix == 'Timeout' || nameSuffix == 'Interval') ? args[1] || 0 : null, - args: args - }; - return zone.scheduleMacroTask(setName, args[0], options, scheduleTask, clearTask); - } else { - // cause an error by calling it directly. - return delegate.apply(window, args); - } - }); - - var clearNative = patchMethod(window, cancelName, (delegate: Function) => function(self: any, args: any[]) { - var task: Task = args[0]; - if (task && typeof task.type == 'string') { - if (task.cancelFn && task.data.isPeriodic || task.runCount == 0) { - // Do not cancel already canceled functions - task.zone.cancelTask(task); - } - } else { - // cause an error by calling it directly. - delegate.apply(window, args); - } - }); -} - diff --git a/lib/common/timers.ts b/lib/common/timers.ts new file mode 100644 index 000000000..f30f07d4f --- /dev/null +++ b/lib/common/timers.ts @@ -0,0 +1,58 @@ +import {patchMethod} from './utils'; + +interface TimerOptions extends TaskData { + handleId: number; + args: any[]; +} + +export function patchTimer( + window: any, + setName: string, + cancelName: string, + nameSuffix: string) { + + var setNative = null; + var clearNative = null; + setName += nameSuffix; + cancelName += nameSuffix; + + function scheduleTask(task: Task) { + const data = task.data; + data.args[0] = task.invoke; + data.handleId = setNative.apply(window, data.args); + return task; + } + + function clearTask(task: Task) { + return clearNative((task.data).handleId); + } + + setNative = patchMethod(window, setName, (delegate: Function) => function(self: any, args: any[]) { + if (typeof args[0] === 'function') { + var zone = Zone.current; + var options: TimerOptions = { + handleId: null, + isPeriodic: nameSuffix === 'Interval', + delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 : null, + args: args + }; + return zone.scheduleMacroTask(setName, args[0], options, scheduleTask, clearTask); + } else { + // cause an error by calling it directly. + return delegate.apply(window, args); + } + }); + + clearNative = patchMethod(window, cancelName, (delegate: Function) => function(self: any, args: any[]) { + var task: Task = args[0]; + if (task && typeof task.type === 'string') { + if (task.cancelFn && task.data.isPeriodic || task.runCount === 0) { + // Do not cancel already canceled functions + task.zone.cancelTask(task); + } + } else { + // cause an error by calling it directly. + delegate.apply(window, args); + } + }); +} diff --git a/lib/node/node.ts b/lib/node/node.ts index 413fd51f4..c1485af88 100644 --- a/lib/node/node.ts +++ b/lib/node/node.ts @@ -1,11 +1,8 @@ import '../zone'; -import {patchMethod, patchPrototype, patchClass, zoneSymbol} from '../common/utils'; - -// TODO(juliemr): remove duplication in this file. +import {patchTimer} from '../common/timers'; const set = 'set'; const clear = 'clear'; -const blockingMethods = ['alert', 'prompt', 'confirm']; const _global = typeof window === 'undefined' ? global : window; // Timers @@ -55,60 +52,3 @@ if (crypto) { } }.bind(crypto); } - -interface TimerOptions extends TaskData { - handleId: number; - args: any[]; -} - -function patchTimer( - window: any, - setName: string, - cancelName: string, - nameSuffix: string) { - - var setNative = null; - var clearNative = null; - setName += nameSuffix; - cancelName += nameSuffix; - - function scheduleTask(task: Task) { - const data = task.data; - data.args[0] = task.invoke; - data.handleId = setNative.apply(window, data.args); - return task; - } - - function clearTask(task: Task) { - return clearNative((task.data).handleId); - } - - setNative = patchMethod(window, setName, (delegate: Function) => function(self: any, args: any[]) { - if (typeof args[0] === 'function') { - var zone = Zone.current; - var options: TimerOptions = { - handleId: null, - isPeriodic: nameSuffix === 'Interval', - delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 : null, - args: args - }; - return zone.scheduleMacroTask(setName, args[0], options, scheduleTask, clearTask); - } else { - // cause an error by calling it directly. - return delegate.apply(window, args); - } - }); - - clearNative = patchMethod(window, cancelName, (delegate: Function) => function(self: any, args: any[]) { - var task: Task = args[0]; - if (task && typeof task.type === 'string') { - if (task.cancelFn && task.data.isPeriodic || task.runCount === 0) { - // Do not cancel already canceled functions - task.zone.cancelTask(task); - } - } else { - // cause an error by calling it directly. - delegate.apply(window, args); - } - }); -}