Skip to content
This repository has been archived by the owner on Feb 26, 2024. It is now read-only.

Commit

Permalink
chore(node): remove duplication in patching timers
Browse files Browse the repository at this point in the history
  • Loading branch information
juliemr committed Apr 12, 2016
1 parent 29fc5d2 commit 2063814
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 117 deletions.
57 changes: 1 addition & 56 deletions lib/browser/browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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 = <TimerOptions>task.data;
data.args[0] = task.invoke;
data.handleId = setNative.apply(window, data.args);
return task;
}

function clearTask(task: Task) {
return clearNative((<TimerOptions>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);
}
});
}

58 changes: 58 additions & 0 deletions lib/common/timers.ts
Original file line number Diff line number Diff line change
@@ -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 = <TimerOptions>task.data;
data.args[0] = task.invoke;
data.handleId = setNative.apply(window, data.args);
return task;
}

function clearTask(task: Task) {
return clearNative((<TimerOptions>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);
}
});
}
62 changes: 1 addition & 61 deletions lib/node/node.ts
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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 = <TimerOptions>task.data;
data.args[0] = task.invoke;
data.handleId = setNative.apply(window, data.args);
return task;
}

function clearTask(task: Task) {
return clearNative((<TimerOptions>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);
}
});
}

0 comments on commit 2063814

Please sign in to comment.