Comparing version 0.8.9 to 0.8.10
@@ -0,1 +1,20 @@ | ||
<a name="0.8.10"></a> | ||
## [0.8.10](https://github.com/angular/zone.js/compare/v0.8.9...0.8.10) (2017-05-03) | ||
### Bug Fixes | ||
* **showError:** fix ignoreConsoleErrorUncaughtError may change during drain microtask ([#763](https://github.com/angular/zone.js/issues/763)) ([4baeb5c](https://github.com/angular/zone.js/commit/4baeb5c)) | ||
* **spec:** fix [#760](https://github.com/angular/zone.js/issues/760), fakeAsyncTestSpec should handle microtask with additional args ([#762](https://github.com/angular/zone.js/issues/762)) ([f8d17ac](https://github.com/angular/zone.js/commit/f8d17ac)) | ||
* Package Error stack rewriting as a separate bundle. ([#770](https://github.com/angular/zone.js/issues/770)) ([b5e33fd](https://github.com/angular/zone.js/commit/b5e33fd)) | ||
* **timer:** fix [#437](https://github.com/angular/zone.js/issues/437), [#744](https://github.com/angular/zone.js/issues/744), fix nativescript timer issue, fix nodejs v0.10.x timer issue ([#772](https://github.com/angular/zone.js/issues/772)) ([3218b5a](https://github.com/angular/zone.js/commit/3218b5a)) | ||
### Features | ||
* make codebase more modular so that only parts of it can be loaded ([#748](https://github.com/angular/zone.js/issues/748)) ([e933cbd](https://github.com/angular/zone.js/commit/e933cbd)) | ||
* **patch:** load non standard api with new load module method ([#764](https://github.com/angular/zone.js/issues/764)) ([97c03b5](https://github.com/angular/zone.js/commit/97c03b5)) | ||
<a name="0.8.9"></a> | ||
@@ -2,0 +21,0 @@ ## [0.8.9](https://github.com/angular/zone.js/compare/v0.8.8...0.8.9) (2017-04-25) |
@@ -31,4 +31,5 @@ /** | ||
} | ||
Scheduler.prototype.scheduleFunction = function (cb, delay, args, id) { | ||
Scheduler.prototype.scheduleFunction = function (cb, delay, args, isPeriodic, id) { | ||
if (args === void 0) { args = []; } | ||
if (isPeriodic === void 0) { isPeriodic = false; } | ||
if (id === void 0) { id = -1; } | ||
@@ -38,3 +39,10 @@ var currentId = id < 0 ? this.nextId++ : id; | ||
// Insert so that scheduler queue remains sorted by end time. | ||
var newEntry = { endTime: endTime, id: currentId, func: cb, args: args, delay: delay }; | ||
var newEntry = { | ||
endTime: endTime, | ||
id: currentId, | ||
func: cb, | ||
args: args, | ||
delay: delay, | ||
isPeriodic: isPeriodic | ||
}; | ||
var i = 0; | ||
@@ -80,2 +88,26 @@ for (; i < this._schedulerQueue.length; i++) { | ||
}; | ||
Scheduler.prototype.flush = function (limit) { | ||
if (limit === void 0) { limit = 20; } | ||
var startTime = this._currentTime; | ||
var count = 0; | ||
while (this._schedulerQueue.length > 0) { | ||
count++; | ||
if (count > limit) { | ||
throw new Error('flush failed after reaching the limit of ' + limit + | ||
' tasks. Does your code use a polling timeout?'); | ||
} | ||
// If the only remaining tasks are periodic, finish flushing. | ||
if (!(this._schedulerQueue.filter(function (task) { return !task.isPeriodic; }).length)) { | ||
break; | ||
} | ||
var current = this._schedulerQueue.shift(); | ||
this._currentTime = current.endTime; | ||
var retval = current.func.apply(global, current.args); | ||
if (!retval) { | ||
// Uncaught exception in the current scheduled function. Stop processing the queue. | ||
break; | ||
} | ||
} | ||
return this._currentTime - startTime; | ||
}; | ||
return Scheduler; | ||
@@ -140,3 +172,3 @@ }()); | ||
if (_this.pendingPeriodicTimers.indexOf(id) !== -1) { | ||
_this._scheduler.scheduleFunction(fn, interval, args, id); | ||
_this._scheduler.scheduleFunction(fn, interval, args, true, id); | ||
} | ||
@@ -174,3 +206,3 @@ }; | ||
// Queue the callback and dequeue the periodic timer only on error. | ||
this._scheduler.scheduleFunction(cb, interval, args); | ||
this._scheduler.scheduleFunction(cb, interval, args, true); | ||
this.pendingPeriodicTimers.push(id); | ||
@@ -209,10 +241,34 @@ return id; | ||
var microtask = this._microtasks.shift(); | ||
microtask(); | ||
microtask.func.apply(microtask.target, microtask.args); | ||
} | ||
flushErrors(); | ||
}; | ||
FakeAsyncTestZoneSpec.prototype.flush = function () { | ||
FakeAsyncTestZoneSpec.assertInZone(); | ||
this.flushMicrotasks(); | ||
var elapsed = this._scheduler.flush(); | ||
if (this._lastError !== null) { | ||
this._resetLastErrorAndThrow(); | ||
} | ||
return elapsed; | ||
}; | ||
FakeAsyncTestZoneSpec.prototype.onScheduleTask = function (delegate, current, target, task) { | ||
switch (task.type) { | ||
case 'microTask': | ||
this._microtasks.push(task.invoke); | ||
var args = task.data && task.data.args; | ||
// should pass additional arguments to callback if have any | ||
// currently we know process.nextTick will have such additional | ||
// arguments | ||
var addtionalArgs = void 0; | ||
if (args) { | ||
var callbackIndex = task.data.callbackIndex; | ||
if (typeof args.length === 'number' && args.length > callbackIndex + 1) { | ||
addtionalArgs = Array.prototype.slice.call(args, callbackIndex + 1); | ||
} | ||
} | ||
this._microtasks.push({ | ||
func: task.invoke, | ||
args: addtionalArgs, | ||
target: task.data && task.data.target | ||
}); | ||
break; | ||
@@ -219,0 +275,0 @@ case 'macroTask': |
@@ -21,38 +21,34 @@ /** | ||
*/ | ||
(function (_global) { | ||
// patch MediaQuery | ||
patchMediaQuery(_global); | ||
function patchMediaQuery(_global) { | ||
if (!_global['MediaQueryList']) { | ||
return; | ||
} | ||
var patchEventTargetMethods = Zone[Zone.__symbol__('patchEventTargetMethods')]; | ||
patchEventTargetMethods(_global['MediaQueryList'].prototype, 'addListener', 'removeListener', function (self, args) { | ||
return { | ||
useCapturing: false, | ||
eventName: 'mediaQuery', | ||
handler: args[0], | ||
target: self || _global, | ||
name: 'mediaQuery', | ||
invokeAddFunc: function (addFnSymbol, delegate) { | ||
if (delegate && delegate.invoke) { | ||
return this.target[addFnSymbol](delegate.invoke); | ||
} | ||
else { | ||
return this.target[addFnSymbol](delegate); | ||
} | ||
}, | ||
invokeRemoveFunc: function (removeFnSymbol, delegate) { | ||
if (delegate && delegate.invoke) { | ||
return this.target[removeFnSymbol](delegate.invoke); | ||
} | ||
else { | ||
return this.target[removeFnSymbol](delegate); | ||
} | ||
Zone.__load_patch('mediaQuery', function (global, Zone, api) { | ||
if (!global['MediaQueryList']) { | ||
return; | ||
} | ||
var patchEventTargetMethods = Zone[Zone.__symbol__('patchEventTargetMethods')]; | ||
patchEventTargetMethods(_global['MediaQueryList'].prototype, 'addListener', 'removeListener', function (self, args) { | ||
return { | ||
useCapturing: false, | ||
eventName: 'mediaQuery', | ||
handler: args[0], | ||
target: self || global, | ||
name: 'mediaQuery', | ||
invokeAddFunc: function (addFnSymbol, delegate) { | ||
if (delegate && delegate.invoke) { | ||
return this.target[addFnSymbol](delegate.invoke); | ||
} | ||
}; | ||
}); | ||
} | ||
})(typeof window === 'object' && window || typeof self === 'object' && self || global); | ||
else { | ||
return this.target[addFnSymbol](delegate); | ||
} | ||
}, | ||
invokeRemoveFunc: function (removeFnSymbol, delegate) { | ||
if (delegate && delegate.invoke) { | ||
return this.target[removeFnSymbol](delegate.invoke); | ||
} | ||
else { | ||
return this.target[removeFnSymbol](delegate); | ||
} | ||
} | ||
}; | ||
}); | ||
}); | ||
}))); |
@@ -1,1 +0,1 @@ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(this,function(){"use strict";!function(e){function t(e){if(e.MediaQueryList){var t=Zone[Zone.__symbol__("patchEventTargetMethods")];t(e.MediaQueryList.prototype,"addListener","removeListener",function(t,n){return{useCapturing:!1,eventName:"mediaQuery",handler:n[0],target:t||e,name:"mediaQuery",invokeAddFunc:function(e,t){return t&&t.invoke?this.target[e](t.invoke):this.target[e](t)},invokeRemoveFunc:function(e,t){return t&&t.invoke?this.target[e](t.invoke):this.target[e](t)}}})}}t(e)}("object"==typeof window&&window||"object"==typeof self&&self||global)}); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(this,function(){"use strict";Zone.__load_patch("mediaQuery",function(e,t,n){if(e.MediaQueryList){var i=t[t.__symbol__("patchEventTargetMethods")];i(_global.MediaQueryList.prototype,"addListener","removeListener",function(t,n){return{useCapturing:!1,eventName:"mediaQuery",handler:n[0],target:t||e,name:"mediaQuery",invokeAddFunc:function(e,t){return t&&t.invoke?this.target[e](t.invoke):this.target[e](t)},invokeRemoveFunc:function(e,t){return t&&t.invoke?this.target[e](t.invoke):this.target[e](t)}}})}})}); |
@@ -21,19 +21,15 @@ /** | ||
*/ | ||
(function (_global) { | ||
// patch Notification | ||
patchNotification(_global); | ||
function patchNotification(_global) { | ||
var Notification = _global['Notification']; | ||
if (!Notification || !Notification.prototype) { | ||
return; | ||
} | ||
var desc = Object.getOwnPropertyDescriptor(Notification.prototype, 'onerror'); | ||
if (!desc || !desc.configurable) { | ||
return; | ||
} | ||
var patchOnProperties = Zone[Zone.__symbol__('patchOnProperties')]; | ||
patchOnProperties(Notification.prototype, null); | ||
Zone.__load_patch('notification', function (global, Zone, api) { | ||
var Notification = _global['Notification']; | ||
if (!Notification || !Notification.prototype) { | ||
return; | ||
} | ||
})(typeof window === 'object' && window || typeof self === 'object' && self || global); | ||
var desc = Object.getOwnPropertyDescriptor(Notification.prototype, 'onerror'); | ||
if (!desc || !desc.configurable) { | ||
return; | ||
} | ||
var patchOnProperties = Zone[Zone.__symbol__('patchOnProperties')]; | ||
patchOnProperties(Notification.prototype, null); | ||
}); | ||
}))); |
@@ -1,1 +0,1 @@ | ||
!function(o,e){"object"==typeof exports&&"undefined"!=typeof module?e():"function"==typeof define&&define.amd?define(e):e()}(this,function(){"use strict";!function(o){function e(o){var e=o.Notification;if(e&&e.prototype){var t=Object.getOwnPropertyDescriptor(e.prototype,"onerror");if(t&&t.configurable){var n=Zone[Zone.__symbol__("patchOnProperties")];n(e.prototype,null)}}}e(o)}("object"==typeof window&&window||"object"==typeof self&&self||global)}); | ||
!function(o,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(this,function(){"use strict";Zone.__load_patch("notification",function(o,t,e){var n=_global.Notification;if(n&&n.prototype){var i=Object.getOwnPropertyDescriptor(n.prototype,"onerror");if(i&&i.configurable){var r=t[t.__symbol__("patchOnProperties")];r(n.prototype,null)}}})}); |
@@ -21,4 +21,3 @@ /** | ||
*/ | ||
(function () { | ||
var __symbol__ = Zone.__symbol__; | ||
Zone.__load_patch('bluebird', function (global, Zone, api) { | ||
// TODO: @JiaLiPassion, we can automatically patch bluebird | ||
@@ -29,3 +28,3 @@ // if global.Promise = Bluebird, but sometimes in nodejs, | ||
// safe to just expose a method to patch Bluebird explicitly | ||
Zone[__symbol__('bluebird')] = function patchBluebird(Bluebird) { | ||
Zone[Zone.__symbol__('bluebird')] = function patchBluebird(Bluebird) { | ||
Bluebird.setScheduler(function (fn) { | ||
@@ -35,4 +34,4 @@ Zone.current.scheduleMicroTask('bluebird', fn); | ||
}; | ||
})(); | ||
}); | ||
}))); |
@@ -1,1 +0,1 @@ | ||
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n():"function"==typeof define&&define.amd?define(n):n()}(this,function(){"use strict";!function(){var e=Zone.__symbol__;Zone[e("bluebird")]=function(e){e.setScheduler(function(e){Zone.current.scheduleMicroTask("bluebird",e)})}}()}); | ||
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n():"function"==typeof define&&define.amd?define(n):n()}(this,function(){"use strict";Zone.__load_patch("bluebird",function(e,n,t){n[n.__symbol__("bluebird")]=function(e){e.setScheduler(function(e){n.current.scheduleMicroTask("bluebird",e)})}})}); |
@@ -524,15 +524,2 @@ /** | ||
} | ||
/** | ||
* Extend the Error with additional fields for rewritten stack frames | ||
*/ | ||
interface Error { | ||
/** | ||
* Stack trace where extra frames have been removed and zone names added. | ||
*/ | ||
zoneAwareStack?: string; | ||
/** | ||
* Original stack trace with no modifications | ||
*/ | ||
originalStack?: string; | ||
} | ||
declare const Zone: ZoneType; |
@@ -1,1 +0,1 @@ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(this,function(){"use strict";function e(e,t){for(var n=e.length-1;n>=0;n--)"function"==typeof e[n]&&(e[n]=Zone.current.wrap(e[n],t+"_"+n));return e}function t(t,n){for(var r=t.constructor.name,o=function(o){var a=n[o],i=t[a];i&&(t[a]=function(t){var n=function(){return t.apply(this,e(arguments,r+"."+a))};return d(n,t),n}(i))},a=0;a<n.length;a++)o(a)}function n(e,t){var n=Object.getOwnPropertyDescriptor(e,t)||{enumerable:!0,configurable:!0};if(n.configurable){delete n.writable,delete n.value;var r=n.get,o=t.substr(2),a=P("_"+t);n.set=function(t){var n=this;if(n||e!==C||(n=C),n){var r=n[a];if(r&&n.removeEventListener(o,r),"function"==typeof t){var i=function(e){var n=t.apply(this,arguments);return void 0==n||n||e.preventDefault(),n};n[a]=i,n.addEventListener(o,i,!1)}else n[a]=null}},n.get=function(){var o=this;if(o||e!==C||(o=C),!o)return null;if(o.hasOwnProperty(a))return o[a];if(r){var i=r.apply(this);if(i)return n.set.apply(this,[i]),"function"==typeof o.removeAttribute&&o.removeAttribute(t),i}return null},Object.defineProperty(e,t,n)}}function r(e,t){if(t)for(var r=0;r<t.length;r++)n(e,"on"+t[r]);else{var o=[];for(var a in e)"on"==a.substr(0,2)&&o.push(a);for(var i=0;i<o.length;i++)n(e,o[i])}}function o(e,t){var n="boolean"==typeof e?e:"object"==typeof e&&(e&&e.capture),r="boolean"==typeof t?t:"object"==typeof t&&(t&&t.capture);return!!n==!!r}function a(e,t,n,r,a){var i=e[H];if(i)for(var s=0;s<i.length;s++){var c=i[s],u=c.data,l=u.handler;if((u.handler===t||l.listener===t)&&o(u.options,r)&&u.eventName===n)return a&&i.splice(s,1),c}return null}function i(e,t,n){var r=e[H];r||(r=e[H]=[]),n?r.unshift(t):r.push(t)}function s(e,t,n,r,o,s){function c(e){var t=e.data;return i(t.target,e,o),t.invokeAddFunc(l,e)}function u(e){var t=e.data;return a(t.target,e.invoke,t.eventName,t.options,!0),t.invokeRemoveFunc(h,e)}void 0===n&&(n=!0),void 0===r&&(r=!1),void 0===o&&(o=!1),void 0===s&&(s=q);var l=P(e),h=P(t),f=!n&&void 0;return function(t,n){var o=s(t,n);o.options=o.options||f;var i=null;"function"==typeof o.handler?i=o.handler:o.handler&&o.handler.handleEvent&&(i=function(e){return o.handler.handleEvent(e)});var h=!1;try{h=o.handler&&"[object FunctionWrapper]"===o.handler.toString()}catch(p){return o.crossContext=!0,o.invokeAddFunc(l,o.handler)}if(!i||h)return o.invokeAddFunc(l,o.handler);if(!r){var d=a(o.target,o.handler,o.eventName,o.options,!1);if(d)return o.invokeAddFunc(l,d)}var v=Zone.current,k=o.target.constructor.name+"."+e+":"+o.eventName;v.scheduleEventTask(k,i,o,c,u)}}function c(e,t,n){void 0===t&&(t=!0),void 0===n&&(n=q);var r=P(e),o=!t&&void 0;return function(e,t){var i=n(e,t);i.options=i.options||o;var s=null;"function"==typeof i.handler?s=i.handler:i.handler&&i.handler.handleEvent&&(s=function(e){return i.handler.handleEvent(e)});var c=!1;try{c=i.handler&&"[object FunctionWrapper]"===i.handler.toString()}catch(u){return i.crossContext=!0,i.invokeRemoveFunc(r,i.handler)}if(!s||c)return i.invokeRemoveFunc(r,i.handler);var l=a(i.target,i.handler,i.eventName,i.options,!0);l?l.zone.cancelTask(l):i.invokeRemoveFunc(r,i.handler)}}function u(e,t,n,r){return void 0===t&&(t=R),void 0===n&&(n=x),void 0===r&&(r=q),!(!e||!e[t])&&(f(e,t,function(){return s(t,n,!0,!1,!1,r)}),f(e,n,function(){return c(n,!0,r)}),!0)}function l(t){var n=C[t];if(n){C[P(t)]=n,C[t]=function(){var r=e(arguments,t);switch(r.length){case 0:this[A]=new n;break;case 1:this[A]=new n(r[0]);break;case 2:this[A]=new n(r[0],r[1]);break;case 3:this[A]=new n(r[0],r[1],r[2]);break;case 4:this[A]=new n(r[0],r[1],r[2],r[3]);break;default:throw new Error("Arg list too long.")}},d(C[t],n);var r,o=new n(function(){});for(r in o)"XMLHttpRequest"===t&&"responseBlob"===r||!function(e){"function"==typeof o[e]?C[t].prototype[e]=function(){return this[A][e].apply(this[A],arguments)}:Object.defineProperty(C[t].prototype,e,{set:function(n){"function"==typeof n?(this[A][e]=Zone.current.wrap(n,t+"."+e),d(this[A][e],n)):this[A][e]=n},get:function(){return this[A][e]}})}(r);for(r in n)"prototype"!==r&&n.hasOwnProperty(r)&&(C[t][r]=n[r])}}function h(e,t){try{return Function("f","return function "+e+"(){return f(this, arguments)}")(t)}catch(n){return function(){return t(this,arguments)}}}function f(e,t,n){for(var r=e;r&&Object.getOwnPropertyNames(r).indexOf(t)===-1;)r=Object.getPrototypeOf(r);!r&&e[t]&&(r=e);var o,a=P(t);return r&&!(o=r[a])&&(o=r[a]=r[t],r[t]=h(t,n(o,a,t)),d(r[t],o)),o}function p(e,t){var n=e[P("eventTasks")],r=[];if(n)for(var o=0;o<n.length;o++){var a=n[o],i=a.data,s=i&&i.eventName;s===t&&r.push(a)}return r}function d(e,t){e[P("OriginalDelegate")]=t}function v(e,t,n,r){function o(t){function n(){try{t.invoke.apply(this,arguments)}finally{delete c[r.handleId]}}var r=t.data;return r.args[0]=n,r.handleId=i.apply(e,r.args),c[r.handleId]=t,t}function a(e){return delete c[e.data.handleId],s(e.data.handleId)}var i=null,s=null;t+=r,n+=r;var c={};i=f(e,t,function(n){return function(i,s){if("function"==typeof s[0]){var c=Zone.current,u={handleId:null,isPeriodic:"Interval"===r,delay:"Timeout"===r||"Interval"===r?s[1]||0:null,args:s},l=c.scheduleMacroTask(t,s[0],u,o,a);if(!l)return l;var h=l.data.handleId;return h&&h.ref&&h.unref&&"function"==typeof h.ref&&"function"==typeof h.unref&&(l.ref=h.ref.bind(h),l.unref=h.unref.bind(h)),l}return n.apply(e,s)}}),s=f(e,n,function(t){return function(n,r){var o="number"==typeof r[0]?c[r[0]]:r[0];o&&"string"==typeof o.type?"notScheduled"!==o.state&&(o.cancelFn&&o.data.isPeriodic||0===o.runCount)&&o.zone.cancelTask(o):t.apply(e,r)}})}function k(){var e=Function.prototype.toString,t="undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global;Function.prototype.toString=function(){if("function"==typeof this){if(this[P("OriginalDelegate")])return e.apply(this[P("OriginalDelegate")],arguments);if(this===Promise){var n=t[P("Promise")];if(n)return e.apply(n,arguments)}if(this===Error){var r=t[P("Error")];if(r)return e.apply(r,arguments)}}return e.apply(this,arguments)}}function y(){var e=Object.prototype.toString;Object.prototype.toString=function(){return this instanceof Promise?"[object Promise]":e.apply(this,arguments)}}function g(){Object.defineProperty=function(e,t,n){if(m(e,t))throw new TypeError("Cannot assign to read only property '"+t+"' of "+e);var r=n.configurable;return"prototype"!==t&&(n=b(e,t,n)),_(e,t,n,r)},Object.defineProperties=function(e,t){return Object.keys(t).forEach(function(n){Object.defineProperty(e,n,t[n])}),e},Object.create=function(e,t){return"object"!=typeof t||Object.isFrozen(t)||Object.keys(t).forEach(function(n){t[n]=b(e,n,t[n])}),X(e,t)},Object.getOwnPropertyDescriptor=function(e,t){var n=B(e,t);return m(e,t)&&(n.configurable=!1),n}}function T(e,t,n){var r=n.configurable;return n=b(e,t,n),_(e,t,n,r)}function m(e,t){return e&&e[W]&&e[W][t]}function b(e,t,n){return n.configurable=!0,n.configurable||(e[W]||N(e,W,{writable:!0,value:{}}),e[W][t]=!0),n}function _(e,t,n,r){try{return N(e,t,n)}catch(o){if(!n.configurable)throw o;"undefined"==typeof r?delete n.configurable:n.configurable=r;try{return N(e,t,n)}catch(o){var a=null;try{a=JSON.stringify(n)}catch(o){a=a.toString()}console.log("Attempting to configure '"+t+"' with descriptor '"+a+"' on object '"+e+"' and got error, giving up: "+o)}}}function w(e){var t=[],n=e.wtf;n?t=G.split(",").map(function(e){return"HTML"+e+"Element"}).concat(U):e[V]?t.push(V):t=U;for(var r=0;r<t.length;r++){var o=e[t[r]];u(o&&o.prototype)}}function E(e){var t=e.WebSocket;e.EventTarget||u(t.prototype),e.WebSocket=function(e,n){var o,a=arguments.length>1?new t(e,n):new t(e),i=Object.getOwnPropertyDescriptor(a,"onmessage");return i&&i.configurable===!1?(o=Object.create(a),["addEventListener","removeEventListener","send","close"].forEach(function(e){o[e]=function(){return a[e].apply(a,arguments)}})):o=a,r(o,["close","error","message","open"]),o};for(var n in t)e.WebSocket[n]=t[n]}function S(e){if(!I||M){var t="undefined"!=typeof WebSocket;O()?(F&&(r(window,K.concat(["resize"])),r(Document.prototype,K),"undefined"!=typeof window.SVGElement&&r(window.SVGElement.prototype,K),r(HTMLElement.prototype,K)),r(XMLHttpRequest.prototype,null),"undefined"!=typeof IDBIndex&&(r(IDBIndex.prototype,null),r(IDBRequest.prototype,null),r(IDBOpenDBRequest.prototype,null),r(IDBDatabase.prototype,null),r(IDBTransaction.prototype,null),r(IDBCursor.prototype,null)),t&&r(WebSocket.prototype,null)):(D(),l("XMLHttpRequest"),t&&E(e))}}function O(){if((F||M)&&!Object.getOwnPropertyDescriptor(HTMLElement.prototype,"onclick")&&"undefined"!=typeof Element){var e=Object.getOwnPropertyDescriptor(Element.prototype,"onclick");if(e&&!e.configurable)return!1}var t=Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype,"onreadystatechange");if(t){Object.defineProperty(XMLHttpRequest.prototype,"onreadystatechange",{enumerable:!0,configurable:!0,get:function(){return!0}});var n=new XMLHttpRequest,r=!!n.onreadystatechange;return Object.defineProperty(XMLHttpRequest.prototype,"onreadystatechange",t||{}),r}Object.defineProperty(XMLHttpRequest.prototype,"onreadystatechange",{enumerable:!0,configurable:!0,get:function(){return this[P("fakeonreadystatechange")]},set:function(e){this[P("fakeonreadystatechange")]=e}});var n=new XMLHttpRequest,o=function(){};n.onreadystatechange=o;var r=n[P("fakeonreadystatechange")]===o;return n.onreadystatechange=null,r}function D(){for(var e=function(e){var t=K[e],n="on"+t;self.addEventListener(t,function(e){var t,r,o=e.target;for(r=o?o.constructor.name+"."+n:"unknown."+n;o;)o[n]&&!o[n][J]&&(t=Zone.current.wrap(o[n],r),t[J]=o[n],o[n]=t),o=o.parentElement},!0)},t=0;t<K.length;t++)e(t)}function Z(e){if((F||M)&&"registerElement"in e.document){var t=document.registerElement,n=["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"];document.registerElement=function(e,r){return r&&r.prototype&&n.forEach(function(e){var t="Document.registerElement::"+e;if(r.prototype.hasOwnProperty(e)){var n=Object.getOwnPropertyDescriptor(r.prototype,e);n&&n.value?(n.value=Zone.current.wrap(n.value,t),T(r.prototype,e,n)):r.prototype[e]=Zone.current.wrap(r.prototype[e],t)}else r.prototype[e]&&(r.prototype[e]=Zone.current.wrap(r.prototype[e],t))}),t.apply(document,[e,r])},d(document.registerElement,t)}}function z(e){function t(e){var t=e[oe];return t}function n(e){XMLHttpRequest[se]=!1;var t=e.data,n=t.target[ie];n&&t.target.removeEventListener("readystatechange",n);var r=t.target[ie]=function(){t.target.readyState===t.target.DONE&&!t.aborted&&XMLHttpRequest[se]&&"scheduled"===e.state&&e.invoke()};t.target.addEventListener("readystatechange",r);var o=t.target[oe];return o||(t.target[oe]=e),i.apply(t.target,t.args),XMLHttpRequest[se]=!0,e}function r(){}function o(e){var t=e.data;return t.aborted=!0,s.apply(t.target,t.args)}var a=f(e.XMLHttpRequest.prototype,"open",function(){return function(e,t){return e[ae]=0==t[2],a.apply(e,t)}}),i=f(e.XMLHttpRequest.prototype,"send",function(){return function(e,t){var a=Zone.current;if(e[ae])return i.apply(e,t);var s={target:e,isPeriodic:!1,delay:null,args:t,aborted:!1};return a.scheduleMacroTask("XMLHttpRequest.send",r,s,n,o)}}),s=f(e.XMLHttpRequest.prototype,"abort",function(e){return function(e,n){var r=t(e);if(r&&"string"==typeof r.type){if(null==r.cancelFn||r.data&&r.data.aborted)return;r.zone.cancelTask(r)}}})}function j(e){return function(t){var n=p(ee,e);n.forEach(function(n){var r=ee.PromiseRejectionEvent;if(r){var o=new r(e,{promise:t.promise,reason:t.rejection});n.invoke(o)}})}}var P=(function(e){function t(e){return"__zone_symbol__"+e}function n(){0===q&&0===H.length&&(e[L]?e[L].resolve(0)[I](i):e[C](i,0))}function r(e){n(),H.push(e)}function o(e){if(!D[t("ignoreConsoleErrorUncaughtError")]){var n=e&&e.rejection;n&&console.error("Unhandled Promise rejection:",n instanceof Error?n.message:n,"; Zone:",e.zone.name,"; Task:",e.task&&e.task.source,"; Value:",n,n instanceof Error?n.stack:void 0),console.error(e)}}function a(e){o(e);try{var n=D[t("unhandledPromiseRejectionHandler")];n&&"function"==typeof n&&n.apply(this,[e])}catch(r){}}function i(){if(!R){for(R=!0;H.length;){var e=H;H=[];for(var t=0;t<e.length;t++){var n=e[t];try{n.zone.runTask(n,null,null)}catch(r){o(r)}}}for(;x.length;)for(var i=function(){var e=x.shift();try{e.zone.runGuarded(function(){throw e})}catch(t){a(t)}};x.length;)i();R=!1}}function s(e){return e&&e.then}function c(e){return e}function u(e){return K.reject(e)}function l(e,t){return function(n){try{h(e,t,n)}catch(r){h(e,!1,r)}}}function h(e,r,o){var a=V();if(e===o)throw new TypeError("Promise resolved with itself");if(e[A]===X){var i=null;try{"object"!=typeof o&&"function"!=typeof o||(i=o&&o.then)}catch(s){return a(function(){h(e,!1,s)})(),e}if(r!==G&&o instanceof K&&o.hasOwnProperty(A)&&o.hasOwnProperty(N)&&o[A]!==X)f(o),h(e,o[A],o[N]);else if(r!==G&&"function"==typeof i)try{i.apply(o,[a(l(e,r)),a(l(e,!1))])}catch(s){a(function(){h(e,!1,s)})()}else{e[A]=r;var c=e[N];e[N]=o,r===G&&o instanceof Error&&(o[t("currentTask")]=D.currentTask);for(var u=0;u<c.length;)p(e,c[u++],c[u++],c[u++],c[u++]);if(0==c.length&&r==G){e[A]=U;try{throw new Error("Uncaught (in promise): "+o+(o&&o.stack?"\n"+o.stack:""))}catch(s){var d=s;d.rejection=o,d.promise=e,d.zone=D.current,d.task=D.currentTask,x.push(d),n()}}}}return e}function f(e){if(e[A]===U){try{var n=D[t("rejectionHandledHandler")];n&&"function"==typeof n&&n.apply(this,[{rejection:e[N],promise:e}])}catch(r){}e[A]=G;for(var o=0;o<x.length;o++)e===x[o].promise&&x.splice(o,1)}}function p(e,t,n,r,o){f(e);var a=e[A]?"function"==typeof r?r:c:"function"==typeof o?o:u;t.scheduleMicroTask(B,function(){try{h(n,!0,t.run(a,void 0,[e[N]]))}catch(r){h(n,!1,r)}})}function d(e){var t=e.prototype,n=t.then;t[I]=n,e.prototype.then=function(e,t){var r=this,o=new K(function(e,t){n.call(r,e,t)});return o.then(e,t)},e[Q]=!0}function v(e){return function(){var t=e.apply(this,arguments);if(t instanceof K)return t;var n=t.constructor;return n[Q]||d(n),t}}function k(){var e=this,t=ne.apply(this,arguments),n=t.originalStack=t.stack;if(k[oe]&&n){for(var r=n.split("\n"),o=F,a=0;r[a]!==$&&r[a]!==ee&&a<r.length;)a++;for(;a<r.length&&o;a++){var i=r[a];if(i.trim())switch(re[i]){case 0:r.splice(a,1),a--;break;case 1:o=o.parent?o.parent:null,r.splice(a,1),a--;break;default:r[a]+=" ["+o.zone.name+"]"}}try{t.stack=t.zoneAwareStack=r.join("\n")}catch(s){}}return this instanceof ne&&this.constructor!=ne?(Object.keys(t).concat("stack","message").forEach(function(n){if(void 0!==t[n])try{e[n]=t[n]}catch(r){}}),this):t}if(e.Zone)throw new Error("Zone already loaded.");var y={name:"NO ZONE"},g="notScheduled",T="scheduling",m="scheduled",b="running",_="canceling",w="unknown",E="microTask",S="macroTask",O="eventTask",D=function(){function t(e,t){this._properties=null,this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new z(this,this._parent&&this._parent._zoneDelegate,t)}return t.assertZonePatched=function(){if(e.Promise!==K)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(t,"root",{get:function(){for(var e=t.current;e.parent;)e=e.parent;return e},enumerable:!0,configurable:!0}),Object.defineProperty(t,"current",{get:function(){return F.zone},enumerable:!0,configurable:!0}),Object.defineProperty(t,"currentTask",{get:function(){return M},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),t.prototype.get=function(e){var t=this.getZoneWith(e);if(t)return t._properties[e]},t.prototype.getZoneWith=function(e){for(var t=this;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null},t.prototype.fork=function(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)},t.prototype.wrap=function(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);var n=this._zoneDelegate.intercept(this,e,t),r=this;return function(){return r.runGuarded(n,this,arguments,t)}},t.prototype.run=function(e,t,n,r){void 0===t&&(t=void 0),void 0===n&&(n=null),void 0===r&&(r=null),F=new P(F,this);try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{F=F.parent}},t.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),void 0===n&&(n=null),void 0===r&&(r=null),F=new P(F,this);try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(o){if(this._zoneDelegate.handleError(this,o))throw o}}finally{F=F.parent}},t.prototype.runTask=function(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||y).name+"; Execution: "+this.name+")");var r=e.state!=b;r&&e._transitionTo(b,m),e.runCount++;var o=M;M=e,F=new P(F,this);try{e.type==S&&e.data&&!e.data.isPeriodic&&(e.cancelFn=null);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(a){if(this._zoneDelegate.handleError(this,a))throw a}}finally{e.state!==g&&e.state!==w&&(e.type==O||e.data&&e.data.isPeriodic?r&&e._transitionTo(m,b):(e.runCount=0,this._updateTaskCount(e,-1),r&&e._transitionTo(g,b,g))),F=F.parent,M=o}},t.prototype.scheduleTask=function(e){if(e.zone&&e.zone!==this)for(var t=this;t;){if(t===e.zone)throw Error("can not reschedule task to "+this.name+" which is descendants of the original zone "+e.zone.name);t=t.parent}e._transitionTo(T,g);var n=[];e._zoneDelegates=n,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(r){throw e._transitionTo(w,T,g),this._zoneDelegate.handleError(this,r),r}return e._zoneDelegates===n&&this._updateTaskCount(e,1),e.state==T&&e._transitionTo(m,T),e},t.prototype.scheduleMicroTask=function(e,t,n,r){return this.scheduleTask(new j(E,e,t,n,r,null))},t.prototype.scheduleMacroTask=function(e,t,n,r,o){return this.scheduleTask(new j(S,e,t,n,r,o))},t.prototype.scheduleEventTask=function(e,t,n,r,o){return this.scheduleTask(new j(O,e,t,n,r,o))},t.prototype.cancelTask=function(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||y).name+"; Execution: "+this.name+")");e._transitionTo(_,m,b);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(w,_),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(g,_),e.runCount=0,e},t.prototype._updateTaskCount=function(e,t){var n=e._zoneDelegates;t==-1&&(e._zoneDelegates=null);for(var r=0;r<n.length;r++)n[r]._updateTaskCount(e.type,t)},t}();D.__symbol__=t;var Z={name:"",onHasTask:function(e,t,n,r){return e.hasTask(n,r)},onScheduleTask:function(e,t,n,r){return e.scheduleTask(n,r)},onInvokeTask:function(e,t,n,r,o,a){return e.invokeTask(n,r,o,a)},onCancelTask:function(e,t,n,r){return e.cancelTask(n,r)}},z=function(){function e(e,t,n){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._forkZS),this._forkDlgt=n&&(n.onFork?t:t._forkDlgt),this._forkCurrZone=n&&(n.onFork?this.zone:t.zone),this._interceptZS=n&&(n.onIntercept?n:t._interceptZS),this._interceptDlgt=n&&(n.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=n&&(n.onIntercept?this.zone:t.zone),this._invokeZS=n&&(n.onInvoke?n:t._invokeZS),this._invokeDlgt=n&&(n.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=n&&(n.onInvoke?this.zone:t.zone),this._handleErrorZS=n&&(n.onHandleError?n:t._handleErrorZS),this._handleErrorDlgt=n&&(n.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=n&&(n.onHandleError?this.zone:t.zone),this._scheduleTaskZS=n&&(n.onScheduleTask?n:t._scheduleTaskZS),this._scheduleTaskDlgt=n&&(n.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=n&&(n.onScheduleTask?this.zone:t.zone),this._invokeTaskZS=n&&(n.onInvokeTask?n:t._invokeTaskZS),this._invokeTaskDlgt=n&&(n.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=n&&(n.onInvokeTask?this.zone:t.zone),this._cancelTaskZS=n&&(n.onCancelTask?n:t._cancelTaskZS),this._cancelTaskDlgt=n&&(n.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=n&&(n.onCancelTask?this.zone:t.zone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;var r=n&&n.onHasTask,o=t&&t._hasTaskZS;(r||o)&&(this._hasTaskZS=r?n:Z,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=e,n.onScheduleTask||(this._scheduleTaskZS=Z,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this.zone),n.onInvokeTask||(this._invokeTaskZS=Z,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this.zone),n.onCancelTask||(this._cancelTaskZS=Z,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this.zone))}return e.prototype.fork=function(e,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,e,t):new D(e,t)},e.prototype.intercept=function(e,t,n){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,e,t,n):t},e.prototype.invoke=function(e,t,n,r,o){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,e,t,n,r,o):t.apply(n,r)},e.prototype.handleError=function(e,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,e,t)},e.prototype.scheduleTask=function(e,t){var n=t;if(this._scheduleTaskZS)this._hasTaskZS&&n._zoneDelegates.push(this._hasTaskDlgtOwner),n=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,e,t),n||(n=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=E)throw new Error("Task is missing scheduleFn.");r(t)}return n},e.prototype.invokeTask=function(e,t,n,r){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,e,t,n,r):t.callback.apply(n,r)},e.prototype.cancelTask=function(e,t){var n;if(this._cancelTaskZS)n=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,e,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");n=t.cancelFn(t)}return n},e.prototype.hasTask=function(e,t){try{return this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,e,t)}catch(n){this.handleError(e,n)}},e.prototype._updateTaskCount=function(e,t){var n=this._taskCounts,r=n[e],o=n[e]=r+t;if(o<0)throw new Error("More tasks executed then were scheduled.");if(0==r||0==o){var a={microTask:n.microTask>0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e};this.hasTask(this.zone,a)}},e}(),j=function(){function e(e,t,n,r,o,a){this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=e,this.source=t,this.data=r,this.scheduleFn=o,this.cancelFn=a,this.callback=n;var s=this;this.invoke=function(){q++;try{return s.runCount++,s.zone.runTask(s,this,arguments)}finally{1==q&&i(),q--}}}return Object.defineProperty(e.prototype,"zone",{get:function(){return this._zone},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"state",{get:function(){return this._state},enumerable:!0,configurable:!0}),e.prototype.cancelScheduleRequest=function(){this._transitionTo(g,T)},e.prototype._transitionTo=function(e,t,n){if(this._state!==t&&this._state!==n)throw new Error(this.type+" '"+this.source+"': can not transition to '"+e+"', expecting state '"+t+"'"+(n?" or '"+n+"'":"")+", was '"+this._state+"'.");this._state=e,e==g&&(this._zoneDelegates=null)},e.prototype.toString=function(){return this.data&&"undefined"!=typeof this.data.handleId?this.data.handleId:Object.prototype.toString.call(this)},e.prototype.toJSON=function(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,invoke:this.invoke,scheduleFn:this.scheduleFn,cancelFn:this.cancelFn,runCount:this.runCount,callback:this.callback}},e}(),P=function(){function e(e,t){this.parent=e,this.zone=t}return e}(),C=t("setTimeout"),L=t("Promise"),I=t("then"),F=new P(null,new D(null,null)),M=null,H=[],R=!1,x=[],q=0,A=t("state"),N=t("value"),B="Promise.then",X=null,W=!0,G=!1,U=0,V=function(){var e=!1;return function(t){return function(){e||(e=!0,t.apply(null,arguments))}}},K=function(){function e(t){var n=this;if(!(n instanceof e))throw new Error("Must be an instanceof Promise.");n[A]=X,n[N]=[];try{t&&t(l(n,W),l(n,G))}catch(r){h(n,!1,r)}}return e.toString=function(){return"function ZoneAwarePromise() { [native code] }"},e.resolve=function(e){return h(new this(null),W,e)},e.reject=function(e){return h(new this(null),G,e)},e.race=function(e){function t(e){a&&(a=r(e))}function n(e){a&&(a=o(e))}for(var r,o,a=new this(function(e,t){n=[e,t],r=n[0],o=n[1];var n}),i=0,c=e;i<c.length;i++){var u=c[i];s(u)||(u=this.resolve(u)),u.then(t,n)}return a},e.all=function(e){for(var t,n,r=new this(function(e,r){t=e,n=r}),o=0,a=[],i=0,c=e;i<c.length;i++){var u=c[i];s(u)||(u=this.resolve(u)),u.then(function(e){return function(n){a[e]=n,o--,o||t(a)}}(o),n),o++}return o||t(a),r},e.prototype.then=function(e,t){var n=new this.constructor(null),r=D.current;return this[A]==X?this[N].push(r,n,e,t):p(this,r,n,e,t),n},e.prototype["catch"]=function(e){return this.then(null,e)},e}();K.resolve=K.resolve,K.reject=K.reject,K.race=K.race,K.all=K.all;var J=e[L]=e.Promise;e.Promise=K;var Q=t("thenPatched");if(J){d(J);var Y=e.fetch;"function"==typeof Y&&(e.fetch=v(Y))}Promise[D.__symbol__("uncaughtPromiseErrors")]=x;var $,ee,te=D.__symbol__("blacklistedStackFrames"),ne=e[t("Error")]=e.Error,re={};e.Error=k;var oe="stackRewrite";k.prototype=ne.prototype,k[te]=re,k[oe]=!1;var ae=["stackTraceLimit","captureStackTrace","prepareStackTrace"],ie=Object.keys(ne);ie&&ie.forEach(function(e){0===ae.filter(function(t){return t===e}).length&&Object.defineProperty(k,e,{get:function(){return ne[e]},set:function(t){ne[e]=t}})}),ne.hasOwnProperty("stackTraceLimit")&&(ne.stackTraceLimit=Math.max(ne.stackTraceLimit,15),Object.defineProperty(k,"stackTraceLimit",{get:function(){return ne.stackTraceLimit},set:function(e){return ne.stackTraceLimit=e}})),ne.hasOwnProperty("captureStackTrace")&&Object.defineProperty(k,"captureStackTrace",{value:function(e,t){ne.captureStackTrace(e,t)}}),Object.defineProperty(k,"prepareStackTrace",{get:function(){return ne.prepareStackTrace},set:function(e){return e&&"function"==typeof e?ne.prepareStackTrace=function(t,n){if(n)for(var r=0;r<n.length;r++){var o=n[r];if("zoneCaptureStackTrace"===o.getFunctionName()){n.splice(r,1);break}}return e.apply(this,[t,n])}:ne.prepareStackTrace=e}});var se=D.current.fork({name:"detect",onHandleError:function(e,t,n,r){if(r.originalStack&&Error===k)for(var o=r.originalStack.split(/\n/),a=!1,i=!1,s=!1;o.length;){var c=o.shift();if(/:\d+:\d+/.test(c)){var u=c.split("(")[0].split("@")[0],l=1;if(u.indexOf("ZoneAwareError")!==-1&&($=c,ee=c.replace("Error.",""),re[ee]=0),u.indexOf("runGuarded")!==-1?i=!0:u.indexOf("runTask")!==-1?s=!0:u.indexOf("run")!==-1?a=!0:l=0,re[c]=l,a&&i&&s){k[oe]=!0;break}}}return!1}}),ce=se.fork({name:"child",onScheduleTask:function(e,t,n,r){return e.scheduleTask(n,r)},onInvokeTask:function(e,t,n,r,o,a){return e.invokeTask(n,r,o,a)},onCancelTask:function(e,t,n,r){return e.cancelTask(n,r)},onInvoke:function(e,t,n,r,o,a,i){return e.invoke(n,r,o,a,i)}}),ue=Error.stackTraceLimit;return Error.stackTraceLimit=100,ce.run(function(){ce.runGuarded(function(){var e=function(e,t,n){};ce.scheduleEventTask(te,function(){ce.scheduleMacroTask(te,function(){ce.scheduleMicroTask(te,function(){throw new k(k,ne)},null,function(t){t._transitionTo=e,t.invoke()})},null,function(t){t._transitionTo=e,t.invoke()},function(){})},null,function(t){t._transitionTo=e,t.invoke()},function(){})})}),Error.stackTraceLimit=ue,e.Zone=D}("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global),function(e){return"__zone_symbol__"+e}),C="object"==typeof window&&window||"object"==typeof self&&self||global,L="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,I=!("nw"in C)&&"undefined"!=typeof process&&"[object process]"==={}.toString.call(process),F=!I&&!L&&!("undefined"==typeof window||!window.HTMLElement),M="undefined"!=typeof process&&"[object process]"==={}.toString.call(process)&&!L&&!("undefined"==typeof window||!window.HTMLElement),H=P("eventTasks"),R="addEventListener",x="removeEventListener",q=function(e,t){return{options:t[2],eventName:t[0],handler:t[1],target:e||C,name:t[0],crossContext:!1,invokeAddFunc:function(e,t){if(!this.crossContext)return t&&t.invoke?this.target[e](this.eventName,t.invoke,this.options):this.target[e](this.eventName,t,this.options);try{return this.target[e](this.eventName,t,this.options)}catch(n){}},invokeRemoveFunc:function(e,t){if(!this.crossContext)return t&&t.invoke?this.target[e](this.eventName,t.invoke,this.options):this.target[e](this.eventName,t,this.options);try{return this.target[e](this.eventName,t,this.options)}catch(n){}}}},A=P("originalInstance");Zone[P("patchEventTargetMethods")]=u,Zone[P("patchOnProperties")]=r;var N=Object[P("defineProperty")]=Object.defineProperty,B=Object[P("getOwnPropertyDescriptor")]=Object.getOwnPropertyDescriptor,X=Object.create,W=P("unconfigurables"),G="Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video",U="ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket".split(","),V="EventTarget",K="copy cut paste abort blur focus canplay canplaythrough change click contextmenu dblclick drag dragend dragenter dragleave dragover dragstart drop durationchange emptied ended input invalid keydown keypress keyup load loadeddata loadedmetadata loadstart message mousedown mouseenter mouseleave mousemove mouseout mouseover mouseup pause play playing progress ratechange reset scroll seeked seeking select show stalled submit suspend timeupdate volumechange waiting mozfullscreenchange mozfullscreenerror mozpointerlockchange mozpointerlockerror error webglcontextrestored webglcontextlost webglcontextcreationerror".split(" "),J=P("unbound"),Q="set",Y="clear",$=["alert","prompt","confirm"],ee="undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global;v(ee,Q,Y,"Timeout"),v(ee,Q,Y,"Interval"),v(ee,Q,Y,"Immediate"),v(ee,"request","cancel","AnimationFrame"),v(ee,"mozRequest","mozCancel","AnimationFrame"),v(ee,"webkitRequest","webkitCancel","AnimationFrame");for(var te=0;te<$.length;te++){var ne=$[te];f(ee,ne,function(e,t,n){return function(t,r){return Zone.current.run(e,ee,r,n)}})}w(ee);var re=ee.XMLHttpRequestEventTarget;re&&re.prototype&&u(re.prototype),S(ee),l("MutationObserver"),l("WebKitMutationObserver"),l("FileReader"),g(),Z(ee),z(ee);var oe=P("xhrTask"),ae=P("xhrSync"),ie=P("xhrListener"),se=P("xhrScheduled");ee.navigator&&ee.navigator.geolocation&&t(ee.navigator.geolocation,["getCurrentPosition","watchPosition"]),k(),y(),ee.PromiseRejectionEvent&&(Zone[P("unhandledPromiseRejectionHandler")]=j("unhandledrejection"),Zone[P("rejectionHandledHandler")]=j("rejectionhandled"))}); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(this,function(){"use strict";function e(e,t){for(var n=e.length-1;n>=0;n--)"function"==typeof e[n]&&(e[n]=Zone.current.wrap(e[n],t+"_"+n));return e}function t(t,n){for(var r=t.constructor.name,o=function(o){var a=n[o],i=t[a];i&&(t[a]=function(t){var n=function(){return t.apply(this,e(arguments,r+"."+a))};return f(n,t),n}(i))},a=0;a<n.length;a++)o(a)}function n(e,t){var n=Object.getOwnPropertyDescriptor(e,t)||{enumerable:!0,configurable:!0};if(n.configurable){delete n.writable,delete n.value;var r=n.get,o=t.substr(2),a=D("_"+t);n.set=function(t){var n=this;if(n||e!==S||(n=S),n){var r=n[a];if(r&&n.removeEventListener(o,r),"function"==typeof t){var i=function(e){var n=t.apply(this,arguments);return void 0==n||n||e.preventDefault(),n};n[a]=i,n.addEventListener(o,i,!1)}else n[a]=null}},n.get=function(){var o=this;if(o||e!==S||(o=S),!o)return null;if(o.hasOwnProperty(a))return o[a];if(r){var i=r&&r.apply(this);if(i)return n.set.apply(this,[i]),"function"==typeof o.removeAttribute&&o.removeAttribute(t),i}return null},Object.defineProperty(e,t,n)}}function r(e,t){if(t)for(var r=0;r<t.length;r++)n(e,"on"+t[r]);else{var o=[];for(var a in e)"on"==a.substr(0,2)&&o.push(a);for(var i=0;i<o.length;i++)n(e,o[i])}}function o(e,t){var n="boolean"==typeof e?e:"object"==typeof e&&(e&&e.capture),r="boolean"==typeof t?t:"object"==typeof t&&(t&&t.capture);return!!n==!!r}function a(e,t,n,r,a){var i=e[C];if(i)for(var s=0;s<i.length;s++){var c=i[s],u=c.data,l=u.handler;if((u.handler===t||l.listener===t)&&o(u.options,r)&&u.eventName===n)return a&&i.splice(s,1),c}return null}function i(e,t,n){var r=e[C];r||(r=e[C]=[]),n?r.unshift(t):r.push(t)}function s(e,t,n,r,o,s){function c(e){var t=e.data;return i(t.target,e,o),t.invokeAddFunc(l,e)}function u(e){var t=e.data;return a(t.target,e.invoke,t.eventName,t.options,!0),t.invokeRemoveFunc(h,e)}void 0===n&&(n=!0),void 0===r&&(r=!1),void 0===o&&(o=!1),void 0===s&&(s=F);var l=D(e),h=D(t),p=!n&&void 0;return function(t,n){var o=s(t,n);o.options=o.options||p;var i=null;"function"==typeof o.handler?i=o.handler:o.handler&&o.handler.handleEvent&&(i=function(e){return o.handler.handleEvent(e)});var h=!1;try{h=o.handler&&"[object FunctionWrapper]"===o.handler.toString()}catch(f){return o.crossContext=!0,o.invokeAddFunc(l,o.handler)}if(!i||h)return o.invokeAddFunc(l,o.handler);if(!r){var d=a(o.target,o.handler,o.eventName,o.options,!1);if(d)return o.invokeAddFunc(l,d)}var v=Zone.current,y=o.target.constructor.name+"."+e+":"+o.eventName;v.scheduleEventTask(y,i,o,c,u)}}function c(e,t,n){void 0===t&&(t=!0),void 0===n&&(n=F);var r=D(e),o=!t&&void 0;return function(e,t){var i=n(e,t);i.options=i.options||o;var s=null;"function"==typeof i.handler?s=i.handler:i.handler&&i.handler.handleEvent&&(s=function(e){return i.handler.handleEvent(e)});var c=!1;try{c=i.handler&&"[object FunctionWrapper]"===i.handler.toString()}catch(u){return i.crossContext=!0,i.invokeRemoveFunc(r,i.handler)}if(!s||c)return i.invokeRemoveFunc(r,i.handler);var l=a(i.target,i.handler,i.eventName,i.options,!0);l?l.zone.cancelTask(l):i.invokeRemoveFunc(r,i.handler)}}function u(e,t,n,r){return void 0===t&&(t=I),void 0===n&&(n=M),void 0===r&&(r=F),!(!e||!e[t])&&(h(e,t,function(){return s(t,n,!0,!1,!1,r)}),h(e,n,function(){return c(n,!0,r)}),!0)}function l(t){var n=S[t];if(n){S[D(t)]=n,S[t]=function(){var r=e(arguments,t);switch(r.length){case 0:this[H]=new n;break;case 1:this[H]=new n(r[0]);break;case 2:this[H]=new n(r[0],r[1]);break;case 3:this[H]=new n(r[0],r[1],r[2]);break;case 4:this[H]=new n(r[0],r[1],r[2],r[3]);break;default:throw new Error("Arg list too long.")}},f(S[t],n);var r,o=new n(function(){});for(r in o)"XMLHttpRequest"===t&&"responseBlob"===r||!function(e){"function"==typeof o[e]?S[t].prototype[e]=function(){return this[H][e].apply(this[H],arguments)}:Object.defineProperty(S[t].prototype,e,{set:function(n){"function"==typeof n?(this[H][e]=Zone.current.wrap(n,t+"."+e),f(this[H][e],n)):this[H][e]=n},get:function(){return this[H][e]}})}(r);for(r in n)"prototype"!==r&&n.hasOwnProperty(r)&&(S[t][r]=n[r])}}function h(e,t,n){for(var r=e;r&&!r.hasOwnProperty(t);)r=Object.getPrototypeOf(r);!r&&e[t]&&(r=e);var o,a=D(t);if(r&&!(o=r[a])){o=r[a]=r[t];var i=n(o,a,t);r[t]=function(){return i(this,arguments)},f(r[t],o)}return o}function p(e,t){var n=e[D("eventTasks")],r=[];if(n)for(var o=0;o<n.length;o++){var a=n[o],i=a.data,s=i&&i.eventName;s===t&&r.push(a)}return r}function f(e,t){e[D("OriginalDelegate")]=t}function d(e,t,n,r){function o(t){function n(){try{t.invoke.apply(this,arguments)}finally{"number"==typeof r.handleId&&delete c[r.handleId]}}var r=t.data;return r.args[0]=n,r.handleId=i.apply(e,r.args),"number"==typeof r.handleId&&(c[r.handleId]=t),t}function a(e){return"number"==typeof e.data.handleId&&delete c[e.data.handleId],s(e.data.handleId)}var i=null,s=null;t+=r,n+=r;var c={};i=h(e,t,function(n){return function(i,s){if("function"==typeof s[0]){var c=Zone.current,u={handleId:null,isPeriodic:"Interval"===r,delay:"Timeout"===r||"Interval"===r?s[1]||0:null,args:s},l=c.scheduleMacroTask(t,s[0],u,o,a);if(!l)return l;var h=l.data.handleId;return h&&h.ref&&h.unref&&"function"==typeof h.ref&&"function"==typeof h.unref&&(l.ref=h.ref.bind(h),l.unref=h.unref.bind(h)),l}return n.apply(e,s)}}),s=h(e,n,function(t){return function(n,r){var o="number"==typeof r[0]?c[r[0]]:r[0];o&&"string"==typeof o.type?"notScheduled"!==o.state&&(o.cancelFn&&o.data.isPeriodic||0===o.runCount)&&o.zone.cancelTask(o):t.apply(e,r)}})}function v(){Object.defineProperty=function(e,t,n){if(k(e,t))throw new TypeError("Cannot assign to read only property '"+t+"' of "+e);var r=n.configurable;return"prototype"!==t&&(n=g(e,t,n)),_(e,t,n,r)},Object.defineProperties=function(e,t){return Object.keys(t).forEach(function(n){Object.defineProperty(e,n,t[n])}),e},Object.create=function(e,t){return"object"!=typeof t||Object.isFrozen(t)||Object.keys(t).forEach(function(n){t[n]=g(e,n,t[n])}),q(e,t)},Object.getOwnPropertyDescriptor=function(e,t){var n=R(e,t);return k(e,t)&&(n.configurable=!1),n}}function y(e,t,n){var r=n.configurable;return n=g(e,t,n),_(e,t,n,r)}function k(e,t){return e&&e[x]&&e[x][t]}function g(e,t,n){return n.configurable=!0,n.configurable||(e[x]||L(e,x,{writable:!0,value:{}}),e[x][t]=!0),n}function _(e,t,n,r){try{return L(e,t,n)}catch(o){if(!n.configurable)throw o;"undefined"==typeof r?delete n.configurable:n.configurable=r;try{return L(e,t,n)}catch(o){var a=null;try{a=JSON.stringify(n)}catch(o){a=a.toString()}console.log("Attempting to configure '"+t+"' with descriptor '"+a+"' on object '"+e+"' and got error, giving up: "+o)}}}function m(e){var t=[],n=e.wtf;n?t=A.split(",").map(function(e){return"HTML"+e+"Element"}).concat(B):e[X]?t.push(X):t=B;for(var r=0;r<t.length;r++){var o=e[t[r]];u(o&&o.prototype)}}function T(e){var t=e.WebSocket;e.EventTarget||u(t.prototype),e.WebSocket=function(e,n){var o,a=arguments.length>1?new t(e,n):new t(e),i=Object.getOwnPropertyDescriptor(a,"onmessage");return i&&i.configurable===!1?(o=Object.create(a),["addEventListener","removeEventListener","send","close"].forEach(function(e){o[e]=function(){return a[e].apply(a,arguments)}})):o=a,r(o,["close","error","message","open"]),o};for(var n in t)e.WebSocket[n]=t[n]}function b(e){if(!P||j){var t="undefined"!=typeof WebSocket;w()?(O&&(r(window,N.concat(["resize"])),r(Document.prototype,N),"undefined"!=typeof window.SVGElement&&r(window.SVGElement.prototype,N),r(HTMLElement.prototype,N)),r(XMLHttpRequest.prototype,null),"undefined"!=typeof IDBIndex&&(r(IDBIndex.prototype,null),r(IDBRequest.prototype,null),r(IDBOpenDBRequest.prototype,null),r(IDBDatabase.prototype,null),r(IDBTransaction.prototype,null),r(IDBCursor.prototype,null)),t&&r(WebSocket.prototype,null)):(E(),l("XMLHttpRequest"),t&&T(e))}}function w(){if((O||j)&&!Object.getOwnPropertyDescriptor(HTMLElement.prototype,"onclick")&&"undefined"!=typeof Element){var e=Object.getOwnPropertyDescriptor(Element.prototype,"onclick");if(e&&!e.configurable)return!1}var t=Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype,"onreadystatechange");if(t){Object.defineProperty(XMLHttpRequest.prototype,"onreadystatechange",{enumerable:!0,configurable:!0,get:function(){return!0}});var n=new XMLHttpRequest,r=!!n.onreadystatechange;return Object.defineProperty(XMLHttpRequest.prototype,"onreadystatechange",t||{}),r}Object.defineProperty(XMLHttpRequest.prototype,"onreadystatechange",{enumerable:!0,configurable:!0,get:function(){return this[D("fakeonreadystatechange")]},set:function(e){this[D("fakeonreadystatechange")]=e}});var n=new XMLHttpRequest,o=function(){};n.onreadystatechange=o;var r=n[D("fakeonreadystatechange")]===o;return n.onreadystatechange=null,r}function E(){for(var e=function(e){var t=N[e],n="on"+t;self.addEventListener(t,function(e){var t,r,o=e.target;for(r=o?o.constructor.name+"."+n:"unknown."+n;o;)o[n]&&!o[n][W]&&(t=Zone.current.wrap(o[n],r),t[W]=o[n],o[n]=t),o=o.parentElement},!0)},t=0;t<N.length;t++)e(t)}function Z(e){if((O||j)&&"registerElement"in e.document){var t=document.registerElement,n=["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"];document.registerElement=function(e,r){return r&&r.prototype&&n.forEach(function(e){var t="Document.registerElement::"+e;if(r.prototype.hasOwnProperty(e)){var n=Object.getOwnPropertyDescriptor(r.prototype,e);n&&n.value?(n.value=Zone.current.wrap(n.value,t),y(r.prototype,e,n)):r.prototype[e]=Zone.current.wrap(r.prototype[e],t)}else r.prototype[e]&&(r.prototype[e]=Zone.current.wrap(r.prototype[e],t))}),t.apply(document,[e,r])},f(document.registerElement,t)}}(function(e){function t(e){s&&s.mark&&s.mark(e)}function n(e,t){s&&s.measure&&s.measure(e,t)}function r(t){0===j&&0===v.length&&(e[f]?e[f].resolve(0)[d](o):e[p](o,0)),t&&v.push(t)}function o(){if(!y){for(y=!0;v.length;){var e=v;v=[];for(var t=0;t<e.length;t++){var n=e[t];try{n.zone.runTask(n,null,null)}catch(r){z.onUnhandledError(r)}}}!c[i("ignoreConsoleErrorUncaughtError")];z.microtaskDrainDone(),y=!1}}function a(){}function i(e){return"__zone_symbol__"+e}var s=e.performance;if(t("Zone"),e.Zone)throw new Error("Zone already loaded.");var c=function(){function r(e,t){this._properties=null,this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new l(this,this._parent&&this._parent._zoneDelegate,t)}return r.assertZonePatched=function(){if(e.Promise!==S.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(r,"root",{get:function(){for(var e=r.current;e.parent;)e=e.parent;return e},enumerable:!0,configurable:!0}),Object.defineProperty(r,"current",{get:function(){return P.zone},enumerable:!0,configurable:!0}),Object.defineProperty(r,"currentTask",{get:function(){return O},enumerable:!0,configurable:!0}),r.__load_patch=function(o,a){if(S.hasOwnProperty(o))throw Error("Already loaded patch: "+o);if(!e["__Zone_disable_"+o]){var i="Zone:"+o;t(i),S[o]=a(e,r,z),n(i,i)}},Object.defineProperty(r.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(r.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),r.prototype.get=function(e){var t=this.getZoneWith(e);if(t)return t._properties[e]},r.prototype.getZoneWith=function(e){for(var t=this;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null},r.prototype.fork=function(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)},r.prototype.wrap=function(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);var n=this._zoneDelegate.intercept(this,e,t),r=this;return function(){return r.runGuarded(n,this,arguments,t)}},r.prototype.run=function(e,t,n,r){void 0===t&&(t=void 0),void 0===n&&(n=null),void 0===r&&(r=null),P={parent:P,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{P=P.parent}},r.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),void 0===n&&(n=null),void 0===r&&(r=null),P={parent:P,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(o){if(this._zoneDelegate.handleError(this,o))throw o}}finally{P=P.parent}},r.prototype.runTask=function(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||k).name+"; Execution: "+this.name+")");var r=e.state!=T;r&&e._transitionTo(T,m),e.runCount++;var o=O;O=e,P={parent:P,zone:this};try{e.type==Z&&e.data&&!e.data.isPeriodic&&(e.cancelFn=null);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(a){if(this._zoneDelegate.handleError(this,a))throw a}}finally{e.state!==g&&e.state!==w&&(e.type==D||e.data&&e.data.isPeriodic?r&&e._transitionTo(m,T):(e.runCount=0,this._updateTaskCount(e,-1),r&&e._transitionTo(g,T,g))),P=P.parent,O=o}},r.prototype.scheduleTask=function(e){if(e.zone&&e.zone!==this)for(var t=this;t;){if(t===e.zone)throw Error("can not reschedule task to "+this.name+" which is descendants of the original zone "+e.zone.name);t=t.parent}e._transitionTo(_,g);var n=[];e._zoneDelegates=n,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(r){throw e._transitionTo(w,_,g),this._zoneDelegate.handleError(this,r),r}return e._zoneDelegates===n&&this._updateTaskCount(e,1),e.state==_&&e._transitionTo(m,_),e},r.prototype.scheduleMicroTask=function(e,t,n,r){return this.scheduleTask(new h(E,e,t,n,r,null))},r.prototype.scheduleMacroTask=function(e,t,n,r,o){return this.scheduleTask(new h(Z,e,t,n,r,o))},r.prototype.scheduleEventTask=function(e,t,n,r,o){return this.scheduleTask(new h(D,e,t,n,r,o))},r.prototype.cancelTask=function(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||k).name+"; Execution: "+this.name+")");e._transitionTo(b,m,T);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(w,b),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(g,b),e.runCount=0,e},r.prototype._updateTaskCount=function(e,t){var n=e._zoneDelegates;t==-1&&(e._zoneDelegates=null);for(var r=0;r<n.length;r++)n[r]._updateTaskCount(e.type,t)},r}();c.__symbol__=i;var u={name:"",onHasTask:function(e,t,n,r){return e.hasTask(n,r)},onScheduleTask:function(e,t,n,r){return e.scheduleTask(n,r)},onInvokeTask:function(e,t,n,r,o,a){return e.invokeTask(n,r,o,a)},onCancelTask:function(e,t,n,r){return e.cancelTask(n,r)}},l=function(){function e(e,t,n){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._forkZS),this._forkDlgt=n&&(n.onFork?t:t._forkDlgt),this._forkCurrZone=n&&(n.onFork?this.zone:t.zone),this._interceptZS=n&&(n.onIntercept?n:t._interceptZS),this._interceptDlgt=n&&(n.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=n&&(n.onIntercept?this.zone:t.zone),this._invokeZS=n&&(n.onInvoke?n:t._invokeZS),this._invokeDlgt=n&&(n.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=n&&(n.onInvoke?this.zone:t.zone),this._handleErrorZS=n&&(n.onHandleError?n:t._handleErrorZS),this._handleErrorDlgt=n&&(n.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=n&&(n.onHandleError?this.zone:t.zone),this._scheduleTaskZS=n&&(n.onScheduleTask?n:t._scheduleTaskZS),this._scheduleTaskDlgt=n&&(n.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=n&&(n.onScheduleTask?this.zone:t.zone),this._invokeTaskZS=n&&(n.onInvokeTask?n:t._invokeTaskZS),this._invokeTaskDlgt=n&&(n.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=n&&(n.onInvokeTask?this.zone:t.zone),this._cancelTaskZS=n&&(n.onCancelTask?n:t._cancelTaskZS),this._cancelTaskDlgt=n&&(n.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=n&&(n.onCancelTask?this.zone:t.zone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;var r=n&&n.onHasTask,o=t&&t._hasTaskZS;(r||o)&&(this._hasTaskZS=r?n:u,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=e,n.onScheduleTask||(this._scheduleTaskZS=u,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this.zone),n.onInvokeTask||(this._invokeTaskZS=u,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this.zone),n.onCancelTask||(this._cancelTaskZS=u,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this.zone))}return e.prototype.fork=function(e,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,e,t):new c(e,t)},e.prototype.intercept=function(e,t,n){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,e,t,n):t},e.prototype.invoke=function(e,t,n,r,o){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,e,t,n,r,o):t.apply(n,r)},e.prototype.handleError=function(e,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,e,t)},e.prototype.scheduleTask=function(e,t){var n=t;if(this._scheduleTaskZS)this._hasTaskZS&&n._zoneDelegates.push(this._hasTaskDlgtOwner),n=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,e,t),n||(n=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=E)throw new Error("Task is missing scheduleFn.");r(t)}return n},e.prototype.invokeTask=function(e,t,n,r){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,e,t,n,r):t.callback.apply(n,r)},e.prototype.cancelTask=function(e,t){var n;if(this._cancelTaskZS)n=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,e,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");n=t.cancelFn(t)}return n},e.prototype.hasTask=function(e,t){try{return this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,e,t)}catch(n){this.handleError(e,n)}},e.prototype._updateTaskCount=function(e,t){var n=this._taskCounts,r=n[e],o=n[e]=r+t;if(o<0)throw new Error("More tasks executed then were scheduled.");if(0==r||0==o){var a={microTask:n.microTask>0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e};this.hasTask(this.zone,a)}},e}(),h=function(){function e(e,t,n,r,a,i){this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=e,this.source=t,this.data=r,this.scheduleFn=a,this.cancelFn=i,this.callback=n;var s=this;this.invoke=function(){j++;try{return s.runCount++,s.zone.runTask(s,this,arguments)}finally{1==j&&o(),j--}}}return Object.defineProperty(e.prototype,"zone",{get:function(){return this._zone},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"state",{get:function(){return this._state},enumerable:!0,configurable:!0}),e.prototype.cancelScheduleRequest=function(){this._transitionTo(g,_)},e.prototype._transitionTo=function(e,t,n){if(this._state!==t&&this._state!==n)throw new Error(this.type+" '"+this.source+"': can not transition to '"+e+"', expecting state '"+t+"'"+(n?" or '"+n+"'":"")+", was '"+this._state+"'.");this._state=e,e==g&&(this._zoneDelegates=null)},e.prototype.toString=function(){return this.data&&"undefined"!=typeof this.data.handleId?this.data.handleId:Object.prototype.toString.call(this)},e.prototype.toJSON=function(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,invoke:this.invoke,scheduleFn:this.scheduleFn,cancelFn:this.cancelFn,runCount:this.runCount,callback:this.callback}},e}(),p=i("setTimeout"),f=i("Promise"),d=i("then"),v=[],y=!1,k={name:"NO ZONE"},g="notScheduled",_="scheduling",m="scheduled",T="running",b="canceling",w="unknown",E="microTask",Z="macroTask",D="eventTask",S={},z={symbol:i,currentZoneFrame:function(){return P},onUnhandledError:a,microtaskDrainDone:a,scheduleMicroTask:r,showUncaughtError:function(){return!c[i("ignoreConsoleErrorUncaughtError")]}},P={parent:null,zone:new c(null,null)},O=null,j=0;return n("Zone","Zone"),e.Zone=c})("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global);Zone.__load_patch("ZoneAwarePromise",function(e,t,n){function r(e){n.onUnhandledError(e);try{var r=t[f("unhandledPromiseRejectionHandler")];r&&"function"==typeof r&&r.apply(this,[e])}catch(o){}}function o(e){return e&&e.then}function a(e){return e}function i(e){return Z.reject(e)}function s(e,t){return function(n){try{c(e,t,n)}catch(r){c(e,!1,r)}}}function c(e,r,o){var a=E();if(e===o)throw new TypeError("Promise resolved with itself");if(e[k]===m){var i=null;try{"object"!=typeof o&&"function"!=typeof o||(i=o&&o.then)}catch(h){return a(function(){c(e,!1,h)})(),e}if(r!==b&&o instanceof Z&&o.hasOwnProperty(k)&&o.hasOwnProperty(g)&&o[k]!==m)u(o),c(e,o[k],o[g]);else if(r!==b&&"function"==typeof i)try{i.apply(o,[a(s(e,r)),a(s(e,!1))])}catch(h){a(function(){c(e,!1,h)})()}else{e[k]=r;var p=e[g];e[g]=o,r===b&&o instanceof Error&&(o[f("currentTask")]=t.currentTask);for(var v=0;v<p.length;)l(e,p[v++],p[v++],p[v++],p[v++]);if(0==p.length&&r==b){e[k]=w;try{throw new Error("Uncaught (in promise): "+o+(o&&o.stack?"\n"+o.stack:""))}catch(h){var y=h;y.rejection=o,y.promise=e,y.zone=t.current,y.task=t.currentTask,d.push(y),n.scheduleMicroTask()}}}}return e}function u(e){if(e[k]===w){try{var n=t[f("rejectionHandledHandler")];n&&"function"==typeof n&&n.apply(this,[{rejection:e[g],promise:e}])}catch(r){}e[k]=b;for(var o=0;o<d.length;o++)e===d[o].promise&&d.splice(o,1)}}function l(e,t,n,r,o){u(e);var s=e[k]?"function"==typeof r?r:a:"function"==typeof o?o:i;t.scheduleMicroTask(_,function(){try{c(n,!0,t.run(s,void 0,[e[g]]))}catch(r){c(n,!1,r)}})}function h(e){var t=e.prototype,n=t.then;t[y]=n,e.prototype.then=function(e,t){var r=this,o=new Z(function(e,t){n.call(r,e,t)});return o.then(e,t)},e[S]=!0}function p(e){return function(){var t=e.apply(this,arguments);if(t instanceof Z)return t;var n=t.constructor;return n[S]||h(n),t}}var f=n.symbol,d=[],v=f("Promise"),y=f("then");n.onUnhandledError=function(e){if(n.showUncaughtError()){var t=e&&e.rejection;t&&console.error("Unhandled Promise rejection:",t instanceof Error?t.message:t,"; Zone:",e.zone.name,"; Task:",e.task&&e.task.source,"; Value:",t,t instanceof Error?t.stack:void 0),console.error(e)}},n.microtaskDrainDone=function(){for(;d.length;)for(var e=function(){var e=d.shift();try{e.zone.runGuarded(function(){throw e})}catch(t){r(t)}};d.length;)e()};var k=f("state"),g=f("value"),_="Promise.then",m=null,T=!0,b=!1,w=0,E=function(){var e=!1;return function(t){return function(){e||(e=!0,t.apply(null,arguments))}}},Z=function(){function e(t){var n=this;if(!(n instanceof e))throw new Error("Must be an instanceof Promise.");n[k]=m,n[g]=[];try{t&&t(s(n,T),s(n,b))}catch(r){c(n,!1,r)}}return e.toString=function(){return"function ZoneAwarePromise() { [native code] }"},e.resolve=function(e){return c(new this(null),T,e)},e.reject=function(e){return c(new this(null),b,e)},e.race=function(e){function t(e){i&&(i=r(e))}function n(e){i&&(i=a(e))}for(var r,a,i=new this(function(e,t){n=[e,t],r=n[0],a=n[1];var n}),s=0,c=e;s<c.length;s++){var u=c[s];o(u)||(u=this.resolve(u)),u.then(t,n)}return i},e.all=function(e){for(var t,n,r=new this(function(e,r){t=e,n=r}),a=0,i=[],s=0,c=e;s<c.length;s++){var u=c[s];o(u)||(u=this.resolve(u)),u.then(function(e){return function(n){i[e]=n,a--,a||t(i)}}(a),n),a++}return a||t(i),r},e.prototype.then=function(e,n){var r=new this.constructor(null),o=t.current;return this[k]==m?this[g].push(o,r,e,n):l(this,o,r,e,n),r},e.prototype["catch"]=function(e){return this.then(null,e)},e}();Z.resolve=Z.resolve,Z.reject=Z.reject,Z.race=Z.race,Z.all=Z.all;var D=e[v]=e.Promise;e.Promise=Z;var S=f("thenPatched");if(D){h(D);var z=e.fetch;"function"==typeof z&&(e.fetch=p(z))}return Promise[t.__symbol__("uncaughtPromiseErrors")]=d,Z});var D=function(e){return"__zone_symbol__"+e},S="object"==typeof window&&window||"object"==typeof self&&self||global,z="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,P=!("nw"in S)&&"undefined"!=typeof process&&"[object process]"==={}.toString.call(process),O=!P&&!z&&!("undefined"==typeof window||!window.HTMLElement),j="undefined"!=typeof process&&"[object process]"==={}.toString.call(process)&&!z&&!("undefined"==typeof window||!window.HTMLElement),C=D("eventTasks"),I="addEventListener",M="removeEventListener",F=function(e,t){return{options:t[2],eventName:t[0],handler:t[1],target:e||S,name:t[0],crossContext:!1,invokeAddFunc:function(e,t){if(!this.crossContext)return t&&t.invoke?this.target[e](this.eventName,t.invoke,this.options):this.target[e](this.eventName,t,this.options);try{return this.target[e](this.eventName,t,this.options)}catch(n){}},invokeRemoveFunc:function(e,t){if(!this.crossContext)return t&&t.invoke?this.target[e](this.eventName,t.invoke,this.options):this.target[e](this.eventName,t,this.options);try{return this.target[e](this.eventName,t,this.options)}catch(n){}}}},H=D("originalInstance");Zone[D("patchEventTargetMethods")]=u,Zone[D("patchOnProperties")]=r,Zone.__load_patch("toString",function(e,t,n){var r=Function.prototype.toString;Function.prototype.toString=function(){if("function"==typeof this){if(this[D("OriginalDelegate")])return r.apply(this[D("OriginalDelegate")],arguments);if(this===Promise){var t=e[D("Promise")];if(t)return r.apply(t,arguments)}if(this===Error){var n=e[D("Error")];if(n)return r.apply(n,arguments)}}return r.apply(this,arguments)};var o=Object.prototype.toString;Object.prototype.toString=function(){return this instanceof Promise?"[object Promise]":o.apply(this,arguments)}});var L=Object[D("defineProperty")]=Object.defineProperty,R=Object[D("getOwnPropertyDescriptor")]=Object.getOwnPropertyDescriptor,q=Object.create,x=D("unconfigurables"),A="Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video",B="ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket".split(","),X="EventTarget",N="copy cut paste abort blur focus canplay canplaythrough change click contextmenu dblclick drag dragend dragenter dragleave dragover dragstart drop durationchange emptied ended input invalid keydown keypress keyup load loadeddata loadedmetadata loadstart message mousedown mouseenter mouseleave mousemove mouseout mouseover mouseup pause play playing progress ratechange reset scroll seeked seeking select show stalled submit suspend timeupdate volumechange waiting mozfullscreenchange mozfullscreenerror mozpointerlockchange mozpointerlockerror error webglcontextrestored webglcontextlost webglcontextcreationerror".split(" "),W=D("unbound");Zone.__load_patch("timers",function(e,t,n){var r="set",o="clear";d(e,r,o,"Timeout"),d(e,r,o,"Interval"),d(e,r,o,"Immediate"),d(e,"request","cancel","AnimationFrame"),d(e,"mozRequest","mozCancel","AnimationFrame"),d(e,"webkitRequest","webkitCancel","AnimationFrame")}),Zone.__load_patch("blocking",function(e,t,n){for(var r=["alert","prompt","confirm"],o=0;o<r.length;o++){var a=r[o];h(e,a,function(n,r,o){return function(r,a){return t.current.run(n,e,a,o)}})}}),Zone.__load_patch("EventTarget",function(e,t,n){m(e);var r=e.XMLHttpRequestEventTarget;r&&r.prototype&&u(r.prototype),l("MutationObserver"),l("WebKitMutationObserver"),l("FileReader")}),Zone.__load_patch("on_property",function(e,t,n){b(e),v(),Z(e)}),Zone.__load_patch("XHR",function(e,t,n){function r(e){function n(e){var t=e[o];return t}function r(e){XMLHttpRequest[s]=!1;var t=e.data,n=t.target[i];n&&t.target.removeEventListener("readystatechange",n);var r=t.target[i]=function(){t.target.readyState===t.target.DONE&&!t.aborted&&XMLHttpRequest[s]&&"scheduled"===e.state&&e.invoke()};t.target.addEventListener("readystatechange",r);var a=t.target[o];return a||(t.target[o]=e),p.apply(t.target,t.args),XMLHttpRequest[s]=!0,e}function c(){}function u(e){var t=e.data;return t.aborted=!0,f.apply(t.target,t.args)}var l=h(e.XMLHttpRequest.prototype,"open",function(){return function(e,t){return e[a]=0==t[2],l.apply(e,t)}}),p=h(e.XMLHttpRequest.prototype,"send",function(){return function(e,n){var o=t.current;if(e[a])return p.apply(e,n);var i={target:e,isPeriodic:!1,delay:null,args:n,aborted:!1};return o.scheduleMacroTask("XMLHttpRequest.send",c,i,r,u)}}),f=h(e.XMLHttpRequest.prototype,"abort",function(e){return function(e,t){var r=n(e);if(r&&"string"==typeof r.type){if(null==r.cancelFn||r.data&&r.data.aborted)return;r.zone.cancelTask(r)}}})}r(e);var o=D("xhrTask"),a=D("xhrSync"),i=D("xhrListener"),s=D("xhrScheduled")}),Zone.__load_patch("geolocation",function(e,n,r){e.navigator&&e.navigator.geolocation&&t(e.navigator.geolocation,["getCurrentPosition","watchPosition"])}),Zone.__load_patch("PromiseRejectionEvent",function(e,t,n){function r(t){return function(n){var r=p(e,t);r.forEach(function(r){var o=e.PromiseRejectionEvent;if(o){var a=new o(t,{promise:n.promise,reason:n.rejection});r.invoke(a)}})}}e.PromiseRejectionEvent&&(t[D("unhandledPromiseRejectionHandler")]=r("unhandledrejection"),t[D("rejectionHandledHandler")]=r("rejectionhandled"))})}); |
@@ -9,4 +9,5 @@ /** | ||
import '../common/to-string'; | ||
import {patchTimer} from '../common/timers'; | ||
import {patchFuncToString, patchObjectToString} from '../common/to-string'; | ||
import {findEventTask, patchClass, patchEventTargetMethods, patchMethod, patchPrototype, zoneSymbol} from '../common/utils'; | ||
@@ -19,166 +20,175 @@ | ||
const set = 'set'; | ||
const clear = 'clear'; | ||
const blockingMethods = ['alert', 'prompt', 'confirm']; | ||
const _global: any = | ||
typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global; | ||
Zone.__load_patch('timers', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
const set = 'set'; | ||
const clear = 'clear'; | ||
patchTimer(global, set, clear, 'Timeout'); | ||
patchTimer(global, set, clear, 'Interval'); | ||
patchTimer(global, set, clear, 'Immediate'); | ||
patchTimer(global, 'request', 'cancel', 'AnimationFrame'); | ||
patchTimer(global, 'mozRequest', 'mozCancel', 'AnimationFrame'); | ||
patchTimer(global, 'webkitRequest', 'webkitCancel', 'AnimationFrame'); | ||
}); | ||
patchTimer(_global, set, clear, 'Timeout'); | ||
patchTimer(_global, set, clear, 'Interval'); | ||
patchTimer(_global, set, clear, 'Immediate'); | ||
patchTimer(_global, 'request', 'cancel', 'AnimationFrame'); | ||
patchTimer(_global, 'mozRequest', 'mozCancel', 'AnimationFrame'); | ||
patchTimer(_global, 'webkitRequest', 'webkitCancel', 'AnimationFrame'); | ||
Zone.__load_patch('blocking', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
const blockingMethods = ['alert', 'prompt', 'confirm']; | ||
for (let i = 0; i < blockingMethods.length; i++) { | ||
const name = blockingMethods[i]; | ||
patchMethod(global, name, (delegate, symbol, name) => { | ||
return function(s: any, args: any[]) { | ||
return Zone.current.run(delegate, global, args, name); | ||
}; | ||
}); | ||
} | ||
}); | ||
for (let i = 0; i < blockingMethods.length; i++) { | ||
const name = blockingMethods[i]; | ||
patchMethod(_global, name, (delegate, symbol, name) => { | ||
return function(s: any, args: any[]) { | ||
return Zone.current.run(delegate, _global, args, name); | ||
}; | ||
}); | ||
} | ||
Zone.__load_patch('EventTarget', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
eventTargetPatch(global); | ||
// patch XMLHttpRequestEventTarget's addEventListener/removeEventListener | ||
const XMLHttpRequestEventTarget = (global as any)['XMLHttpRequestEventTarget']; | ||
if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) { | ||
patchEventTargetMethods(XMLHttpRequestEventTarget.prototype); | ||
} | ||
patchClass('MutationObserver'); | ||
patchClass('WebKitMutationObserver'); | ||
patchClass('FileReader'); | ||
}); | ||
eventTargetPatch(_global); | ||
// patch XMLHttpRequestEventTarget's addEventListener/removeEventListener | ||
const XMLHttpRequestEventTarget = (_global as any)['XMLHttpRequestEventTarget']; | ||
if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) { | ||
patchEventTargetMethods(XMLHttpRequestEventTarget.prototype); | ||
} | ||
propertyDescriptorPatch(_global); | ||
patchClass('MutationObserver'); | ||
patchClass('WebKitMutationObserver'); | ||
patchClass('FileReader'); | ||
propertyPatch(); | ||
registerElementPatch(_global); | ||
Zone.__load_patch('on_property', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
propertyDescriptorPatch(global); | ||
propertyPatch(); | ||
registerElementPatch(global); | ||
}); | ||
// Treat XMLHTTPRequest as a macrotask. | ||
patchXHR(_global); | ||
Zone.__load_patch('XHR', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
// Treat XMLHTTPRequest as a macrotask. | ||
patchXHR(global); | ||
const XHR_TASK = zoneSymbol('xhrTask'); | ||
const XHR_SYNC = zoneSymbol('xhrSync'); | ||
const XHR_LISTENER = zoneSymbol('xhrListener'); | ||
const XHR_SCHEDULED = zoneSymbol('xhrScheduled'); | ||
const XHR_TASK = zoneSymbol('xhrTask'); | ||
const XHR_SYNC = zoneSymbol('xhrSync'); | ||
const XHR_LISTENER = zoneSymbol('xhrListener'); | ||
const XHR_SCHEDULED = zoneSymbol('xhrScheduled'); | ||
interface XHROptions extends TaskData { | ||
target: any; | ||
args: any[]; | ||
aborted: boolean; | ||
} | ||
function patchXHR(window: any) { | ||
function findPendingTask(target: any) { | ||
const pendingTask: Task = target[XHR_TASK]; | ||
return pendingTask; | ||
interface XHROptions extends TaskData { | ||
target: any; | ||
args: any[]; | ||
aborted: boolean; | ||
} | ||
function scheduleTask(task: Task) { | ||
(XMLHttpRequest as any)[XHR_SCHEDULED] = false; | ||
const data = <XHROptions>task.data; | ||
// remove existing event listener | ||
const listener = data.target[XHR_LISTENER]; | ||
if (listener) { | ||
data.target.removeEventListener('readystatechange', listener); | ||
function patchXHR(window: any) { | ||
function findPendingTask(target: any) { | ||
const pendingTask: Task = target[XHR_TASK]; | ||
return pendingTask; | ||
} | ||
const newListener = data.target[XHR_LISTENER] = () => { | ||
if (data.target.readyState === data.target.DONE) { | ||
// sometimes on some browsers XMLHttpRequest will fire onreadystatechange with | ||
// readyState=4 multiple times, so we need to check task state here | ||
if (!data.aborted && (XMLHttpRequest as any)[XHR_SCHEDULED] && task.state === 'scheduled') { | ||
task.invoke(); | ||
function scheduleTask(task: Task) { | ||
(XMLHttpRequest as any)[XHR_SCHEDULED] = false; | ||
const data = <XHROptions>task.data; | ||
// remove existing event listener | ||
const listener = data.target[XHR_LISTENER]; | ||
if (listener) { | ||
data.target.removeEventListener('readystatechange', listener); | ||
} | ||
const newListener = data.target[XHR_LISTENER] = () => { | ||
if (data.target.readyState === data.target.DONE) { | ||
// sometimes on some browsers XMLHttpRequest will fire onreadystatechange with | ||
// readyState=4 multiple times, so we need to check task state here | ||
if (!data.aborted && (XMLHttpRequest as any)[XHR_SCHEDULED] && | ||
task.state === 'scheduled') { | ||
task.invoke(); | ||
} | ||
} | ||
}; | ||
data.target.addEventListener('readystatechange', newListener); | ||
const storedTask: Task = data.target[XHR_TASK]; | ||
if (!storedTask) { | ||
data.target[XHR_TASK] = task; | ||
} | ||
}; | ||
data.target.addEventListener('readystatechange', newListener); | ||
sendNative.apply(data.target, data.args); | ||
(XMLHttpRequest as any)[XHR_SCHEDULED] = true; | ||
return task; | ||
} | ||
const storedTask: Task = data.target[XHR_TASK]; | ||
if (!storedTask) { | ||
data.target[XHR_TASK] = task; | ||
function placeholderCallback() {} | ||
function clearTask(task: Task) { | ||
const data = <XHROptions>task.data; | ||
// Note - ideally, we would call data.target.removeEventListener here, but it's too late | ||
// to prevent it from firing. So instead, we store info for the event listener. | ||
data.aborted = true; | ||
return abortNative.apply(data.target, data.args); | ||
} | ||
sendNative.apply(data.target, data.args); | ||
(XMLHttpRequest as any)[XHR_SCHEDULED] = true; | ||
return task; | ||
} | ||
function placeholderCallback() {} | ||
const openNative: Function = patchMethod( | ||
window.XMLHttpRequest.prototype, 'open', () => function(self: any, args: any[]) { | ||
self[XHR_SYNC] = args[2] == false; | ||
return openNative.apply(self, args); | ||
}); | ||
function clearTask(task: Task) { | ||
const data = <XHROptions>task.data; | ||
// Note - ideally, we would call data.target.removeEventListener here, but it's too late | ||
// to prevent it from firing. So instead, we store info for the event listener. | ||
data.aborted = true; | ||
return abortNative.apply(data.target, data.args); | ||
const sendNative: Function = patchMethod( | ||
window.XMLHttpRequest.prototype, 'send', () => function(self: any, args: any[]) { | ||
const zone = Zone.current; | ||
if (self[XHR_SYNC]) { | ||
// if the XHR is sync there is no task to schedule, just execute the code. | ||
return sendNative.apply(self, args); | ||
} else { | ||
const options: XHROptions = | ||
{target: self, isPeriodic: false, delay: null, args: args, aborted: false}; | ||
return zone.scheduleMacroTask( | ||
'XMLHttpRequest.send', placeholderCallback, options, scheduleTask, clearTask); | ||
} | ||
}); | ||
const abortNative = patchMethod( | ||
window.XMLHttpRequest.prototype, 'abort', | ||
(delegate: Function) => function(self: any, args: any[]) { | ||
const task: Task = findPendingTask(self); | ||
if (task && typeof task.type == 'string') { | ||
// If the XHR has already completed, do nothing. | ||
// If the XHR has already been aborted, do nothing. | ||
// Fix #569, call abort multiple times before done will cause | ||
// macroTask task count be negative number | ||
if (task.cancelFn == null || (task.data && (<XHROptions>task.data).aborted)) { | ||
return; | ||
} | ||
task.zone.cancelTask(task); | ||
} | ||
// Otherwise, we are trying to abort an XHR which has not yet been sent, so there is no | ||
// task | ||
// to cancel. Do nothing. | ||
}); | ||
} | ||
}); | ||
const openNative: Function = | ||
patchMethod(window.XMLHttpRequest.prototype, 'open', () => function(self: any, args: any[]) { | ||
self[XHR_SYNC] = args[2] == false; | ||
return openNative.apply(self, args); | ||
}); | ||
Zone.__load_patch('geolocation', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
/// GEO_LOCATION | ||
if (global['navigator'] && global['navigator'].geolocation) { | ||
patchPrototype(global['navigator'].geolocation, ['getCurrentPosition', 'watchPosition']); | ||
} | ||
}); | ||
const sendNative: Function = | ||
patchMethod(window.XMLHttpRequest.prototype, 'send', () => function(self: any, args: any[]) { | ||
const zone = Zone.current; | ||
if (self[XHR_SYNC]) { | ||
// if the XHR is sync there is no task to schedule, just execute the code. | ||
return sendNative.apply(self, args); | ||
} else { | ||
const options: XHROptions = | ||
{target: self, isPeriodic: false, delay: null, args: args, aborted: false}; | ||
return zone.scheduleMacroTask( | ||
'XMLHttpRequest.send', placeholderCallback, options, scheduleTask, clearTask); | ||
Zone.__load_patch('PromiseRejectionEvent', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
// handle unhandled promise rejection | ||
function findPromiseRejectionHandler(evtName: string) { | ||
return function(e: any) { | ||
const eventTasks = findEventTask(global, evtName); | ||
eventTasks.forEach(eventTask => { | ||
// windows has added unhandledrejection event listener | ||
// trigger the event listener | ||
const PromiseRejectionEvent = global['PromiseRejectionEvent']; | ||
if (PromiseRejectionEvent) { | ||
const evt = new PromiseRejectionEvent(evtName, {promise: e.promise, reason: e.rejection}); | ||
eventTask.invoke(evt); | ||
} | ||
}); | ||
}; | ||
} | ||
const abortNative = patchMethod( | ||
window.XMLHttpRequest.prototype, 'abort', | ||
(delegate: Function) => function(self: any, args: any[]) { | ||
const task: Task = findPendingTask(self); | ||
if (task && typeof task.type == 'string') { | ||
// If the XHR has already completed, do nothing. | ||
// If the XHR has already been aborted, do nothing. | ||
// Fix #569, call abort multiple times before done will cause | ||
// macroTask task count be negative number | ||
if (task.cancelFn == null || (task.data && (<XHROptions>task.data).aborted)) { | ||
return; | ||
} | ||
task.zone.cancelTask(task); | ||
} | ||
// Otherwise, we are trying to abort an XHR which has not yet been sent, so there is no task | ||
// to cancel. Do nothing. | ||
}); | ||
} | ||
if (global['PromiseRejectionEvent']) { | ||
(Zone as any)[zoneSymbol('unhandledPromiseRejectionHandler')] = | ||
findPromiseRejectionHandler('unhandledrejection'); | ||
/// GEO_LOCATION | ||
if (_global['navigator'] && _global['navigator'].geolocation) { | ||
patchPrototype(_global['navigator'].geolocation, ['getCurrentPosition', 'watchPosition']); | ||
} | ||
// patch Func.prototype.toString to let them look like native | ||
patchFuncToString(); | ||
// patch Object.prototype.toString to let them look like native | ||
patchObjectToString(); | ||
// handle unhandled promise rejection | ||
function findPromiseRejectionHandler(evtName: string) { | ||
return function(e: any) { | ||
const eventTasks = findEventTask(_global, evtName); | ||
eventTasks.forEach(eventTask => { | ||
// windows has added unhandledrejection event listener | ||
// trigger the event listener | ||
const PromiseRejectionEvent = _global['PromiseRejectionEvent']; | ||
if (PromiseRejectionEvent) { | ||
const evt = new PromiseRejectionEvent(evtName, {promise: e.promise, reason: e.rejection}); | ||
eventTask.invoke(evt); | ||
} | ||
}); | ||
}; | ||
} | ||
if (_global['PromiseRejectionEvent']) { | ||
(Zone as any)[zoneSymbol('unhandledPromiseRejectionHandler')] = | ||
findPromiseRejectionHandler('unhandledrejection'); | ||
(Zone as any)[zoneSymbol('rejectionHandledHandler')] = | ||
findPromiseRejectionHandler('rejectionhandled'); | ||
} | ||
(Zone as any)[zoneSymbol('rejectionHandledHandler')] = | ||
findPromiseRejectionHandler('rejectionhandled'); | ||
} | ||
}); |
@@ -11,2 +11,3 @@ /** | ||
import '../zone'; | ||
import './browser'; | ||
import '../common/promise'; | ||
import './browser'; |
@@ -8,38 +8,33 @@ /** | ||
*/ | ||
((_global: any) => { | ||
// patch MediaQuery | ||
patchMediaQuery(_global); | ||
function patchMediaQuery(_global: any) { | ||
if (!_global['MediaQueryList']) { | ||
return; | ||
} | ||
const patchEventTargetMethods = | ||
(Zone as any)[(Zone as any).__symbol__('patchEventTargetMethods')]; | ||
patchEventTargetMethods( | ||
_global['MediaQueryList'].prototype, 'addListener', 'removeListener', | ||
(self: any, args: any[]) => { | ||
return { | ||
useCapturing: false, | ||
eventName: 'mediaQuery', | ||
handler: args[0], | ||
target: self || _global, | ||
name: 'mediaQuery', | ||
invokeAddFunc: function(addFnSymbol: any, delegate: any) { | ||
if (delegate && (<Task>delegate).invoke) { | ||
return this.target[addFnSymbol]((<Task>delegate).invoke); | ||
} else { | ||
return this.target[addFnSymbol](delegate); | ||
} | ||
}, | ||
invokeRemoveFunc: function(removeFnSymbol: any, delegate: any) { | ||
if (delegate && (<Task>delegate).invoke) { | ||
return this.target[removeFnSymbol]((<Task>delegate).invoke); | ||
} else { | ||
return this.target[removeFnSymbol](delegate); | ||
} | ||
Zone.__load_patch('mediaQuery', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
if (!global['MediaQueryList']) { | ||
return; | ||
} | ||
const patchEventTargetMethods = | ||
(Zone as any)[(Zone as any).__symbol__('patchEventTargetMethods')]; | ||
patchEventTargetMethods( | ||
_global['MediaQueryList'].prototype, 'addListener', 'removeListener', | ||
(self: any, args: any[]) => { | ||
return { | ||
useCapturing: false, | ||
eventName: 'mediaQuery', | ||
handler: args[0], | ||
target: self || global, | ||
name: 'mediaQuery', | ||
invokeAddFunc: function(addFnSymbol: any, delegate: any) { | ||
if (delegate && (<Task>delegate).invoke) { | ||
return this.target[addFnSymbol]((<Task>delegate).invoke); | ||
} else { | ||
return this.target[addFnSymbol](delegate); | ||
} | ||
}; | ||
}); | ||
} | ||
})(typeof window === 'object' && window || typeof self === 'object' && self || global); | ||
}, | ||
invokeRemoveFunc: function(removeFnSymbol: any, delegate: any) { | ||
if (delegate && (<Task>delegate).invoke) { | ||
return this.target[removeFnSymbol]((<Task>delegate).invoke); | ||
} else { | ||
return this.target[removeFnSymbol](delegate); | ||
} | ||
} | ||
}; | ||
}); | ||
}); |
@@ -8,18 +8,13 @@ /** | ||
*/ | ||
((_global: any) => { | ||
// patch Notification | ||
patchNotification(_global); | ||
function patchNotification(_global: any) { | ||
const Notification = _global['Notification']; | ||
if (!Notification || !Notification.prototype) { | ||
return; | ||
} | ||
const desc = Object.getOwnPropertyDescriptor(Notification.prototype, 'onerror'); | ||
if (!desc || !desc.configurable) { | ||
return; | ||
} | ||
const patchOnProperties = (Zone as any)[(Zone as any).__symbol__('patchOnProperties')]; | ||
patchOnProperties(Notification.prototype, null); | ||
Zone.__load_patch('notification', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
const Notification = _global['Notification']; | ||
if (!Notification || !Notification.prototype) { | ||
return; | ||
} | ||
})(typeof window === 'object' && window || typeof self === 'object' && self || global); | ||
const desc = Object.getOwnPropertyDescriptor(Notification.prototype, 'onerror'); | ||
if (!desc || !desc.configurable) { | ||
return; | ||
} | ||
const patchOnProperties = (Zone as any)[(Zone as any).__symbol__('patchOnProperties')]; | ||
patchOnProperties(Notification.prototype, null); | ||
}); |
@@ -42,4 +42,4 @@ /** | ||
for (const prop in WS) { | ||
_global.WebSocket[prop] = WS[prop]; | ||
_global['WebSocket'][prop] = WS[prop]; | ||
} | ||
} |
@@ -30,3 +30,6 @@ /** | ||
} finally { | ||
delete tasksByHandleId[data.handleId]; | ||
if (typeof data.handleId === 'number') { | ||
// Node returns complex objects as handleIds | ||
delete tasksByHandleId[data.handleId]; | ||
} | ||
} | ||
@@ -36,3 +39,8 @@ } | ||
data.handleId = setNative.apply(window, data.args); | ||
tasksByHandleId[data.handleId] = task; | ||
if (typeof data.handleId === 'number') { | ||
// Node returns complex objects as handleIds -> no need to keep them around. Additionally, | ||
// this throws an | ||
// exception in older node versions and has no effect there, because of the stringified key. | ||
tasksByHandleId[data.handleId] = task; | ||
} | ||
return task; | ||
@@ -42,3 +50,6 @@ } | ||
function clearTask(task: Task) { | ||
delete tasksByHandleId[(<TimerOptions>task.data).handleId]; | ||
if (typeof(<TimerOptions>task.data).handleId === 'number') { | ||
// Node returns complex objects as handleIds | ||
delete tasksByHandleId[(<TimerOptions>task.data).handleId]; | ||
} | ||
return clearNative((<TimerOptions>task.data).handleId); | ||
@@ -45,0 +56,0 @@ } |
@@ -12,6 +12,5 @@ /** | ||
// look like native function | ||
export function patchFuncToString() { | ||
Zone.__load_patch('toString', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
// patch Func.prototype.toString to let them look like native | ||
const originalFunctionToString = Function.prototype.toString; | ||
const g: any = | ||
typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global; | ||
Function.prototype.toString = function() { | ||
@@ -23,3 +22,3 @@ if (typeof this === 'function') { | ||
if (this === Promise) { | ||
const nativePromise = g[zoneSymbol('Promise')]; | ||
const nativePromise = global[zoneSymbol('Promise')]; | ||
if (nativePromise) { | ||
@@ -30,3 +29,3 @@ return originalFunctionToString.apply(nativePromise, arguments); | ||
if (this === Error) { | ||
const nativeError = g[zoneSymbol('Error')]; | ||
const nativeError = global[zoneSymbol('Error')]; | ||
if (nativeError) { | ||
@@ -39,5 +38,5 @@ return originalFunctionToString.apply(nativeError, arguments); | ||
}; | ||
} | ||
export function patchObjectToString() { | ||
// patch Object.prototype.toString to let them look like native | ||
const originalObjectToString = Object.prototype.toString; | ||
@@ -50,2 +49,2 @@ Object.prototype.toString = function() { | ||
}; | ||
} | ||
}); |
@@ -136,3 +136,3 @@ /** | ||
// so we should use original native get to retrieve the handler | ||
let value = originalDescGet.apply(this); | ||
let value = originalDescGet && originalDescGet.apply(this); | ||
if (value) { | ||
@@ -557,13 +557,2 @@ desc.set.apply(this, [value]); | ||
export function createNamedFn(name: string, delegate: (self: any, args: any[]) => any): Function { | ||
try { | ||
return (Function('f', `return function ${name}(){return f(this, arguments)}`))(delegate); | ||
} catch (error) { | ||
// if we fail, we must be CSP, just return delegate. | ||
return function() { | ||
return delegate(this, <any>arguments); | ||
}; | ||
} | ||
} | ||
export function patchMethod( | ||
@@ -574,3 +563,3 @@ target: any, name: string, | ||
let proto = target; | ||
while (proto && Object.getOwnPropertyNames(proto).indexOf(name) === -1) { | ||
while (proto && !proto.hasOwnProperty(name)) { | ||
proto = Object.getPrototypeOf(proto); | ||
@@ -586,3 +575,6 @@ } | ||
delegate = proto[delegateName] = proto[name]; | ||
proto[name] = createNamedFn(name, patchFn(delegate, delegateName, name)); | ||
const patchDelegate = patchFn(delegate, delegateName, name); | ||
proto[name] = function() { | ||
return patchDelegate(this, arguments as any); | ||
}; | ||
attachOriginToPatched(proto[name], delegate); | ||
@@ -589,0 +581,0 @@ } |
@@ -8,4 +8,3 @@ /** | ||
*/ | ||
(() => { | ||
const __symbol__ = (Zone as any).__symbol__; | ||
Zone.__load_patch('bluebird', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
// TODO: @JiaLiPassion, we can automatically patch bluebird | ||
@@ -16,3 +15,3 @@ // if global.Promise = Bluebird, but sometimes in nodejs, | ||
// safe to just expose a method to patch Bluebird explicitly | ||
(Zone as any)[__symbol__('bluebird')] = function patchBluebird(Bluebird: any) { | ||
(Zone as any)[Zone.__symbol__('bluebird')] = function patchBluebird(Bluebird: any) { | ||
Bluebird.setScheduler((fn: Function) => { | ||
@@ -22,2 +21,2 @@ Zone.current.scheduleMicroTask('bluebird', fn); | ||
}; | ||
})(); | ||
}); |
@@ -10,2 +10,4 @@ /** | ||
import '../zone'; | ||
import '../common/promise'; | ||
import '../common/to-string'; | ||
import './events'; | ||
@@ -15,56 +17,53 @@ import './fs'; | ||
import {patchTimer} from '../common/timers'; | ||
import {patchFuncToString, patchObjectToString} from '../common/to-string'; | ||
import {findEventTask, patchMacroTask, patchMicroTask, zoneSymbol} from '../common/utils'; | ||
import {findEventTask, patchMacroTask, patchMicroTask} from '../common/utils'; | ||
const set = 'set'; | ||
const clear = 'clear'; | ||
const _global = typeof window === 'object' && window || typeof self === 'object' && self || global; | ||
// Timers | ||
const timers = require('timers'); | ||
patchTimer(timers, set, clear, 'Timeout'); | ||
patchTimer(timers, set, clear, 'Interval'); | ||
patchTimer(timers, set, clear, 'Immediate'); | ||
Zone.__load_patch('timers', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
// Timers | ||
let globalUseTimeoutFromTimer = false; | ||
try { | ||
const timers = require('timers'); | ||
let globalEqualTimersTimeout = global.setTimeout === timers.setTimeout; | ||
if (!globalEqualTimersTimeout) { | ||
// if global.setTimeout not equal timers.setTimeout, check | ||
// whether global.setTimeout use timers.setTimeout or not | ||
const originSetTimeout = timers.setTimeout; | ||
timers.setTimeout = function() { | ||
globalUseTimeoutFromTimer = true; | ||
return originSetTimeout.apply(this, arguments); | ||
}; | ||
const detectTimeout = global.setTimeout(noop, 100); | ||
clearTimeout(detectTimeout); | ||
timers.setTimeout = originSetTimeout; | ||
} | ||
patchTimer(timers, set, clear, 'Timeout'); | ||
patchTimer(timers, set, clear, 'Interval'); | ||
patchTimer(timers, set, clear, 'Immediate'); | ||
} catch (error) { | ||
// timers module not exists, for example, when we using nativescript | ||
// timers is not available | ||
} | ||
if (!globalUseTimeoutFromTimer) { | ||
// 1. global setTimeout equals timers setTimeout | ||
// 2. or global don't use timers setTimeout(maybe some other library patch setTimeout) | ||
// 3. or load timers module error happens, we should patch global setTimeout | ||
patchTimer(global, set, clear, 'Timeout'); | ||
patchTimer(global, set, clear, 'Interval'); | ||
patchTimer(global, set, clear, 'Immediate'); | ||
} else { | ||
// global use timers setTimeout, but not equals | ||
// this happenes when use nodejs v0.10.x, global setTimeout will | ||
// use a lazy load version of timers setTimeout | ||
// we should not double patch timer's setTimeout | ||
// so we only store the __symbol__ for consistency | ||
global[Zone.__symbol__('setTimeout')] = global.setTimeout; | ||
global[Zone.__symbol__('setInterval')] = global.setInterval; | ||
global[Zone.__symbol__('setImmediate')] = global.setImmediate; | ||
} | ||
}); | ||
const shouldPatchGlobalTimers = global.setTimeout !== timers.setTimeout; | ||
if (shouldPatchGlobalTimers) { | ||
patchTimer(_global, set, clear, 'Timeout'); | ||
patchTimer(_global, set, clear, 'Interval'); | ||
patchTimer(_global, set, clear, 'Immediate'); | ||
} | ||
// patch process related methods | ||
patchProcess(); | ||
handleUnhandledPromiseRejection(); | ||
// patch Function.prototyp.toString | ||
patchFuncToString(); | ||
// patch Object.prototyp.toString | ||
patchObjectToString(); | ||
// Crypto | ||
let crypto: any; | ||
try { | ||
crypto = require('crypto'); | ||
} catch (err) { | ||
} | ||
// use the generic patchMacroTask to patch crypto | ||
if (crypto) { | ||
const methodNames = ['randomBytes', 'pbkdf2']; | ||
methodNames.forEach(name => { | ||
patchMacroTask(crypto, name, (self: any, args: any[]) => { | ||
return { | ||
name: 'crypto.' + name, | ||
args: args, | ||
callbackIndex: | ||
(args.length > 0 && typeof args[args.length - 1] === 'function') ? args.length - 1 : -1, | ||
target: crypto | ||
}; | ||
}); | ||
}); | ||
} | ||
function patchProcess() { | ||
Zone.__load_patch('nextTick', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
// patch nextTick as microTask | ||
@@ -79,26 +78,55 @@ patchMicroTask(process, 'nextTick', (self: any, args: any[]) => { | ||
}); | ||
} | ||
}); | ||
// handle unhandled promise rejection | ||
function findProcessPromiseRejectionHandler(evtName: string) { | ||
return function(e: any) { | ||
const eventTasks = findEventTask(process, evtName); | ||
eventTasks.forEach(eventTask => { | ||
// process has added unhandledrejection event listener | ||
// trigger the event listener | ||
if (evtName === 'unhandledRejection') { | ||
eventTask.invoke(e.rejection, e.promise); | ||
} else if (evtName === 'rejectionHandled') { | ||
eventTask.invoke(e.promise); | ||
Zone.__load_patch( | ||
'handleUnhandledPromiseRejection', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
(Zone as any)[api.symbol('unhandledPromiseRejectionHandler')] = | ||
findProcessPromiseRejectionHandler('unhandledRejection'); | ||
(Zone as any)[api.symbol('rejectionHandledHandler')] = | ||
findProcessPromiseRejectionHandler('rejectionHandled'); | ||
// handle unhandled promise rejection | ||
function findProcessPromiseRejectionHandler(evtName: string) { | ||
return function(e: any) { | ||
const eventTasks = findEventTask(process, evtName); | ||
eventTasks.forEach(eventTask => { | ||
// process has added unhandledrejection event listener | ||
// trigger the event listener | ||
if (evtName === 'unhandledRejection') { | ||
eventTask.invoke(e.rejection, e.promise); | ||
} else if (evtName === 'rejectionHandled') { | ||
eventTask.invoke(e.promise); | ||
} | ||
}); | ||
}; | ||
} | ||
}); | ||
}; | ||
} | ||
function handleUnhandledPromiseRejection() { | ||
(Zone as any)[zoneSymbol('unhandledPromiseRejectionHandler')] = | ||
findProcessPromiseRejectionHandler('unhandledRejection'); | ||
(Zone as any)[zoneSymbol('rejectionHandledHandler')] = | ||
findProcessPromiseRejectionHandler('rejectionHandled'); | ||
} | ||
// Crypto | ||
Zone.__load_patch('crypto', (global: any, Zone: ZoneType, api: _ZonePrivate) => { | ||
let crypto: any; | ||
try { | ||
crypto = require('crypto'); | ||
} catch (err) { | ||
} | ||
// use the generic patchMacroTask to patch crypto | ||
if (crypto) { | ||
const methodNames = ['randomBytes', 'pbkdf2']; | ||
methodNames.forEach(name => { | ||
patchMacroTask(crypto, name, (self: any, args: any[]) => { | ||
return { | ||
name: 'crypto.' + name, | ||
args: args, | ||
callbackIndex: (args.length > 0 && typeof args[args.length - 1] === 'function') ? | ||
args.length - 1 : | ||
-1, | ||
target: crypto | ||
}; | ||
}); | ||
}); | ||
} | ||
}); |
@@ -16,4 +16,11 @@ /** | ||
delay: number; | ||
isPeriodic: boolean; | ||
} | ||
interface MicroTaskScheduledFunction { | ||
func: Function; | ||
args: any[]; | ||
target: any; | ||
} | ||
class Scheduler { | ||
@@ -30,3 +37,5 @@ // Next scheduler id. | ||
scheduleFunction(cb: Function, delay: number, args: any[] = [], id: number = -1): number { | ||
scheduleFunction( | ||
cb: Function, delay: number, args: any[] = [], isPeriodic: boolean = false, | ||
id: number = -1): number { | ||
let currentId: number = id < 0 ? this.nextId++ : id; | ||
@@ -36,4 +45,10 @@ let endTime = this._currentTime + delay; | ||
// Insert so that scheduler queue remains sorted by end time. | ||
let newEntry: | ||
ScheduledFunction = {endTime: endTime, id: currentId, func: cb, args: args, delay: delay}; | ||
let newEntry: ScheduledFunction = { | ||
endTime: endTime, | ||
id: currentId, | ||
func: cb, | ||
args: args, | ||
delay: delay, | ||
isPeriodic: isPeriodic | ||
}; | ||
let i = 0; | ||
@@ -79,2 +94,27 @@ for (; i < this._schedulerQueue.length; i++) { | ||
} | ||
flush(limit: number = 20): number { | ||
const startTime = this._currentTime; | ||
let count = 0; | ||
while (this._schedulerQueue.length > 0) { | ||
count++; | ||
if (count > limit) { | ||
throw new Error( | ||
'flush failed after reaching the limit of ' + limit + | ||
' tasks. Does your code use a polling timeout?'); | ||
} | ||
// If the only remaining tasks are periodic, finish flushing. | ||
if (!(this._schedulerQueue.filter(task => !task.isPeriodic).length)) { | ||
break; | ||
} | ||
let current = this._schedulerQueue.shift(); | ||
this._currentTime = current.endTime; | ||
let retval = current.func.apply(global, current.args); | ||
if (!retval) { | ||
// Uncaught exception in the current scheduled function. Stop processing the queue. | ||
break; | ||
} | ||
} | ||
return this._currentTime - startTime; | ||
} | ||
} | ||
@@ -90,3 +130,3 @@ | ||
private _scheduler: Scheduler = new Scheduler(); | ||
private _microtasks: Function[] = []; | ||
private _microtasks: MicroTaskScheduledFunction[] = []; | ||
private _lastError: Error = null; | ||
@@ -142,3 +182,3 @@ private _uncaughtPromiseErrors: {rejection: any}[] = | ||
if (this.pendingPeriodicTimers.indexOf(id) !== -1) { | ||
this._scheduler.scheduleFunction(fn, interval, args, id); | ||
this._scheduler.scheduleFunction(fn, interval, args, true, id); | ||
} | ||
@@ -177,3 +217,3 @@ }; | ||
// Queue the callback and dequeue the periodic timer only on error. | ||
this._scheduler.scheduleFunction(cb, interval, args); | ||
this._scheduler.scheduleFunction(cb, interval, args, true); | ||
this.pendingPeriodicTimers.push(id); | ||
@@ -214,3 +254,3 @@ return id; | ||
let microtask = this._microtasks.shift(); | ||
microtask(); | ||
microtask.func.apply(microtask.target, microtask.args); | ||
} | ||
@@ -220,2 +260,12 @@ flushErrors(); | ||
flush(): number { | ||
FakeAsyncTestZoneSpec.assertInZone(); | ||
this.flushMicrotasks(); | ||
let elapsed = this._scheduler.flush(); | ||
if (this._lastError !== null) { | ||
this._resetLastErrorAndThrow(); | ||
} | ||
return elapsed; | ||
} | ||
// ZoneSpec implementation below. | ||
@@ -230,3 +280,18 @@ | ||
case 'microTask': | ||
this._microtasks.push(task.invoke); | ||
let args = task.data && (task.data as any).args; | ||
// should pass additional arguments to callback if have any | ||
// currently we know process.nextTick will have such additional | ||
// arguments | ||
let addtionalArgs: any[]; | ||
if (args) { | ||
let callbackIndex = (task.data as any).callbackIndex; | ||
if (typeof args.length === 'number' && args.length > callbackIndex + 1) { | ||
addtionalArgs = Array.prototype.slice.call(args, callbackIndex + 1); | ||
} | ||
} | ||
this._microtasks.push({ | ||
func: task.invoke, | ||
args: addtionalArgs, | ||
target: task.data && (task.data as any).target | ||
}); | ||
break; | ||
@@ -233,0 +298,0 @@ case 'macroTask': |
{ | ||
"name": "zone.js", | ||
"version": "0.8.9", | ||
"version": "0.8.10", | ||
"description": "Zones for JavaScript", | ||
@@ -5,0 +5,0 @@ "main": "dist/zone-node.js", |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
650093
64
0
13148