diff --git a/CHANGELOG.md b/CHANGELOG.md
index 00eac3742..06eef6011 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,41 @@
+
+# [0.9.0](https://github.com/angular/zone.js/compare/v0.8.29...0.9.0) (2019-03-12)
+
+
+### Bug Fixes
+
+* **lint:** fix [#1168](https://github.com/angular/zone.js/issues/1168), remove unused = null code ([#1171](https://github.com/angular/zone.js/issues/1171)) ([917e2af](https://github.com/angular/zone.js/commit/917e2af))
+* **test:** fix [#1155](https://github.com/angular/zone.js/issues/1155), try/catch modify error.message ([#1157](https://github.com/angular/zone.js/issues/1157)) ([7e983d1](https://github.com/angular/zone.js/commit/7e983d1))
+* **test:** fix: make fakeAsync test spec timer id global ([d32e79b](https://github.com/angular/zone.js/commit/d32e79b))
+* **build:** fix: closure related fixes ([2a8415d](https://github.com/angular/zone.js/commit/2a8415d))
+* **compile:** fix: remove finally definition from Promise interface ([47dd3f4](https://github.com/angular/zone.js/commit/47dd3f4))
+
+### Doc
+
+* **doc:** [#1181](https://github.com/angular/zone.js/pull/1181), Fix the typo in timer module documentation ([8f78b55](https://github.com/angular/zone.js/commit/8f78b55))
+* **doc:** [#1163](https://github.com/angular/zone.js/pull/1163), Update YouTube video link ([f171821](https://github.com/angular/zone.js/commit/f171821))
+* **doc:** [#1151](https://github.com/angular/zone.js/pull/1151), Re-phrase the lines for better understanding ([2a6444b](https://github.com/angular/zone.js/commit/2a6444b))
+* **doc:** [#1152](https://github.com/angular/zone.js/pull/1152), change the word TimerTask to MacroTask ([f3995de](https://github.com/angular/zone.js/commit/f3995de))
+
+
+### Features
+
+* **test:** add benchmark page ([#1076](https://github.com/angular/zone.js/issues/1076)) ([128649a](https://github.com/angular/zone.js/commit/128649a))
+* **test:** test(promise): add test cases for Promise.all with sync then operation ([#1158](https://github.com/angular/zone.js/issues/1158)) ([0b44e83](https://github.com/angular/zone.js/commit/0b44e83))
+* **test:** feat: add an option __zone_symbol__disableDatePatching to allow disabling Date patching ([c378f87](https://github.com/angular/zone.js/commit/c378f87))
+
+### Env
+
+* **env:** change BLACK_LISTED_EVENTS to DISABLE_EVENTS ([9c65d25](https://github.com/angular/zone.js/commit/9c65d25))
+
+### Build
+
+* **build:** build zone-evergreen.js in es2015, add terser minify support ([2ad936b](https://github.com/angular/zone.js/commit/2ad936b))
+* **build:** upgrade to pass jasmine 3.3 test ([82dfd75](https://github.com/angular/zone.js/commit/82dfd75))
+* **build:** upgrade to typescript 3.2.2 ([fcdd559](https://github.com/angular/zone.js/commit/fcdd559))
+* **build:** separate zone.js into evergreen only and legacy included bundles ([ac3851e](https://github.com/angular/zone.js/commit/ac3851e))
+* **build:** make legacy standalone bundle ([a5fe09b](https://github.com/angular/zone.js/commit/a5fe09b))
+
## [0.8.29](https://github.com/angular/zone.js/compare/v0.8.28...0.8.29) (2019-01-22)
diff --git a/dist/fake-async-test.js b/dist/fake-async-test.js
index 348de8d0f..63ac9898d 100644
--- a/dist/fake-async-test.js
+++ b/dist/fake-async-test.js
@@ -72,8 +72,6 @@ var __spread = (undefined && undefined.__spread) || function () {
};
var Scheduler = /** @class */ (function () {
function Scheduler() {
- // Next scheduler id.
- this.nextId = 1;
// Scheduler queue with the tuple of end time and callback function - sorted by end time.
this._schedulerQueue = [];
// Current simulated time in millis.
@@ -95,7 +93,7 @@ var __spread = (undefined && undefined.__spread) || function () {
if (isPeriodic === void 0) { isPeriodic = false; }
if (isRequestAnimationFrame === void 0) { isRequestAnimationFrame = false; }
if (id === void 0) { id = -1; }
- var currentId = id < 0 ? this.nextId++ : id;
+ var currentId = id < 0 ? Scheduler.nextId++ : id;
var endTime = this._currentTime + delay;
// Insert so that scheduler queue remains sorted by end time.
var newEntry = {
@@ -212,6 +210,8 @@ var __spread = (undefined && undefined.__spread) || function () {
}
return this._currentTime - startTime;
};
+ // Next scheduler id.
+ Scheduler.nextId = 1;
return Scheduler;
}());
var FakeAsyncTestZoneSpec = /** @class */ (function () {
@@ -292,7 +292,7 @@ var __spread = (undefined && undefined.__spread) || function () {
};
FakeAsyncTestZoneSpec.prototype._setTimeout = function (fn, delay, args, isTimer) {
if (isTimer === void 0) { isTimer = true; }
- var removeTimerFn = this._dequeueTimer(this._scheduler.nextId);
+ var removeTimerFn = this._dequeueTimer(Scheduler.nextId);
// Queue the callback and dequeue the timer on success and error.
var cb = this._fnAndFlush(fn, { onSuccess: removeTimerFn, onError: removeTimerFn });
var id = this._scheduler.scheduleFunction(cb, delay, args, false, !isTimer);
@@ -306,7 +306,7 @@ var __spread = (undefined && undefined.__spread) || function () {
this._scheduler.removeScheduledFunctionWithId(id);
};
FakeAsyncTestZoneSpec.prototype._setInterval = function (fn, interval, args) {
- var id = this._scheduler.nextId;
+ var id = Scheduler.nextId;
var completers = { onSuccess: null, onError: this._dequeuePeriodicTimer(id) };
var cb = this._fnAndFlush(fn, completers);
// Use the callback created above to requeue on success.
@@ -336,6 +336,14 @@ var __spread = (undefined && undefined.__spread) || function () {
this._scheduler.setCurrentRealTime(realTime);
};
FakeAsyncTestZoneSpec.patchDate = function () {
+ if (!!global[Zone.__symbol__('disableDatePatching')]) {
+ // we don't want to patch global Date
+ // because in some case, global Date
+ // is already being patched, we need to provide
+ // an option to let user still use their
+ // own version of Date.
+ return;
+ }
if (global['Date'] === FakeDate) {
// already patched
return;
diff --git a/dist/jasmine-patch.js b/dist/jasmine-patch.js
index 8276ea2fd..4191c6005 100644
--- a/dist/jasmine-patch.js
+++ b/dist/jasmine-patch.js
@@ -52,6 +52,30 @@
var symbol = Zone.__symbol__;
// whether patch jasmine clock when in fakeAsync
var enableClockPatch = _global[symbol('fakeAsyncPatchLock')] === true;
+ var ignoreUnhandledRejection = _global[symbol('ignoreUnhandledRejection')] === true;
+ if (!ignoreUnhandledRejection) {
+ var globalErrors_1 = jasmine.GlobalErrors;
+ if (globalErrors_1 && !jasmine[symbol('GlobalErrors')]) {
+ jasmine[symbol('GlobalErrors')] = globalErrors_1;
+ jasmine.GlobalErrors = function () {
+ var instance = new globalErrors_1();
+ var originalInstall = instance.install;
+ if (originalInstall && !instance[symbol('install')]) {
+ instance[symbol('install')] = originalInstall;
+ instance.install = function () {
+ var originalHandlers = process.listeners('unhandledRejection');
+ var r = originalInstall.apply(this, arguments);
+ process.removeAllListeners('unhandledRejection');
+ if (originalHandlers) {
+ originalHandlers.forEach(function (h) { return process.on('unhandledRejection', h); });
+ }
+ return r;
+ };
+ }
+ return instance;
+ };
+ }
+ }
// Monkey patch all of the jasmine DSL so that each function runs in appropriate zone.
var jasmineEnv = jasmine.getEnv();
['describe', 'xdescribe', 'fdescribe'].forEach(function (methodName) {
@@ -205,7 +229,12 @@
var proxyZoneSpec = this && this.testProxyZoneSpec;
if (proxyZoneSpec) {
var pendingTasksInfo = proxyZoneSpec.getAndClearPendingTasksInfo();
- error.message += pendingTasksInfo;
+ try {
+ // try catch here in case error.message is not writable
+ error.message += pendingTasksInfo;
+ }
+ catch (err) {
+ }
}
}
if (onException) {
diff --git a/dist/jasmine-patch.min.js b/dist/jasmine-patch.min.js
index 8d984ddfb..505ff0c26 100644
--- a/dist/jasmine-patch.min.js
+++ b/dist/jasmine-patch.min.js
@@ -1 +1 @@
-!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n():"function"==typeof define&&define.amd?define(n):n()}(this,function(){"use strict";!function(){function e(e){return function(){return a.run(e,this,arguments)}}function n(e,n,t,o){var r=!!jasmine[u("clockInstalled")],i=(t.testProxyZoneSpec,t.testProxyZone);if(r&&f){var c=Zone[Zone.__symbol__("fakeAsyncTest")];c&&"function"==typeof c.fakeAsync&&(e=c.fakeAsync(e))}return o?i.run(e,n,[o]):i.run(e,n)}function t(e){return e&&(e.length?function(t){return n(e,this,this.queueRunner,t)}:function(){return n(e,this,this.queueRunner)})}var o=function(e,n){function t(){this.constructor=e}for(var o in n)n.hasOwnProperty(o)&&(e[o]=n[o]);e.prototype=null===n?Object.create(n):(t.prototype=n.prototype,new t)},r="undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global;if(!Zone)throw new Error("Missing: zone.js");if("undefined"==typeof jasmine)throw new Error("Missing: jasmine.js");if(jasmine.__zone_patch__)throw new Error("'jasmine' has already been patched with 'Zone'.");jasmine.__zone_patch__=!0;var i=Zone.SyncTestZoneSpec,c=Zone.ProxyZoneSpec;if(!i)throw new Error("Missing: SyncTestZoneSpec");if(!c)throw new Error("Missing: ProxyZoneSpec");var s=Zone.current,a=s.fork(new i("jasmine.describe")),u=Zone.__symbol__,f=r[u("fakeAsyncPatchLock")]===!0,l=jasmine.getEnv();["describe","xdescribe","fdescribe"].forEach(function(n){var t=l[n];l[n]=function(n,o){return t.call(this,n,e(o))}}),["it","xit","fit"].forEach(function(e){var n=l[e];l[u(e)]=n,l[e]=function(e,o,r){return arguments[1]=t(o),n.apply(this,arguments)}}),["beforeEach","afterEach","beforeAll","afterAll"].forEach(function(e){var n=l[e];l[u(e)]=n,l[e]=function(e,o){return arguments[0]=t(e),n.apply(this,arguments)}});var p=jasmine[u("clock")]=jasmine.clock;jasmine.clock=function(){var e=p.apply(this,arguments);if(!e[u("patched")]){e[u("patched")]=u("patched");var n=e[u("tick")]=e.tick;e.tick=function(){var e=Zone.current.get("FakeAsyncTestZoneSpec");return e?e.tick.apply(e,arguments):n.apply(this,arguments)};var t=e[u("mockDate")]=e.mockDate;e.mockDate=function(){var e=Zone.current.get("FakeAsyncTestZoneSpec");if(e){var n=arguments.length>0?arguments[0]:new Date;return e.setCurrentRealTime.apply(e,n&&"function"==typeof n.getTime?[n.getTime()]:arguments)}return t.apply(this,arguments)},f&&["install","uninstall"].forEach(function(n){var t=e[u(n)]=e[n];e[n]=function(){var e=Zone.FakeAsyncTestZoneSpec;return e?void(jasmine[u("clockInstalled")]="install"===n):t.apply(this,arguments)}})}return e};var h=jasmine.QueueRunner;jasmine.QueueRunner=function(e){function n(n){var t=this;n.onComplete=function(e){return function(){t.testProxyZone=null,t.testProxyZoneSpec=null,s.scheduleMicroTask("jasmine.onComplete",e)}}(n.onComplete);var o=r.__zone_symbol__setTimeout,i=r.__zone_symbol__clearTimeout;o&&(n.timeout={setTimeout:o?o:r.setTimeout,clearTimeout:i?i:r.clearTimeout}),jasmine.UserContext?(n.userContext||(n.userContext=new jasmine.UserContext),n.userContext.queueRunner=this):(n.userContext||(n.userContext={}),n.userContext.queueRunner=this);var c=n.onException;n.onException=function(e){if(e&&"Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL."===e.message){var n=this&&this.testProxyZoneSpec;if(n){var t=n.getAndClearPendingTasksInfo();e.message+=t}}c&&c.call(this,e)},e.call(this,n)}return o(n,e),n.prototype.execute=function(){for(var n=this,t=Zone.current,o=!1;t;){if(t===s){o=!0;break}t=t.parent}if(!o)throw new Error("Unexpected Zone: "+Zone.current.name);this.testProxyZoneSpec=new c,this.testProxyZone=s.fork(this.testProxyZoneSpec),Zone.currentTask?e.prototype.execute.call(this):Zone.current.scheduleMicroTask("jasmine.execute().forceTask",function(){return h.prototype.execute.call(n)})},n}(h)}()});
\ No newline at end of file
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n():"function"==typeof define&&define.amd?define(n):n()}(0,function(){"use strict";!function(){var e="undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global;if(!Zone)throw new Error("Missing: zone.js");if("undefined"==typeof jasmine)throw new Error("Missing: jasmine.js");if(jasmine.__zone_patch__)throw new Error("'jasmine' has already been patched with 'Zone'.");jasmine.__zone_patch__=!0;var n=Zone.SyncTestZoneSpec,t=Zone.ProxyZoneSpec;if(!n)throw new Error("Missing: SyncTestZoneSpec");if(!t)throw new Error("Missing: ProxyZoneSpec");var o=Zone.current,r=o.fork(new n("jasmine.describe")),i=Zone.__symbol__,s=!0===e[i("fakeAsyncPatchLock")];if(!(!0===e[i("ignoreUnhandledRejection")])){var a=jasmine.GlobalErrors;a&&!jasmine[i("GlobalErrors")]&&(jasmine[i("GlobalErrors")]=a,jasmine.GlobalErrors=function(){var e=new a,n=e.install;return n&&!e[i("install")]&&(e[i("install")]=n,e.install=function(){var e=process.listeners("unhandledRejection"),t=n.apply(this,arguments);return process.removeAllListeners("unhandledRejection"),e&&e.forEach(function(e){return process.on("unhandledRejection",e)}),t}),e})}var c=jasmine.getEnv();["describe","xdescribe","fdescribe"].forEach(function(e){var n=c[e];c[e]=function(e,t){return n.call(this,e,(o=t,function(){return r.run(o,this,arguments)}));var o}}),["it","xit","fit"].forEach(function(e){var n=c[e];c[i(e)]=n,c[e]=function(e,t,o){return arguments[1]=f(t),n.apply(this,arguments)}}),["beforeEach","afterEach","beforeAll","afterAll"].forEach(function(e){var n=c[e];c[i(e)]=n,c[e]=function(e,t){return arguments[0]=f(e),n.apply(this,arguments)}});var u=jasmine[i("clock")]=jasmine.clock;function l(e,n,t,o){var r=!!jasmine[i("clockInstalled")],a=(t.testProxyZoneSpec,t.testProxyZone);if(r&&s){var c=Zone[Zone.__symbol__("fakeAsyncTest")];c&&"function"==typeof c.fakeAsync&&(e=c.fakeAsync(e))}return o?a.run(e,n,[o]):a.run(e,n)}function f(e){return e&&(e.length?function(n){return l(e,this,this.queueRunner,n)}:function(){return l(e,this,this.queueRunner)})}jasmine.clock=function(){var e=u.apply(this,arguments);if(!e[i("patched")]){e[i("patched")]=i("patched");var n=e[i("tick")]=e.tick;e.tick=function(){var e=Zone.current.get("FakeAsyncTestZoneSpec");return e?e.tick.apply(e,arguments):n.apply(this,arguments)};var t=e[i("mockDate")]=e.mockDate;e.mockDate=function(){var e=Zone.current.get("FakeAsyncTestZoneSpec");if(e){var n=arguments.length>0?arguments[0]:new Date;return e.setCurrentRealTime.apply(e,n&&"function"==typeof n.getTime?[n.getTime()]:arguments)}return t.apply(this,arguments)},s&&["install","uninstall"].forEach(function(n){var t=e[i(n)]=e[n];e[n]=function(){if(!Zone.FakeAsyncTestZoneSpec)return t.apply(this,arguments);jasmine[i("clockInstalled")]="install"===n}})}return e};var p=jasmine.QueueRunner;jasmine.QueueRunner=function(n){function r(t){var r,i=this;t.onComplete=(r=t.onComplete,function(){i.testProxyZone=null,i.testProxyZoneSpec=null,o.scheduleMicroTask("jasmine.onComplete",r)});var s=e.__zone_symbol__setTimeout,a=e.__zone_symbol__clearTimeout;s&&(t.timeout={setTimeout:s||e.setTimeout,clearTimeout:a||e.clearTimeout}),jasmine.UserContext?(t.userContext||(t.userContext=new jasmine.UserContext),t.userContext.queueRunner=this):(t.userContext||(t.userContext={}),t.userContext.queueRunner=this);var c=t.onException;t.onException=function(e){if(e&&"Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL."===e.message){var n=this&&this.testProxyZoneSpec;if(n){var t=n.getAndClearPendingTasksInfo();try{e.message+=t}catch(e){}}}c&&c.call(this,e)},n.call(this,t)}return function(e,n){for(var t in n)n.hasOwnProperty(t)&&(e[t]=n[t]);function o(){this.constructor=e}e.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new o)}(r,n),r.prototype.execute=function(){for(var e=this,r=Zone.current,i=!1;r;){if(r===o){i=!0;break}r=r.parent}if(!i)throw new Error("Unexpected Zone: "+Zone.current.name);this.testProxyZoneSpec=new t,this.testProxyZone=o.fork(this.testProxyZoneSpec),Zone.currentTask?n.prototype.execute.call(this):Zone.current.scheduleMicroTask("jasmine.execute().forceTask",function(){return p.prototype.execute.call(e)})},r}(p)}()});
\ No newline at end of file
diff --git a/dist/long-stack-trace-zone.js b/dist/long-stack-trace-zone.js
index 4f3f2f047..9200ae7ca 100644
--- a/dist/long-stack-trace-zone.js
+++ b/dist/long-stack-trace-zone.js
@@ -22,6 +22,17 @@
* @fileoverview
* @suppress {globalThis}
*/
+var __assign = (undefined && undefined.__assign) || function () {
+ __assign = Object.assign || function(t) {
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
+ s = arguments[i];
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+ t[p] = s[p];
+ }
+ return t;
+ };
+ return __assign.apply(this, arguments);
+};
var NEWLINE = '\n';
var IGNORE_FRAMES = {};
var creationTrace = '__creationTrace__';
@@ -111,6 +122,14 @@ Zone['longStackTraceZoneSpec'] = {
}
if (!task.data)
task.data = {};
+ if (task.type === 'eventTask') {
+ // Fix issue https://github.com/angular/zone.js/issues/1195,
+ // For event task of browser, by default, all task will share a
+ // singleton instance of data object, we should create a new one here
+ // The cast to `any` is required to workaround a closure bug which wrongly applies
+ // URL sanitization rules to .data access.
+ task.data = __assign({}, task.data);
+ }
task.data[creationTrace] = trace;
}
return parentZoneDelegate.scheduleTask(targetZone, task);
diff --git a/dist/long-stack-trace-zone.min.js b/dist/long-stack-trace-zone.min.js
index 0565d31bd..fe18bf627 100644
--- a/dist/long-stack-trace-zone.min.js
+++ b/dist/long-stack-trace-zone.min.js
@@ -1 +1 @@
-!function(t,r){"object"==typeof exports&&"undefined"!=typeof module?r():"function"==typeof define&&define.amd?define(r):r()}(this,function(){"use strict";function t(){return new Error(u)}function r(){try{throw t()}catch(r){return r}}function a(t){return t.stack?t.stack.split(o):[]}function e(t,r){for(var e=a(r),n=0;n0&&(t.push(a((new h).error)),c(t,r-1))}function i(){if(!(Error.stackTraceLimit<=0)){var t=[];c(t,2);for(var r=t[0],a=t[1],e=0;e0){var n=Zone.currentTask,c=n&&n.data&&n.data[f]||[];c=[new h].concat(c),c.length>this.longStackTraceLimit&&(c.length=this.longStackTraceLimit),e.data||(e.data={}),e.data[f]=c}return t.scheduleTask(a,e)},onHandleError:function(t,r,a,e){if(Error.stackTraceLimit>0){var c=Zone.currentTask||e.task;if(e instanceof Error&&c){var i=n(c.data&&c.data[f],e.stack);try{e.stack=e.longStack=i}catch(o){}}}return t.handleError(a,e)}},i()});
\ No newline at end of file
+!function(t,r){"object"==typeof exports&&"undefined"!=typeof module?r():"function"==typeof define&&define.amd?define(r):r()}(0,function(){"use strict";var t=function(){return(t=Object.assign||function(t){for(var r,a=1,e=arguments.length;a0){var c=Zone.currentTask,i=c&&c.data&&c.data.__creationTrace__||[];(i=[new o].concat(i)).length>this.longStackTraceLimit&&(i.length=this.longStackTraceLimit),n.data||(n.data={}),"eventTask"===n.type&&(n.data=t({},n.data)),n.data.__creationTrace__=i}return r.scheduleTask(e,n)},onHandleError:function(t,r,a,e){if(Error.stackTraceLimit>0){var n=Zone.currentTask||e.task;if(e instanceof Error&&n){var c=h(n.data&&n.data.__creationTrace__,e.stack);try{e.stack=e.longStack=c}catch(t){}}}return t.handleError(a,e)}},function(){if(!(Error.stackTraceLimit<=0)){var t=[];!function t(r,a){a>0&&(r.push(l((new o).error)),t(r,a-1))}(t,2);for(var r=t[0],i=t[1],s=0;s0?i[0]:null;if("function"==typeof a){var o=t.current.wrap(a,"MediaQuery");return a[n.symbol("mediaQueryCallback")]=o,e.call(r,o)}return e.apply(r,i)}})}function i(e){n.patchMethod(e,"removeListener",function(e){return function(t,r){var i=r.length>0?r[0]:null;if("function"==typeof i){var a=i[n.symbol("mediaQueryCallback")];return a?e.call(t,a):e.apply(t,r)}return e.apply(t,r)}})}if(e.MediaQueryList){var a=e.MediaQueryList.prototype;r(a),i(a)}else e.matchMedia&&n.patchMethod(e,"matchMedia",function(e){return function(t,n){var a=e.apply(t,n);if(a){var o=Object.getPrototypeOf(a);o&&o.addListener?(r(o),i(o),r(a),i(a)):a.addListener&&(r(a),i(a))}return a}})})});
\ No newline at end of file
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){"use strict";Zone.__load_patch("mediaQuery",function(e,t,n){function r(e){n.patchMethod(e,"addListener",function(e){return function(r,a){var i=a.length>0?a[0]:null;if("function"==typeof i){var o=t.current.wrap(i,"MediaQuery");return i[n.symbol("mediaQueryCallback")]=o,e.call(r,o)}return e.apply(r,a)}})}function a(e){n.patchMethod(e,"removeListener",function(e){return function(t,r){var a=r.length>0?r[0]:null;if("function"==typeof a){var i=a[n.symbol("mediaQueryCallback")];return i?e.call(t,i):e.apply(t,r)}return e.apply(t,r)}})}if(e.MediaQueryList){var i=e.MediaQueryList.prototype;r(i),a(i)}else e.matchMedia&&n.patchMethod(e,"matchMedia",function(e){return function(t,n){var i=e.apply(t,n);if(i){var o=Object.getPrototypeOf(i);o&&o.addListener?(r(o),a(o),r(i),a(i)):i.addListener&&(r(i),a(i))}return i}})})});
\ No newline at end of file
diff --git a/dist/webapis-notification.min.js b/dist/webapis-notification.min.js
index cf8cdf11b..c632924e5 100644
--- a/dist/webapis-notification.min.js
+++ b/dist/webapis-notification.min.js
@@ -1 +1 @@
-!function(t,o){"object"==typeof exports&&"undefined"!=typeof module?o():"function"==typeof define&&define.amd?define(o):o()}(this,function(){"use strict";Zone.__load_patch("notification",function(t,o,e){var n=t.Notification;if(n&&n.prototype){var i=Object.getOwnPropertyDescriptor(n.prototype,"onerror");i&&i.configurable&&e.patchOnProperties(n.prototype,null)}})});
\ No newline at end of file
+!function(o,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){"use strict";Zone.__load_patch("notification",function(o,t,e){var n=o.Notification;if(n&&n.prototype){var i=Object.getOwnPropertyDescriptor(n.prototype,"onerror");i&&i.configurable&&e.patchOnProperties(n.prototype,null)}})});
\ No newline at end of file
diff --git a/dist/webapis-rtc-peer-connection.min.js b/dist/webapis-rtc-peer-connection.min.js
index a2f70d40c..ded10ecbb 100644
--- a/dist/webapis-rtc-peer-connection.min.js
+++ b/dist/webapis-rtc-peer-connection.min.js
@@ -1 +1 @@
-!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("RTCPeerConnection",function(e,t,o){var n=e.RTCPeerConnection;if(n){var p=o.symbol("addEventListener"),r=o.symbol("removeEventListener");n.prototype.addEventListener=n.prototype[p],n.prototype.removeEventListener=n.prototype[r],n.prototype[p]=null,n.prototype[r]=null,o.patchEventTarget(e,[n.prototype],{useG:!1})}})});
\ No newline at end of file
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){"use strict";Zone.__load_patch("RTCPeerConnection",function(e,t,o){var n=e.RTCPeerConnection;if(n){var p=o.symbol("addEventListener"),r=o.symbol("removeEventListener");n.prototype.addEventListener=n.prototype[p],n.prototype.removeEventListener=n.prototype[r],n.prototype[p]=null,n.prototype[r]=null,o.patchEventTarget(e,[n.prototype],{useG:!1})}})});
\ No newline at end of file
diff --git a/dist/webapis-shadydom.min.js b/dist/webapis-shadydom.min.js
index 4d0f64feb..cbdc0c953 100644
--- a/dist/webapis-shadydom.min.js
+++ b/dist/webapis-shadydom.min.js
@@ -1 +1 @@
-!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("shadydom",function(e,t,o){var n=Object.getPrototypeOf(window);n&&n.hasOwnProperty("addEventListener")&&(n[t.__symbol__("addEventListener")]=null,n[t.__symbol__("removeEventListener")]=null,o.patchEventTarget(e,[n])),Node.prototype.hasOwnProperty("addEventListener")&&(Node.prototype[t.__symbol__("addEventListener")]=null,Node.prototype[t.__symbol__("removeEventListener")]=null,o.patchEventTarget(e,[Node.prototype]))})});
\ No newline at end of file
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){"use strict";Zone.__load_patch("shadydom",function(e,t,o){var n=Object.getPrototypeOf(window);n&&n.hasOwnProperty("addEventListener")&&(n[t.__symbol__("addEventListener")]=null,n[t.__symbol__("removeEventListener")]=null,o.patchEventTarget(e,[n])),Node.prototype.hasOwnProperty("addEventListener")&&(Node.prototype[t.__symbol__("addEventListener")]=null,Node.prototype[t.__symbol__("removeEventListener")]=null,o.patchEventTarget(e,[Node.prototype]))})});
\ No newline at end of file
diff --git a/dist/wtf.min.js b/dist/wtf.min.js
index ae6905708..b5e62239f 100644
--- a/dist/wtf.min.js
+++ b/dist/wtf.min.js
@@ -1 +1 @@
-!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n():"function"==typeof define&&define.amd?define(n):n()}(this,function(){"use strict";!function(e){function n(e,o){if(!e||!o)return null;var t={};for(var c in e)if(e.hasOwnProperty(c)){var a=e[c];switch(typeof a){case"object":var r=a&&a.constructor&&a.constructor.name;a=r==Object.name?n(a,o-1):r;break;case"function":a=a.name||void 0}t[c]=a}return t}function o(e){for(var n=e.name,o=e.parent;null!=o;)n=o.name+"::"+n,o=o.parent;return n}var t=null,c=null,a=function(){var n=e.wtf;return!(!n||!(t=n.trace))&&(c=t.events,!0)}(),r=function(){function e(){this.name="WTF"}return e.prototype.onFork=function(n,t,c,a){var r=n.fork(c,a);return e.forkInstance(o(c),r.name),r},e.prototype.onInvoke=function(n,a,r,i,s,u,f){var p=f||"unknown",l=e.invokeScope[p];return l||(l=e.invokeScope[p]=c.createScope("Zone:invoke:"+f+"(ascii zone)")),t.leaveScope(l(o(r)),n.invoke(r,i,s,u,f))},e.prototype.onHandleError=function(e,n,o,t){return e.handleError(o,t)},e.prototype.onScheduleTask=function(t,a,r,i){var s=i.type+":"+i.source,u=e.scheduleInstance[s];u||(u=e.scheduleInstance[s]=c.createInstance("Zone:schedule:"+s+"(ascii zone, any data)"));var f=t.scheduleTask(r,i);return u(o(r),n(i.data,2)),f},e.prototype.onInvokeTask=function(n,a,r,i,s,u){var f=i.source,p=e.invokeTaskScope[f];return p||(p=e.invokeTaskScope[f]=c.createScope("Zone:invokeTask:"+f+"(ascii zone)")),t.leaveScope(p(o(r)),n.invokeTask(r,i,s,u))},e.prototype.onCancelTask=function(t,a,r,i){var s=i.source,u=e.cancelInstance[s];u||(u=e.cancelInstance[s]=c.createInstance("Zone:cancel:"+s+"(ascii zone, any options)"));var f=t.cancelTask(r,i);return u(o(r),n(i.data,2)),f},e.forkInstance=a?c.createInstance("Zone:fork(ascii zone, ascii newZone)"):null,e.scheduleInstance={},e.cancelInstance={},e.invokeScope={},e.invokeTaskScope={},e}();Zone.wtfZoneSpec=a?new r:null}("object"==typeof window&&window||"object"==typeof self&&self||global)});
\ No newline at end of file
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n():"function"==typeof define&&define.amd?define(n):n()}(0,function(){"use strict";!function(e){var n,o=null,t=null,c=!(!(n=e.wtf)||!(o=n.trace)||(t=o.events,0)),a=function(){function e(){this.name="WTF"}return e.prototype.onFork=function(n,o,t,c){var a=n.fork(t,c);return e.forkInstance(i(t),a.name),a},e.prototype.onInvoke=function(n,c,a,r,s,u,f){var p=f||"unknown",l=e.invokeScope[p];return l||(l=e.invokeScope[p]=t.createScope("Zone:invoke:"+f+"(ascii zone)")),o.leaveScope(l(i(a)),n.invoke(a,r,s,u,f))},e.prototype.onHandleError=function(e,n,o,t){return e.handleError(o,t)},e.prototype.onScheduleTask=function(n,o,c,a){var s=a.type+":"+a.source,u=e.scheduleInstance[s];u||(u=e.scheduleInstance[s]=t.createInstance("Zone:schedule:"+s+"(ascii zone, any data)"));var f=n.scheduleTask(c,a);return u(i(c),r(a.data,2)),f},e.prototype.onInvokeTask=function(n,c,a,r,s,u){var f=r.source,p=e.invokeTaskScope[f];return p||(p=e.invokeTaskScope[f]=t.createScope("Zone:invokeTask:"+f+"(ascii zone)")),o.leaveScope(p(i(a)),n.invokeTask(a,r,s,u))},e.prototype.onCancelTask=function(n,o,c,a){var s=a.source,u=e.cancelInstance[s];u||(u=e.cancelInstance[s]=t.createInstance("Zone:cancel:"+s+"(ascii zone, any options)"));var f=n.cancelTask(c,a);return u(i(c),r(a.data,2)),f},e.forkInstance=c?t.createInstance("Zone:fork(ascii zone, ascii newZone)"):null,e.scheduleInstance={},e.cancelInstance={},e.invokeScope={},e.invokeTaskScope={},e}();function r(e,n){if(!e||!n)return null;var o={};for(var t in e)if(e.hasOwnProperty(t)){var c=e[t];switch(typeof c){case"object":var a=c&&c.constructor&&c.constructor.name;c=a==Object.name?r(c,n-1):a;break;case"function":c=c.name||void 0}o[t]=c}return o}function i(e){for(var n=e.name,o=e.parent;null!=o;)n=o.name+"::"+n,o=o.parent;return n}Zone.wtfZoneSpec=c?new a:null}("object"==typeof window&&window||"object"==typeof self&&self||global)});
\ No newline at end of file
diff --git a/dist/zone-bluebird.min.js b/dist/zone-bluebird.min.js
index 4502c2f8c..9c05f0c1e 100644
--- a/dist/zone-bluebird.min.js
+++ b/dist/zone-bluebird.min.js
@@ -1 +1 @@
-!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(this,function(){"use strict";Zone.__load_patch("bluebird",function(n,t,e){var o="bluebird";t[t.__symbol__(o)]=function(o){var r=["then","spread","finally"];r.forEach(function(n){e.patchMethod(o.prototype,n,function(n){return function(e,r){for(var i=t.current,c=function(n){var t=r[n];"function"==typeof t&&(r[n]=function(){var n=this,e=arguments;return new o(function(o,r){i.scheduleMicroTask("Promise.then",function(){try{o(t.apply(n,e))}catch(i){r(i)}})})})},u=0;u';
+ this._properties = zoneSpec && zoneSpec.properties || {};
+ this._zoneDelegate =
+ new ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec);
+ }
+ Zone.assertZonePatched = function () {
+ if (global['Promise'] !== patches['ZoneAwarePromise']) {
+ throw new Error('Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' +
+ 'has been overwritten.\n' +
+ 'Most 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(Zone, "root", {
+ get: function () {
+ var zone = Zone.current;
+ while (zone.parent) {
+ zone = zone.parent;
+ }
+ return zone;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Zone, "current", {
+ get: function () {
+ return _currentZoneFrame.zone;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Zone, "currentTask", {
+ get: function () {
+ return _currentTask;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Zone.__load_patch = function (name, fn) {
+ if (patches.hasOwnProperty(name)) {
+ if (checkDuplicate) {
+ throw Error('Already loaded patch: ' + name);
+ }
+ }
+ else if (!global['__Zone_disable_' + name]) {
+ var perfName = 'Zone:' + name;
+ mark(perfName);
+ patches[name] = fn(global, Zone, _api);
+ performanceMeasure(perfName, perfName);
+ }
+ };
+ Object.defineProperty(Zone.prototype, "parent", {
+ get: function () {
+ return this._parent;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(Zone.prototype, "name", {
+ get: function () {
+ return this._name;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Zone.prototype.get = function (key) {
+ var zone = this.getZoneWith(key);
+ if (zone)
+ return zone._properties[key];
+ };
+ Zone.prototype.getZoneWith = function (key) {
+ var current = this;
+ while (current) {
+ if (current._properties.hasOwnProperty(key)) {
+ return current;
+ }
+ current = current._parent;
+ }
+ return null;
+ };
+ Zone.prototype.fork = function (zoneSpec) {
+ if (!zoneSpec)
+ throw new Error('ZoneSpec required!');
+ return this._zoneDelegate.fork(this, zoneSpec);
+ };
+ Zone.prototype.wrap = function (callback, source) {
+ if (typeof callback !== 'function') {
+ throw new Error('Expecting function got: ' + callback);
+ }
+ var _callback = this._zoneDelegate.intercept(this, callback, source);
+ var zone = this;
+ return function () {
+ return zone.runGuarded(_callback, this, arguments, source);
+ };
+ };
+ Zone.prototype.run = function (callback, applyThis, applyArgs, source) {
+ _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+ try {
+ return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
+ }
+ finally {
+ _currentZoneFrame = _currentZoneFrame.parent;
+ }
+ };
+ Zone.prototype.runGuarded = function (callback, applyThis, applyArgs, source) {
+ if (applyThis === void 0) { applyThis = null; }
+ _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+ try {
+ try {
+ return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
+ }
+ catch (error) {
+ if (this._zoneDelegate.handleError(this, error)) {
+ throw error;
+ }
+ }
+ }
+ finally {
+ _currentZoneFrame = _currentZoneFrame.parent;
+ }
+ };
+ Zone.prototype.runTask = function (task, applyThis, applyArgs) {
+ if (task.zone != this) {
+ throw new Error('A task can only be run in the zone of creation! (Creation: ' +
+ (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')');
+ }
+ // https://github.com/angular/zone.js/issues/778, sometimes eventTask
+ // will run in notScheduled(canceled) state, we should not try to
+ // run such kind of task but just return
+ if (task.state === notScheduled && (task.type === eventTask || task.type === macroTask)) {
+ return;
+ }
+ var reEntryGuard = task.state != running;
+ reEntryGuard && task._transitionTo(running, scheduled);
+ task.runCount++;
+ var previousTask = _currentTask;
+ _currentTask = task;
+ _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+ try {
+ if (task.type == macroTask && task.data && !task.data.isPeriodic) {
+ task.cancelFn = undefined;
+ }
+ try {
+ return this._zoneDelegate.invokeTask(this, task, applyThis, applyArgs);
+ }
+ catch (error) {
+ if (this._zoneDelegate.handleError(this, error)) {
+ throw error;
+ }
+ }
+ }
+ finally {
+ // if the task's state is notScheduled or unknown, then it has already been cancelled
+ // we should not reset the state to scheduled
+ if (task.state !== notScheduled && task.state !== unknown) {
+ if (task.type == eventTask || (task.data && task.data.isPeriodic)) {
+ reEntryGuard && task._transitionTo(scheduled, running);
+ }
+ else {
+ task.runCount = 0;
+ this._updateTaskCount(task, -1);
+ reEntryGuard &&
+ task._transitionTo(notScheduled, running, notScheduled);
+ }
+ }
+ _currentZoneFrame = _currentZoneFrame.parent;
+ _currentTask = previousTask;
+ }
+ };
+ Zone.prototype.scheduleTask = function (task) {
+ if (task.zone && task.zone !== this) {
+ // check if the task was rescheduled, the newZone
+ // should not be the children of the original zone
+ var newZone = this;
+ while (newZone) {
+ if (newZone === task.zone) {
+ throw Error("can not reschedule task to " + this.name + " which is descendants of the original zone " + task.zone.name);
+ }
+ newZone = newZone.parent;
+ }
+ }
+ task._transitionTo(scheduling, notScheduled);
+ var zoneDelegates = [];
+ task._zoneDelegates = zoneDelegates;
+ task._zone = this;
+ try {
+ task = this._zoneDelegate.scheduleTask(this, task);
+ }
+ catch (err) {
+ // should set task's state to unknown when scheduleTask throw error
+ // because the err may from reschedule, so the fromState maybe notScheduled
+ task._transitionTo(unknown, scheduling, notScheduled);
+ // TODO: @JiaLiPassion, should we check the result from handleError?
+ this._zoneDelegate.handleError(this, err);
+ throw err;
+ }
+ if (task._zoneDelegates === zoneDelegates) {
+ // we have to check because internally the delegate can reschedule the task.
+ this._updateTaskCount(task, 1);
+ }
+ if (task.state == scheduling) {
+ task._transitionTo(scheduled, scheduling);
+ }
+ return task;
+ };
+ Zone.prototype.scheduleMicroTask = function (source, callback, data, customSchedule) {
+ return this.scheduleTask(new ZoneTask(microTask, source, callback, data, customSchedule, undefined));
+ };
+ Zone.prototype.scheduleMacroTask = function (source, callback, data, customSchedule, customCancel) {
+ return this.scheduleTask(new ZoneTask(macroTask, source, callback, data, customSchedule, customCancel));
+ };
+ Zone.prototype.scheduleEventTask = function (source, callback, data, customSchedule, customCancel) {
+ return this.scheduleTask(new ZoneTask(eventTask, source, callback, data, customSchedule, customCancel));
+ };
+ Zone.prototype.cancelTask = function (task) {
+ if (task.zone != this)
+ throw new Error('A task can only be cancelled in the zone of creation! (Creation: ' +
+ (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')');
+ task._transitionTo(canceling, scheduled, running);
+ try {
+ this._zoneDelegate.cancelTask(this, task);
+ }
+ catch (err) {
+ // if error occurs when cancelTask, transit the state to unknown
+ task._transitionTo(unknown, canceling);
+ this._zoneDelegate.handleError(this, err);
+ throw err;
+ }
+ this._updateTaskCount(task, -1);
+ task._transitionTo(notScheduled, canceling);
+ task.runCount = 0;
+ return task;
+ };
+ Zone.prototype._updateTaskCount = function (task, count) {
+ var zoneDelegates = task._zoneDelegates;
+ if (count == -1) {
+ task._zoneDelegates = null;
+ }
+ for (var i = 0; i < zoneDelegates.length; i++) {
+ zoneDelegates[i]._updateTaskCount(task.type, count);
+ }
+ };
+ Zone.__symbol__ = __symbol__;
+ return Zone;
+ }());
+ var DELEGATE_ZS = {
+ name: '',
+ onHasTask: function (delegate, _, target, hasTaskState) { return delegate.hasTask(target, hasTaskState); },
+ onScheduleTask: function (delegate, _, target, task) {
+ return delegate.scheduleTask(target, task);
+ },
+ onInvokeTask: function (delegate, _, target, task, applyThis, applyArgs) {
+ return delegate.invokeTask(target, task, applyThis, applyArgs);
+ },
+ onCancelTask: function (delegate, _, target, task) { return delegate.cancelTask(target, task); }
+ };
+ var ZoneDelegate = /** @class */ (function () {
+ function ZoneDelegate(zone, parentDelegate, zoneSpec) {
+ this._taskCounts = { 'microTask': 0, 'macroTask': 0, 'eventTask': 0 };
+ this.zone = zone;
+ this._parentDelegate = parentDelegate;
+ this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS);
+ this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt);
+ this._forkCurrZone = zoneSpec && (zoneSpec.onFork ? this.zone : parentDelegate.zone);
+ this._interceptZS =
+ zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS);
+ this._interceptDlgt =
+ zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt);
+ this._interceptCurrZone =
+ zoneSpec && (zoneSpec.onIntercept ? this.zone : parentDelegate.zone);
+ this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS);
+ this._invokeDlgt =
+ zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt);
+ this._invokeCurrZone = zoneSpec && (zoneSpec.onInvoke ? this.zone : parentDelegate.zone);
+ this._handleErrorZS =
+ zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS);
+ this._handleErrorDlgt =
+ zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt);
+ this._handleErrorCurrZone =
+ zoneSpec && (zoneSpec.onHandleError ? this.zone : parentDelegate.zone);
+ this._scheduleTaskZS =
+ zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS);
+ this._scheduleTaskDlgt = zoneSpec &&
+ (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt);
+ this._scheduleTaskCurrZone =
+ zoneSpec && (zoneSpec.onScheduleTask ? this.zone : parentDelegate.zone);
+ this._invokeTaskZS =
+ zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS);
+ this._invokeTaskDlgt =
+ zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt);
+ this._invokeTaskCurrZone =
+ zoneSpec && (zoneSpec.onInvokeTask ? this.zone : parentDelegate.zone);
+ this._cancelTaskZS =
+ zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS);
+ this._cancelTaskDlgt =
+ zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt);
+ this._cancelTaskCurrZone =
+ zoneSpec && (zoneSpec.onCancelTask ? this.zone : parentDelegate.zone);
+ this._hasTaskZS = null;
+ this._hasTaskDlgt = null;
+ this._hasTaskDlgtOwner = null;
+ this._hasTaskCurrZone = null;
+ var zoneSpecHasTask = zoneSpec && zoneSpec.onHasTask;
+ var parentHasTask = parentDelegate && parentDelegate._hasTaskZS;
+ if (zoneSpecHasTask || parentHasTask) {
+ // If we need to report hasTask, than this ZS needs to do ref counting on tasks. In such
+ // a case all task related interceptors must go through this ZD. We can't short circuit it.
+ this._hasTaskZS = zoneSpecHasTask ? zoneSpec : DELEGATE_ZS;
+ this._hasTaskDlgt = parentDelegate;
+ this._hasTaskDlgtOwner = this;
+ this._hasTaskCurrZone = zone;
+ if (!zoneSpec.onScheduleTask) {
+ this._scheduleTaskZS = DELEGATE_ZS;
+ this._scheduleTaskDlgt = parentDelegate;
+ this._scheduleTaskCurrZone = this.zone;
+ }
+ if (!zoneSpec.onInvokeTask) {
+ this._invokeTaskZS = DELEGATE_ZS;
+ this._invokeTaskDlgt = parentDelegate;
+ this._invokeTaskCurrZone = this.zone;
+ }
+ if (!zoneSpec.onCancelTask) {
+ this._cancelTaskZS = DELEGATE_ZS;
+ this._cancelTaskDlgt = parentDelegate;
+ this._cancelTaskCurrZone = this.zone;
+ }
+ }
+ }
+ ZoneDelegate.prototype.fork = function (targetZone, zoneSpec) {
+ return this._forkZS ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec) :
+ new Zone(targetZone, zoneSpec);
+ };
+ ZoneDelegate.prototype.intercept = function (targetZone, callback, source) {
+ return this._interceptZS ?
+ this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source) :
+ callback;
+ };
+ ZoneDelegate.prototype.invoke = function (targetZone, callback, applyThis, applyArgs, source) {
+ return this._invokeZS ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source) :
+ callback.apply(applyThis, applyArgs);
+ };
+ ZoneDelegate.prototype.handleError = function (targetZone, error) {
+ return this._handleErrorZS ?
+ this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error) :
+ true;
+ };
+ ZoneDelegate.prototype.scheduleTask = function (targetZone, task) {
+ var returnTask = task;
+ if (this._scheduleTaskZS) {
+ if (this._hasTaskZS) {
+ returnTask._zoneDelegates.push(this._hasTaskDlgtOwner);
+ }
+ returnTask = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task);
+ if (!returnTask)
+ returnTask = task;
+ }
+ else {
+ if (task.scheduleFn) {
+ task.scheduleFn(task);
+ }
+ else if (task.type == microTask) {
+ scheduleMicroTask(task);
+ }
+ else {
+ throw new Error('Task is missing scheduleFn.');
+ }
+ }
+ return returnTask;
+ };
+ ZoneDelegate.prototype.invokeTask = function (targetZone, task, applyThis, applyArgs) {
+ return this._invokeTaskZS ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs) :
+ task.callback.apply(applyThis, applyArgs);
+ };
+ ZoneDelegate.prototype.cancelTask = function (targetZone, task) {
+ var value;
+ if (this._cancelTaskZS) {
+ value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task);
+ }
+ else {
+ if (!task.cancelFn) {
+ throw Error('Task is not cancelable');
+ }
+ value = task.cancelFn(task);
+ }
+ return value;
+ };
+ ZoneDelegate.prototype.hasTask = function (targetZone, isEmpty) {
+ // hasTask should not throw error so other ZoneDelegate
+ // can still trigger hasTask callback
+ try {
+ this._hasTaskZS &&
+ this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty);
+ }
+ catch (err) {
+ this.handleError(targetZone, err);
+ }
+ };
+ ZoneDelegate.prototype._updateTaskCount = function (type, count) {
+ var counts = this._taskCounts;
+ var prev = counts[type];
+ var next = counts[type] = prev + count;
+ if (next < 0) {
+ throw new Error('More tasks executed then were scheduled.');
+ }
+ if (prev == 0 || next == 0) {
+ var isEmpty = {
+ microTask: counts['microTask'] > 0,
+ macroTask: counts['macroTask'] > 0,
+ eventTask: counts['eventTask'] > 0,
+ change: type
+ };
+ this.hasTask(this.zone, isEmpty);
+ }
+ };
+ return ZoneDelegate;
+ }());
+ var ZoneTask = /** @class */ (function () {
+ function ZoneTask(type, source, callback, options, scheduleFn, cancelFn) {
+ this._zone = null;
+ this.runCount = 0;
+ this._zoneDelegates = null;
+ this._state = 'notScheduled';
+ this.type = type;
+ this.source = source;
+ this.data = options;
+ this.scheduleFn = scheduleFn;
+ this.cancelFn = cancelFn;
+ this.callback = callback;
+ var self = this;
+ // TODO: @JiaLiPassion options should have interface
+ if (type === eventTask && options && options.useG) {
+ this.invoke = ZoneTask.invokeTask;
+ }
+ else {
+ this.invoke = function () {
+ return ZoneTask.invokeTask.call(global, self, this, arguments);
+ };
+ }
+ }
+ ZoneTask.invokeTask = function (task, target, args) {
+ if (!task) {
+ task = this;
+ }
+ _numberOfNestedTaskFrames++;
+ try {
+ task.runCount++;
+ return task.zone.runTask(task, target, args);
+ }
+ finally {
+ if (_numberOfNestedTaskFrames == 1) {
+ drainMicroTaskQueue();
+ }
+ _numberOfNestedTaskFrames--;
+ }
+ };
+ Object.defineProperty(ZoneTask.prototype, "zone", {
+ get: function () {
+ return this._zone;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(ZoneTask.prototype, "state", {
+ get: function () {
+ return this._state;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ ZoneTask.prototype.cancelScheduleRequest = function () {
+ this._transitionTo(notScheduled, scheduling);
+ };
+ ZoneTask.prototype._transitionTo = function (toState, fromState1, fromState2) {
+ if (this._state === fromState1 || this._state === fromState2) {
+ this._state = toState;
+ if (toState == notScheduled) {
+ this._zoneDelegates = null;
+ }
+ }
+ else {
+ throw new Error(this.type + " '" + this.source + "': can not transition to '" + toState + "', expecting state '" + fromState1 + "'" + (fromState2 ? ' or \'' + fromState2 + '\'' : '') + ", was '" + this._state + "'.");
+ }
+ };
+ ZoneTask.prototype.toString = function () {
+ if (this.data && typeof this.data.handleId !== 'undefined') {
+ return this.data.handleId.toString();
+ }
+ else {
+ return Object.prototype.toString.call(this);
+ }
+ };
+ // add toJSON method to prevent cyclic error when
+ // call JSON.stringify(zoneTask)
+ ZoneTask.prototype.toJSON = function () {
+ return {
+ type: this.type,
+ state: this.state,
+ source: this.source,
+ zone: this.zone.name,
+ runCount: this.runCount
+ };
+ };
+ return ZoneTask;
+ }());
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ /// MICROTASK QUEUE
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ var symbolSetTimeout = __symbol__('setTimeout');
+ var symbolPromise = __symbol__('Promise');
+ var symbolThen = __symbol__('then');
+ var _microTaskQueue = [];
+ var _isDrainingMicrotaskQueue = false;
+ var nativeMicroTaskQueuePromise;
+ function scheduleMicroTask(task) {
+ // if we are not running in any task, and there has not been anything scheduled
+ // we must bootstrap the initial task creation by manually scheduling the drain
+ if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) {
+ // We are not running in Task, so we need to kickstart the microtask queue.
+ if (!nativeMicroTaskQueuePromise) {
+ if (global[symbolPromise]) {
+ nativeMicroTaskQueuePromise = global[symbolPromise].resolve(0);
+ }
+ }
+ if (nativeMicroTaskQueuePromise) {
+ var nativeThen = nativeMicroTaskQueuePromise[symbolThen];
+ if (!nativeThen) {
+ // native Promise is not patchable, we need to use `then` directly
+ // issue 1078
+ nativeThen = nativeMicroTaskQueuePromise['then'];
+ }
+ nativeThen.call(nativeMicroTaskQueuePromise, drainMicroTaskQueue);
+ }
+ else {
+ global[symbolSetTimeout](drainMicroTaskQueue, 0);
+ }
+ }
+ task && _microTaskQueue.push(task);
+ }
+ function drainMicroTaskQueue() {
+ if (!_isDrainingMicrotaskQueue) {
+ _isDrainingMicrotaskQueue = true;
+ while (_microTaskQueue.length) {
+ var queue = _microTaskQueue;
+ _microTaskQueue = [];
+ for (var i = 0; i < queue.length; i++) {
+ var task = queue[i];
+ try {
+ task.zone.runTask(task, null, null);
+ }
+ catch (error) {
+ _api.onUnhandledError(error);
+ }
+ }
+ }
+ _api.microtaskDrainDone();
+ _isDrainingMicrotaskQueue = false;
+ }
+ }
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ /// BOOTSTRAP
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ var NO_ZONE = { name: 'NO ZONE' };
+ var notScheduled = 'notScheduled', scheduling = 'scheduling', scheduled = 'scheduled', running = 'running', canceling = 'canceling', unknown = 'unknown';
+ var microTask = 'microTask', macroTask = 'macroTask', eventTask = 'eventTask';
+ var patches = {};
+ var _api = {
+ symbol: __symbol__,
+ currentZoneFrame: function () { return _currentZoneFrame; },
+ onUnhandledError: noop,
+ microtaskDrainDone: noop,
+ scheduleMicroTask: scheduleMicroTask,
+ showUncaughtError: function () { return !Zone[__symbol__('ignoreConsoleErrorUncaughtError')]; },
+ patchEventTarget: function () { return []; },
+ patchOnProperties: noop,
+ patchMethod: function () { return noop; },
+ bindArguments: function () { return []; },
+ patchThen: function () { return noop; },
+ patchMacroTask: function () { return noop; },
+ setNativePromise: function (NativePromise) {
+ // sometimes NativePromise.resolve static function
+ // is not ready yet, (such as core-js/es6.promise)
+ // so we need to check here.
+ if (NativePromise && typeof NativePromise.resolve === 'function') {
+ nativeMicroTaskQueuePromise = NativePromise.resolve(0);
+ }
+ },
+ patchEventPrototype: function () { return noop; },
+ isIEOrEdge: function () { return false; },
+ getGlobalObjects: function () { return undefined; },
+ ObjectDefineProperty: function () { return noop; },
+ ObjectGetOwnPropertyDescriptor: function () { return undefined; },
+ ObjectCreate: function () { return undefined; },
+ ArraySlice: function () { return []; },
+ patchClass: function () { return noop; },
+ wrapWithCurrentZone: function () { return noop; },
+ filterProperties: function () { return []; },
+ attachOriginToPatched: function () { return noop; },
+ _redefineProperty: function () { return noop; },
+ patchCallbacks: function () { return noop; }
+ };
+ var _currentZoneFrame = { parent: null, zone: new Zone(null, null) };
+ var _currentTask = null;
+ var _numberOfNestedTaskFrames = 0;
+ function noop() { }
+ function __symbol__(name) {
+ return '__zone_symbol__' + name;
+ }
+ performanceMeasure('Zone', 'Zone');
+ return global['Zone'] = Zone;
+})(typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global);
+
+var __values = (undefined && undefined.__values) || function (o) {
+ var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
+ if (m) return m.call(o);
+ return {
+ next: function () {
+ if (o && i >= o.length) o = void 0;
+ return { value: o && o[i++], done: !o };
+ }
+ };
+};
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
+ var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+ var ObjectDefineProperty = Object.defineProperty;
+ function readableObjectToString(obj) {
+ if (obj && obj.toString === Object.prototype.toString) {
+ var className = obj.constructor && obj.constructor.name;
+ return (className ? className : '') + ': ' + JSON.stringify(obj);
+ }
+ return obj ? obj.toString() : Object.prototype.toString.call(obj);
+ }
+ var __symbol__ = api.symbol;
+ var _uncaughtPromiseErrors = [];
+ var symbolPromise = __symbol__('Promise');
+ var symbolThen = __symbol__('then');
+ var creationTrace = '__creationTrace__';
+ api.onUnhandledError = function (e) {
+ if (api.showUncaughtError()) {
+ var rejection = e && e.rejection;
+ if (rejection) {
+ console.error('Unhandled Promise rejection:', rejection instanceof Error ? rejection.message : rejection, '; Zone:', e.zone.name, '; Task:', e.task && e.task.source, '; Value:', rejection, rejection instanceof Error ? rejection.stack : undefined);
+ }
+ else {
+ console.error(e);
+ }
+ }
+ };
+ api.microtaskDrainDone = function () {
+ while (_uncaughtPromiseErrors.length) {
+ var _loop_1 = function () {
+ var uncaughtPromiseError = _uncaughtPromiseErrors.shift();
+ try {
+ uncaughtPromiseError.zone.runGuarded(function () {
+ throw uncaughtPromiseError;
+ });
+ }
+ catch (error) {
+ handleUnhandledRejection(error);
+ }
+ };
+ while (_uncaughtPromiseErrors.length) {
+ _loop_1();
+ }
+ }
+ };
+ var UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__('unhandledPromiseRejectionHandler');
+ function handleUnhandledRejection(e) {
+ api.onUnhandledError(e);
+ try {
+ var handler = Zone[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL];
+ if (handler && typeof handler === 'function') {
+ handler.call(this, e);
+ }
+ }
+ catch (err) {
+ }
+ }
+ function isThenable(value) {
+ return value && value.then;
+ }
+ function forwardResolution(value) {
+ return value;
+ }
+ function forwardRejection(rejection) {
+ return ZoneAwarePromise.reject(rejection);
+ }
+ var symbolState = __symbol__('state');
+ var symbolValue = __symbol__('value');
+ var symbolFinally = __symbol__('finally');
+ var symbolParentPromiseValue = __symbol__('parentPromiseValue');
+ var symbolParentPromiseState = __symbol__('parentPromiseState');
+ var source = 'Promise.then';
+ var UNRESOLVED = null;
+ var RESOLVED = true;
+ var REJECTED = false;
+ var REJECTED_NO_CATCH = 0;
+ function makeResolver(promise, state) {
+ return function (v) {
+ try {
+ resolvePromise(promise, state, v);
+ }
+ catch (err) {
+ resolvePromise(promise, false, err);
+ }
+ // Do not return value or you will break the Promise spec.
+ };
+ }
+ var once = function () {
+ var wasCalled = false;
+ return function wrapper(wrappedFunction) {
+ return function () {
+ if (wasCalled) {
+ return;
+ }
+ wasCalled = true;
+ wrappedFunction.apply(null, arguments);
+ };
+ };
+ };
+ var TYPE_ERROR = 'Promise resolved with itself';
+ var CURRENT_TASK_TRACE_SYMBOL = __symbol__('currentTaskTrace');
+ // Promise Resolution
+ function resolvePromise(promise, state, value) {
+ var onceWrapper = once();
+ if (promise === value) {
+ throw new TypeError(TYPE_ERROR);
+ }
+ if (promise[symbolState] === UNRESOLVED) {
+ // should only get value.then once based on promise spec.
+ var then = null;
+ try {
+ if (typeof value === 'object' || typeof value === 'function') {
+ then = value && value.then;
+ }
+ }
+ catch (err) {
+ onceWrapper(function () {
+ resolvePromise(promise, false, err);
+ })();
+ return promise;
+ }
+ // if (value instanceof ZoneAwarePromise) {
+ if (state !== REJECTED && value instanceof ZoneAwarePromise &&
+ value.hasOwnProperty(symbolState) && value.hasOwnProperty(symbolValue) &&
+ value[symbolState] !== UNRESOLVED) {
+ clearRejectedNoCatch(value);
+ resolvePromise(promise, value[symbolState], value[symbolValue]);
+ }
+ else if (state !== REJECTED && typeof then === 'function') {
+ try {
+ then.call(value, onceWrapper(makeResolver(promise, state)), onceWrapper(makeResolver(promise, false)));
+ }
+ catch (err) {
+ onceWrapper(function () {
+ resolvePromise(promise, false, err);
+ })();
+ }
+ }
+ else {
+ promise[symbolState] = state;
+ var queue = promise[symbolValue];
+ promise[symbolValue] = value;
+ if (promise[symbolFinally] === symbolFinally) {
+ // the promise is generated by Promise.prototype.finally
+ if (state === RESOLVED) {
+ // the state is resolved, should ignore the value
+ // and use parent promise value
+ promise[symbolState] = promise[symbolParentPromiseState];
+ promise[symbolValue] = promise[symbolParentPromiseValue];
+ }
+ }
+ // record task information in value when error occurs, so we can
+ // do some additional work such as render longStackTrace
+ if (state === REJECTED && value instanceof Error) {
+ // check if longStackTraceZone is here
+ var trace = Zone.currentTask && Zone.currentTask.data &&
+ Zone.currentTask.data[creationTrace];
+ if (trace) {
+ // only keep the long stack trace into error when in longStackTraceZone
+ ObjectDefineProperty(value, CURRENT_TASK_TRACE_SYMBOL, { configurable: true, enumerable: false, writable: true, value: trace });
+ }
+ }
+ for (var i = 0; i < queue.length;) {
+ scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]);
+ }
+ if (queue.length == 0 && state == REJECTED) {
+ promise[symbolState] = REJECTED_NO_CATCH;
+ try {
+ // try to print more readable error log
+ throw new Error('Uncaught (in promise): ' + readableObjectToString(value) +
+ (value && value.stack ? '\n' + value.stack : ''));
+ }
+ catch (err) {
+ var error_1 = err;
+ error_1.rejection = value;
+ error_1.promise = promise;
+ error_1.zone = Zone.current;
+ error_1.task = Zone.currentTask;
+ _uncaughtPromiseErrors.push(error_1);
+ api.scheduleMicroTask(); // to make sure that it is running
+ }
+ }
+ }
+ }
+ // Resolving an already resolved promise is a noop.
+ return promise;
+ }
+ var REJECTION_HANDLED_HANDLER = __symbol__('rejectionHandledHandler');
+ function clearRejectedNoCatch(promise) {
+ if (promise[symbolState] === REJECTED_NO_CATCH) {
+ // if the promise is rejected no catch status
+ // and queue.length > 0, means there is a error handler
+ // here to handle the rejected promise, we should trigger
+ // windows.rejectionhandled eventHandler or nodejs rejectionHandled
+ // eventHandler
+ try {
+ var handler = Zone[REJECTION_HANDLED_HANDLER];
+ if (handler && typeof handler === 'function') {
+ handler.call(this, { rejection: promise[symbolValue], promise: promise });
+ }
+ }
+ catch (err) {
+ }
+ promise[symbolState] = REJECTED;
+ for (var i = 0; i < _uncaughtPromiseErrors.length; i++) {
+ if (promise === _uncaughtPromiseErrors[i].promise) {
+ _uncaughtPromiseErrors.splice(i, 1);
+ }
+ }
+ }
+ }
+ function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) {
+ clearRejectedNoCatch(promise);
+ var promiseState = promise[symbolState];
+ var delegate = promiseState ?
+ (typeof onFulfilled === 'function') ? onFulfilled : forwardResolution :
+ (typeof onRejected === 'function') ? onRejected : forwardRejection;
+ zone.scheduleMicroTask(source, function () {
+ try {
+ var parentPromiseValue = promise[symbolValue];
+ var isFinallyPromise = chainPromise && symbolFinally === chainPromise[symbolFinally];
+ if (isFinallyPromise) {
+ // if the promise is generated from finally call, keep parent promise's state and value
+ chainPromise[symbolParentPromiseValue] = parentPromiseValue;
+ chainPromise[symbolParentPromiseState] = promiseState;
+ }
+ // should not pass value to finally callback
+ var value = zone.run(delegate, undefined, isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution ?
+ [] :
+ [parentPromiseValue]);
+ resolvePromise(chainPromise, true, value);
+ }
+ catch (error) {
+ // if error occurs, should always return this error
+ resolvePromise(chainPromise, false, error);
+ }
+ }, chainPromise);
+ }
+ var ZONE_AWARE_PROMISE_TO_STRING = 'function ZoneAwarePromise() { [native code] }';
+ var ZoneAwarePromise = /** @class */ (function () {
+ function ZoneAwarePromise(executor) {
+ var promise = this;
+ if (!(promise instanceof ZoneAwarePromise)) {
+ throw new Error('Must be an instanceof Promise.');
+ }
+ promise[symbolState] = UNRESOLVED;
+ promise[symbolValue] = []; // queue;
+ try {
+ executor && executor(makeResolver(promise, RESOLVED), makeResolver(promise, REJECTED));
+ }
+ catch (error) {
+ resolvePromise(promise, false, error);
+ }
+ }
+ ZoneAwarePromise.toString = function () {
+ return ZONE_AWARE_PROMISE_TO_STRING;
+ };
+ ZoneAwarePromise.resolve = function (value) {
+ return resolvePromise(new this(null), RESOLVED, value);
+ };
+ ZoneAwarePromise.reject = function (error) {
+ return resolvePromise(new this(null), REJECTED, error);
+ };
+ ZoneAwarePromise.race = function (values) {
+ var e_1, _a;
+ var resolve;
+ var reject;
+ var promise = new this(function (res, rej) {
+ resolve = res;
+ reject = rej;
+ });
+ function onResolve(value) {
+ resolve(value);
+ }
+ function onReject(error) {
+ reject(error);
+ }
+ try {
+ for (var values_1 = __values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) {
+ var value = values_1_1.value;
+ if (!isThenable(value)) {
+ value = this.resolve(value);
+ }
+ value.then(onResolve, onReject);
+ }
+ }
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
+ finally {
+ try {
+ if (values_1_1 && !values_1_1.done && (_a = values_1.return)) _a.call(values_1);
+ }
+ finally { if (e_1) throw e_1.error; }
+ }
+ return promise;
+ };
+ ZoneAwarePromise.all = function (values) {
+ var e_2, _a;
+ var resolve;
+ var reject;
+ var promise = new this(function (res, rej) {
+ resolve = res;
+ reject = rej;
+ });
+ // Start at 2 to prevent prematurely resolving if .then is called immediately.
+ var unresolvedCount = 2;
+ var valueIndex = 0;
+ var resolvedValues = [];
+ var _loop_2 = function (value) {
+ if (!isThenable(value)) {
+ value = this_1.resolve(value);
+ }
+ var curValueIndex = valueIndex;
+ value.then(function (value) {
+ resolvedValues[curValueIndex] = value;
+ unresolvedCount--;
+ if (unresolvedCount === 0) {
+ resolve(resolvedValues);
+ }
+ }, reject);
+ unresolvedCount++;
+ valueIndex++;
+ };
+ var this_1 = this;
+ try {
+ for (var values_2 = __values(values), values_2_1 = values_2.next(); !values_2_1.done; values_2_1 = values_2.next()) {
+ var value = values_2_1.value;
+ _loop_2(value);
+ }
+ }
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
+ finally {
+ try {
+ if (values_2_1 && !values_2_1.done && (_a = values_2.return)) _a.call(values_2);
+ }
+ finally { if (e_2) throw e_2.error; }
+ }
+ // Make the unresolvedCount zero-based again.
+ unresolvedCount -= 2;
+ if (unresolvedCount === 0) {
+ resolve(resolvedValues);
+ }
+ return promise;
+ };
+ Object.defineProperty(ZoneAwarePromise.prototype, Symbol.toStringTag, {
+ get: function () {
+ return 'Promise';
+ },
+ enumerable: true,
+ configurable: true
+ });
+ ZoneAwarePromise.prototype.then = function (onFulfilled, onRejected) {
+ var chainPromise = new this.constructor(null);
+ var zone = Zone.current;
+ if (this[symbolState] == UNRESOLVED) {
+ this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected);
+ }
+ else {
+ scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected);
+ }
+ return chainPromise;
+ };
+ ZoneAwarePromise.prototype.catch = function (onRejected) {
+ return this.then(null, onRejected);
+ };
+ ZoneAwarePromise.prototype.finally = function (onFinally) {
+ var chainPromise = new this.constructor(null);
+ chainPromise[symbolFinally] = symbolFinally;
+ var zone = Zone.current;
+ if (this[symbolState] == UNRESOLVED) {
+ this[symbolValue].push(zone, chainPromise, onFinally, onFinally);
+ }
+ else {
+ scheduleResolveOrReject(this, zone, chainPromise, onFinally, onFinally);
+ }
+ return chainPromise;
+ };
+ return ZoneAwarePromise;
+ }());
+ // Protect against aggressive optimizers dropping seemingly unused properties.
+ // E.g. Closure Compiler in advanced mode.
+ ZoneAwarePromise['resolve'] = ZoneAwarePromise.resolve;
+ ZoneAwarePromise['reject'] = ZoneAwarePromise.reject;
+ ZoneAwarePromise['race'] = ZoneAwarePromise.race;
+ ZoneAwarePromise['all'] = ZoneAwarePromise.all;
+ var NativePromise = global[symbolPromise] = global['Promise'];
+ var ZONE_AWARE_PROMISE = Zone.__symbol__('ZoneAwarePromise');
+ var desc = ObjectGetOwnPropertyDescriptor(global, 'Promise');
+ if (!desc || desc.configurable) {
+ desc && delete desc.writable;
+ desc && delete desc.value;
+ if (!desc) {
+ desc = { configurable: true, enumerable: true };
+ }
+ desc.get = function () {
+ // if we already set ZoneAwarePromise, use patched one
+ // otherwise return native one.
+ return global[ZONE_AWARE_PROMISE] ? global[ZONE_AWARE_PROMISE] : global[symbolPromise];
+ };
+ desc.set = function (NewNativePromise) {
+ if (NewNativePromise === ZoneAwarePromise) {
+ // if the NewNativePromise is ZoneAwarePromise
+ // save to global
+ global[ZONE_AWARE_PROMISE] = NewNativePromise;
+ }
+ else {
+ // if the NewNativePromise is not ZoneAwarePromise
+ // for example: after load zone.js, some library just
+ // set es6-promise to global, if we set it to global
+ // directly, assertZonePatched will fail and angular
+ // will not loaded, so we just set the NewNativePromise
+ // to global[symbolPromise], so the result is just like
+ // we load ES6 Promise before zone.js
+ global[symbolPromise] = NewNativePromise;
+ if (!NewNativePromise.prototype[symbolThen]) {
+ patchThen(NewNativePromise);
+ }
+ api.setNativePromise(NewNativePromise);
+ }
+ };
+ ObjectDefineProperty(global, 'Promise', desc);
+ }
+ global['Promise'] = ZoneAwarePromise;
+ var symbolThenPatched = __symbol__('thenPatched');
+ function patchThen(Ctor) {
+ var proto = Ctor.prototype;
+ var prop = ObjectGetOwnPropertyDescriptor(proto, 'then');
+ if (prop && (prop.writable === false || !prop.configurable)) {
+ // check Ctor.prototype.then propertyDescriptor is writable or not
+ // in meteor env, writable is false, we should ignore such case
+ return;
+ }
+ var originalThen = proto.then;
+ // Keep a reference to the original method.
+ proto[symbolThen] = originalThen;
+ Ctor.prototype.then = function (onResolve, onReject) {
+ var _this = this;
+ var wrapped = new ZoneAwarePromise(function (resolve, reject) {
+ originalThen.call(_this, resolve, reject);
+ });
+ return wrapped.then(onResolve, onReject);
+ };
+ Ctor[symbolThenPatched] = true;
+ }
+ api.patchThen = patchThen;
+ function zoneify(fn) {
+ return function () {
+ var resultPromise = fn.apply(this, arguments);
+ if (resultPromise instanceof ZoneAwarePromise) {
+ return resultPromise;
+ }
+ var ctor = resultPromise.constructor;
+ if (!ctor[symbolThenPatched]) {
+ patchThen(ctor);
+ }
+ return resultPromise;
+ };
+ }
+ if (NativePromise) {
+ patchThen(NativePromise);
+ var fetch_1 = global['fetch'];
+ if (typeof fetch_1 == 'function') {
+ global[api.symbol('fetch')] = fetch_1;
+ global['fetch'] = zoneify(fetch_1);
+ }
+ }
+ // This is not part of public API, but it is useful for tests, so we expose it.
+ Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors;
+ return ZoneAwarePromise;
+});
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Suppress closure compiler errors about unknown 'Zone' variable
+ * @fileoverview
+ * @suppress {undefinedVars,globalThis,missingRequire}
+ */
+// issue #989, to reduce bundle size, use short name
+/** Object.getOwnPropertyDescriptor */
+var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+/** Object.defineProperty */
+var ObjectDefineProperty = Object.defineProperty;
+/** Object.getPrototypeOf */
+var ObjectGetPrototypeOf = Object.getPrototypeOf;
+/** Object.create */
+var ObjectCreate = Object.create;
+/** Array.prototype.slice */
+var ArraySlice = Array.prototype.slice;
+/** addEventListener string const */
+var ADD_EVENT_LISTENER_STR = 'addEventListener';
+/** removeEventListener string const */
+var REMOVE_EVENT_LISTENER_STR = 'removeEventListener';
+/** zoneSymbol addEventListener */
+var ZONE_SYMBOL_ADD_EVENT_LISTENER = Zone.__symbol__(ADD_EVENT_LISTENER_STR);
+/** zoneSymbol removeEventListener */
+var ZONE_SYMBOL_REMOVE_EVENT_LISTENER = Zone.__symbol__(REMOVE_EVENT_LISTENER_STR);
+/** true string const */
+var TRUE_STR = 'true';
+/** false string const */
+var FALSE_STR = 'false';
+/** __zone_symbol__ string const */
+var ZONE_SYMBOL_PREFIX = '__zone_symbol__';
+function wrapWithCurrentZone(callback, source) {
+ return Zone.current.wrap(callback, source);
+}
+function scheduleMacroTaskWithCurrentZone(source, callback, data, customSchedule, customCancel) {
+ return Zone.current.scheduleMacroTask(source, callback, data, customSchedule, customCancel);
+}
+var zoneSymbol = Zone.__symbol__;
+var isWindowExists = typeof window !== 'undefined';
+var internalWindow = isWindowExists ? window : undefined;
+var _global = isWindowExists && internalWindow || typeof self === 'object' && self || global;
+var REMOVE_ATTRIBUTE = 'removeAttribute';
+var NULL_ON_PROP_VALUE = [null];
+function bindArguments(args, source) {
+ for (var i = args.length - 1; i >= 0; i--) {
+ if (typeof args[i] === 'function') {
+ args[i] = wrapWithCurrentZone(args[i], source + '_' + i);
+ }
+ }
+ return args;
+}
+function patchPrototype(prototype, fnNames) {
+ var source = prototype.constructor['name'];
+ var _loop_1 = function (i) {
+ var name_1 = fnNames[i];
+ var delegate = prototype[name_1];
+ if (delegate) {
+ var prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, name_1);
+ if (!isPropertyWritable(prototypeDesc)) {
+ return "continue";
+ }
+ prototype[name_1] = (function (delegate) {
+ var patched = function () {
+ return delegate.apply(this, bindArguments(arguments, source + '.' + name_1));
+ };
+ attachOriginToPatched(patched, delegate);
+ return patched;
+ })(delegate);
+ }
+ };
+ for (var i = 0; i < fnNames.length; i++) {
+ _loop_1(i);
+ }
+}
+function isPropertyWritable(propertyDesc) {
+ if (!propertyDesc) {
+ return true;
+ }
+ if (propertyDesc.writable === false) {
+ return false;
+ }
+ return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined');
+}
+var isWebWorker = (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope);
+// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
+// this code.
+var isNode = (!('nw' in _global) && typeof _global.process !== 'undefined' &&
+ {}.toString.call(_global.process) === '[object process]');
+var isBrowser = !isNode && !isWebWorker && !!(isWindowExists && internalWindow['HTMLElement']);
+// we are in electron of nw, so we are both browser and nodejs
+// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
+// this code.
+var isMix = typeof _global.process !== 'undefined' &&
+ {}.toString.call(_global.process) === '[object process]' && !isWebWorker &&
+ !!(isWindowExists && internalWindow['HTMLElement']);
+var zoneSymbolEventNames = {};
+var wrapFn = function (event) {
+ // https://github.com/angular/zone.js/issues/911, in IE, sometimes
+ // event will be undefined, so we need to use window.event
+ event = event || _global.event;
+ if (!event) {
+ return;
+ }
+ var eventNameSymbol = zoneSymbolEventNames[event.type];
+ if (!eventNameSymbol) {
+ eventNameSymbol = zoneSymbolEventNames[event.type] = zoneSymbol('ON_PROPERTY' + event.type);
+ }
+ var target = this || event.target || _global;
+ var listener = target[eventNameSymbol];
+ var result;
+ if (isBrowser && target === internalWindow && event.type === 'error') {
+ // window.onerror have different signiture
+ // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror#window.onerror
+ // and onerror callback will prevent default when callback return true
+ var errorEvent = event;
+ result = listener &&
+ listener.call(this, errorEvent.message, errorEvent.filename, errorEvent.lineno, errorEvent.colno, errorEvent.error);
+ if (result === true) {
+ event.preventDefault();
+ }
+ }
+ else {
+ result = listener && listener.apply(this, arguments);
+ if (result != undefined && !result) {
+ event.preventDefault();
+ }
+ }
+ return result;
+};
+function patchProperty(obj, prop, prototype) {
+ var desc = ObjectGetOwnPropertyDescriptor(obj, prop);
+ if (!desc && prototype) {
+ // when patch window object, use prototype to check prop exist or not
+ var prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, prop);
+ if (prototypeDesc) {
+ desc = { enumerable: true, configurable: true };
+ }
+ }
+ // if the descriptor not exists or is not configurable
+ // just return
+ if (!desc || !desc.configurable) {
+ return;
+ }
+ var onPropPatchedSymbol = zoneSymbol('on' + prop + 'patched');
+ if (obj.hasOwnProperty(onPropPatchedSymbol) && obj[onPropPatchedSymbol]) {
+ return;
+ }
+ // A property descriptor cannot have getter/setter and be writable
+ // deleting the writable and value properties avoids this error:
+ //
+ // TypeError: property descriptors must not specify a value or be writable when a
+ // getter or setter has been specified
+ delete desc.writable;
+ delete desc.value;
+ var originalDescGet = desc.get;
+ var originalDescSet = desc.set;
+ // substr(2) cuz 'onclick' -> 'click', etc
+ var eventName = prop.substr(2);
+ var eventNameSymbol = zoneSymbolEventNames[eventName];
+ if (!eventNameSymbol) {
+ eventNameSymbol = zoneSymbolEventNames[eventName] = zoneSymbol('ON_PROPERTY' + eventName);
+ }
+ desc.set = function (newValue) {
+ // in some of windows's onproperty callback, this is undefined
+ // so we need to check it
+ var target = this;
+ if (!target && obj === _global) {
+ target = _global;
+ }
+ if (!target) {
+ return;
+ }
+ var previousValue = target[eventNameSymbol];
+ if (previousValue) {
+ target.removeEventListener(eventName, wrapFn);
+ }
+ // issue #978, when onload handler was added before loading zone.js
+ // we should remove it with originalDescSet
+ if (originalDescSet) {
+ originalDescSet.apply(target, NULL_ON_PROP_VALUE);
+ }
+ if (typeof newValue === 'function') {
+ target[eventNameSymbol] = newValue;
+ target.addEventListener(eventName, wrapFn, false);
+ }
+ else {
+ target[eventNameSymbol] = null;
+ }
+ };
+ // The getter would return undefined for unassigned properties but the default value of an
+ // unassigned property is null
+ desc.get = function () {
+ // in some of windows's onproperty callback, this is undefined
+ // so we need to check it
+ var target = this;
+ if (!target && obj === _global) {
+ target = _global;
+ }
+ if (!target) {
+ return null;
+ }
+ var listener = target[eventNameSymbol];
+ if (listener) {
+ return listener;
+ }
+ else if (originalDescGet) {
+ // result will be null when use inline event attribute,
+ // such as
+ // because the onclick function is internal raw uncompiled handler
+ // the onclick will be evaluated when first time event was triggered or
+ // the property is accessed, https://github.com/angular/zone.js/issues/525
+ // so we should use original native get to retrieve the handler
+ var value = originalDescGet && originalDescGet.call(this);
+ if (value) {
+ desc.set.call(this, value);
+ if (typeof target[REMOVE_ATTRIBUTE] === 'function') {
+ target.removeAttribute(prop);
+ }
+ return value;
+ }
+ }
+ return null;
+ };
+ ObjectDefineProperty(obj, prop, desc);
+ obj[onPropPatchedSymbol] = true;
+}
+function patchOnProperties(obj, properties, prototype) {
+ if (properties) {
+ for (var i = 0; i < properties.length; i++) {
+ patchProperty(obj, 'on' + properties[i], prototype);
+ }
+ }
+ else {
+ var onProperties = [];
+ for (var prop in obj) {
+ if (prop.substr(0, 2) == 'on') {
+ onProperties.push(prop);
+ }
+ }
+ for (var j = 0; j < onProperties.length; j++) {
+ patchProperty(obj, onProperties[j], prototype);
+ }
+ }
+}
+var originalInstanceKey = zoneSymbol('originalInstance');
+// wrap some native API on `window`
+function patchClass(className) {
+ var OriginalClass = _global[className];
+ if (!OriginalClass)
+ return;
+ // keep original class in global
+ _global[zoneSymbol(className)] = OriginalClass;
+ _global[className] = function () {
+ var a = bindArguments(arguments, className);
+ switch (a.length) {
+ case 0:
+ this[originalInstanceKey] = new OriginalClass();
+ break;
+ case 1:
+ this[originalInstanceKey] = new OriginalClass(a[0]);
+ break;
+ case 2:
+ this[originalInstanceKey] = new OriginalClass(a[0], a[1]);
+ break;
+ case 3:
+ this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2]);
+ break;
+ case 4:
+ this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2], a[3]);
+ break;
+ default:
+ throw new Error('Arg list too long.');
+ }
+ };
+ // attach original delegate to patched function
+ attachOriginToPatched(_global[className], OriginalClass);
+ var instance = new OriginalClass(function () { });
+ var prop;
+ for (prop in instance) {
+ // https://bugs.webkit.org/show_bug.cgi?id=44721
+ if (className === 'XMLHttpRequest' && prop === 'responseBlob')
+ continue;
+ (function (prop) {
+ if (typeof instance[prop] === 'function') {
+ _global[className].prototype[prop] = function () {
+ return this[originalInstanceKey][prop].apply(this[originalInstanceKey], arguments);
+ };
+ }
+ else {
+ ObjectDefineProperty(_global[className].prototype, prop, {
+ set: function (fn) {
+ if (typeof fn === 'function') {
+ this[originalInstanceKey][prop] = wrapWithCurrentZone(fn, className + '.' + prop);
+ // keep callback in wrapped function so we can
+ // use it in Function.prototype.toString to return
+ // the native one.
+ attachOriginToPatched(this[originalInstanceKey][prop], fn);
+ }
+ else {
+ this[originalInstanceKey][prop] = fn;
+ }
+ },
+ get: function () {
+ return this[originalInstanceKey][prop];
+ }
+ });
+ }
+ }(prop));
+ }
+ for (prop in OriginalClass) {
+ if (prop !== 'prototype' && OriginalClass.hasOwnProperty(prop)) {
+ _global[className][prop] = OriginalClass[prop];
+ }
+ }
+}
+function copySymbolProperties(src, dest) {
+ if (typeof Object.getOwnPropertySymbols !== 'function') {
+ return;
+ }
+ var symbols = Object.getOwnPropertySymbols(src);
+ symbols.forEach(function (symbol) {
+ var desc = Object.getOwnPropertyDescriptor(src, symbol);
+ Object.defineProperty(dest, symbol, {
+ get: function () {
+ return src[symbol];
+ },
+ set: function (value) {
+ if (desc && (!desc.writable || typeof desc.set !== 'function')) {
+ // if src[symbol] is not writable or not have a setter, just return
+ return;
+ }
+ src[symbol] = value;
+ },
+ enumerable: desc ? desc.enumerable : true,
+ configurable: desc ? desc.configurable : true
+ });
+ });
+}
+var shouldCopySymbolProperties = false;
+
+function patchMethod(target, name, patchFn) {
+ var proto = target;
+ while (proto && !proto.hasOwnProperty(name)) {
+ proto = ObjectGetPrototypeOf(proto);
+ }
+ if (!proto && target[name]) {
+ // somehow we did not find it, but we can see it. This happens on IE for Window properties.
+ proto = target;
+ }
+ var delegateName = zoneSymbol(name);
+ var delegate = null;
+ if (proto && !(delegate = proto[delegateName])) {
+ delegate = proto[delegateName] = proto[name];
+ // check whether proto[name] is writable
+ // some property is readonly in safari, such as HtmlCanvasElement.prototype.toBlob
+ var desc = proto && ObjectGetOwnPropertyDescriptor(proto, name);
+ if (isPropertyWritable(desc)) {
+ var patchDelegate_1 = patchFn(delegate, delegateName, name);
+ proto[name] = function () {
+ return patchDelegate_1(this, arguments);
+ };
+ attachOriginToPatched(proto[name], delegate);
+ if (shouldCopySymbolProperties) {
+ copySymbolProperties(delegate, proto[name]);
+ }
+ }
+ }
+ return delegate;
+}
+// TODO: @JiaLiPassion, support cancel task later if necessary
+function patchMacroTask(obj, funcName, metaCreator) {
+ var setNative = null;
+ function scheduleTask(task) {
+ var data = task.data;
+ data.args[data.cbIdx] = function () {
+ task.invoke.apply(this, arguments);
+ };
+ setNative.apply(data.target, data.args);
+ return task;
+ }
+ setNative = patchMethod(obj, funcName, function (delegate) { return function (self, args) {
+ var meta = metaCreator(self, args);
+ if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') {
+ return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask);
+ }
+ else {
+ // cause an error by calling it directly.
+ return delegate.apply(self, args);
+ }
+ }; });
+}
+
+function attachOriginToPatched(patched, original) {
+ patched[zoneSymbol('OriginalDelegate')] = original;
+}
+var isDetectedIEOrEdge = false;
+var ieOrEdge = false;
+function isIE() {
+ try {
+ var ua = internalWindow.navigator.userAgent;
+ if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1) {
+ return true;
+ }
+ }
+ catch (error) {
+ }
+ return false;
+}
+function isIEOrEdge() {
+ if (isDetectedIEOrEdge) {
+ return ieOrEdge;
+ }
+ isDetectedIEOrEdge = true;
+ try {
+ var ua = internalWindow.navigator.userAgent;
+ if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1 || ua.indexOf('Edge/') !== -1) {
+ ieOrEdge = true;
+ }
+ }
+ catch (error) {
+ }
+ return ieOrEdge;
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// override Function.prototype.toString to make zone.js patched function
+// look like native function
+Zone.__load_patch('toString', function (global) {
+ // patch Func.prototype.toString to let them look like native
+ var originalFunctionToString = Function.prototype.toString;
+ var ORIGINAL_DELEGATE_SYMBOL = zoneSymbol('OriginalDelegate');
+ var PROMISE_SYMBOL = zoneSymbol('Promise');
+ var ERROR_SYMBOL = zoneSymbol('Error');
+ var newFunctionToString = function toString() {
+ if (typeof this === 'function') {
+ var originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
+ if (originalDelegate) {
+ if (typeof originalDelegate === 'function') {
+ return originalFunctionToString.call(originalDelegate);
+ }
+ else {
+ return Object.prototype.toString.call(originalDelegate);
+ }
+ }
+ if (this === Promise) {
+ var nativePromise = global[PROMISE_SYMBOL];
+ if (nativePromise) {
+ return originalFunctionToString.call(nativePromise);
+ }
+ }
+ if (this === Error) {
+ var nativeError = global[ERROR_SYMBOL];
+ if (nativeError) {
+ return originalFunctionToString.call(nativeError);
+ }
+ }
+ }
+ return originalFunctionToString.call(this);
+ };
+ newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
+ Function.prototype.toString = newFunctionToString;
+ // patch Object.prototype.toString to let them look like native
+ var originalObjectToString = Object.prototype.toString;
+ var PROMISE_OBJECT_TO_STRING = '[object Promise]';
+ Object.prototype.toString = function () {
+ if (this instanceof Promise) {
+ return PROMISE_OBJECT_TO_STRING;
+ }
+ return originalObjectToString.call(this);
+ };
+});
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {missingRequire}
+ */
+var passiveSupported = false;
+if (typeof window !== 'undefined') {
+ try {
+ var options = Object.defineProperty({}, 'passive', {
+ get: function () {
+ passiveSupported = true;
+ }
+ });
+ window.addEventListener('test', options, options);
+ window.removeEventListener('test', options, options);
+ }
+ catch (err) {
+ passiveSupported = false;
+ }
+}
+// an identifier to tell ZoneTask do not create a new invoke closure
+var OPTIMIZED_ZONE_EVENT_TASK_DATA = {
+ useG: true
+};
+var zoneSymbolEventNames$1 = {};
+var globalSources = {};
+var EVENT_NAME_SYMBOL_REGX = /^__zone_symbol__(\w+)(true|false)$/;
+var IMMEDIATE_PROPAGATION_SYMBOL = ('__zone_symbol__propagationStopped');
+function patchEventTarget(_global, apis, patchOptions) {
+ var ADD_EVENT_LISTENER = (patchOptions && patchOptions.add) || ADD_EVENT_LISTENER_STR;
+ var REMOVE_EVENT_LISTENER = (patchOptions && patchOptions.rm) || REMOVE_EVENT_LISTENER_STR;
+ var LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.listeners) || 'eventListeners';
+ var REMOVE_ALL_LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.rmAll) || 'removeAllListeners';
+ var zoneSymbolAddEventListener = zoneSymbol(ADD_EVENT_LISTENER);
+ var ADD_EVENT_LISTENER_SOURCE = '.' + ADD_EVENT_LISTENER + ':';
+ var PREPEND_EVENT_LISTENER = 'prependListener';
+ var PREPEND_EVENT_LISTENER_SOURCE = '.' + PREPEND_EVENT_LISTENER + ':';
+ var invokeTask = function (task, target, event) {
+ // for better performance, check isRemoved which is set
+ // by removeEventListener
+ if (task.isRemoved) {
+ return;
+ }
+ var delegate = task.callback;
+ if (typeof delegate === 'object' && delegate.handleEvent) {
+ // create the bind version of handleEvent when invoke
+ task.callback = function (event) { return delegate.handleEvent(event); };
+ task.originalDelegate = delegate;
+ }
+ // invoke static task.invoke
+ task.invoke(task, target, [event]);
+ var options = task.options;
+ if (options && typeof options === 'object' && options.once) {
+ // if options.once is true, after invoke once remove listener here
+ // only browser need to do this, nodejs eventEmitter will cal removeListener
+ // inside EventEmitter.once
+ var delegate_1 = task.originalDelegate ? task.originalDelegate : task.callback;
+ target[REMOVE_EVENT_LISTENER].call(target, event.type, delegate_1, options);
+ }
+ };
+ // global shared zoneAwareCallback to handle all event callback with capture = false
+ var globalZoneAwareCallback = function (event) {
+ // https://github.com/angular/zone.js/issues/911, in IE, sometimes
+ // event will be undefined, so we need to use window.event
+ event = event || _global.event;
+ if (!event) {
+ return;
+ }
+ // event.target is needed for Samsung TV and SourceBuffer
+ // || global is needed https://github.com/angular/zone.js/issues/190
+ var target = this || event.target || _global;
+ var tasks = target[zoneSymbolEventNames$1[event.type][FALSE_STR]];
+ if (tasks) {
+ // invoke all tasks which attached to current target with given event.type and capture = false
+ // for performance concern, if task.length === 1, just invoke
+ if (tasks.length === 1) {
+ invokeTask(tasks[0], target, event);
+ }
+ else {
+ // https://github.com/angular/zone.js/issues/836
+ // copy the tasks array before invoke, to avoid
+ // the callback will remove itself or other listener
+ var copyTasks = tasks.slice();
+ for (var i = 0; i < copyTasks.length; i++) {
+ if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
+ break;
+ }
+ invokeTask(copyTasks[i], target, event);
+ }
+ }
+ }
+ };
+ // global shared zoneAwareCallback to handle all event callback with capture = true
+ var globalZoneAwareCaptureCallback = function (event) {
+ // https://github.com/angular/zone.js/issues/911, in IE, sometimes
+ // event will be undefined, so we need to use window.event
+ event = event || _global.event;
+ if (!event) {
+ return;
+ }
+ // event.target is needed for Samsung TV and SourceBuffer
+ // || global is needed https://github.com/angular/zone.js/issues/190
+ var target = this || event.target || _global;
+ var tasks = target[zoneSymbolEventNames$1[event.type][TRUE_STR]];
+ if (tasks) {
+ // invoke all tasks which attached to current target with given event.type and capture = false
+ // for performance concern, if task.length === 1, just invoke
+ if (tasks.length === 1) {
+ invokeTask(tasks[0], target, event);
+ }
+ else {
+ // https://github.com/angular/zone.js/issues/836
+ // copy the tasks array before invoke, to avoid
+ // the callback will remove itself or other listener
+ var copyTasks = tasks.slice();
+ for (var i = 0; i < copyTasks.length; i++) {
+ if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
+ break;
+ }
+ invokeTask(copyTasks[i], target, event);
+ }
+ }
+ }
+ };
+ function patchEventTargetMethods(obj, patchOptions) {
+ if (!obj) {
+ return false;
+ }
+ var useGlobalCallback = true;
+ if (patchOptions && patchOptions.useG !== undefined) {
+ useGlobalCallback = patchOptions.useG;
+ }
+ var validateHandler = patchOptions && patchOptions.vh;
+ var checkDuplicate = true;
+ if (patchOptions && patchOptions.chkDup !== undefined) {
+ checkDuplicate = patchOptions.chkDup;
+ }
+ var returnTarget = false;
+ if (patchOptions && patchOptions.rt !== undefined) {
+ returnTarget = patchOptions.rt;
+ }
+ var proto = obj;
+ while (proto && !proto.hasOwnProperty(ADD_EVENT_LISTENER)) {
+ proto = ObjectGetPrototypeOf(proto);
+ }
+ if (!proto && obj[ADD_EVENT_LISTENER]) {
+ // somehow we did not find it, but we can see it. This happens on IE for Window properties.
+ proto = obj;
+ }
+ if (!proto) {
+ return false;
+ }
+ if (proto[zoneSymbolAddEventListener]) {
+ return false;
+ }
+ var eventNameToString = patchOptions && patchOptions.eventNameToString;
+ // a shared global taskData to pass data for scheduleEventTask
+ // so we do not need to create a new object just for pass some data
+ var taskData = {};
+ var nativeAddEventListener = proto[zoneSymbolAddEventListener] = proto[ADD_EVENT_LISTENER];
+ var nativeRemoveEventListener = proto[zoneSymbol(REMOVE_EVENT_LISTENER)] =
+ proto[REMOVE_EVENT_LISTENER];
+ var nativeListeners = proto[zoneSymbol(LISTENERS_EVENT_LISTENER)] =
+ proto[LISTENERS_EVENT_LISTENER];
+ var nativeRemoveAllListeners = proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)] =
+ proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER];
+ var nativePrependEventListener;
+ if (patchOptions && patchOptions.prepend) {
+ nativePrependEventListener = proto[zoneSymbol(patchOptions.prepend)] =
+ proto[patchOptions.prepend];
+ }
+ function checkIsPassive(task) {
+ if (!passiveSupported && typeof taskData.options !== 'boolean' &&
+ typeof taskData.options !== 'undefined' && taskData.options !== null) {
+ // options is a non-null non-undefined object
+ // passive is not supported
+ // don't pass options as object
+ // just pass capture as a boolean
+ task.options = !!taskData.options.capture;
+ taskData.options = task.options;
+ }
+ }
+ var customScheduleGlobal = function (task) {
+ // if there is already a task for the eventName + capture,
+ // just return, because we use the shared globalZoneAwareCallback here.
+ if (taskData.isExisting) {
+ return;
+ }
+ checkIsPassive(task);
+ return nativeAddEventListener.call(taskData.target, taskData.eventName, taskData.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, taskData.options);
+ };
+ var customCancelGlobal = function (task) {
+ // if task is not marked as isRemoved, this call is directly
+ // from Zone.prototype.cancelTask, we should remove the task
+ // from tasksList of target first
+ if (!task.isRemoved) {
+ var symbolEventNames = zoneSymbolEventNames$1[task.eventName];
+ var symbolEventName = void 0;
+ if (symbolEventNames) {
+ symbolEventName = symbolEventNames[task.capture ? TRUE_STR : FALSE_STR];
+ }
+ var existingTasks = symbolEventName && task.target[symbolEventName];
+ if (existingTasks) {
+ for (var i = 0; i < existingTasks.length; i++) {
+ var existingTask = existingTasks[i];
+ if (existingTask === task) {
+ existingTasks.splice(i, 1);
+ // set isRemoved to data for faster invokeTask check
+ task.isRemoved = true;
+ if (existingTasks.length === 0) {
+ // all tasks for the eventName + capture have gone,
+ // remove globalZoneAwareCallback and remove the task cache from target
+ task.allRemoved = true;
+ task.target[symbolEventName] = null;
+ }
+ break;
+ }
+ }
+ }
+ }
+ // if all tasks for the eventName + capture have gone,
+ // we will really remove the global event callback,
+ // if not, return
+ if (!task.allRemoved) {
+ return;
+ }
+ return nativeRemoveEventListener.call(task.target, task.eventName, task.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, task.options);
+ };
+ var customScheduleNonGlobal = function (task) {
+ checkIsPassive(task);
+ return nativeAddEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
+ };
+ var customSchedulePrepend = function (task) {
+ return nativePrependEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
+ };
+ var customCancelNonGlobal = function (task) {
+ return nativeRemoveEventListener.call(task.target, task.eventName, task.invoke, task.options);
+ };
+ var customSchedule = useGlobalCallback ? customScheduleGlobal : customScheduleNonGlobal;
+ var customCancel = useGlobalCallback ? customCancelGlobal : customCancelNonGlobal;
+ var compareTaskCallbackVsDelegate = function (task, delegate) {
+ var typeOfDelegate = typeof delegate;
+ return (typeOfDelegate === 'function' && task.callback === delegate) ||
+ (typeOfDelegate === 'object' && task.originalDelegate === delegate);
+ };
+ var compare = (patchOptions && patchOptions.diff) ? patchOptions.diff : compareTaskCallbackVsDelegate;
+ var blackListedEvents = Zone[Zone.__symbol__('BLACK_LISTED_EVENTS')];
+ var makeAddListener = function (nativeListener, addSource, customScheduleFn, customCancelFn, returnTarget, prepend) {
+ if (returnTarget === void 0) { returnTarget = false; }
+ if (prepend === void 0) { prepend = false; }
+ return function () {
+ var target = this || _global;
+ var eventName = arguments[0];
+ var delegate = arguments[1];
+ if (!delegate) {
+ return nativeListener.apply(this, arguments);
+ }
+ if (isNode && eventName === 'uncaughtException') {
+ // don't patch uncaughtException of nodejs to prevent endless loop
+ return nativeListener.apply(this, arguments);
+ }
+ // don't create the bind delegate function for handleEvent
+ // case here to improve addEventListener performance
+ // we will create the bind delegate when invoke
+ var isHandleEvent = false;
+ if (typeof delegate !== 'function') {
+ if (!delegate.handleEvent) {
+ return nativeListener.apply(this, arguments);
+ }
+ isHandleEvent = true;
+ }
+ if (validateHandler && !validateHandler(nativeListener, delegate, target, arguments)) {
+ return;
+ }
+ var options = arguments[2];
+ if (blackListedEvents) {
+ // check black list
+ for (var i = 0; i < blackListedEvents.length; i++) {
+ if (eventName === blackListedEvents[i]) {
+ return nativeListener.apply(this, arguments);
+ }
+ }
+ }
+ var capture;
+ var once = false;
+ if (options === undefined) {
+ capture = false;
+ }
+ else if (options === true) {
+ capture = true;
+ }
+ else if (options === false) {
+ capture = false;
+ }
+ else {
+ capture = options ? !!options.capture : false;
+ once = options ? !!options.once : false;
+ }
+ var zone = Zone.current;
+ var symbolEventNames = zoneSymbolEventNames$1[eventName];
+ var symbolEventName;
+ if (!symbolEventNames) {
+ // the code is duplicate, but I just want to get some better performance
+ var falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
+ var trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
+ var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
+ var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
+ zoneSymbolEventNames$1[eventName] = {};
+ zoneSymbolEventNames$1[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames$1[eventName][TRUE_STR] = symbolCapture;
+ symbolEventName = capture ? symbolCapture : symbol;
+ }
+ else {
+ symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
+ }
+ var existingTasks = target[symbolEventName];
+ var isExisting = false;
+ if (existingTasks) {
+ // already have task registered
+ isExisting = true;
+ if (checkDuplicate) {
+ for (var i = 0; i < existingTasks.length; i++) {
+ if (compare(existingTasks[i], delegate)) {
+ // same callback, same capture, same event name, just return
+ return;
+ }
+ }
+ }
+ }
+ else {
+ existingTasks = target[symbolEventName] = [];
+ }
+ var source;
+ var constructorName = target.constructor['name'];
+ var targetSource = globalSources[constructorName];
+ if (targetSource) {
+ source = targetSource[eventName];
+ }
+ if (!source) {
+ source = constructorName + addSource +
+ (eventNameToString ? eventNameToString(eventName) : eventName);
+ }
+ // do not create a new object as task.data to pass those things
+ // just use the global shared one
+ taskData.options = options;
+ if (once) {
+ // if addEventListener with once options, we don't pass it to
+ // native addEventListener, instead we keep the once setting
+ // and handle ourselves.
+ taskData.options.once = false;
+ }
+ taskData.target = target;
+ taskData.capture = capture;
+ taskData.eventName = eventName;
+ taskData.isExisting = isExisting;
+ var data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : undefined;
+ // keep taskData into data to allow onScheduleEventTask to access the task information
+ if (data) {
+ data.taskData = taskData;
+ }
+ var task = zone.scheduleEventTask(source, delegate, data, customScheduleFn, customCancelFn);
+ // should clear taskData.target to avoid memory leak
+ // issue, https://github.com/angular/angular/issues/20442
+ taskData.target = null;
+ // need to clear up taskData because it is a global object
+ if (data) {
+ data.taskData = null;
+ }
+ // have to save those information to task in case
+ // application may call task.zone.cancelTask() directly
+ if (once) {
+ options.once = true;
+ }
+ if (!(!passiveSupported && typeof task.options === 'boolean')) {
+ // if not support passive, and we pass an option object
+ // to addEventListener, we should save the options to task
+ task.options = options;
+ }
+ task.target = target;
+ task.capture = capture;
+ task.eventName = eventName;
+ if (isHandleEvent) {
+ // save original delegate for compare to check duplicate
+ task.originalDelegate = delegate;
+ }
+ if (!prepend) {
+ existingTasks.push(task);
+ }
+ else {
+ existingTasks.unshift(task);
+ }
+ if (returnTarget) {
+ return target;
+ }
+ };
+ };
+ proto[ADD_EVENT_LISTENER] = makeAddListener(nativeAddEventListener, ADD_EVENT_LISTENER_SOURCE, customSchedule, customCancel, returnTarget);
+ if (nativePrependEventListener) {
+ proto[PREPEND_EVENT_LISTENER] = makeAddListener(nativePrependEventListener, PREPEND_EVENT_LISTENER_SOURCE, customSchedulePrepend, customCancel, returnTarget, true);
+ }
+ proto[REMOVE_EVENT_LISTENER] = function () {
+ var target = this || _global;
+ var eventName = arguments[0];
+ var options = arguments[2];
+ var capture;
+ if (options === undefined) {
+ capture = false;
+ }
+ else if (options === true) {
+ capture = true;
+ }
+ else if (options === false) {
+ capture = false;
+ }
+ else {
+ capture = options ? !!options.capture : false;
+ }
+ var delegate = arguments[1];
+ if (!delegate) {
+ return nativeRemoveEventListener.apply(this, arguments);
+ }
+ if (validateHandler &&
+ !validateHandler(nativeRemoveEventListener, delegate, target, arguments)) {
+ return;
+ }
+ var symbolEventNames = zoneSymbolEventNames$1[eventName];
+ var symbolEventName;
+ if (symbolEventNames) {
+ symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
+ }
+ var existingTasks = symbolEventName && target[symbolEventName];
+ if (existingTasks) {
+ for (var i = 0; i < existingTasks.length; i++) {
+ var existingTask = existingTasks[i];
+ if (compare(existingTask, delegate)) {
+ existingTasks.splice(i, 1);
+ // set isRemoved to data for faster invokeTask check
+ existingTask.isRemoved = true;
+ if (existingTasks.length === 0) {
+ // all tasks for the eventName + capture have gone,
+ // remove globalZoneAwareCallback and remove the task cache from target
+ existingTask.allRemoved = true;
+ target[symbolEventName] = null;
+ }
+ existingTask.zone.cancelTask(existingTask);
+ if (returnTarget) {
+ return target;
+ }
+ return;
+ }
+ }
+ }
+ // issue 930, didn't find the event name or callback
+ // from zone kept existingTasks, the callback maybe
+ // added outside of zone, we need to call native removeEventListener
+ // to try to remove it.
+ return nativeRemoveEventListener.apply(this, arguments);
+ };
+ proto[LISTENERS_EVENT_LISTENER] = function () {
+ var target = this || _global;
+ var eventName = arguments[0];
+ var listeners = [];
+ var tasks = findEventTasks(target, eventNameToString ? eventNameToString(eventName) : eventName);
+ for (var i = 0; i < tasks.length; i++) {
+ var task = tasks[i];
+ var delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+ listeners.push(delegate);
+ }
+ return listeners;
+ };
+ proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER] = function () {
+ var target = this || _global;
+ var eventName = arguments[0];
+ if (!eventName) {
+ var keys = Object.keys(target);
+ for (var i = 0; i < keys.length; i++) {
+ var prop = keys[i];
+ var match = EVENT_NAME_SYMBOL_REGX.exec(prop);
+ var evtName = match && match[1];
+ // in nodejs EventEmitter, removeListener event is
+ // used for monitoring the removeListener call,
+ // so just keep removeListener eventListener until
+ // all other eventListeners are removed
+ if (evtName && evtName !== 'removeListener') {
+ this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, evtName);
+ }
+ }
+ // remove removeListener listener finally
+ this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, 'removeListener');
+ }
+ else {
+ var symbolEventNames = zoneSymbolEventNames$1[eventName];
+ if (symbolEventNames) {
+ var symbolEventName = symbolEventNames[FALSE_STR];
+ var symbolCaptureEventName = symbolEventNames[TRUE_STR];
+ var tasks = target[symbolEventName];
+ var captureTasks = target[symbolCaptureEventName];
+ if (tasks) {
+ var removeTasks = tasks.slice();
+ for (var i = 0; i < removeTasks.length; i++) {
+ var task = removeTasks[i];
+ var delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+ this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
+ }
+ }
+ if (captureTasks) {
+ var removeTasks = captureTasks.slice();
+ for (var i = 0; i < removeTasks.length; i++) {
+ var task = removeTasks[i];
+ var delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+ this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
+ }
+ }
+ }
+ }
+ if (returnTarget) {
+ return this;
+ }
+ };
+ // for native toString patch
+ attachOriginToPatched(proto[ADD_EVENT_LISTENER], nativeAddEventListener);
+ attachOriginToPatched(proto[REMOVE_EVENT_LISTENER], nativeRemoveEventListener);
+ if (nativeRemoveAllListeners) {
+ attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER], nativeRemoveAllListeners);
+ }
+ if (nativeListeners) {
+ attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER], nativeListeners);
+ }
+ return true;
+ }
+ var results = [];
+ for (var i = 0; i < apis.length; i++) {
+ results[i] = patchEventTargetMethods(apis[i], patchOptions);
+ }
+ return results;
+}
+function findEventTasks(target, eventName) {
+ var foundTasks = [];
+ for (var prop in target) {
+ var match = EVENT_NAME_SYMBOL_REGX.exec(prop);
+ var evtName = match && match[1];
+ if (evtName && (!eventName || evtName === eventName)) {
+ var tasks = target[prop];
+ if (tasks) {
+ for (var i = 0; i < tasks.length; i++) {
+ foundTasks.push(tasks[i]);
+ }
+ }
+ }
+ }
+ return foundTasks;
+}
+function patchEventPrototype(global, api) {
+ var Event = global['Event'];
+ if (Event && Event.prototype) {
+ api.patchMethod(Event.prototype, 'stopImmediatePropagation', function (delegate) { return function (self, args) {
+ self[IMMEDIATE_PROPAGATION_SYMBOL] = true;
+ // we need to call the native stopImmediatePropagation
+ // in case in some hybrid application, some part of
+ // application will be controlled by zone, some are not
+ delegate && delegate.apply(self, args);
+ }; });
+ }
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function patchCallbacks(api, target, targetName, method, callbacks) {
+ var symbol = Zone.__symbol__(method);
+ if (target[symbol]) {
+ return;
+ }
+ var nativeDelegate = target[symbol] = target[method];
+ target[method] = function (name, opts, options) {
+ if (opts && opts.prototype) {
+ callbacks.forEach(function (callback) {
+ var source = targetName + "." + method + "::" + callback;
+ var prototype = opts.prototype;
+ if (prototype.hasOwnProperty(callback)) {
+ var descriptor = api.ObjectGetOwnPropertyDescriptor(prototype, callback);
+ if (descriptor && descriptor.value) {
+ descriptor.value = api.wrapWithCurrentZone(descriptor.value, source);
+ api._redefineProperty(opts.prototype, callback, descriptor);
+ }
+ else if (prototype[callback]) {
+ prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
+ }
+ }
+ else if (prototype[callback]) {
+ prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
+ }
+ });
+ }
+ return nativeDelegate.call(target, name, opts, options);
+ };
+ api.attachOriginToPatched(target[method], nativeDelegate);
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/*
+ * This is necessary for Chrome and Chrome mobile, to enable
+ * things like redefining `createdCallback` on an element.
+ */
+var zoneSymbol$1 = Zone.__symbol__;
+var _defineProperty = Object[zoneSymbol$1('defineProperty')] = Object.defineProperty;
+var _getOwnPropertyDescriptor = Object[zoneSymbol$1('getOwnPropertyDescriptor')] =
+ Object.getOwnPropertyDescriptor;
+var _create = Object.create;
+var unconfigurablesKey = zoneSymbol$1('unconfigurables');
+function propertyPatch() {
+ Object.defineProperty = function (obj, prop, desc) {
+ if (isUnconfigurable(obj, prop)) {
+ throw new TypeError('Cannot assign to read only property \'' + prop + '\' of ' + obj);
+ }
+ var originalConfigurableFlag = desc.configurable;
+ if (prop !== 'prototype') {
+ desc = rewriteDescriptor(obj, prop, desc);
+ }
+ return _tryDefineProperty(obj, prop, desc, originalConfigurableFlag);
+ };
+ Object.defineProperties = function (obj, props) {
+ Object.keys(props).forEach(function (prop) {
+ Object.defineProperty(obj, prop, props[prop]);
+ });
+ return obj;
+ };
+ Object.create = function (obj, proto) {
+ if (typeof proto === 'object' && !Object.isFrozen(proto)) {
+ Object.keys(proto).forEach(function (prop) {
+ proto[prop] = rewriteDescriptor(obj, prop, proto[prop]);
+ });
+ }
+ return _create(obj, proto);
+ };
+ Object.getOwnPropertyDescriptor = function (obj, prop) {
+ var desc = _getOwnPropertyDescriptor(obj, prop);
+ if (desc && isUnconfigurable(obj, prop)) {
+ desc.configurable = false;
+ }
+ return desc;
+ };
+}
+function _redefineProperty(obj, prop, desc) {
+ var originalConfigurableFlag = desc.configurable;
+ desc = rewriteDescriptor(obj, prop, desc);
+ return _tryDefineProperty(obj, prop, desc, originalConfigurableFlag);
+}
+function isUnconfigurable(obj, prop) {
+ return obj && obj[unconfigurablesKey] && obj[unconfigurablesKey][prop];
+}
+function rewriteDescriptor(obj, prop, desc) {
+ // issue-927, if the desc is frozen, don't try to change the desc
+ if (!Object.isFrozen(desc)) {
+ desc.configurable = true;
+ }
+ if (!desc.configurable) {
+ // issue-927, if the obj is frozen, don't try to set the desc to obj
+ if (!obj[unconfigurablesKey] && !Object.isFrozen(obj)) {
+ _defineProperty(obj, unconfigurablesKey, { writable: true, value: {} });
+ }
+ if (obj[unconfigurablesKey]) {
+ obj[unconfigurablesKey][prop] = true;
+ }
+ }
+ return desc;
+}
+function _tryDefineProperty(obj, prop, desc, originalConfigurableFlag) {
+ try {
+ return _defineProperty(obj, prop, desc);
+ }
+ catch (error) {
+ if (desc.configurable) {
+ // In case of errors, when the configurable flag was likely set by rewriteDescriptor(), let's
+ // retry with the original flag value
+ if (typeof originalConfigurableFlag == 'undefined') {
+ delete desc.configurable;
+ }
+ else {
+ desc.configurable = originalConfigurableFlag;
+ }
+ try {
+ return _defineProperty(obj, prop, desc);
+ }
+ catch (error) {
+ var descJson = null;
+ try {
+ descJson = JSON.stringify(desc);
+ }
+ catch (error) {
+ descJson = desc.toString();
+ }
+ console.log("Attempting to configure '" + prop + "' with descriptor '" + descJson + "' on object '" + obj + "' and got error, giving up: " + error);
+ }
+ }
+ else {
+ throw error;
+ }
+ }
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {globalThis}
+ */
+var globalEventHandlersEventNames = [
+ 'abort',
+ 'animationcancel',
+ 'animationend',
+ 'animationiteration',
+ 'auxclick',
+ 'beforeinput',
+ 'blur',
+ 'cancel',
+ 'canplay',
+ 'canplaythrough',
+ 'change',
+ 'compositionstart',
+ 'compositionupdate',
+ 'compositionend',
+ 'cuechange',
+ 'click',
+ 'close',
+ 'contextmenu',
+ 'curechange',
+ 'dblclick',
+ 'drag',
+ 'dragend',
+ 'dragenter',
+ 'dragexit',
+ 'dragleave',
+ 'dragover',
+ 'drop',
+ 'durationchange',
+ 'emptied',
+ 'ended',
+ 'error',
+ 'focus',
+ 'focusin',
+ 'focusout',
+ 'gotpointercapture',
+ 'input',
+ 'invalid',
+ 'keydown',
+ 'keypress',
+ 'keyup',
+ 'load',
+ 'loadstart',
+ 'loadeddata',
+ 'loadedmetadata',
+ 'lostpointercapture',
+ 'mousedown',
+ 'mouseenter',
+ 'mouseleave',
+ 'mousemove',
+ 'mouseout',
+ 'mouseover',
+ 'mouseup',
+ 'mousewheel',
+ 'orientationchange',
+ 'pause',
+ 'play',
+ 'playing',
+ 'pointercancel',
+ 'pointerdown',
+ 'pointerenter',
+ 'pointerleave',
+ 'pointerlockchange',
+ 'mozpointerlockchange',
+ 'webkitpointerlockerchange',
+ 'pointerlockerror',
+ 'mozpointerlockerror',
+ 'webkitpointerlockerror',
+ 'pointermove',
+ 'pointout',
+ 'pointerover',
+ 'pointerup',
+ 'progress',
+ 'ratechange',
+ 'reset',
+ 'resize',
+ 'scroll',
+ 'seeked',
+ 'seeking',
+ 'select',
+ 'selectionchange',
+ 'selectstart',
+ 'show',
+ 'sort',
+ 'stalled',
+ 'submit',
+ 'suspend',
+ 'timeupdate',
+ 'volumechange',
+ 'touchcancel',
+ 'touchmove',
+ 'touchstart',
+ 'touchend',
+ 'transitioncancel',
+ 'transitionend',
+ 'waiting',
+ 'wheel'
+];
+var documentEventNames = [
+ 'afterscriptexecute', 'beforescriptexecute', 'DOMContentLoaded', 'freeze', 'fullscreenchange',
+ 'mozfullscreenchange', 'webkitfullscreenchange', 'msfullscreenchange', 'fullscreenerror',
+ 'mozfullscreenerror', 'webkitfullscreenerror', 'msfullscreenerror', 'readystatechange',
+ 'visibilitychange', 'resume'
+];
+var windowEventNames = [
+ 'absolutedeviceorientation',
+ 'afterinput',
+ 'afterprint',
+ 'appinstalled',
+ 'beforeinstallprompt',
+ 'beforeprint',
+ 'beforeunload',
+ 'devicelight',
+ 'devicemotion',
+ 'deviceorientation',
+ 'deviceorientationabsolute',
+ 'deviceproximity',
+ 'hashchange',
+ 'languagechange',
+ 'message',
+ 'mozbeforepaint',
+ 'offline',
+ 'online',
+ 'paint',
+ 'pageshow',
+ 'pagehide',
+ 'popstate',
+ 'rejectionhandled',
+ 'storage',
+ 'unhandledrejection',
+ 'unload',
+ 'userproximity',
+ 'vrdisplyconnected',
+ 'vrdisplaydisconnected',
+ 'vrdisplaypresentchange'
+];
+var htmlElementEventNames = [
+ 'beforecopy', 'beforecut', 'beforepaste', 'copy', 'cut', 'paste', 'dragstart', 'loadend',
+ 'animationstart', 'search', 'transitionrun', 'transitionstart', 'webkitanimationend',
+ 'webkitanimationiteration', 'webkitanimationstart', 'webkittransitionend'
+];
+var mediaElementEventNames = ['encrypted', 'waitingforkey', 'msneedkey', 'mozinterruptbegin', 'mozinterruptend'];
+var ieElementEventNames = [
+ 'activate',
+ 'afterupdate',
+ 'ariarequest',
+ 'beforeactivate',
+ 'beforedeactivate',
+ 'beforeeditfocus',
+ 'beforeupdate',
+ 'cellchange',
+ 'controlselect',
+ 'dataavailable',
+ 'datasetchanged',
+ 'datasetcomplete',
+ 'errorupdate',
+ 'filterchange',
+ 'layoutcomplete',
+ 'losecapture',
+ 'move',
+ 'moveend',
+ 'movestart',
+ 'propertychange',
+ 'resizeend',
+ 'resizestart',
+ 'rowenter',
+ 'rowexit',
+ 'rowsdelete',
+ 'rowsinserted',
+ 'command',
+ 'compassneedscalibration',
+ 'deactivate',
+ 'help',
+ 'mscontentzoom',
+ 'msmanipulationstatechanged',
+ 'msgesturechange',
+ 'msgesturedoubletap',
+ 'msgestureend',
+ 'msgesturehold',
+ 'msgesturestart',
+ 'msgesturetap',
+ 'msgotpointercapture',
+ 'msinertiastart',
+ 'mslostpointercapture',
+ 'mspointercancel',
+ 'mspointerdown',
+ 'mspointerenter',
+ 'mspointerhover',
+ 'mspointerleave',
+ 'mspointermove',
+ 'mspointerout',
+ 'mspointerover',
+ 'mspointerup',
+ 'pointerout',
+ 'mssitemodejumplistitemremoved',
+ 'msthumbnailclick',
+ 'stop',
+ 'storagecommit'
+];
+var webglEventNames = ['webglcontextrestored', 'webglcontextlost', 'webglcontextcreationerror'];
+var formEventNames = ['autocomplete', 'autocompleteerror'];
+var detailEventNames = ['toggle'];
+var frameEventNames = ['load'];
+var frameSetEventNames = ['blur', 'error', 'focus', 'load', 'resize', 'scroll', 'messageerror'];
+var marqueeEventNames = ['bounce', 'finish', 'start'];
+var XMLHttpRequestEventNames = [
+ 'loadstart', 'progress', 'abort', 'error', 'load', 'progress', 'timeout', 'loadend',
+ 'readystatechange'
+];
+var IDBIndexEventNames = ['upgradeneeded', 'complete', 'abort', 'success', 'error', 'blocked', 'versionchange', 'close'];
+var websocketEventNames = ['close', 'error', 'open', 'message'];
+var workerEventNames = ['error', 'message'];
+var eventNames = globalEventHandlersEventNames.concat(webglEventNames, formEventNames, detailEventNames, documentEventNames, windowEventNames, htmlElementEventNames, ieElementEventNames);
+function filterProperties(target, onProperties, ignoreProperties) {
+ if (!ignoreProperties || ignoreProperties.length === 0) {
+ return onProperties;
+ }
+ var tip = ignoreProperties.filter(function (ip) { return ip.target === target; });
+ if (!tip || tip.length === 0) {
+ return onProperties;
+ }
+ var targetIgnoreProperties = tip[0].ignoreProperties;
+ return onProperties.filter(function (op) { return targetIgnoreProperties.indexOf(op) === -1; });
+}
+function patchFilteredProperties(target, onProperties, ignoreProperties, prototype) {
+ // check whether target is available, sometimes target will be undefined
+ // because different browser or some 3rd party plugin.
+ if (!target) {
+ return;
+ }
+ var filteredProperties = filterProperties(target, onProperties, ignoreProperties);
+ patchOnProperties(target, filteredProperties, prototype);
+}
+function propertyDescriptorPatch(api, _global) {
+ if (isNode && !isMix) {
+ return;
+ }
+ if (Zone[api.symbol('patchEvents')]) {
+ // events are already been patched by legacy patch.
+ return;
+ }
+ var supportsWebSocket = typeof WebSocket !== 'undefined';
+ var ignoreProperties = _global['__Zone_ignore_on_properties'];
+ // for browsers that we can patch the descriptor: Chrome & Firefox
+ if (isBrowser) {
+ var internalWindow = window;
+ var ignoreErrorProperties = isIE ? [{ target: internalWindow, ignoreProperties: ['error'] }] : [];
+ // in IE/Edge, onProp not exist in window object, but in WindowPrototype
+ // so we need to pass WindowPrototype to check onProp exist or not
+ patchFilteredProperties(internalWindow, eventNames.concat(['messageerror']), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow));
+ patchFilteredProperties(Document.prototype, eventNames, ignoreProperties);
+ if (typeof internalWindow['SVGElement'] !== 'undefined') {
+ patchFilteredProperties(internalWindow['SVGElement'].prototype, eventNames, ignoreProperties);
+ }
+ patchFilteredProperties(Element.prototype, eventNames, ignoreProperties);
+ patchFilteredProperties(HTMLElement.prototype, eventNames, ignoreProperties);
+ patchFilteredProperties(HTMLMediaElement.prototype, mediaElementEventNames, ignoreProperties);
+ patchFilteredProperties(HTMLFrameSetElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
+ patchFilteredProperties(HTMLBodyElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
+ patchFilteredProperties(HTMLFrameElement.prototype, frameEventNames, ignoreProperties);
+ patchFilteredProperties(HTMLIFrameElement.prototype, frameEventNames, ignoreProperties);
+ var HTMLMarqueeElement_1 = internalWindow['HTMLMarqueeElement'];
+ if (HTMLMarqueeElement_1) {
+ patchFilteredProperties(HTMLMarqueeElement_1.prototype, marqueeEventNames, ignoreProperties);
+ }
+ var Worker_1 = internalWindow['Worker'];
+ if (Worker_1) {
+ patchFilteredProperties(Worker_1.prototype, workerEventNames, ignoreProperties);
+ }
+ }
+ patchFilteredProperties(XMLHttpRequest.prototype, XMLHttpRequestEventNames, ignoreProperties);
+ var XMLHttpRequestEventTarget = _global['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget) {
+ patchFilteredProperties(XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype, XMLHttpRequestEventNames, ignoreProperties);
+ }
+ if (typeof IDBIndex !== 'undefined') {
+ patchFilteredProperties(IDBIndex.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBOpenDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBDatabase.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBTransaction.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBCursor.prototype, IDBIndexEventNames, ignoreProperties);
+ }
+ if (supportsWebSocket) {
+ patchFilteredProperties(WebSocket.prototype, websocketEventNames, ignoreProperties);
+ }
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+Zone.__load_patch('util', function (global, Zone, api) {
+ api.patchOnProperties = patchOnProperties;
+ api.patchMethod = patchMethod;
+ api.bindArguments = bindArguments;
+ api.patchMacroTask = patchMacroTask;
+ // In earlier version of zone.js (<0.9.0), we use env name `__zone_symbol__BLACK_LISTED_EVENTS` to
+ // define which events will not be patched by `Zone.js`.
+ // In newer version (>=0.9.0), we change the env name to `__zone_symbol__UNPATCHED_EVENTS` to keep
+ // the name consistent with angular repo.
+ // The `__zone_symbol__BLACK_LISTED_EVENTS` is deprecated, but it is still be supported for
+ // backwards compatibility.
+ var SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');
+ var SYMBOL_UNPATCHED_EVENTS = Zone.__symbol__('UNPATCHED_EVENTS');
+ if (global[SYMBOL_UNPATCHED_EVENTS]) {
+ global[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_UNPATCHED_EVENTS];
+ }
+ if (global[SYMBOL_BLACK_LISTED_EVENTS]) {
+ Zone[SYMBOL_BLACK_LISTED_EVENTS] = Zone[SYMBOL_UNPATCHED_EVENTS] =
+ global[SYMBOL_BLACK_LISTED_EVENTS];
+ }
+ api.patchEventPrototype = patchEventPrototype;
+ api.patchEventTarget = patchEventTarget;
+ api.isIEOrEdge = isIEOrEdge;
+ api.ObjectDefineProperty = ObjectDefineProperty;
+ api.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;
+ api.ObjectCreate = ObjectCreate;
+ api.ArraySlice = ArraySlice;
+ api.patchClass = patchClass;
+ api.wrapWithCurrentZone = wrapWithCurrentZone;
+ api.filterProperties = filterProperties;
+ api.attachOriginToPatched = attachOriginToPatched;
+ api._redefineProperty = _redefineProperty;
+ api.patchCallbacks = patchCallbacks;
+ api.getGlobalObjects = function () { return ({
+ globalSources: globalSources,
+ zoneSymbolEventNames: zoneSymbolEventNames$1,
+ eventNames: eventNames,
+ isBrowser: isBrowser,
+ isMix: isMix,
+ isNode: isNode,
+ TRUE_STR: TRUE_STR,
+ FALSE_STR: FALSE_STR,
+ ZONE_SYMBOL_PREFIX: ZONE_SYMBOL_PREFIX,
+ ADD_EVENT_LISTENER_STR: ADD_EVENT_LISTENER_STR,
+ REMOVE_EVENT_LISTENER_STR: REMOVE_EVENT_LISTENER_STR
+ }); };
+});
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {missingRequire}
+ */
+var taskSymbol = zoneSymbol('zoneTask');
+function patchTimer(window, setName, cancelName, nameSuffix) {
+ var setNative = null;
+ var clearNative = null;
+ setName += nameSuffix;
+ cancelName += nameSuffix;
+ var tasksByHandleId = {};
+ function scheduleTask(task) {
+ var data = task.data;
+ function timer() {
+ try {
+ task.invoke.apply(this, arguments);
+ }
+ finally {
+ // issue-934, task will be cancelled
+ // even it is a periodic task such as
+ // setInterval
+ if (!(task.data && task.data.isPeriodic)) {
+ if (typeof data.handleId === 'number') {
+ // in non-nodejs env, we remove timerId
+ // from local cache
+ delete tasksByHandleId[data.handleId];
+ }
+ else if (data.handleId) {
+ // Node returns complex objects as handleIds
+ // we remove task reference from timer object
+ data.handleId[taskSymbol] = null;
+ }
+ }
+ }
+ }
+ data.args[0] = timer;
+ data.handleId = setNative.apply(window, data.args);
+ return task;
+ }
+ function clearTask(task) {
+ return clearNative(task.data.handleId);
+ }
+ setNative =
+ patchMethod(window, setName, function (delegate) { return function (self, args) {
+ if (typeof args[0] === 'function') {
+ var options = {
+ isPeriodic: nameSuffix === 'Interval',
+ delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 :
+ undefined,
+ args: args
+ };
+ var task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask);
+ if (!task) {
+ return task;
+ }
+ // Node.js must additionally support the ref and unref functions.
+ var handle = task.data.handleId;
+ if (typeof handle === 'number') {
+ // for non nodejs env, we save handleId: task
+ // mapping in local cache for clearTimeout
+ tasksByHandleId[handle] = task;
+ }
+ else if (handle) {
+ // for nodejs env, we save task
+ // reference in timerId Object for clearTimeout
+ handle[taskSymbol] = task;
+ }
+ // check whether handle is null, because some polyfill or browser
+ // may return undefined from setTimeout/setInterval/setImmediate/requestAnimationFrame
+ if (handle && handle.ref && handle.unref && typeof handle.ref === 'function' &&
+ typeof handle.unref === 'function') {
+ task.ref = handle.ref.bind(handle);
+ task.unref = handle.unref.bind(handle);
+ }
+ if (typeof handle === 'number' || handle) {
+ return handle;
+ }
+ return task;
+ }
+ else {
+ // cause an error by calling it directly.
+ return delegate.apply(window, args);
+ }
+ }; });
+ clearNative =
+ patchMethod(window, cancelName, function (delegate) { return function (self, args) {
+ var id = args[0];
+ var task;
+ if (typeof id === 'number') {
+ // non nodejs env.
+ task = tasksByHandleId[id];
+ }
+ else {
+ // nodejs env.
+ task = id && id[taskSymbol];
+ // other environments.
+ if (!task) {
+ task = id;
+ }
+ }
+ if (task && typeof task.type === 'string') {
+ if (task.state !== 'notScheduled' &&
+ (task.cancelFn && task.data.isPeriodic || task.runCount === 0)) {
+ if (typeof id === 'number') {
+ delete tasksByHandleId[id];
+ }
+ else if (id) {
+ id[taskSymbol] = null;
+ }
+ // Do not cancel already canceled functions
+ task.zone.cancelTask(task);
+ }
+ }
+ else {
+ // cause an error by calling it directly.
+ delegate.apply(window, args);
+ }
+ }; });
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function patchCustomElements(_global, api) {
+ var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
+ if ((!isBrowser && !isMix) || !('customElements' in _global)) {
+ return;
+ }
+ var callbacks = ['connectedCallback', 'disconnectedCallback', 'adoptedCallback', 'attributeChangedCallback'];
+ api.patchCallbacks(api, _global.customElements, 'customElements', 'define', callbacks);
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function eventTargetPatch(_global, api) {
+ var _a = api.getGlobalObjects(), eventNames = _a.eventNames, zoneSymbolEventNames = _a.zoneSymbolEventNames, TRUE_STR = _a.TRUE_STR, FALSE_STR = _a.FALSE_STR, ZONE_SYMBOL_PREFIX = _a.ZONE_SYMBOL_PREFIX;
+ // predefine all __zone_symbol__ + eventName + true/false string
+ for (var i = 0; i < eventNames.length; i++) {
+ var eventName = eventNames[i];
+ var falseEventName = eventName + FALSE_STR;
+ var trueEventName = eventName + TRUE_STR;
+ var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
+ var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
+ zoneSymbolEventNames[eventName] = {};
+ zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
+ }
+ var EVENT_TARGET = _global['EventTarget'];
+ if (!EVENT_TARGET || !EVENT_TARGET.prototype) {
+ return;
+ }
+ api.patchEventTarget(_global, [EVENT_TARGET && EVENT_TARGET.prototype]);
+ return true;
+}
+function patchEvent(global, api) {
+ api.patchEventPrototype(global, api);
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {missingRequire}
+ */
+Zone.__load_patch('legacy', function (global) {
+ var legacyPatch = global[Zone.__symbol__('legacyPatch')];
+ if (legacyPatch) {
+ legacyPatch();
+ }
+});
+Zone.__load_patch('timers', function (global) {
+ var set = 'set';
+ var clear = 'clear';
+ patchTimer(global, set, clear, 'Timeout');
+ patchTimer(global, set, clear, 'Interval');
+ patchTimer(global, set, clear, 'Immediate');
+});
+Zone.__load_patch('requestAnimationFrame', function (global) {
+ patchTimer(global, 'request', 'cancel', 'AnimationFrame');
+ patchTimer(global, 'mozRequest', 'mozCancel', 'AnimationFrame');
+ patchTimer(global, 'webkitRequest', 'webkitCancel', 'AnimationFrame');
+});
+Zone.__load_patch('blocking', function (global, Zone) {
+ var blockingMethods = ['alert', 'prompt', 'confirm'];
+ for (var i = 0; i < blockingMethods.length; i++) {
+ var name_1 = blockingMethods[i];
+ patchMethod(global, name_1, function (delegate, symbol, name) {
+ return function (s, args) {
+ return Zone.current.run(delegate, global, args, name);
+ };
+ });
+ }
+});
+Zone.__load_patch('EventTarget', function (global, Zone, api) {
+ patchEvent(global, api);
+ eventTargetPatch(global, api);
+ // patch XMLHttpRequestEventTarget's addEventListener/removeEventListener
+ var XMLHttpRequestEventTarget = global['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) {
+ api.patchEventTarget(global, [XMLHttpRequestEventTarget.prototype]);
+ }
+ patchClass('MutationObserver');
+ patchClass('WebKitMutationObserver');
+ patchClass('IntersectionObserver');
+ patchClass('FileReader');
+});
+Zone.__load_patch('on_property', function (global, Zone, api) {
+ propertyDescriptorPatch(api, global);
+ propertyPatch();
+});
+Zone.__load_patch('customElements', function (global, Zone, api) {
+ patchCustomElements(global, api);
+});
+Zone.__load_patch('XHR', function (global, Zone) {
+ // Treat XMLHttpRequest as a macrotask.
+ patchXHR(global);
+ var XHR_TASK = zoneSymbol('xhrTask');
+ var XHR_SYNC = zoneSymbol('xhrSync');
+ var XHR_LISTENER = zoneSymbol('xhrListener');
+ var XHR_SCHEDULED = zoneSymbol('xhrScheduled');
+ var XHR_URL = zoneSymbol('xhrURL');
+ var XHR_ERROR_BEFORE_SCHEDULED = zoneSymbol('xhrErrorBeforeScheduled');
+ function patchXHR(window) {
+ var XMLHttpRequestPrototype = XMLHttpRequest.prototype;
+ function findPendingTask(target) {
+ return target[XHR_TASK];
+ }
+ var oriAddListener = XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+ var oriRemoveListener = XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+ if (!oriAddListener) {
+ var XMLHttpRequestEventTarget_1 = window['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget_1) {
+ var XMLHttpRequestEventTargetPrototype = XMLHttpRequestEventTarget_1.prototype;
+ oriAddListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+ oriRemoveListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+ }
+ }
+ var READY_STATE_CHANGE = 'readystatechange';
+ var SCHEDULED = 'scheduled';
+ function scheduleTask(task) {
+ var data = task.data;
+ var target = data.target;
+ target[XHR_SCHEDULED] = false;
+ target[XHR_ERROR_BEFORE_SCHEDULED] = false;
+ // remove existing event listener
+ var listener = target[XHR_LISTENER];
+ if (!oriAddListener) {
+ oriAddListener = target[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+ oriRemoveListener = target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+ }
+ if (listener) {
+ oriRemoveListener.call(target, READY_STATE_CHANGE, listener);
+ }
+ var newListener = target[XHR_LISTENER] = function () {
+ if (target.readyState === 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 && target[XHR_SCHEDULED] && task.state === SCHEDULED) {
+ // check whether the xhr has registered onload listener
+ // if that is the case, the task should invoke after all
+ // onload listeners finish.
+ var loadTasks = target['__zone_symbol__loadfalse'];
+ if (loadTasks && loadTasks.length > 0) {
+ var oriInvoke_1 = task.invoke;
+ task.invoke = function () {
+ // need to load the tasks again, because in other
+ // load listener, they may remove themselves
+ var loadTasks = target['__zone_symbol__loadfalse'];
+ for (var i = 0; i < loadTasks.length; i++) {
+ if (loadTasks[i] === task) {
+ loadTasks.splice(i, 1);
+ }
+ }
+ if (!data.aborted && task.state === SCHEDULED) {
+ oriInvoke_1.call(task);
+ }
+ };
+ loadTasks.push(task);
+ }
+ else {
+ task.invoke();
+ }
+ }
+ else if (!data.aborted && target[XHR_SCHEDULED] === false) {
+ // error occurs when xhr.send()
+ target[XHR_ERROR_BEFORE_SCHEDULED] = true;
+ }
+ }
+ };
+ oriAddListener.call(target, READY_STATE_CHANGE, newListener);
+ var storedTask = target[XHR_TASK];
+ if (!storedTask) {
+ target[XHR_TASK] = task;
+ }
+ sendNative.apply(target, data.args);
+ target[XHR_SCHEDULED] = true;
+ return task;
+ }
+ function placeholderCallback() { }
+ function clearTask(task) {
+ var data = 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);
+ }
+ var openNative = patchMethod(XMLHttpRequestPrototype, 'open', function () { return function (self, args) {
+ self[XHR_SYNC] = args[2] == false;
+ self[XHR_URL] = args[1];
+ return openNative.apply(self, args);
+ }; });
+ var XMLHTTPREQUEST_SOURCE = 'XMLHttpRequest.send';
+ var fetchTaskAborting = zoneSymbol('fetchTaskAborting');
+ var fetchTaskScheduling = zoneSymbol('fetchTaskScheduling');
+ var sendNative = patchMethod(XMLHttpRequestPrototype, 'send', function () { return function (self, args) {
+ if (Zone.current[fetchTaskScheduling] === true) {
+ // a fetch is scheduling, so we are using xhr to polyfill fetch
+ // and because we already schedule macroTask for fetch, we should
+ // not schedule a macroTask for xhr again
+ return sendNative.apply(self, args);
+ }
+ 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 {
+ var options = { target: self, url: self[XHR_URL], isPeriodic: false, args: args, aborted: false };
+ var task = scheduleMacroTaskWithCurrentZone(XMLHTTPREQUEST_SOURCE, placeholderCallback, options, scheduleTask, clearTask);
+ if (self && self[XHR_ERROR_BEFORE_SCHEDULED] === true && !options.aborted &&
+ task.state === SCHEDULED) {
+ // xhr request throw error when send
+ // we should invoke task instead of leaving a scheduled
+ // pending macroTask
+ task.invoke();
+ }
+ }
+ }; });
+ var abortNative = patchMethod(XMLHttpRequestPrototype, 'abort', function () { return function (self, args) {
+ var 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 && task.data.aborted)) {
+ return;
+ }
+ task.zone.cancelTask(task);
+ }
+ else if (Zone.current[fetchTaskAborting] === true) {
+ // the abort is called from fetch polyfill, we need to call native abort of XHR.
+ return abortNative.apply(self, args);
+ }
+ // Otherwise, we are trying to abort an XHR which has not yet been sent, so there is no
+ // task
+ // to cancel. Do nothing.
+ }; });
+ }
+});
+Zone.__load_patch('geolocation', function (global) {
+ /// GEO_LOCATION
+ if (global['navigator'] && global['navigator'].geolocation) {
+ patchPrototype(global['navigator'].geolocation, ['getCurrentPosition', 'watchPosition']);
+ }
+});
+Zone.__load_patch('PromiseRejectionEvent', function (global, Zone) {
+ // handle unhandled promise rejection
+ function findPromiseRejectionHandler(evtName) {
+ return function (e) {
+ var eventTasks = findEventTasks(global, evtName);
+ eventTasks.forEach(function (eventTask) {
+ // windows has added unhandledrejection event listener
+ // trigger the event listener
+ var PromiseRejectionEvent = global['PromiseRejectionEvent'];
+ if (PromiseRejectionEvent) {
+ var evt = new PromiseRejectionEvent(evtName, { promise: e.promise, reason: e.rejection });
+ eventTask.invoke(evt);
+ }
+ });
+ };
+ }
+ if (global['PromiseRejectionEvent']) {
+ Zone[zoneSymbol('unhandledPromiseRejectionHandler')] =
+ findPromiseRejectionHandler('unhandledrejection');
+ Zone[zoneSymbol('rejectionHandledHandler')] =
+ findPromiseRejectionHandler('rejectionhandled');
+ }
+});
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {globalThis}
+ */
+var __assign = (undefined && undefined.__assign) || function () {
+ __assign = Object.assign || function(t) {
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
+ s = arguments[i];
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+ t[p] = s[p];
+ }
+ return t;
+ };
+ return __assign.apply(this, arguments);
+};
+var NEWLINE = '\n';
+var IGNORE_FRAMES = {};
+var creationTrace = '__creationTrace__';
+var ERROR_TAG = 'STACKTRACE TRACKING';
+var SEP_TAG = '__SEP_TAG__';
+var sepTemplate = SEP_TAG + '@[native]';
+var LongStackTrace = /** @class */ (function () {
+ function LongStackTrace() {
+ this.error = getStacktrace();
+ this.timestamp = new Date();
+ }
+ return LongStackTrace;
+}());
+function getStacktraceWithUncaughtError() {
+ return new Error(ERROR_TAG);
+}
+function getStacktraceWithCaughtError() {
+ try {
+ throw getStacktraceWithUncaughtError();
+ }
+ catch (err) {
+ return err;
+ }
+}
+// Some implementations of exception handling don't create a stack trace if the exception
+// isn't thrown, however it's faster not to actually throw the exception.
+var error = getStacktraceWithUncaughtError();
+var caughtError = getStacktraceWithCaughtError();
+var getStacktrace = error.stack ?
+ getStacktraceWithUncaughtError :
+ (caughtError.stack ? getStacktraceWithCaughtError : getStacktraceWithUncaughtError);
+function getFrames(error) {
+ return error.stack ? error.stack.split(NEWLINE) : [];
+}
+function addErrorStack(lines, error) {
+ var trace = getFrames(error);
+ for (var i = 0; i < trace.length; i++) {
+ var frame = trace[i];
+ // Filter out the Frames which are part of stack capturing.
+ if (!IGNORE_FRAMES.hasOwnProperty(frame)) {
+ lines.push(trace[i]);
+ }
+ }
+}
+function renderLongStackTrace(frames, stack) {
+ var longTrace = [stack ? stack.trim() : ''];
+ if (frames) {
+ var timestamp = new Date().getTime();
+ for (var i = 0; i < frames.length; i++) {
+ var traceFrames = frames[i];
+ var lastTime = traceFrames.timestamp;
+ var separator = "____________________Elapsed " + (timestamp - lastTime.getTime()) + " ms; At: " + lastTime;
+ separator = separator.replace(/[^\w\d]/g, '_');
+ longTrace.push(sepTemplate.replace(SEP_TAG, separator));
+ addErrorStack(longTrace, traceFrames.error);
+ timestamp = lastTime.getTime();
+ }
+ }
+ return longTrace.join(NEWLINE);
+}
+Zone['longStackTraceZoneSpec'] = {
+ name: 'long-stack-trace',
+ longStackTraceLimit: 10,
+ // add a getLongStackTrace method in spec to
+ // handle handled reject promise error.
+ getLongStackTrace: function (error) {
+ if (!error) {
+ return undefined;
+ }
+ var trace = error[Zone.__symbol__('currentTaskTrace')];
+ if (!trace) {
+ return error.stack;
+ }
+ return renderLongStackTrace(trace, error.stack);
+ },
+ onScheduleTask: function (parentZoneDelegate, currentZone, targetZone, task) {
+ if (Error.stackTraceLimit > 0) {
+ // if Error.stackTraceLimit is 0, means stack trace
+ // is disabled, so we don't need to generate long stack trace
+ // this will improve performance in some test(some test will
+ // set stackTraceLimit to 0, https://github.com/angular/zone.js/issues/698
+ var currentTask = Zone.currentTask;
+ var trace = currentTask && currentTask.data && currentTask.data[creationTrace] || [];
+ trace = [new LongStackTrace()].concat(trace);
+ if (trace.length > this.longStackTraceLimit) {
+ trace.length = this.longStackTraceLimit;
+ }
+ if (!task.data)
+ task.data = {};
+ if (task.type === 'eventTask') {
+ // Fix issue https://github.com/angular/zone.js/issues/1195,
+ // For event task of browser, by default, all task will share a
+ // singleton instance of data object, we should create a new one here
+ // The cast to `any` is required to workaround a closure bug which wrongly applies
+ // URL sanitization rules to .data access.
+ task.data = __assign({}, task.data);
+ }
+ task.data[creationTrace] = trace;
+ }
+ return parentZoneDelegate.scheduleTask(targetZone, task);
+ },
+ onHandleError: function (parentZoneDelegate, currentZone, targetZone, error) {
+ if (Error.stackTraceLimit > 0) {
+ // if Error.stackTraceLimit is 0, means stack trace
+ // is disabled, so we don't need to generate long stack trace
+ // this will improve performance in some test(some test will
+ // set stackTraceLimit to 0, https://github.com/angular/zone.js/issues/698
+ var parentTask = Zone.currentTask || error.task;
+ if (error instanceof Error && parentTask) {
+ var longStack = renderLongStackTrace(parentTask.data && parentTask.data[creationTrace], error.stack);
+ try {
+ error.stack = error.longStack = longStack;
+ }
+ catch (err) {
+ }
+ }
+ }
+ return parentZoneDelegate.handleError(targetZone, error);
+ }
+};
+function captureStackTraces(stackTraces, count) {
+ if (count > 0) {
+ stackTraces.push(getFrames((new LongStackTrace()).error));
+ captureStackTraces(stackTraces, count - 1);
+ }
+}
+function computeIgnoreFrames() {
+ if (Error.stackTraceLimit <= 0) {
+ return;
+ }
+ var frames = [];
+ captureStackTraces(frames, 2);
+ var frames1 = frames[0];
+ var frames2 = frames[1];
+ for (var i = 0; i < frames1.length; i++) {
+ var frame1 = frames1[i];
+ if (frame1.indexOf(ERROR_TAG) == -1) {
+ var match = frame1.match(/^\s*at\s+/);
+ if (match) {
+ sepTemplate = match[0] + SEP_TAG + ' (http://localhost)';
+ break;
+ }
+ }
+ }
+ for (var i = 0; i < frames1.length; i++) {
+ var frame1 = frames1[i];
+ var frame2 = frames2[i];
+ if (frame1 === frame2) {
+ IGNORE_FRAMES[frame1] = true;
+ }
+ else {
+ break;
+ }
+ }
+}
+computeIgnoreFrames();
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+var ProxyZoneSpec = /** @class */ (function () {
+ function ProxyZoneSpec(defaultSpecDelegate) {
+ if (defaultSpecDelegate === void 0) { defaultSpecDelegate = null; }
+ this.defaultSpecDelegate = defaultSpecDelegate;
+ this.name = 'ProxyZone';
+ this._delegateSpec = null;
+ this.properties = { 'ProxyZoneSpec': this };
+ this.propertyKeys = null;
+ this.lastTaskState = null;
+ this.isNeedToTriggerHasTask = false;
+ this.tasks = [];
+ this.setDelegate(defaultSpecDelegate);
+ }
+ ProxyZoneSpec.get = function () {
+ return Zone.current.get('ProxyZoneSpec');
+ };
+ ProxyZoneSpec.isLoaded = function () {
+ return ProxyZoneSpec.get() instanceof ProxyZoneSpec;
+ };
+ ProxyZoneSpec.assertPresent = function () {
+ if (!ProxyZoneSpec.isLoaded()) {
+ throw new Error("Expected to be running in 'ProxyZone', but it was not found.");
+ }
+ return ProxyZoneSpec.get();
+ };
+ ProxyZoneSpec.prototype.setDelegate = function (delegateSpec) {
+ var _this = this;
+ var isNewDelegate = this._delegateSpec !== delegateSpec;
+ this._delegateSpec = delegateSpec;
+ this.propertyKeys && this.propertyKeys.forEach(function (key) { return delete _this.properties[key]; });
+ this.propertyKeys = null;
+ if (delegateSpec && delegateSpec.properties) {
+ this.propertyKeys = Object.keys(delegateSpec.properties);
+ this.propertyKeys.forEach(function (k) { return _this.properties[k] = delegateSpec.properties[k]; });
+ }
+ // if set a new delegateSpec, shoulde check whether need to
+ // trigger hasTask or not
+ if (isNewDelegate && this.lastTaskState &&
+ (this.lastTaskState.macroTask || this.lastTaskState.microTask)) {
+ this.isNeedToTriggerHasTask = true;
+ }
+ };
+ ProxyZoneSpec.prototype.getDelegate = function () {
+ return this._delegateSpec;
+ };
+ ProxyZoneSpec.prototype.resetDelegate = function () {
+ var delegateSpec = this.getDelegate();
+ this.setDelegate(this.defaultSpecDelegate);
+ };
+ ProxyZoneSpec.prototype.tryTriggerHasTask = function (parentZoneDelegate, currentZone, targetZone) {
+ if (this.isNeedToTriggerHasTask && this.lastTaskState) {
+ // last delegateSpec has microTask or macroTask
+ // should call onHasTask in current delegateSpec
+ this.isNeedToTriggerHasTask = false;
+ this.onHasTask(parentZoneDelegate, currentZone, targetZone, this.lastTaskState);
+ }
+ };
+ ProxyZoneSpec.prototype.removeFromTasks = function (task) {
+ if (!this.tasks) {
+ return;
+ }
+ for (var i = 0; i < this.tasks.length; i++) {
+ if (this.tasks[i] === task) {
+ this.tasks.splice(i, 1);
+ return;
+ }
+ }
+ };
+ ProxyZoneSpec.prototype.getAndClearPendingTasksInfo = function () {
+ if (this.tasks.length === 0) {
+ return '';
+ }
+ var taskInfo = this.tasks.map(function (task) {
+ var dataInfo = task.data &&
+ Object.keys(task.data)
+ .map(function (key) {
+ return key + ':' + task.data[key];
+ })
+ .join(',');
+ return "type: " + task.type + ", source: " + task.source + ", args: {" + dataInfo + "}";
+ });
+ var pendingTasksInfo = '--Pendng async tasks are: [' + taskInfo + ']';
+ // clear tasks
+ this.tasks = [];
+ return pendingTasksInfo;
+ };
+ ProxyZoneSpec.prototype.onFork = function (parentZoneDelegate, currentZone, targetZone, zoneSpec) {
+ if (this._delegateSpec && this._delegateSpec.onFork) {
+ return this._delegateSpec.onFork(parentZoneDelegate, currentZone, targetZone, zoneSpec);
+ }
+ else {
+ return parentZoneDelegate.fork(targetZone, zoneSpec);
+ }
+ };
+ ProxyZoneSpec.prototype.onIntercept = function (parentZoneDelegate, currentZone, targetZone, delegate, source) {
+ if (this._delegateSpec && this._delegateSpec.onIntercept) {
+ return this._delegateSpec.onIntercept(parentZoneDelegate, currentZone, targetZone, delegate, source);
+ }
+ else {
+ return parentZoneDelegate.intercept(targetZone, delegate, source);
+ }
+ };
+ ProxyZoneSpec.prototype.onInvoke = function (parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) {
+ this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
+ if (this._delegateSpec && this._delegateSpec.onInvoke) {
+ return this._delegateSpec.onInvoke(parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source);
+ }
+ else {
+ return parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source);
+ }
+ };
+ ProxyZoneSpec.prototype.onHandleError = function (parentZoneDelegate, currentZone, targetZone, error) {
+ if (this._delegateSpec && this._delegateSpec.onHandleError) {
+ return this._delegateSpec.onHandleError(parentZoneDelegate, currentZone, targetZone, error);
+ }
+ else {
+ return parentZoneDelegate.handleError(targetZone, error);
+ }
+ };
+ ProxyZoneSpec.prototype.onScheduleTask = function (parentZoneDelegate, currentZone, targetZone, task) {
+ if (task.type !== 'eventTask') {
+ this.tasks.push(task);
+ }
+ if (this._delegateSpec && this._delegateSpec.onScheduleTask) {
+ return this._delegateSpec.onScheduleTask(parentZoneDelegate, currentZone, targetZone, task);
+ }
+ else {
+ return parentZoneDelegate.scheduleTask(targetZone, task);
+ }
+ };
+ ProxyZoneSpec.prototype.onInvokeTask = function (parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs) {
+ if (task.type !== 'eventTask') {
+ this.removeFromTasks(task);
+ }
+ this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
+ if (this._delegateSpec && this._delegateSpec.onInvokeTask) {
+ return this._delegateSpec.onInvokeTask(parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs);
+ }
+ else {
+ return parentZoneDelegate.invokeTask(targetZone, task, applyThis, applyArgs);
+ }
+ };
+ ProxyZoneSpec.prototype.onCancelTask = function (parentZoneDelegate, currentZone, targetZone, task) {
+ if (task.type !== 'eventTask') {
+ this.removeFromTasks(task);
+ }
+ this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
+ if (this._delegateSpec && this._delegateSpec.onCancelTask) {
+ return this._delegateSpec.onCancelTask(parentZoneDelegate, currentZone, targetZone, task);
+ }
+ else {
+ return parentZoneDelegate.cancelTask(targetZone, task);
+ }
+ };
+ ProxyZoneSpec.prototype.onHasTask = function (delegate, current, target, hasTaskState) {
+ this.lastTaskState = hasTaskState;
+ if (this._delegateSpec && this._delegateSpec.onHasTask) {
+ this._delegateSpec.onHasTask(delegate, current, target, hasTaskState);
+ }
+ else {
+ delegate.hasTask(target, hasTaskState);
+ }
+ };
+ return ProxyZoneSpec;
+}());
+// Export the class so that new instances can be created with proper
+// constructor params.
+Zone['ProxyZoneSpec'] = ProxyZoneSpec;
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+var SyncTestZoneSpec = /** @class */ (function () {
+ function SyncTestZoneSpec(namePrefix) {
+ this.runZone = Zone.current;
+ this.name = 'syncTestZone for ' + namePrefix;
+ }
+ SyncTestZoneSpec.prototype.onScheduleTask = function (delegate, current, target, task) {
+ switch (task.type) {
+ case 'microTask':
+ case 'macroTask':
+ throw new Error("Cannot call " + task.source + " from within a sync test.");
+ case 'eventTask':
+ task = delegate.scheduleTask(target, task);
+ break;
+ }
+ return task;
+ };
+ return SyncTestZoneSpec;
+}());
+// Export the class so that new instances can be created with proper
+// constructor params.
+Zone['SyncTestZoneSpec'] = SyncTestZoneSpec;
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+(function () {
+ var __extends = function (d, b) {
+ for (var p in b)
+ if (b.hasOwnProperty(p))
+ d[p] = b[p];
+ function __() {
+ this.constructor = d;
+ }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+ var _global = typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global;
+ // Patch jasmine's describe/it/beforeEach/afterEach functions so test code always runs
+ // in a testZone (ProxyZone). (See: angular/zone.js#91 & angular/angular#10503)
+ if (!Zone)
+ throw new Error('Missing: zone.js');
+ if (typeof jasmine == 'undefined')
+ throw new Error('Missing: jasmine.js');
+ if (jasmine['__zone_patch__'])
+ throw new Error("'jasmine' has already been patched with 'Zone'.");
+ jasmine['__zone_patch__'] = true;
+ var SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
+ var ProxyZoneSpec = Zone['ProxyZoneSpec'];
+ if (!SyncTestZoneSpec)
+ throw new Error('Missing: SyncTestZoneSpec');
+ if (!ProxyZoneSpec)
+ throw new Error('Missing: ProxyZoneSpec');
+ var ambientZone = Zone.current;
+ // Create a synchronous-only zone in which to run `describe` blocks in order to raise an
+ // error if any asynchronous operations are attempted inside of a `describe` but outside of
+ // a `beforeEach` or `it`.
+ var syncZone = ambientZone.fork(new SyncTestZoneSpec('jasmine.describe'));
+ var symbol = Zone.__symbol__;
+ // whether patch jasmine clock when in fakeAsync
+ var enableClockPatch = _global[symbol('fakeAsyncPatchLock')] === true;
+ var ignoreUnhandledRejection = _global[symbol('ignoreUnhandledRejection')] === true;
+ if (!ignoreUnhandledRejection) {
+ var globalErrors_1 = jasmine.GlobalErrors;
+ if (globalErrors_1 && !jasmine[symbol('GlobalErrors')]) {
+ jasmine[symbol('GlobalErrors')] = globalErrors_1;
+ jasmine.GlobalErrors = function () {
+ var instance = new globalErrors_1();
+ var originalInstall = instance.install;
+ if (originalInstall && !instance[symbol('install')]) {
+ instance[symbol('install')] = originalInstall;
+ instance.install = function () {
+ var originalHandlers = process.listeners('unhandledRejection');
+ var r = originalInstall.apply(this, arguments);
+ process.removeAllListeners('unhandledRejection');
+ if (originalHandlers) {
+ originalHandlers.forEach(function (h) { return process.on('unhandledRejection', h); });
+ }
+ return r;
+ };
+ }
+ return instance;
+ };
+ }
+ }
+ // Monkey patch all of the jasmine DSL so that each function runs in appropriate zone.
+ var jasmineEnv = jasmine.getEnv();
+ ['describe', 'xdescribe', 'fdescribe'].forEach(function (methodName) {
+ var originalJasmineFn = jasmineEnv[methodName];
+ jasmineEnv[methodName] = function (description, specDefinitions) {
+ return originalJasmineFn.call(this, description, wrapDescribeInZone(specDefinitions));
+ };
+ });
+ ['it', 'xit', 'fit'].forEach(function (methodName) {
+ var originalJasmineFn = jasmineEnv[methodName];
+ jasmineEnv[symbol(methodName)] = originalJasmineFn;
+ jasmineEnv[methodName] = function (description, specDefinitions, timeout) {
+ arguments[1] = wrapTestInZone(specDefinitions);
+ return originalJasmineFn.apply(this, arguments);
+ };
+ });
+ ['beforeEach', 'afterEach', 'beforeAll', 'afterAll'].forEach(function (methodName) {
+ var originalJasmineFn = jasmineEnv[methodName];
+ jasmineEnv[symbol(methodName)] = originalJasmineFn;
+ jasmineEnv[methodName] = function (specDefinitions, timeout) {
+ arguments[0] = wrapTestInZone(specDefinitions);
+ return originalJasmineFn.apply(this, arguments);
+ };
+ });
+ // need to patch jasmine.clock().mockDate and jasmine.clock().tick() so
+ // they can work properly in FakeAsyncTest
+ var originalClockFn = (jasmine[symbol('clock')] = jasmine['clock']);
+ jasmine['clock'] = function () {
+ var clock = originalClockFn.apply(this, arguments);
+ if (!clock[symbol('patched')]) {
+ clock[symbol('patched')] = symbol('patched');
+ var originalTick_1 = (clock[symbol('tick')] = clock.tick);
+ clock.tick = function () {
+ var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
+ if (fakeAsyncZoneSpec) {
+ return fakeAsyncZoneSpec.tick.apply(fakeAsyncZoneSpec, arguments);
+ }
+ return originalTick_1.apply(this, arguments);
+ };
+ var originalMockDate_1 = (clock[symbol('mockDate')] = clock.mockDate);
+ clock.mockDate = function () {
+ var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
+ if (fakeAsyncZoneSpec) {
+ var dateTime = arguments.length > 0 ? arguments[0] : new Date();
+ return fakeAsyncZoneSpec.setCurrentRealTime.apply(fakeAsyncZoneSpec, dateTime && typeof dateTime.getTime === 'function' ? [dateTime.getTime()] :
+ arguments);
+ }
+ return originalMockDate_1.apply(this, arguments);
+ };
+ // for auto go into fakeAsync feature, we need the flag to enable it
+ if (enableClockPatch) {
+ ['install', 'uninstall'].forEach(function (methodName) {
+ var originalClockFn = (clock[symbol(methodName)] = clock[methodName]);
+ clock[methodName] = function () {
+ var FakeAsyncTestZoneSpec = Zone['FakeAsyncTestZoneSpec'];
+ if (FakeAsyncTestZoneSpec) {
+ jasmine[symbol('clockInstalled')] = 'install' === methodName;
+ return;
+ }
+ return originalClockFn.apply(this, arguments);
+ };
+ });
+ }
+ }
+ return clock;
+ };
+ /**
+ * Gets a function wrapping the body of a Jasmine `describe` block to execute in a
+ * synchronous-only zone.
+ */
+ function wrapDescribeInZone(describeBody) {
+ return function () {
+ return syncZone.run(describeBody, this, arguments);
+ };
+ }
+ function runInTestZone(testBody, applyThis, queueRunner, done) {
+ var isClockInstalled = !!jasmine[symbol('clockInstalled')];
+ var testProxyZoneSpec = queueRunner.testProxyZoneSpec;
+ var testProxyZone = queueRunner.testProxyZone;
+ if (isClockInstalled && enableClockPatch) {
+ // auto run a fakeAsync
+ var fakeAsyncModule = Zone[Zone.__symbol__('fakeAsyncTest')];
+ if (fakeAsyncModule && typeof fakeAsyncModule.fakeAsync === 'function') {
+ testBody = fakeAsyncModule.fakeAsync(testBody);
+ }
+ }
+ if (done) {
+ return testProxyZone.run(testBody, applyThis, [done]);
+ }
+ else {
+ return testProxyZone.run(testBody, applyThis);
+ }
+ }
+ /**
+ * Gets a function wrapping the body of a Jasmine `it/beforeEach/afterEach` block to
+ * execute in a ProxyZone zone.
+ * This will run in `testProxyZone`. The `testProxyZone` will be reset by the `ZoneQueueRunner`
+ */
+ function wrapTestInZone(testBody) {
+ // The `done` callback is only passed through if the function expects at least one argument.
+ // Note we have to make a function with correct number of arguments, otherwise jasmine will
+ // think that all functions are sync or async.
+ return (testBody && (testBody.length ? function (done) {
+ return runInTestZone(testBody, this, this.queueRunner, done);
+ } : function () {
+ return runInTestZone(testBody, this, this.queueRunner);
+ }));
+ }
+ var QueueRunner = jasmine.QueueRunner;
+ jasmine.QueueRunner = (function (_super) {
+ __extends(ZoneQueueRunner, _super);
+ function ZoneQueueRunner(attrs) {
+ var _this = this;
+ attrs.onComplete = (function (fn) { return function () {
+ // All functions are done, clear the test zone.
+ _this.testProxyZone = null;
+ _this.testProxyZoneSpec = null;
+ ambientZone.scheduleMicroTask('jasmine.onComplete', fn);
+ }; })(attrs.onComplete);
+ var nativeSetTimeout = _global['__zone_symbol__setTimeout'];
+ var nativeClearTimeout = _global['__zone_symbol__clearTimeout'];
+ if (nativeSetTimeout) {
+ // should run setTimeout inside jasmine outside of zone
+ attrs.timeout = {
+ setTimeout: nativeSetTimeout ? nativeSetTimeout : _global.setTimeout,
+ clearTimeout: nativeClearTimeout ? nativeClearTimeout : _global.clearTimeout
+ };
+ }
+ // create a userContext to hold the queueRunner itself
+ // so we can access the testProxy in it/xit/beforeEach ...
+ if (jasmine.UserContext) {
+ if (!attrs.userContext) {
+ attrs.userContext = new jasmine.UserContext();
+ }
+ attrs.userContext.queueRunner = this;
+ }
+ else {
+ if (!attrs.userContext) {
+ attrs.userContext = {};
+ }
+ attrs.userContext.queueRunner = this;
+ }
+ // patch attrs.onException
+ var onException = attrs.onException;
+ attrs.onException = function (error) {
+ if (error &&
+ error.message ===
+ 'Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.') {
+ // jasmine timeout, we can make the error message more
+ // reasonable to tell what tasks are pending
+ var proxyZoneSpec = this && this.testProxyZoneSpec;
+ if (proxyZoneSpec) {
+ var pendingTasksInfo = proxyZoneSpec.getAndClearPendingTasksInfo();
+ try {
+ // try catch here in case error.message is not writable
+ error.message += pendingTasksInfo;
+ }
+ catch (err) {
+ }
+ }
+ }
+ if (onException) {
+ onException.call(this, error);
+ }
+ };
+ _super.call(this, attrs);
+ }
+ ZoneQueueRunner.prototype.execute = function () {
+ var _this = this;
+ var zone = Zone.current;
+ var isChildOfAmbientZone = false;
+ while (zone) {
+ if (zone === ambientZone) {
+ isChildOfAmbientZone = true;
+ break;
+ }
+ zone = zone.parent;
+ }
+ if (!isChildOfAmbientZone)
+ throw new Error('Unexpected Zone: ' + Zone.current.name);
+ // This is the zone which will be used for running individual tests.
+ // It will be a proxy zone, so that the tests function can retroactively install
+ // different zones.
+ // Example:
+ // - In beforeEach() do childZone = Zone.current.fork(...);
+ // - In it() try to do fakeAsync(). The issue is that because the beforeEach forked the
+ // zone outside of fakeAsync it will be able to escape the fakeAsync rules.
+ // - Because ProxyZone is parent fo `childZone` fakeAsync can retroactively add
+ // fakeAsync behavior to the childZone.
+ this.testProxyZoneSpec = new ProxyZoneSpec();
+ this.testProxyZone = ambientZone.fork(this.testProxyZoneSpec);
+ if (!Zone.currentTask) {
+ // if we are not running in a task then if someone would register a
+ // element.addEventListener and then calling element.click() the
+ // addEventListener callback would think that it is the top most task and would
+ // drain the microtask queue on element.click() which would be incorrect.
+ // For this reason we always force a task when running jasmine tests.
+ Zone.current.scheduleMicroTask('jasmine.execute().forceTask', function () { return QueueRunner.prototype.execute.call(_this); });
+ }
+ else {
+ _super.prototype.execute.call(this);
+ }
+ };
+ return ZoneQueueRunner;
+ })(QueueRunner);
+})();
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+var _global$1 = typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global;
+var AsyncTestZoneSpec = /** @class */ (function () {
+ function AsyncTestZoneSpec(finishCallback, failCallback, namePrefix) {
+ this.finishCallback = finishCallback;
+ this.failCallback = failCallback;
+ this._pendingMicroTasks = false;
+ this._pendingMacroTasks = false;
+ this._alreadyErrored = false;
+ this._isSync = false;
+ this.runZone = Zone.current;
+ this.unresolvedChainedPromiseCount = 0;
+ this.supportWaitUnresolvedChainedPromise = false;
+ this.name = 'asyncTestZone for ' + namePrefix;
+ this.properties = { 'AsyncTestZoneSpec': this };
+ this.supportWaitUnresolvedChainedPromise =
+ _global$1[Zone.__symbol__('supportWaitUnResolvedChainedPromise')] === true;
+ }
+ AsyncTestZoneSpec.prototype.isUnresolvedChainedPromisePending = function () {
+ return this.unresolvedChainedPromiseCount > 0;
+ };
+ AsyncTestZoneSpec.prototype._finishCallbackIfDone = function () {
+ var _this = this;
+ if (!(this._pendingMicroTasks || this._pendingMacroTasks ||
+ (this.supportWaitUnresolvedChainedPromise && this.isUnresolvedChainedPromisePending()))) {
+ // We do this because we would like to catch unhandled rejected promises.
+ this.runZone.run(function () {
+ setTimeout(function () {
+ if (!_this._alreadyErrored && !(_this._pendingMicroTasks || _this._pendingMacroTasks)) {
+ _this.finishCallback();
+ }
+ }, 0);
+ });
+ }
+ };
+ AsyncTestZoneSpec.prototype.patchPromiseForTest = function () {
+ if (!this.supportWaitUnresolvedChainedPromise) {
+ return;
+ }
+ var patchPromiseForTest = Promise[Zone.__symbol__('patchPromiseForTest')];
+ if (patchPromiseForTest) {
+ patchPromiseForTest();
+ }
+ };
+ AsyncTestZoneSpec.prototype.unPatchPromiseForTest = function () {
+ if (!this.supportWaitUnresolvedChainedPromise) {
+ return;
+ }
+ var unPatchPromiseForTest = Promise[Zone.__symbol__('unPatchPromiseForTest')];
+ if (unPatchPromiseForTest) {
+ unPatchPromiseForTest();
+ }
+ };
+ AsyncTestZoneSpec.prototype.onScheduleTask = function (delegate, current, target, task) {
+ if (task.type !== 'eventTask') {
+ this._isSync = false;
+ }
+ if (task.type === 'microTask' && task.data && task.data instanceof Promise) {
+ // check whether the promise is a chained promise
+ if (task.data[AsyncTestZoneSpec.symbolParentUnresolved] === true) {
+ // chained promise is being scheduled
+ this.unresolvedChainedPromiseCount--;
+ }
+ }
+ return delegate.scheduleTask(target, task);
+ };
+ AsyncTestZoneSpec.prototype.onInvokeTask = function (delegate, current, target, task, applyThis, applyArgs) {
+ if (task.type !== 'eventTask') {
+ this._isSync = false;
+ }
+ return delegate.invokeTask(target, task, applyThis, applyArgs);
+ };
+ AsyncTestZoneSpec.prototype.onCancelTask = function (delegate, current, target, task) {
+ if (task.type !== 'eventTask') {
+ this._isSync = false;
+ }
+ return delegate.cancelTask(target, task);
+ };
+ // Note - we need to use onInvoke at the moment to call finish when a test is
+ // fully synchronous. TODO(juliemr): remove this when the logic for
+ // onHasTask changes and it calls whenever the task queues are dirty.
+ // updated by(JiaLiPassion), only call finish callback when no task
+ // was scheduled/invoked/canceled.
+ AsyncTestZoneSpec.prototype.onInvoke = function (parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) {
+ try {
+ this._isSync = true;
+ return parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source);
+ }
+ finally {
+ var afterTaskCounts = parentZoneDelegate._taskCounts;
+ if (this._isSync) {
+ this._finishCallbackIfDone();
+ }
+ }
+ };
+ AsyncTestZoneSpec.prototype.onHandleError = function (parentZoneDelegate, currentZone, targetZone, error) {
+ // Let the parent try to handle the error.
+ var result = parentZoneDelegate.handleError(targetZone, error);
+ if (result) {
+ this.failCallback(error);
+ this._alreadyErrored = true;
+ }
+ return false;
+ };
+ AsyncTestZoneSpec.prototype.onHasTask = function (delegate, current, target, hasTaskState) {
+ delegate.hasTask(target, hasTaskState);
+ if (hasTaskState.change == 'microTask') {
+ this._pendingMicroTasks = hasTaskState.microTask;
+ this._finishCallbackIfDone();
+ }
+ else if (hasTaskState.change == 'macroTask') {
+ this._pendingMacroTasks = hasTaskState.macroTask;
+ this._finishCallbackIfDone();
+ }
+ };
+ AsyncTestZoneSpec.symbolParentUnresolved = Zone.__symbol__('parentUnresolved');
+ return AsyncTestZoneSpec;
+}());
+// Export the class so that new instances can be created with proper
+// constructor params.
+Zone['AsyncTestZoneSpec'] = AsyncTestZoneSpec;
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+Zone.__load_patch('asynctest', function (global, Zone, api) {
+ /**
+ * Wraps a test function in an asynchronous test zone. The test will automatically
+ * complete when all asynchronous calls within this zone are done.
+ */
+ Zone[api.symbol('asyncTest')] = function asyncTest(fn) {
+ // If we're running using the Jasmine test framework, adapt to call the 'done'
+ // function when asynchronous activity is finished.
+ if (global.jasmine) {
+ // Not using an arrow function to preserve context passed from call site
+ return function (done) {
+ if (!done) {
+ // if we run beforeEach in @angular/core/testing/testing_internal then we get no done
+ // fake it here and assume sync.
+ done = function () { };
+ done.fail = function (e) {
+ throw e;
+ };
+ }
+ runInTestZone(fn, this, done, function (err) {
+ if (typeof err === 'string') {
+ return done.fail(new Error(err));
+ }
+ else {
+ done.fail(err);
+ }
+ });
+ };
+ }
+ // Otherwise, return a promise which will resolve when asynchronous activity
+ // is finished. This will be correctly consumed by the Mocha framework with
+ // it('...', async(myFn)); or can be used in a custom framework.
+ // Not using an arrow function to preserve context passed from call site
+ return function () {
+ var _this = this;
+ return new Promise(function (finishCallback, failCallback) {
+ runInTestZone(fn, _this, finishCallback, failCallback);
+ });
+ };
+ };
+ function runInTestZone(fn, context, finishCallback, failCallback) {
+ var currentZone = Zone.current;
+ var AsyncTestZoneSpec = Zone['AsyncTestZoneSpec'];
+ if (AsyncTestZoneSpec === undefined) {
+ throw new Error('AsyncTestZoneSpec is needed for the async() test helper but could not be found. ' +
+ 'Please make sure that your environment includes zone.js/dist/async-test.js');
+ }
+ var ProxyZoneSpec = Zone['ProxyZoneSpec'];
+ if (ProxyZoneSpec === undefined) {
+ throw new Error('ProxyZoneSpec is needed for the async() test helper but could not be found. ' +
+ 'Please make sure that your environment includes zone.js/dist/proxy.js');
+ }
+ var proxyZoneSpec = ProxyZoneSpec.get();
+ ProxyZoneSpec.assertPresent();
+ // We need to create the AsyncTestZoneSpec outside the ProxyZone.
+ // If we do it in ProxyZone then we will get to infinite recursion.
+ var proxyZone = Zone.current.getZoneWith('ProxyZoneSpec');
+ var previousDelegate = proxyZoneSpec.getDelegate();
+ proxyZone.parent.run(function () {
+ var testZoneSpec = new AsyncTestZoneSpec(function () {
+ // Need to restore the original zone.
+ if (proxyZoneSpec.getDelegate() == testZoneSpec) {
+ // Only reset the zone spec if it's
+ // sill this one. Otherwise, assume
+ // it's OK.
+ proxyZoneSpec.setDelegate(previousDelegate);
+ }
+ testZoneSpec.unPatchPromiseForTest();
+ currentZone.run(function () {
+ finishCallback();
+ });
+ }, function (error) {
+ // Need to restore the original zone.
+ if (proxyZoneSpec.getDelegate() == testZoneSpec) {
+ // Only reset the zone spec if it's sill this one. Otherwise, assume it's OK.
+ proxyZoneSpec.setDelegate(previousDelegate);
+ }
+ testZoneSpec.unPatchPromiseForTest();
+ currentZone.run(function () {
+ failCallback(error);
+ });
+ }, 'test');
+ proxyZoneSpec.setDelegate(testZoneSpec);
+ testZoneSpec.patchPromiseForTest();
+ });
+ return Zone.current.runGuarded(fn, context);
+ }
+});
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+var __read = (undefined && undefined.__read) || function (o, n) {
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
+ if (!m) return o;
+ var i = m.call(o), r, ar = [], e;
+ try {
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
+ }
+ catch (error) { e = { error: error }; }
+ finally {
+ try {
+ if (r && !r.done && (m = i["return"])) m.call(i);
+ }
+ finally { if (e) throw e.error; }
+ }
+ return ar;
+};
+var __spread = (undefined && undefined.__spread) || function () {
+ for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
+ return ar;
+};
+(function (global) {
+ var OriginalDate = global.Date;
+ var FakeDate = /** @class */ (function () {
+ function FakeDate() {
+ if (arguments.length === 0) {
+ var d = new OriginalDate();
+ d.setTime(FakeDate.now());
+ return d;
+ }
+ else {
+ var args = Array.prototype.slice.call(arguments);
+ return new (OriginalDate.bind.apply(OriginalDate, __spread([void 0], args)))();
+ }
+ }
+ FakeDate.now = function () {
+ var fakeAsyncTestZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
+ if (fakeAsyncTestZoneSpec) {
+ return fakeAsyncTestZoneSpec.getCurrentRealTime() + fakeAsyncTestZoneSpec.getCurrentTime();
+ }
+ return OriginalDate.now.apply(this, arguments);
+ };
+ return FakeDate;
+ }());
+ FakeDate.UTC = OriginalDate.UTC;
+ FakeDate.parse = OriginalDate.parse;
+ // keep a reference for zone patched timer function
+ var timers = {
+ setTimeout: global.setTimeout,
+ setInterval: global.setInterval,
+ clearTimeout: global.clearTimeout,
+ clearInterval: global.clearInterval
+ };
+ var Scheduler = /** @class */ (function () {
+ function Scheduler() {
+ // Scheduler queue with the tuple of end time and callback function - sorted by end time.
+ this._schedulerQueue = [];
+ // Current simulated time in millis.
+ this._currentTime = 0;
+ // Current real time in millis.
+ this._currentRealTime = OriginalDate.now();
+ }
+ Scheduler.prototype.getCurrentTime = function () {
+ return this._currentTime;
+ };
+ Scheduler.prototype.getCurrentRealTime = function () {
+ return this._currentRealTime;
+ };
+ Scheduler.prototype.setCurrentRealTime = function (realTime) {
+ this._currentRealTime = realTime;
+ };
+ Scheduler.prototype.scheduleFunction = function (cb, delay, args, isPeriodic, isRequestAnimationFrame, id) {
+ if (args === void 0) { args = []; }
+ if (isPeriodic === void 0) { isPeriodic = false; }
+ if (isRequestAnimationFrame === void 0) { isRequestAnimationFrame = false; }
+ if (id === void 0) { id = -1; }
+ var currentId = id < 0 ? Scheduler.nextId++ : id;
+ var endTime = this._currentTime + delay;
+ // Insert so that scheduler queue remains sorted by end time.
+ var newEntry = {
+ endTime: endTime,
+ id: currentId,
+ func: cb,
+ args: args,
+ delay: delay,
+ isPeriodic: isPeriodic,
+ isRequestAnimationFrame: isRequestAnimationFrame
+ };
+ var i = 0;
+ for (; i < this._schedulerQueue.length; i++) {
+ var currentEntry = this._schedulerQueue[i];
+ if (newEntry.endTime < currentEntry.endTime) {
+ break;
+ }
+ }
+ this._schedulerQueue.splice(i, 0, newEntry);
+ return currentId;
+ };
+ Scheduler.prototype.removeScheduledFunctionWithId = function (id) {
+ for (var i = 0; i < this._schedulerQueue.length; i++) {
+ if (this._schedulerQueue[i].id == id) {
+ this._schedulerQueue.splice(i, 1);
+ break;
+ }
+ }
+ };
+ Scheduler.prototype.tick = function (millis, doTick) {
+ if (millis === void 0) { millis = 0; }
+ var finalTime = this._currentTime + millis;
+ var lastCurrentTime = 0;
+ if (this._schedulerQueue.length === 0 && doTick) {
+ doTick(millis);
+ return;
+ }
+ while (this._schedulerQueue.length > 0) {
+ var current = this._schedulerQueue[0];
+ if (finalTime < current.endTime) {
+ // Done processing the queue since it's sorted by endTime.
+ break;
+ }
+ else {
+ // Time to run scheduled function. Remove it from the head of queue.
+ var current_1 = this._schedulerQueue.shift();
+ lastCurrentTime = this._currentTime;
+ this._currentTime = current_1.endTime;
+ if (doTick) {
+ doTick(this._currentTime - lastCurrentTime);
+ }
+ var retval = current_1.func.apply(global, current_1.args);
+ if (!retval) {
+ // Uncaught exception in the current scheduled function. Stop processing the queue.
+ break;
+ }
+ }
+ }
+ lastCurrentTime = this._currentTime;
+ this._currentTime = finalTime;
+ if (doTick) {
+ doTick(this._currentTime - lastCurrentTime);
+ }
+ };
+ Scheduler.prototype.flush = function (limit, flushPeriodic, doTick) {
+ if (limit === void 0) { limit = 20; }
+ if (flushPeriodic === void 0) { flushPeriodic = false; }
+ if (flushPeriodic) {
+ return this.flushPeriodic(doTick);
+ }
+ else {
+ return this.flushNonPeriodic(limit, doTick);
+ }
+ };
+ Scheduler.prototype.flushPeriodic = function (doTick) {
+ if (this._schedulerQueue.length === 0) {
+ return 0;
+ }
+ // Find the last task currently queued in the scheduler queue and tick
+ // till that time.
+ var startTime = this._currentTime;
+ var lastTask = this._schedulerQueue[this._schedulerQueue.length - 1];
+ this.tick(lastTask.endTime - startTime, doTick);
+ return this._currentTime - startTime;
+ };
+ Scheduler.prototype.flushNonPeriodic = function (limit, doTick) {
+ var startTime = this._currentTime;
+ var lastCurrentTime = 0;
+ 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?');
+ }
+ // flush only non-periodic timers.
+ // If the only remaining tasks are periodic(or requestAnimationFrame), finish flushing.
+ if (this._schedulerQueue.filter(function (task) { return !task.isPeriodic && !task.isRequestAnimationFrame; })
+ .length === 0) {
+ break;
+ }
+ var current = this._schedulerQueue.shift();
+ lastCurrentTime = this._currentTime;
+ this._currentTime = current.endTime;
+ if (doTick) {
+ // Update any secondary schedulers like Jasmine mock Date.
+ doTick(this._currentTime - lastCurrentTime);
+ }
+ 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;
+ };
+ // Next scheduler id.
+ Scheduler.nextId = 1;
+ return Scheduler;
+ }());
+ var FakeAsyncTestZoneSpec = /** @class */ (function () {
+ function FakeAsyncTestZoneSpec(namePrefix, trackPendingRequestAnimationFrame, macroTaskOptions) {
+ if (trackPendingRequestAnimationFrame === void 0) { trackPendingRequestAnimationFrame = false; }
+ this.trackPendingRequestAnimationFrame = trackPendingRequestAnimationFrame;
+ this.macroTaskOptions = macroTaskOptions;
+ this._scheduler = new Scheduler();
+ this._microtasks = [];
+ this._lastError = null;
+ this._uncaughtPromiseErrors = Promise[Zone.__symbol__('uncaughtPromiseErrors')];
+ this.pendingPeriodicTimers = [];
+ this.pendingTimers = [];
+ this.patchDateLocked = false;
+ this.properties = { 'FakeAsyncTestZoneSpec': this };
+ this.name = 'fakeAsyncTestZone for ' + namePrefix;
+ // in case user can't access the construction of FakeAsyncTestSpec
+ // user can also define macroTaskOptions by define a global variable.
+ if (!this.macroTaskOptions) {
+ this.macroTaskOptions = global[Zone.__symbol__('FakeAsyncTestMacroTask')];
+ }
+ }
+ FakeAsyncTestZoneSpec.assertInZone = function () {
+ if (Zone.current.get('FakeAsyncTestZoneSpec') == null) {
+ throw new Error('The code should be running in the fakeAsync zone to call this function');
+ }
+ };
+ FakeAsyncTestZoneSpec.prototype._fnAndFlush = function (fn, completers) {
+ var _this = this;
+ return function () {
+ var args = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ args[_i] = arguments[_i];
+ }
+ fn.apply(global, args);
+ if (_this._lastError === null) { // Success
+ if (completers.onSuccess != null) {
+ completers.onSuccess.apply(global);
+ }
+ // Flush microtasks only on success.
+ _this.flushMicrotasks();
+ }
+ else { // Failure
+ if (completers.onError != null) {
+ completers.onError.apply(global);
+ }
+ }
+ // Return true if there were no errors, false otherwise.
+ return _this._lastError === null;
+ };
+ };
+ FakeAsyncTestZoneSpec._removeTimer = function (timers, id) {
+ var index = timers.indexOf(id);
+ if (index > -1) {
+ timers.splice(index, 1);
+ }
+ };
+ FakeAsyncTestZoneSpec.prototype._dequeueTimer = function (id) {
+ var _this = this;
+ return function () {
+ FakeAsyncTestZoneSpec._removeTimer(_this.pendingTimers, id);
+ };
+ };
+ FakeAsyncTestZoneSpec.prototype._requeuePeriodicTimer = function (fn, interval, args, id) {
+ var _this = this;
+ return function () {
+ // Requeue the timer callback if it's not been canceled.
+ if (_this.pendingPeriodicTimers.indexOf(id) !== -1) {
+ _this._scheduler.scheduleFunction(fn, interval, args, true, false, id);
+ }
+ };
+ };
+ FakeAsyncTestZoneSpec.prototype._dequeuePeriodicTimer = function (id) {
+ var _this = this;
+ return function () {
+ FakeAsyncTestZoneSpec._removeTimer(_this.pendingPeriodicTimers, id);
+ };
+ };
+ FakeAsyncTestZoneSpec.prototype._setTimeout = function (fn, delay, args, isTimer) {
+ if (isTimer === void 0) { isTimer = true; }
+ var removeTimerFn = this._dequeueTimer(Scheduler.nextId);
+ // Queue the callback and dequeue the timer on success and error.
+ var cb = this._fnAndFlush(fn, { onSuccess: removeTimerFn, onError: removeTimerFn });
+ var id = this._scheduler.scheduleFunction(cb, delay, args, false, !isTimer);
+ if (isTimer) {
+ this.pendingTimers.push(id);
+ }
+ return id;
+ };
+ FakeAsyncTestZoneSpec.prototype._clearTimeout = function (id) {
+ FakeAsyncTestZoneSpec._removeTimer(this.pendingTimers, id);
+ this._scheduler.removeScheduledFunctionWithId(id);
+ };
+ FakeAsyncTestZoneSpec.prototype._setInterval = function (fn, interval, args) {
+ var id = Scheduler.nextId;
+ var completers = { onSuccess: null, onError: this._dequeuePeriodicTimer(id) };
+ var cb = this._fnAndFlush(fn, completers);
+ // Use the callback created above to requeue on success.
+ completers.onSuccess = this._requeuePeriodicTimer(cb, interval, args, id);
+ // Queue the callback and dequeue the periodic timer only on error.
+ this._scheduler.scheduleFunction(cb, interval, args, true);
+ this.pendingPeriodicTimers.push(id);
+ return id;
+ };
+ FakeAsyncTestZoneSpec.prototype._clearInterval = function (id) {
+ FakeAsyncTestZoneSpec._removeTimer(this.pendingPeriodicTimers, id);
+ this._scheduler.removeScheduledFunctionWithId(id);
+ };
+ FakeAsyncTestZoneSpec.prototype._resetLastErrorAndThrow = function () {
+ var error = this._lastError || this._uncaughtPromiseErrors[0];
+ this._uncaughtPromiseErrors.length = 0;
+ this._lastError = null;
+ throw error;
+ };
+ FakeAsyncTestZoneSpec.prototype.getCurrentTime = function () {
+ return this._scheduler.getCurrentTime();
+ };
+ FakeAsyncTestZoneSpec.prototype.getCurrentRealTime = function () {
+ return this._scheduler.getCurrentRealTime();
+ };
+ FakeAsyncTestZoneSpec.prototype.setCurrentRealTime = function (realTime) {
+ this._scheduler.setCurrentRealTime(realTime);
+ };
+ FakeAsyncTestZoneSpec.patchDate = function () {
+ if (!!global[Zone.__symbol__('disableDatePatching')]) {
+ // we don't want to patch global Date
+ // because in some case, global Date
+ // is already being patched, we need to provide
+ // an option to let user still use their
+ // own version of Date.
+ return;
+ }
+ if (global['Date'] === FakeDate) {
+ // already patched
+ return;
+ }
+ global['Date'] = FakeDate;
+ FakeDate.prototype = OriginalDate.prototype;
+ // try check and reset timers
+ // because jasmine.clock().install() may
+ // have replaced the global timer
+ FakeAsyncTestZoneSpec.checkTimerPatch();
+ };
+ FakeAsyncTestZoneSpec.resetDate = function () {
+ if (global['Date'] === FakeDate) {
+ global['Date'] = OriginalDate;
+ }
+ };
+ FakeAsyncTestZoneSpec.checkTimerPatch = function () {
+ if (global.setTimeout !== timers.setTimeout) {
+ global.setTimeout = timers.setTimeout;
+ global.clearTimeout = timers.clearTimeout;
+ }
+ if (global.setInterval !== timers.setInterval) {
+ global.setInterval = timers.setInterval;
+ global.clearInterval = timers.clearInterval;
+ }
+ };
+ FakeAsyncTestZoneSpec.prototype.lockDatePatch = function () {
+ this.patchDateLocked = true;
+ FakeAsyncTestZoneSpec.patchDate();
+ };
+ FakeAsyncTestZoneSpec.prototype.unlockDatePatch = function () {
+ this.patchDateLocked = false;
+ FakeAsyncTestZoneSpec.resetDate();
+ };
+ FakeAsyncTestZoneSpec.prototype.tick = function (millis, doTick) {
+ if (millis === void 0) { millis = 0; }
+ FakeAsyncTestZoneSpec.assertInZone();
+ this.flushMicrotasks();
+ this._scheduler.tick(millis, doTick);
+ if (this._lastError !== null) {
+ this._resetLastErrorAndThrow();
+ }
+ };
+ FakeAsyncTestZoneSpec.prototype.flushMicrotasks = function () {
+ var _this = this;
+ FakeAsyncTestZoneSpec.assertInZone();
+ var flushErrors = function () {
+ if (_this._lastError !== null || _this._uncaughtPromiseErrors.length) {
+ // If there is an error stop processing the microtask queue and rethrow the error.
+ _this._resetLastErrorAndThrow();
+ }
+ };
+ while (this._microtasks.length > 0) {
+ var microtask = this._microtasks.shift();
+ microtask.func.apply(microtask.target, microtask.args);
+ }
+ flushErrors();
+ };
+ FakeAsyncTestZoneSpec.prototype.flush = function (limit, flushPeriodic, doTick) {
+ FakeAsyncTestZoneSpec.assertInZone();
+ this.flushMicrotasks();
+ var elapsed = this._scheduler.flush(limit, flushPeriodic, doTick);
+ if (this._lastError !== null) {
+ this._resetLastErrorAndThrow();
+ }
+ return elapsed;
+ };
+ FakeAsyncTestZoneSpec.prototype.onScheduleTask = function (delegate, current, target, task) {
+ switch (task.type) {
+ case 'microTask':
+ 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 additionalArgs = void 0;
+ if (args) {
+ var callbackIndex = task.data.cbIdx;
+ if (typeof args.length === 'number' && args.length > callbackIndex + 1) {
+ additionalArgs = Array.prototype.slice.call(args, callbackIndex + 1);
+ }
+ }
+ this._microtasks.push({
+ func: task.invoke,
+ args: additionalArgs,
+ target: task.data && task.data.target
+ });
+ break;
+ case 'macroTask':
+ switch (task.source) {
+ case 'setTimeout':
+ task.data['handleId'] = this._setTimeout(task.invoke, task.data['delay'], Array.prototype.slice.call(task.data['args'], 2));
+ break;
+ case 'setImmediate':
+ task.data['handleId'] = this._setTimeout(task.invoke, 0, Array.prototype.slice.call(task.data['args'], 1));
+ break;
+ case 'setInterval':
+ task.data['handleId'] = this._setInterval(task.invoke, task.data['delay'], Array.prototype.slice.call(task.data['args'], 2));
+ break;
+ case 'XMLHttpRequest.send':
+ throw new Error('Cannot make XHRs from within a fake async test. Request URL: ' +
+ task.data['url']);
+ case 'requestAnimationFrame':
+ case 'webkitRequestAnimationFrame':
+ case 'mozRequestAnimationFrame':
+ // Simulate a requestAnimationFrame by using a setTimeout with 16 ms.
+ // (60 frames per second)
+ task.data['handleId'] = this._setTimeout(task.invoke, 16, task.data['args'], this.trackPendingRequestAnimationFrame);
+ break;
+ default:
+ // user can define which macroTask they want to support by passing
+ // macroTaskOptions
+ var macroTaskOption = this.findMacroTaskOption(task);
+ if (macroTaskOption) {
+ var args_1 = task.data && task.data['args'];
+ var delay = args_1 && args_1.length > 1 ? args_1[1] : 0;
+ var callbackArgs = macroTaskOption.callbackArgs ? macroTaskOption.callbackArgs : args_1;
+ if (!!macroTaskOption.isPeriodic) {
+ // periodic macroTask, use setInterval to simulate
+ task.data['handleId'] = this._setInterval(task.invoke, delay, callbackArgs);
+ task.data.isPeriodic = true;
+ }
+ else {
+ // not periodic, use setTimeout to simulate
+ task.data['handleId'] = this._setTimeout(task.invoke, delay, callbackArgs);
+ }
+ break;
+ }
+ throw new Error('Unknown macroTask scheduled in fake async test: ' + task.source);
+ }
+ break;
+ case 'eventTask':
+ task = delegate.scheduleTask(target, task);
+ break;
+ }
+ return task;
+ };
+ FakeAsyncTestZoneSpec.prototype.onCancelTask = function (delegate, current, target, task) {
+ switch (task.source) {
+ case 'setTimeout':
+ case 'requestAnimationFrame':
+ case 'webkitRequestAnimationFrame':
+ case 'mozRequestAnimationFrame':
+ return this._clearTimeout(task.data['handleId']);
+ case 'setInterval':
+ return this._clearInterval(task.data['handleId']);
+ default:
+ // user can define which macroTask they want to support by passing
+ // macroTaskOptions
+ var macroTaskOption = this.findMacroTaskOption(task);
+ if (macroTaskOption) {
+ var handleId = task.data['handleId'];
+ return macroTaskOption.isPeriodic ? this._clearInterval(handleId) :
+ this._clearTimeout(handleId);
+ }
+ return delegate.cancelTask(target, task);
+ }
+ };
+ FakeAsyncTestZoneSpec.prototype.onInvoke = function (delegate, current, target, callback, applyThis, applyArgs, source) {
+ try {
+ FakeAsyncTestZoneSpec.patchDate();
+ return delegate.invoke(target, callback, applyThis, applyArgs, source);
+ }
+ finally {
+ if (!this.patchDateLocked) {
+ FakeAsyncTestZoneSpec.resetDate();
+ }
+ }
+ };
+ FakeAsyncTestZoneSpec.prototype.findMacroTaskOption = function (task) {
+ if (!this.macroTaskOptions) {
+ return null;
+ }
+ for (var i = 0; i < this.macroTaskOptions.length; i++) {
+ var macroTaskOption = this.macroTaskOptions[i];
+ if (macroTaskOption.source === task.source) {
+ return macroTaskOption;
+ }
+ }
+ return null;
+ };
+ FakeAsyncTestZoneSpec.prototype.onHandleError = function (parentZoneDelegate, currentZone, targetZone, error) {
+ this._lastError = error;
+ return false; // Don't propagate error to parent zone.
+ };
+ return FakeAsyncTestZoneSpec;
+ }());
+ // Export the class so that new instances can be created with proper
+ // constructor params.
+ Zone['FakeAsyncTestZoneSpec'] = FakeAsyncTestZoneSpec;
+})(typeof window === 'object' && window || typeof self === 'object' && self || global);
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+Zone.__load_patch('fakeasync', function (global, Zone, api) {
+ var FakeAsyncTestZoneSpec = Zone && Zone['FakeAsyncTestZoneSpec'];
+ var ProxyZoneSpec = Zone && Zone['ProxyZoneSpec'];
+ var _fakeAsyncTestZoneSpec = null;
+ /**
+ * Clears out the shared fake async zone for a test.
+ * To be called in a global `beforeEach`.
+ *
+ * @experimental
+ */
+ function resetFakeAsyncZone() {
+ if (_fakeAsyncTestZoneSpec) {
+ _fakeAsyncTestZoneSpec.unlockDatePatch();
+ }
+ _fakeAsyncTestZoneSpec = null;
+ // in node.js testing we may not have ProxyZoneSpec in which case there is nothing to reset.
+ ProxyZoneSpec && ProxyZoneSpec.assertPresent().resetDelegate();
+ }
+ /**
+ * Wraps a function to be executed in the fakeAsync zone:
+ * - microtasks are manually executed by calling `flushMicrotasks()`,
+ * - timers are synchronous, `tick()` simulates the asynchronous passage of time.
+ *
+ * If there are any pending timers at the end of the function, an exception will be thrown.
+ *
+ * Can be used to wrap inject() calls.
+ *
+ * ## Example
+ *
+ * {@example core/testing/ts/fake_async.ts region='basic'}
+ *
+ * @param fn
+ * @returns The function wrapped to be executed in the fakeAsync zone
+ *
+ * @experimental
+ */
+ function fakeAsync(fn) {
+ // Not using an arrow function to preserve context passed from call site
+ return function () {
+ var args = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ args[_i] = arguments[_i];
+ }
+ var proxyZoneSpec = ProxyZoneSpec.assertPresent();
+ if (Zone.current.get('FakeAsyncTestZoneSpec')) {
+ throw new Error('fakeAsync() calls can not be nested');
+ }
+ try {
+ // in case jasmine.clock init a fakeAsyncTestZoneSpec
+ if (!_fakeAsyncTestZoneSpec) {
+ if (proxyZoneSpec.getDelegate() instanceof FakeAsyncTestZoneSpec) {
+ throw new Error('fakeAsync() calls can not be nested');
+ }
+ _fakeAsyncTestZoneSpec = new FakeAsyncTestZoneSpec();
+ }
+ var res = void 0;
+ var lastProxyZoneSpec = proxyZoneSpec.getDelegate();
+ proxyZoneSpec.setDelegate(_fakeAsyncTestZoneSpec);
+ _fakeAsyncTestZoneSpec.lockDatePatch();
+ try {
+ res = fn.apply(this, args);
+ flushMicrotasks();
+ }
+ finally {
+ proxyZoneSpec.setDelegate(lastProxyZoneSpec);
+ }
+ if (_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length > 0) {
+ throw new Error(_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length + " " +
+ "periodic timer(s) still in the queue.");
+ }
+ if (_fakeAsyncTestZoneSpec.pendingTimers.length > 0) {
+ throw new Error(_fakeAsyncTestZoneSpec.pendingTimers.length + " timer(s) still in the queue.");
+ }
+ return res;
+ }
+ finally {
+ resetFakeAsyncZone();
+ }
+ };
+ }
+ function _getFakeAsyncZoneSpec() {
+ if (_fakeAsyncTestZoneSpec == null) {
+ _fakeAsyncTestZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
+ if (_fakeAsyncTestZoneSpec == null) {
+ throw new Error('The code should be running in the fakeAsync zone to call this function');
+ }
+ }
+ return _fakeAsyncTestZoneSpec;
+ }
+ /**
+ * Simulates the asynchronous passage of time for the timers in the fakeAsync zone.
+ *
+ * The microtasks queue is drained at the very start of this function and after any timer callback
+ * has been executed.
+ *
+ * ## Example
+ *
+ * {@example core/testing/ts/fake_async.ts region='basic'}
+ *
+ * @experimental
+ */
+ function tick(millis) {
+ if (millis === void 0) { millis = 0; }
+ _getFakeAsyncZoneSpec().tick(millis);
+ }
+ /**
+ * Simulates the asynchronous passage of time for the timers in the fakeAsync zone by
+ * draining the macrotask queue until it is empty. The returned value is the milliseconds
+ * of time that would have been elapsed.
+ *
+ * @param maxTurns
+ * @returns The simulated time elapsed, in millis.
+ *
+ * @experimental
+ */
+ function flush(maxTurns) {
+ return _getFakeAsyncZoneSpec().flush(maxTurns);
+ }
+ /**
+ * Discard all remaining periodic tasks.
+ *
+ * @experimental
+ */
+ function discardPeriodicTasks() {
+ var zoneSpec = _getFakeAsyncZoneSpec();
+ var pendingTimers = zoneSpec.pendingPeriodicTimers;
+ zoneSpec.pendingPeriodicTimers.length = 0;
+ }
+ /**
+ * Flush any pending microtasks.
+ *
+ * @experimental
+ */
+ function flushMicrotasks() {
+ _getFakeAsyncZoneSpec().flushMicrotasks();
+ }
+ Zone[api.symbol('fakeAsyncTest')] =
+ { resetFakeAsyncZone: resetFakeAsyncZone, flushMicrotasks: flushMicrotasks, discardPeriodicTasks: discardPeriodicTasks, tick: tick, flush: flush, fakeAsync: fakeAsync };
+});
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Promise for async/fakeAsync zoneSpec test
+ * can support async operation which not supported by zone.js
+ * such as
+ * it ('test jsonp in AsyncZone', async() => {
+ * new Promise(res => {
+ * jsonp(url, (data) => {
+ * // success callback
+ * res(data);
+ * });
+ * }).then((jsonpResult) => {
+ * // get jsonp result.
+ *
+ * // user will expect AsyncZoneSpec wait for
+ * // then, but because jsonp is not zone aware
+ * // AsyncZone will finish before then is called.
+ * });
+ * });
+ */
+Zone.__load_patch('promisefortest', function (global, Zone, api) {
+ var symbolState = api.symbol('state');
+ var UNRESOLVED = null;
+ var symbolParentUnresolved = api.symbol('parentUnresolved');
+ // patch Promise.prototype.then to keep an internal
+ // number for tracking unresolved chained promise
+ // we will decrease this number when the parent promise
+ // being resolved/rejected and chained promise was
+ // scheduled as a microTask.
+ // so we can know such kind of chained promise still
+ // not resolved in AsyncTestZone
+ Promise[api.symbol('patchPromiseForTest')] = function patchPromiseForTest() {
+ var oriThen = Promise[Zone.__symbol__('ZonePromiseThen')];
+ if (oriThen) {
+ return;
+ }
+ oriThen = Promise[Zone.__symbol__('ZonePromiseThen')] = Promise.prototype.then;
+ Promise.prototype.then = function () {
+ var chained = oriThen.apply(this, arguments);
+ if (this[symbolState] === UNRESOLVED) {
+ // parent promise is unresolved.
+ var asyncTestZoneSpec = Zone.current.get('AsyncTestZoneSpec');
+ if (asyncTestZoneSpec) {
+ asyncTestZoneSpec.unresolvedChainedPromiseCount++;
+ chained[symbolParentUnresolved] = true;
+ }
+ }
+ return chained;
+ };
+ };
+ Promise[api.symbol('unPatchPromiseForTest')] = function unpatchPromiseForTest() {
+ // restore origin then
+ var oriThen = Promise[Zone.__symbol__('ZonePromiseThen')];
+ if (oriThen) {
+ Promise.prototype.then = oriThen;
+ Promise[Zone.__symbol__('ZonePromiseThen')] = undefined;
+ }
+ };
+});
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// load test related files into bundle in correct order
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// load test related files into bundle
+
+})));
diff --git a/dist/zone-evergreen.js b/dist/zone-evergreen.js
new file mode 100644
index 000000000..6666bf1cb
--- /dev/null
+++ b/dist/zone-evergreen.js
@@ -0,0 +1,3040 @@
+/**
+* @license
+* Copyright Google Inc. All Rights Reserved.
+*
+* Use of this source code is governed by an MIT-style license that can be
+* found in the LICENSE file at https://angular.io/license
+*/
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+const Zone$1 = (function (global) {
+ const performance = global['performance'];
+ function mark(name) {
+ performance && performance['mark'] && performance['mark'](name);
+ }
+ function performanceMeasure(name, label) {
+ performance && performance['measure'] && performance['measure'](name, label);
+ }
+ mark('Zone');
+ const checkDuplicate = global[('__zone_symbol__forceDuplicateZoneCheck')] === true;
+ if (global['Zone']) {
+ // if global['Zone'] already exists (maybe zone.js was already loaded or
+ // some other lib also registered a global object named Zone), we may need
+ // to throw an error, but sometimes user may not want this error.
+ // For example,
+ // we have two web pages, page1 includes zone.js, page2 doesn't.
+ // and the 1st time user load page1 and page2, everything work fine,
+ // but when user load page2 again, error occurs because global['Zone'] already exists.
+ // so we add a flag to let user choose whether to throw this error or not.
+ // By default, if existing Zone is from zone.js, we will not throw the error.
+ if (checkDuplicate || typeof global['Zone'].__symbol__ !== 'function') {
+ throw new Error('Zone already loaded.');
+ }
+ else {
+ return global['Zone'];
+ }
+ }
+ class Zone {
+ constructor(parent, zoneSpec) {
+ this._parent = parent;
+ this._name = zoneSpec ? zoneSpec.name || 'unnamed' : '';
+ this._properties = zoneSpec && zoneSpec.properties || {};
+ this._zoneDelegate =
+ new ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec);
+ }
+ static assertZonePatched() {
+ if (global['Promise'] !== patches['ZoneAwarePromise']) {
+ throw new Error('Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' +
+ 'has been overwritten.\n' +
+ 'Most 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.)');
+ }
+ }
+ static get root() {
+ let zone = Zone.current;
+ while (zone.parent) {
+ zone = zone.parent;
+ }
+ return zone;
+ }
+ static get current() {
+ return _currentZoneFrame.zone;
+ }
+ static get currentTask() {
+ return _currentTask;
+ }
+ static __load_patch(name, fn) {
+ if (patches.hasOwnProperty(name)) {
+ if (checkDuplicate) {
+ throw Error('Already loaded patch: ' + name);
+ }
+ }
+ else if (!global['__Zone_disable_' + name]) {
+ const perfName = 'Zone:' + name;
+ mark(perfName);
+ patches[name] = fn(global, Zone, _api);
+ performanceMeasure(perfName, perfName);
+ }
+ }
+ get parent() {
+ return this._parent;
+ }
+ get name() {
+ return this._name;
+ }
+ get(key) {
+ const zone = this.getZoneWith(key);
+ if (zone)
+ return zone._properties[key];
+ }
+ getZoneWith(key) {
+ let current = this;
+ while (current) {
+ if (current._properties.hasOwnProperty(key)) {
+ return current;
+ }
+ current = current._parent;
+ }
+ return null;
+ }
+ fork(zoneSpec) {
+ if (!zoneSpec)
+ throw new Error('ZoneSpec required!');
+ return this._zoneDelegate.fork(this, zoneSpec);
+ }
+ wrap(callback, source) {
+ if (typeof callback !== 'function') {
+ throw new Error('Expecting function got: ' + callback);
+ }
+ const _callback = this._zoneDelegate.intercept(this, callback, source);
+ const zone = this;
+ return function () {
+ return zone.runGuarded(_callback, this, arguments, source);
+ };
+ }
+ run(callback, applyThis, applyArgs, source) {
+ _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+ try {
+ return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
+ }
+ finally {
+ _currentZoneFrame = _currentZoneFrame.parent;
+ }
+ }
+ runGuarded(callback, applyThis = null, applyArgs, source) {
+ _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+ try {
+ try {
+ return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
+ }
+ catch (error) {
+ if (this._zoneDelegate.handleError(this, error)) {
+ throw error;
+ }
+ }
+ }
+ finally {
+ _currentZoneFrame = _currentZoneFrame.parent;
+ }
+ }
+ runTask(task, applyThis, applyArgs) {
+ if (task.zone != this) {
+ throw new Error('A task can only be run in the zone of creation! (Creation: ' +
+ (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')');
+ }
+ // https://github.com/angular/zone.js/issues/778, sometimes eventTask
+ // will run in notScheduled(canceled) state, we should not try to
+ // run such kind of task but just return
+ if (task.state === notScheduled && (task.type === eventTask || task.type === macroTask)) {
+ return;
+ }
+ const reEntryGuard = task.state != running;
+ reEntryGuard && task._transitionTo(running, scheduled);
+ task.runCount++;
+ const previousTask = _currentTask;
+ _currentTask = task;
+ _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+ try {
+ if (task.type == macroTask && task.data && !task.data.isPeriodic) {
+ task.cancelFn = undefined;
+ }
+ try {
+ return this._zoneDelegate.invokeTask(this, task, applyThis, applyArgs);
+ }
+ catch (error) {
+ if (this._zoneDelegate.handleError(this, error)) {
+ throw error;
+ }
+ }
+ }
+ finally {
+ // if the task's state is notScheduled or unknown, then it has already been cancelled
+ // we should not reset the state to scheduled
+ if (task.state !== notScheduled && task.state !== unknown) {
+ if (task.type == eventTask || (task.data && task.data.isPeriodic)) {
+ reEntryGuard && task._transitionTo(scheduled, running);
+ }
+ else {
+ task.runCount = 0;
+ this._updateTaskCount(task, -1);
+ reEntryGuard &&
+ task._transitionTo(notScheduled, running, notScheduled);
+ }
+ }
+ _currentZoneFrame = _currentZoneFrame.parent;
+ _currentTask = previousTask;
+ }
+ }
+ scheduleTask(task) {
+ if (task.zone && task.zone !== this) {
+ // check if the task was rescheduled, the newZone
+ // should not be the children of the original zone
+ let newZone = this;
+ while (newZone) {
+ if (newZone === task.zone) {
+ throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${task.zone.name}`);
+ }
+ newZone = newZone.parent;
+ }
+ }
+ task._transitionTo(scheduling, notScheduled);
+ const zoneDelegates = [];
+ task._zoneDelegates = zoneDelegates;
+ task._zone = this;
+ try {
+ task = this._zoneDelegate.scheduleTask(this, task);
+ }
+ catch (err) {
+ // should set task's state to unknown when scheduleTask throw error
+ // because the err may from reschedule, so the fromState maybe notScheduled
+ task._transitionTo(unknown, scheduling, notScheduled);
+ // TODO: @JiaLiPassion, should we check the result from handleError?
+ this._zoneDelegate.handleError(this, err);
+ throw err;
+ }
+ if (task._zoneDelegates === zoneDelegates) {
+ // we have to check because internally the delegate can reschedule the task.
+ this._updateTaskCount(task, 1);
+ }
+ if (task.state == scheduling) {
+ task._transitionTo(scheduled, scheduling);
+ }
+ return task;
+ }
+ scheduleMicroTask(source, callback, data, customSchedule) {
+ return this.scheduleTask(new ZoneTask(microTask, source, callback, data, customSchedule, undefined));
+ }
+ scheduleMacroTask(source, callback, data, customSchedule, customCancel) {
+ return this.scheduleTask(new ZoneTask(macroTask, source, callback, data, customSchedule, customCancel));
+ }
+ scheduleEventTask(source, callback, data, customSchedule, customCancel) {
+ return this.scheduleTask(new ZoneTask(eventTask, source, callback, data, customSchedule, customCancel));
+ }
+ cancelTask(task) {
+ if (task.zone != this)
+ throw new Error('A task can only be cancelled in the zone of creation! (Creation: ' +
+ (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')');
+ task._transitionTo(canceling, scheduled, running);
+ try {
+ this._zoneDelegate.cancelTask(this, task);
+ }
+ catch (err) {
+ // if error occurs when cancelTask, transit the state to unknown
+ task._transitionTo(unknown, canceling);
+ this._zoneDelegate.handleError(this, err);
+ throw err;
+ }
+ this._updateTaskCount(task, -1);
+ task._transitionTo(notScheduled, canceling);
+ task.runCount = 0;
+ return task;
+ }
+ _updateTaskCount(task, count) {
+ const zoneDelegates = task._zoneDelegates;
+ if (count == -1) {
+ task._zoneDelegates = null;
+ }
+ for (let i = 0; i < zoneDelegates.length; i++) {
+ zoneDelegates[i]._updateTaskCount(task.type, count);
+ }
+ }
+ }
+ Zone.__symbol__ = __symbol__;
+ const DELEGATE_ZS = {
+ name: '',
+ onHasTask: (delegate, _, target, hasTaskState) => delegate.hasTask(target, hasTaskState),
+ onScheduleTask: (delegate, _, target, task) => delegate.scheduleTask(target, task),
+ onInvokeTask: (delegate, _, target, task, applyThis, applyArgs) => delegate.invokeTask(target, task, applyThis, applyArgs),
+ onCancelTask: (delegate, _, target, task) => delegate.cancelTask(target, task)
+ };
+ class ZoneDelegate {
+ constructor(zone, parentDelegate, zoneSpec) {
+ this._taskCounts = { 'microTask': 0, 'macroTask': 0, 'eventTask': 0 };
+ this.zone = zone;
+ this._parentDelegate = parentDelegate;
+ this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS);
+ this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt);
+ this._forkCurrZone = zoneSpec && (zoneSpec.onFork ? this.zone : parentDelegate.zone);
+ this._interceptZS =
+ zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS);
+ this._interceptDlgt =
+ zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt);
+ this._interceptCurrZone =
+ zoneSpec && (zoneSpec.onIntercept ? this.zone : parentDelegate.zone);
+ this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS);
+ this._invokeDlgt =
+ zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt);
+ this._invokeCurrZone = zoneSpec && (zoneSpec.onInvoke ? this.zone : parentDelegate.zone);
+ this._handleErrorZS =
+ zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS);
+ this._handleErrorDlgt =
+ zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt);
+ this._handleErrorCurrZone =
+ zoneSpec && (zoneSpec.onHandleError ? this.zone : parentDelegate.zone);
+ this._scheduleTaskZS =
+ zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS);
+ this._scheduleTaskDlgt = zoneSpec &&
+ (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt);
+ this._scheduleTaskCurrZone =
+ zoneSpec && (zoneSpec.onScheduleTask ? this.zone : parentDelegate.zone);
+ this._invokeTaskZS =
+ zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS);
+ this._invokeTaskDlgt =
+ zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt);
+ this._invokeTaskCurrZone =
+ zoneSpec && (zoneSpec.onInvokeTask ? this.zone : parentDelegate.zone);
+ this._cancelTaskZS =
+ zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS);
+ this._cancelTaskDlgt =
+ zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt);
+ this._cancelTaskCurrZone =
+ zoneSpec && (zoneSpec.onCancelTask ? this.zone : parentDelegate.zone);
+ this._hasTaskZS = null;
+ this._hasTaskDlgt = null;
+ this._hasTaskDlgtOwner = null;
+ this._hasTaskCurrZone = null;
+ const zoneSpecHasTask = zoneSpec && zoneSpec.onHasTask;
+ const parentHasTask = parentDelegate && parentDelegate._hasTaskZS;
+ if (zoneSpecHasTask || parentHasTask) {
+ // If we need to report hasTask, than this ZS needs to do ref counting on tasks. In such
+ // a case all task related interceptors must go through this ZD. We can't short circuit it.
+ this._hasTaskZS = zoneSpecHasTask ? zoneSpec : DELEGATE_ZS;
+ this._hasTaskDlgt = parentDelegate;
+ this._hasTaskDlgtOwner = this;
+ this._hasTaskCurrZone = zone;
+ if (!zoneSpec.onScheduleTask) {
+ this._scheduleTaskZS = DELEGATE_ZS;
+ this._scheduleTaskDlgt = parentDelegate;
+ this._scheduleTaskCurrZone = this.zone;
+ }
+ if (!zoneSpec.onInvokeTask) {
+ this._invokeTaskZS = DELEGATE_ZS;
+ this._invokeTaskDlgt = parentDelegate;
+ this._invokeTaskCurrZone = this.zone;
+ }
+ if (!zoneSpec.onCancelTask) {
+ this._cancelTaskZS = DELEGATE_ZS;
+ this._cancelTaskDlgt = parentDelegate;
+ this._cancelTaskCurrZone = this.zone;
+ }
+ }
+ }
+ fork(targetZone, zoneSpec) {
+ return this._forkZS ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec) :
+ new Zone(targetZone, zoneSpec);
+ }
+ intercept(targetZone, callback, source) {
+ return this._interceptZS ?
+ this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source) :
+ callback;
+ }
+ invoke(targetZone, callback, applyThis, applyArgs, source) {
+ return this._invokeZS ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source) :
+ callback.apply(applyThis, applyArgs);
+ }
+ handleError(targetZone, error) {
+ return this._handleErrorZS ?
+ this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error) :
+ true;
+ }
+ scheduleTask(targetZone, task) {
+ let returnTask = task;
+ if (this._scheduleTaskZS) {
+ if (this._hasTaskZS) {
+ returnTask._zoneDelegates.push(this._hasTaskDlgtOwner);
+ }
+ returnTask = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task);
+ if (!returnTask)
+ returnTask = task;
+ }
+ else {
+ if (task.scheduleFn) {
+ task.scheduleFn(task);
+ }
+ else if (task.type == microTask) {
+ scheduleMicroTask(task);
+ }
+ else {
+ throw new Error('Task is missing scheduleFn.');
+ }
+ }
+ return returnTask;
+ }
+ invokeTask(targetZone, task, applyThis, applyArgs) {
+ return this._invokeTaskZS ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs) :
+ task.callback.apply(applyThis, applyArgs);
+ }
+ cancelTask(targetZone, task) {
+ let value;
+ if (this._cancelTaskZS) {
+ value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task);
+ }
+ else {
+ if (!task.cancelFn) {
+ throw Error('Task is not cancelable');
+ }
+ value = task.cancelFn(task);
+ }
+ return value;
+ }
+ hasTask(targetZone, isEmpty) {
+ // hasTask should not throw error so other ZoneDelegate
+ // can still trigger hasTask callback
+ try {
+ this._hasTaskZS &&
+ this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty);
+ }
+ catch (err) {
+ this.handleError(targetZone, err);
+ }
+ }
+ _updateTaskCount(type, count) {
+ const counts = this._taskCounts;
+ const prev = counts[type];
+ const next = counts[type] = prev + count;
+ if (next < 0) {
+ throw new Error('More tasks executed then were scheduled.');
+ }
+ if (prev == 0 || next == 0) {
+ const isEmpty = {
+ microTask: counts['microTask'] > 0,
+ macroTask: counts['macroTask'] > 0,
+ eventTask: counts['eventTask'] > 0,
+ change: type
+ };
+ this.hasTask(this.zone, isEmpty);
+ }
+ }
+ }
+ class ZoneTask {
+ constructor(type, source, callback, options, scheduleFn, cancelFn) {
+ this._zone = null;
+ this.runCount = 0;
+ this._zoneDelegates = null;
+ this._state = 'notScheduled';
+ this.type = type;
+ this.source = source;
+ this.data = options;
+ this.scheduleFn = scheduleFn;
+ this.cancelFn = cancelFn;
+ this.callback = callback;
+ const self = this;
+ // TODO: @JiaLiPassion options should have interface
+ if (type === eventTask && options && options.useG) {
+ this.invoke = ZoneTask.invokeTask;
+ }
+ else {
+ this.invoke = function () {
+ return ZoneTask.invokeTask.call(global, self, this, arguments);
+ };
+ }
+ }
+ static invokeTask(task, target, args) {
+ if (!task) {
+ task = this;
+ }
+ _numberOfNestedTaskFrames++;
+ try {
+ task.runCount++;
+ return task.zone.runTask(task, target, args);
+ }
+ finally {
+ if (_numberOfNestedTaskFrames == 1) {
+ drainMicroTaskQueue();
+ }
+ _numberOfNestedTaskFrames--;
+ }
+ }
+ get zone() {
+ return this._zone;
+ }
+ get state() {
+ return this._state;
+ }
+ cancelScheduleRequest() {
+ this._transitionTo(notScheduled, scheduling);
+ }
+ _transitionTo(toState, fromState1, fromState2) {
+ if (this._state === fromState1 || this._state === fromState2) {
+ this._state = toState;
+ if (toState == notScheduled) {
+ this._zoneDelegates = null;
+ }
+ }
+ else {
+ throw new Error(`${this.type} '${this.source}': can not transition to '${toState}', expecting state '${fromState1}'${fromState2 ? ' or \'' + fromState2 + '\'' : ''}, was '${this._state}'.`);
+ }
+ }
+ toString() {
+ if (this.data && typeof this.data.handleId !== 'undefined') {
+ return this.data.handleId.toString();
+ }
+ else {
+ return Object.prototype.toString.call(this);
+ }
+ }
+ // add toJSON method to prevent cyclic error when
+ // call JSON.stringify(zoneTask)
+ toJSON() {
+ return {
+ type: this.type,
+ state: this.state,
+ source: this.source,
+ zone: this.zone.name,
+ runCount: this.runCount
+ };
+ }
+ }
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ /// MICROTASK QUEUE
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ const symbolSetTimeout = __symbol__('setTimeout');
+ const symbolPromise = __symbol__('Promise');
+ const symbolThen = __symbol__('then');
+ let _microTaskQueue = [];
+ let _isDrainingMicrotaskQueue = false;
+ let nativeMicroTaskQueuePromise;
+ function scheduleMicroTask(task) {
+ // if we are not running in any task, and there has not been anything scheduled
+ // we must bootstrap the initial task creation by manually scheduling the drain
+ if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) {
+ // We are not running in Task, so we need to kickstart the microtask queue.
+ if (!nativeMicroTaskQueuePromise) {
+ if (global[symbolPromise]) {
+ nativeMicroTaskQueuePromise = global[symbolPromise].resolve(0);
+ }
+ }
+ if (nativeMicroTaskQueuePromise) {
+ let nativeThen = nativeMicroTaskQueuePromise[symbolThen];
+ if (!nativeThen) {
+ // native Promise is not patchable, we need to use `then` directly
+ // issue 1078
+ nativeThen = nativeMicroTaskQueuePromise['then'];
+ }
+ nativeThen.call(nativeMicroTaskQueuePromise, drainMicroTaskQueue);
+ }
+ else {
+ global[symbolSetTimeout](drainMicroTaskQueue, 0);
+ }
+ }
+ task && _microTaskQueue.push(task);
+ }
+ function drainMicroTaskQueue() {
+ if (!_isDrainingMicrotaskQueue) {
+ _isDrainingMicrotaskQueue = true;
+ while (_microTaskQueue.length) {
+ const queue = _microTaskQueue;
+ _microTaskQueue = [];
+ for (let i = 0; i < queue.length; i++) {
+ const task = queue[i];
+ try {
+ task.zone.runTask(task, null, null);
+ }
+ catch (error) {
+ _api.onUnhandledError(error);
+ }
+ }
+ }
+ _api.microtaskDrainDone();
+ _isDrainingMicrotaskQueue = false;
+ }
+ }
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ /// BOOTSTRAP
+ //////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////
+ const NO_ZONE = { name: 'NO ZONE' };
+ const notScheduled = 'notScheduled', scheduling = 'scheduling', scheduled = 'scheduled', running = 'running', canceling = 'canceling', unknown = 'unknown';
+ const microTask = 'microTask', macroTask = 'macroTask', eventTask = 'eventTask';
+ const patches = {};
+ const _api = {
+ symbol: __symbol__,
+ currentZoneFrame: () => _currentZoneFrame,
+ onUnhandledError: noop,
+ microtaskDrainDone: noop,
+ scheduleMicroTask: scheduleMicroTask,
+ showUncaughtError: () => !Zone[__symbol__('ignoreConsoleErrorUncaughtError')],
+ patchEventTarget: () => [],
+ patchOnProperties: noop,
+ patchMethod: () => noop,
+ bindArguments: () => [],
+ patchThen: () => noop,
+ patchMacroTask: () => noop,
+ setNativePromise: (NativePromise) => {
+ // sometimes NativePromise.resolve static function
+ // is not ready yet, (such as core-js/es6.promise)
+ // so we need to check here.
+ if (NativePromise && typeof NativePromise.resolve === 'function') {
+ nativeMicroTaskQueuePromise = NativePromise.resolve(0);
+ }
+ },
+ patchEventPrototype: () => noop,
+ isIEOrEdge: () => false,
+ getGlobalObjects: () => undefined,
+ ObjectDefineProperty: () => noop,
+ ObjectGetOwnPropertyDescriptor: () => undefined,
+ ObjectCreate: () => undefined,
+ ArraySlice: () => [],
+ patchClass: () => noop,
+ wrapWithCurrentZone: () => noop,
+ filterProperties: () => [],
+ attachOriginToPatched: () => noop,
+ _redefineProperty: () => noop,
+ patchCallbacks: () => noop
+ };
+ let _currentZoneFrame = { parent: null, zone: new Zone(null, null) };
+ let _currentTask = null;
+ let _numberOfNestedTaskFrames = 0;
+ function noop() { }
+ function __symbol__(name) {
+ return '__zone_symbol__' + name;
+ }
+ performanceMeasure('Zone', 'Zone');
+ return global['Zone'] = Zone;
+})(typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global);
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+Zone.__load_patch('ZoneAwarePromise', (global, Zone, api) => {
+ const ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+ const ObjectDefineProperty = Object.defineProperty;
+ function readableObjectToString(obj) {
+ if (obj && obj.toString === Object.prototype.toString) {
+ const className = obj.constructor && obj.constructor.name;
+ return (className ? className : '') + ': ' + JSON.stringify(obj);
+ }
+ return obj ? obj.toString() : Object.prototype.toString.call(obj);
+ }
+ const __symbol__ = api.symbol;
+ const _uncaughtPromiseErrors = [];
+ const symbolPromise = __symbol__('Promise');
+ const symbolThen = __symbol__('then');
+ const creationTrace = '__creationTrace__';
+ api.onUnhandledError = (e) => {
+ if (api.showUncaughtError()) {
+ const rejection = e && e.rejection;
+ if (rejection) {
+ console.error('Unhandled Promise rejection:', rejection instanceof Error ? rejection.message : rejection, '; Zone:', e.zone.name, '; Task:', e.task && e.task.source, '; Value:', rejection, rejection instanceof Error ? rejection.stack : undefined);
+ }
+ else {
+ console.error(e);
+ }
+ }
+ };
+ api.microtaskDrainDone = () => {
+ while (_uncaughtPromiseErrors.length) {
+ while (_uncaughtPromiseErrors.length) {
+ const uncaughtPromiseError = _uncaughtPromiseErrors.shift();
+ try {
+ uncaughtPromiseError.zone.runGuarded(() => {
+ throw uncaughtPromiseError;
+ });
+ }
+ catch (error) {
+ handleUnhandledRejection(error);
+ }
+ }
+ }
+ };
+ const UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__('unhandledPromiseRejectionHandler');
+ function handleUnhandledRejection(e) {
+ api.onUnhandledError(e);
+ try {
+ const handler = Zone[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL];
+ if (handler && typeof handler === 'function') {
+ handler.call(this, e);
+ }
+ }
+ catch (err) {
+ }
+ }
+ function isThenable(value) {
+ return value && value.then;
+ }
+ function forwardResolution(value) {
+ return value;
+ }
+ function forwardRejection(rejection) {
+ return ZoneAwarePromise.reject(rejection);
+ }
+ const symbolState = __symbol__('state');
+ const symbolValue = __symbol__('value');
+ const symbolFinally = __symbol__('finally');
+ const symbolParentPromiseValue = __symbol__('parentPromiseValue');
+ const symbolParentPromiseState = __symbol__('parentPromiseState');
+ const source = 'Promise.then';
+ const UNRESOLVED = null;
+ const RESOLVED = true;
+ const REJECTED = false;
+ const REJECTED_NO_CATCH = 0;
+ function makeResolver(promise, state) {
+ return (v) => {
+ try {
+ resolvePromise(promise, state, v);
+ }
+ catch (err) {
+ resolvePromise(promise, false, err);
+ }
+ // Do not return value or you will break the Promise spec.
+ };
+ }
+ const once = function () {
+ let wasCalled = false;
+ return function wrapper(wrappedFunction) {
+ return function () {
+ if (wasCalled) {
+ return;
+ }
+ wasCalled = true;
+ wrappedFunction.apply(null, arguments);
+ };
+ };
+ };
+ const TYPE_ERROR = 'Promise resolved with itself';
+ const CURRENT_TASK_TRACE_SYMBOL = __symbol__('currentTaskTrace');
+ // Promise Resolution
+ function resolvePromise(promise, state, value) {
+ const onceWrapper = once();
+ if (promise === value) {
+ throw new TypeError(TYPE_ERROR);
+ }
+ if (promise[symbolState] === UNRESOLVED) {
+ // should only get value.then once based on promise spec.
+ let then = null;
+ try {
+ if (typeof value === 'object' || typeof value === 'function') {
+ then = value && value.then;
+ }
+ }
+ catch (err) {
+ onceWrapper(() => {
+ resolvePromise(promise, false, err);
+ })();
+ return promise;
+ }
+ // if (value instanceof ZoneAwarePromise) {
+ if (state !== REJECTED && value instanceof ZoneAwarePromise &&
+ value.hasOwnProperty(symbolState) && value.hasOwnProperty(symbolValue) &&
+ value[symbolState] !== UNRESOLVED) {
+ clearRejectedNoCatch(value);
+ resolvePromise(promise, value[symbolState], value[symbolValue]);
+ }
+ else if (state !== REJECTED && typeof then === 'function') {
+ try {
+ then.call(value, onceWrapper(makeResolver(promise, state)), onceWrapper(makeResolver(promise, false)));
+ }
+ catch (err) {
+ onceWrapper(() => {
+ resolvePromise(promise, false, err);
+ })();
+ }
+ }
+ else {
+ promise[symbolState] = state;
+ const queue = promise[symbolValue];
+ promise[symbolValue] = value;
+ if (promise[symbolFinally] === symbolFinally) {
+ // the promise is generated by Promise.prototype.finally
+ if (state === RESOLVED) {
+ // the state is resolved, should ignore the value
+ // and use parent promise value
+ promise[symbolState] = promise[symbolParentPromiseState];
+ promise[symbolValue] = promise[symbolParentPromiseValue];
+ }
+ }
+ // record task information in value when error occurs, so we can
+ // do some additional work such as render longStackTrace
+ if (state === REJECTED && value instanceof Error) {
+ // check if longStackTraceZone is here
+ const trace = Zone.currentTask && Zone.currentTask.data &&
+ Zone.currentTask.data[creationTrace];
+ if (trace) {
+ // only keep the long stack trace into error when in longStackTraceZone
+ ObjectDefineProperty(value, CURRENT_TASK_TRACE_SYMBOL, { configurable: true, enumerable: false, writable: true, value: trace });
+ }
+ }
+ for (let i = 0; i < queue.length;) {
+ scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]);
+ }
+ if (queue.length == 0 && state == REJECTED) {
+ promise[symbolState] = REJECTED_NO_CATCH;
+ try {
+ // try to print more readable error log
+ throw new Error('Uncaught (in promise): ' + readableObjectToString(value) +
+ (value && value.stack ? '\n' + value.stack : ''));
+ }
+ catch (err) {
+ const error = err;
+ error.rejection = value;
+ error.promise = promise;
+ error.zone = Zone.current;
+ error.task = Zone.currentTask;
+ _uncaughtPromiseErrors.push(error);
+ api.scheduleMicroTask(); // to make sure that it is running
+ }
+ }
+ }
+ }
+ // Resolving an already resolved promise is a noop.
+ return promise;
+ }
+ const REJECTION_HANDLED_HANDLER = __symbol__('rejectionHandledHandler');
+ function clearRejectedNoCatch(promise) {
+ if (promise[symbolState] === REJECTED_NO_CATCH) {
+ // if the promise is rejected no catch status
+ // and queue.length > 0, means there is a error handler
+ // here to handle the rejected promise, we should trigger
+ // windows.rejectionhandled eventHandler or nodejs rejectionHandled
+ // eventHandler
+ try {
+ const handler = Zone[REJECTION_HANDLED_HANDLER];
+ if (handler && typeof handler === 'function') {
+ handler.call(this, { rejection: promise[symbolValue], promise: promise });
+ }
+ }
+ catch (err) {
+ }
+ promise[symbolState] = REJECTED;
+ for (let i = 0; i < _uncaughtPromiseErrors.length; i++) {
+ if (promise === _uncaughtPromiseErrors[i].promise) {
+ _uncaughtPromiseErrors.splice(i, 1);
+ }
+ }
+ }
+ }
+ function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) {
+ clearRejectedNoCatch(promise);
+ const promiseState = promise[symbolState];
+ const delegate = promiseState ?
+ (typeof onFulfilled === 'function') ? onFulfilled : forwardResolution :
+ (typeof onRejected === 'function') ? onRejected : forwardRejection;
+ zone.scheduleMicroTask(source, () => {
+ try {
+ const parentPromiseValue = promise[symbolValue];
+ const isFinallyPromise = chainPromise && symbolFinally === chainPromise[symbolFinally];
+ if (isFinallyPromise) {
+ // if the promise is generated from finally call, keep parent promise's state and value
+ chainPromise[symbolParentPromiseValue] = parentPromiseValue;
+ chainPromise[symbolParentPromiseState] = promiseState;
+ }
+ // should not pass value to finally callback
+ const value = zone.run(delegate, undefined, isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution ?
+ [] :
+ [parentPromiseValue]);
+ resolvePromise(chainPromise, true, value);
+ }
+ catch (error) {
+ // if error occurs, should always return this error
+ resolvePromise(chainPromise, false, error);
+ }
+ }, chainPromise);
+ }
+ const ZONE_AWARE_PROMISE_TO_STRING = 'function ZoneAwarePromise() { [native code] }';
+ class ZoneAwarePromise {
+ constructor(executor) {
+ const promise = this;
+ if (!(promise instanceof ZoneAwarePromise)) {
+ throw new Error('Must be an instanceof Promise.');
+ }
+ promise[symbolState] = UNRESOLVED;
+ promise[symbolValue] = []; // queue;
+ try {
+ executor && executor(makeResolver(promise, RESOLVED), makeResolver(promise, REJECTED));
+ }
+ catch (error) {
+ resolvePromise(promise, false, error);
+ }
+ }
+ static toString() {
+ return ZONE_AWARE_PROMISE_TO_STRING;
+ }
+ static resolve(value) {
+ return resolvePromise(new this(null), RESOLVED, value);
+ }
+ static reject(error) {
+ return resolvePromise(new this(null), REJECTED, error);
+ }
+ static race(values) {
+ let resolve;
+ let reject;
+ let promise = new this((res, rej) => {
+ resolve = res;
+ reject = rej;
+ });
+ function onResolve(value) {
+ resolve(value);
+ }
+ function onReject(error) {
+ reject(error);
+ }
+ for (let value of values) {
+ if (!isThenable(value)) {
+ value = this.resolve(value);
+ }
+ value.then(onResolve, onReject);
+ }
+ return promise;
+ }
+ static all(values) {
+ let resolve;
+ let reject;
+ let promise = new this((res, rej) => {
+ resolve = res;
+ reject = rej;
+ });
+ // Start at 2 to prevent prematurely resolving if .then is called immediately.
+ let unresolvedCount = 2;
+ let valueIndex = 0;
+ const resolvedValues = [];
+ for (let value of values) {
+ if (!isThenable(value)) {
+ value = this.resolve(value);
+ }
+ const curValueIndex = valueIndex;
+ value.then((value) => {
+ resolvedValues[curValueIndex] = value;
+ unresolvedCount--;
+ if (unresolvedCount === 0) {
+ resolve(resolvedValues);
+ }
+ }, reject);
+ unresolvedCount++;
+ valueIndex++;
+ }
+ // Make the unresolvedCount zero-based again.
+ unresolvedCount -= 2;
+ if (unresolvedCount === 0) {
+ resolve(resolvedValues);
+ }
+ return promise;
+ }
+ get [Symbol.toStringTag]() {
+ return 'Promise';
+ }
+ then(onFulfilled, onRejected) {
+ const chainPromise = new this.constructor(null);
+ const zone = Zone.current;
+ if (this[symbolState] == UNRESOLVED) {
+ this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected);
+ }
+ else {
+ scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected);
+ }
+ return chainPromise;
+ }
+ catch(onRejected) {
+ return this.then(null, onRejected);
+ }
+ finally(onFinally) {
+ const chainPromise = new this.constructor(null);
+ chainPromise[symbolFinally] = symbolFinally;
+ const zone = Zone.current;
+ if (this[symbolState] == UNRESOLVED) {
+ this[symbolValue].push(zone, chainPromise, onFinally, onFinally);
+ }
+ else {
+ scheduleResolveOrReject(this, zone, chainPromise, onFinally, onFinally);
+ }
+ return chainPromise;
+ }
+ }
+ // Protect against aggressive optimizers dropping seemingly unused properties.
+ // E.g. Closure Compiler in advanced mode.
+ ZoneAwarePromise['resolve'] = ZoneAwarePromise.resolve;
+ ZoneAwarePromise['reject'] = ZoneAwarePromise.reject;
+ ZoneAwarePromise['race'] = ZoneAwarePromise.race;
+ ZoneAwarePromise['all'] = ZoneAwarePromise.all;
+ const NativePromise = global[symbolPromise] = global['Promise'];
+ const ZONE_AWARE_PROMISE = Zone.__symbol__('ZoneAwarePromise');
+ let desc = ObjectGetOwnPropertyDescriptor(global, 'Promise');
+ if (!desc || desc.configurable) {
+ desc && delete desc.writable;
+ desc && delete desc.value;
+ if (!desc) {
+ desc = { configurable: true, enumerable: true };
+ }
+ desc.get = function () {
+ // if we already set ZoneAwarePromise, use patched one
+ // otherwise return native one.
+ return global[ZONE_AWARE_PROMISE] ? global[ZONE_AWARE_PROMISE] : global[symbolPromise];
+ };
+ desc.set = function (NewNativePromise) {
+ if (NewNativePromise === ZoneAwarePromise) {
+ // if the NewNativePromise is ZoneAwarePromise
+ // save to global
+ global[ZONE_AWARE_PROMISE] = NewNativePromise;
+ }
+ else {
+ // if the NewNativePromise is not ZoneAwarePromise
+ // for example: after load zone.js, some library just
+ // set es6-promise to global, if we set it to global
+ // directly, assertZonePatched will fail and angular
+ // will not loaded, so we just set the NewNativePromise
+ // to global[symbolPromise], so the result is just like
+ // we load ES6 Promise before zone.js
+ global[symbolPromise] = NewNativePromise;
+ if (!NewNativePromise.prototype[symbolThen]) {
+ patchThen(NewNativePromise);
+ }
+ api.setNativePromise(NewNativePromise);
+ }
+ };
+ ObjectDefineProperty(global, 'Promise', desc);
+ }
+ global['Promise'] = ZoneAwarePromise;
+ const symbolThenPatched = __symbol__('thenPatched');
+ function patchThen(Ctor) {
+ const proto = Ctor.prototype;
+ const prop = ObjectGetOwnPropertyDescriptor(proto, 'then');
+ if (prop && (prop.writable === false || !prop.configurable)) {
+ // check Ctor.prototype.then propertyDescriptor is writable or not
+ // in meteor env, writable is false, we should ignore such case
+ return;
+ }
+ const originalThen = proto.then;
+ // Keep a reference to the original method.
+ proto[symbolThen] = originalThen;
+ Ctor.prototype.then = function (onResolve, onReject) {
+ const wrapped = new ZoneAwarePromise((resolve, reject) => {
+ originalThen.call(this, resolve, reject);
+ });
+ return wrapped.then(onResolve, onReject);
+ };
+ Ctor[symbolThenPatched] = true;
+ }
+ api.patchThen = patchThen;
+ function zoneify(fn) {
+ return function () {
+ let resultPromise = fn.apply(this, arguments);
+ if (resultPromise instanceof ZoneAwarePromise) {
+ return resultPromise;
+ }
+ let ctor = resultPromise.constructor;
+ if (!ctor[symbolThenPatched]) {
+ patchThen(ctor);
+ }
+ return resultPromise;
+ };
+ }
+ if (NativePromise) {
+ patchThen(NativePromise);
+ const fetch = global['fetch'];
+ if (typeof fetch == 'function') {
+ global[api.symbol('fetch')] = fetch;
+ global['fetch'] = zoneify(fetch);
+ }
+ }
+ // This is not part of public API, but it is useful for tests, so we expose it.
+ Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors;
+ return ZoneAwarePromise;
+});
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * Suppress closure compiler errors about unknown 'Zone' variable
+ * @fileoverview
+ * @suppress {undefinedVars,globalThis,missingRequire}
+ */
+// issue #989, to reduce bundle size, use short name
+/** Object.getOwnPropertyDescriptor */
+const ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+/** Object.defineProperty */
+const ObjectDefineProperty = Object.defineProperty;
+/** Object.getPrototypeOf */
+const ObjectGetPrototypeOf = Object.getPrototypeOf;
+/** Object.create */
+const ObjectCreate = Object.create;
+/** Array.prototype.slice */
+const ArraySlice = Array.prototype.slice;
+/** addEventListener string const */
+const ADD_EVENT_LISTENER_STR = 'addEventListener';
+/** removeEventListener string const */
+const REMOVE_EVENT_LISTENER_STR = 'removeEventListener';
+/** zoneSymbol addEventListener */
+const ZONE_SYMBOL_ADD_EVENT_LISTENER = Zone.__symbol__(ADD_EVENT_LISTENER_STR);
+/** zoneSymbol removeEventListener */
+const ZONE_SYMBOL_REMOVE_EVENT_LISTENER = Zone.__symbol__(REMOVE_EVENT_LISTENER_STR);
+/** true string const */
+const TRUE_STR = 'true';
+/** false string const */
+const FALSE_STR = 'false';
+/** __zone_symbol__ string const */
+const ZONE_SYMBOL_PREFIX = '__zone_symbol__';
+function wrapWithCurrentZone(callback, source) {
+ return Zone.current.wrap(callback, source);
+}
+function scheduleMacroTaskWithCurrentZone(source, callback, data, customSchedule, customCancel) {
+ return Zone.current.scheduleMacroTask(source, callback, data, customSchedule, customCancel);
+}
+const zoneSymbol = Zone.__symbol__;
+const isWindowExists = typeof window !== 'undefined';
+const internalWindow = isWindowExists ? window : undefined;
+const _global = isWindowExists && internalWindow || typeof self === 'object' && self || global;
+const REMOVE_ATTRIBUTE = 'removeAttribute';
+const NULL_ON_PROP_VALUE = [null];
+function bindArguments(args, source) {
+ for (let i = args.length - 1; i >= 0; i--) {
+ if (typeof args[i] === 'function') {
+ args[i] = wrapWithCurrentZone(args[i], source + '_' + i);
+ }
+ }
+ return args;
+}
+function patchPrototype(prototype, fnNames) {
+ const source = prototype.constructor['name'];
+ for (let i = 0; i < fnNames.length; i++) {
+ const name = fnNames[i];
+ const delegate = prototype[name];
+ if (delegate) {
+ const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, name);
+ if (!isPropertyWritable(prototypeDesc)) {
+ continue;
+ }
+ prototype[name] = ((delegate) => {
+ const patched = function () {
+ return delegate.apply(this, bindArguments(arguments, source + '.' + name));
+ };
+ attachOriginToPatched(patched, delegate);
+ return patched;
+ })(delegate);
+ }
+ }
+}
+function isPropertyWritable(propertyDesc) {
+ if (!propertyDesc) {
+ return true;
+ }
+ if (propertyDesc.writable === false) {
+ return false;
+ }
+ return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined');
+}
+const isWebWorker = (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope);
+// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
+// this code.
+const isNode = (!('nw' in _global) && typeof _global.process !== 'undefined' &&
+ {}.toString.call(_global.process) === '[object process]');
+const isBrowser = !isNode && !isWebWorker && !!(isWindowExists && internalWindow['HTMLElement']);
+// we are in electron of nw, so we are both browser and nodejs
+// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify
+// this code.
+const isMix = typeof _global.process !== 'undefined' &&
+ {}.toString.call(_global.process) === '[object process]' && !isWebWorker &&
+ !!(isWindowExists && internalWindow['HTMLElement']);
+const zoneSymbolEventNames = {};
+const wrapFn = function (event) {
+ // https://github.com/angular/zone.js/issues/911, in IE, sometimes
+ // event will be undefined, so we need to use window.event
+ event = event || _global.event;
+ if (!event) {
+ return;
+ }
+ let eventNameSymbol = zoneSymbolEventNames[event.type];
+ if (!eventNameSymbol) {
+ eventNameSymbol = zoneSymbolEventNames[event.type] = zoneSymbol('ON_PROPERTY' + event.type);
+ }
+ const target = this || event.target || _global;
+ const listener = target[eventNameSymbol];
+ let result;
+ if (isBrowser && target === internalWindow && event.type === 'error') {
+ // window.onerror have different signiture
+ // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror#window.onerror
+ // and onerror callback will prevent default when callback return true
+ const errorEvent = event;
+ result = listener &&
+ listener.call(this, errorEvent.message, errorEvent.filename, errorEvent.lineno, errorEvent.colno, errorEvent.error);
+ if (result === true) {
+ event.preventDefault();
+ }
+ }
+ else {
+ result = listener && listener.apply(this, arguments);
+ if (result != undefined && !result) {
+ event.preventDefault();
+ }
+ }
+ return result;
+};
+function patchProperty(obj, prop, prototype) {
+ let desc = ObjectGetOwnPropertyDescriptor(obj, prop);
+ if (!desc && prototype) {
+ // when patch window object, use prototype to check prop exist or not
+ const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, prop);
+ if (prototypeDesc) {
+ desc = { enumerable: true, configurable: true };
+ }
+ }
+ // if the descriptor not exists or is not configurable
+ // just return
+ if (!desc || !desc.configurable) {
+ return;
+ }
+ const onPropPatchedSymbol = zoneSymbol('on' + prop + 'patched');
+ if (obj.hasOwnProperty(onPropPatchedSymbol) && obj[onPropPatchedSymbol]) {
+ return;
+ }
+ // A property descriptor cannot have getter/setter and be writable
+ // deleting the writable and value properties avoids this error:
+ //
+ // TypeError: property descriptors must not specify a value or be writable when a
+ // getter or setter has been specified
+ delete desc.writable;
+ delete desc.value;
+ const originalDescGet = desc.get;
+ const originalDescSet = desc.set;
+ // substr(2) cuz 'onclick' -> 'click', etc
+ const eventName = prop.substr(2);
+ let eventNameSymbol = zoneSymbolEventNames[eventName];
+ if (!eventNameSymbol) {
+ eventNameSymbol = zoneSymbolEventNames[eventName] = zoneSymbol('ON_PROPERTY' + eventName);
+ }
+ desc.set = function (newValue) {
+ // in some of windows's onproperty callback, this is undefined
+ // so we need to check it
+ let target = this;
+ if (!target && obj === _global) {
+ target = _global;
+ }
+ if (!target) {
+ return;
+ }
+ let previousValue = target[eventNameSymbol];
+ if (previousValue) {
+ target.removeEventListener(eventName, wrapFn);
+ }
+ // issue #978, when onload handler was added before loading zone.js
+ // we should remove it with originalDescSet
+ if (originalDescSet) {
+ originalDescSet.apply(target, NULL_ON_PROP_VALUE);
+ }
+ if (typeof newValue === 'function') {
+ target[eventNameSymbol] = newValue;
+ target.addEventListener(eventName, wrapFn, false);
+ }
+ else {
+ target[eventNameSymbol] = null;
+ }
+ };
+ // The getter would return undefined for unassigned properties but the default value of an
+ // unassigned property is null
+ desc.get = function () {
+ // in some of windows's onproperty callback, this is undefined
+ // so we need to check it
+ let target = this;
+ if (!target && obj === _global) {
+ target = _global;
+ }
+ if (!target) {
+ return null;
+ }
+ const listener = target[eventNameSymbol];
+ if (listener) {
+ return listener;
+ }
+ else if (originalDescGet) {
+ // result will be null when use inline event attribute,
+ // such as
+ // because the onclick function is internal raw uncompiled handler
+ // the onclick will be evaluated when first time event was triggered or
+ // the property is accessed, https://github.com/angular/zone.js/issues/525
+ // so we should use original native get to retrieve the handler
+ let value = originalDescGet && originalDescGet.call(this);
+ if (value) {
+ desc.set.call(this, value);
+ if (typeof target[REMOVE_ATTRIBUTE] === 'function') {
+ target.removeAttribute(prop);
+ }
+ return value;
+ }
+ }
+ return null;
+ };
+ ObjectDefineProperty(obj, prop, desc);
+ obj[onPropPatchedSymbol] = true;
+}
+function patchOnProperties(obj, properties, prototype) {
+ if (properties) {
+ for (let i = 0; i < properties.length; i++) {
+ patchProperty(obj, 'on' + properties[i], prototype);
+ }
+ }
+ else {
+ const onProperties = [];
+ for (const prop in obj) {
+ if (prop.substr(0, 2) == 'on') {
+ onProperties.push(prop);
+ }
+ }
+ for (let j = 0; j < onProperties.length; j++) {
+ patchProperty(obj, onProperties[j], prototype);
+ }
+ }
+}
+const originalInstanceKey = zoneSymbol('originalInstance');
+// wrap some native API on `window`
+function patchClass(className) {
+ const OriginalClass = _global[className];
+ if (!OriginalClass)
+ return;
+ // keep original class in global
+ _global[zoneSymbol(className)] = OriginalClass;
+ _global[className] = function () {
+ const a = bindArguments(arguments, className);
+ switch (a.length) {
+ case 0:
+ this[originalInstanceKey] = new OriginalClass();
+ break;
+ case 1:
+ this[originalInstanceKey] = new OriginalClass(a[0]);
+ break;
+ case 2:
+ this[originalInstanceKey] = new OriginalClass(a[0], a[1]);
+ break;
+ case 3:
+ this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2]);
+ break;
+ case 4:
+ this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2], a[3]);
+ break;
+ default:
+ throw new Error('Arg list too long.');
+ }
+ };
+ // attach original delegate to patched function
+ attachOriginToPatched(_global[className], OriginalClass);
+ const instance = new OriginalClass(function () { });
+ let prop;
+ for (prop in instance) {
+ // https://bugs.webkit.org/show_bug.cgi?id=44721
+ if (className === 'XMLHttpRequest' && prop === 'responseBlob')
+ continue;
+ (function (prop) {
+ if (typeof instance[prop] === 'function') {
+ _global[className].prototype[prop] = function () {
+ return this[originalInstanceKey][prop].apply(this[originalInstanceKey], arguments);
+ };
+ }
+ else {
+ ObjectDefineProperty(_global[className].prototype, prop, {
+ set: function (fn) {
+ if (typeof fn === 'function') {
+ this[originalInstanceKey][prop] = wrapWithCurrentZone(fn, className + '.' + prop);
+ // keep callback in wrapped function so we can
+ // use it in Function.prototype.toString to return
+ // the native one.
+ attachOriginToPatched(this[originalInstanceKey][prop], fn);
+ }
+ else {
+ this[originalInstanceKey][prop] = fn;
+ }
+ },
+ get: function () {
+ return this[originalInstanceKey][prop];
+ }
+ });
+ }
+ }(prop));
+ }
+ for (prop in OriginalClass) {
+ if (prop !== 'prototype' && OriginalClass.hasOwnProperty(prop)) {
+ _global[className][prop] = OriginalClass[prop];
+ }
+ }
+}
+function copySymbolProperties(src, dest) {
+ if (typeof Object.getOwnPropertySymbols !== 'function') {
+ return;
+ }
+ const symbols = Object.getOwnPropertySymbols(src);
+ symbols.forEach((symbol) => {
+ const desc = Object.getOwnPropertyDescriptor(src, symbol);
+ Object.defineProperty(dest, symbol, {
+ get: function () {
+ return src[symbol];
+ },
+ set: function (value) {
+ if (desc && (!desc.writable || typeof desc.set !== 'function')) {
+ // if src[symbol] is not writable or not have a setter, just return
+ return;
+ }
+ src[symbol] = value;
+ },
+ enumerable: desc ? desc.enumerable : true,
+ configurable: desc ? desc.configurable : true
+ });
+ });
+}
+let shouldCopySymbolProperties = false;
+
+function patchMethod(target, name, patchFn) {
+ let proto = target;
+ while (proto && !proto.hasOwnProperty(name)) {
+ proto = ObjectGetPrototypeOf(proto);
+ }
+ if (!proto && target[name]) {
+ // somehow we did not find it, but we can see it. This happens on IE for Window properties.
+ proto = target;
+ }
+ const delegateName = zoneSymbol(name);
+ let delegate = null;
+ if (proto && !(delegate = proto[delegateName])) {
+ delegate = proto[delegateName] = proto[name];
+ // check whether proto[name] is writable
+ // some property is readonly in safari, such as HtmlCanvasElement.prototype.toBlob
+ const desc = proto && ObjectGetOwnPropertyDescriptor(proto, name);
+ if (isPropertyWritable(desc)) {
+ const patchDelegate = patchFn(delegate, delegateName, name);
+ proto[name] = function () {
+ return patchDelegate(this, arguments);
+ };
+ attachOriginToPatched(proto[name], delegate);
+ if (shouldCopySymbolProperties) {
+ copySymbolProperties(delegate, proto[name]);
+ }
+ }
+ }
+ return delegate;
+}
+// TODO: @JiaLiPassion, support cancel task later if necessary
+function patchMacroTask(obj, funcName, metaCreator) {
+ let setNative = null;
+ function scheduleTask(task) {
+ const data = task.data;
+ data.args[data.cbIdx] = function () {
+ task.invoke.apply(this, arguments);
+ };
+ setNative.apply(data.target, data.args);
+ return task;
+ }
+ setNative = patchMethod(obj, funcName, (delegate) => function (self, args) {
+ const meta = metaCreator(self, args);
+ if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') {
+ return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask);
+ }
+ else {
+ // cause an error by calling it directly.
+ return delegate.apply(self, args);
+ }
+ });
+}
+
+function attachOriginToPatched(patched, original) {
+ patched[zoneSymbol('OriginalDelegate')] = original;
+}
+let isDetectedIEOrEdge = false;
+let ieOrEdge = false;
+function isIE() {
+ try {
+ const ua = internalWindow.navigator.userAgent;
+ if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1) {
+ return true;
+ }
+ }
+ catch (error) {
+ }
+ return false;
+}
+function isIEOrEdge() {
+ if (isDetectedIEOrEdge) {
+ return ieOrEdge;
+ }
+ isDetectedIEOrEdge = true;
+ try {
+ const ua = internalWindow.navigator.userAgent;
+ if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1 || ua.indexOf('Edge/') !== -1) {
+ ieOrEdge = true;
+ }
+ }
+ catch (error) {
+ }
+ return ieOrEdge;
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// override Function.prototype.toString to make zone.js patched function
+// look like native function
+Zone.__load_patch('toString', (global) => {
+ // patch Func.prototype.toString to let them look like native
+ const originalFunctionToString = Function.prototype.toString;
+ const ORIGINAL_DELEGATE_SYMBOL = zoneSymbol('OriginalDelegate');
+ const PROMISE_SYMBOL = zoneSymbol('Promise');
+ const ERROR_SYMBOL = zoneSymbol('Error');
+ const newFunctionToString = function toString() {
+ if (typeof this === 'function') {
+ const originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
+ if (originalDelegate) {
+ if (typeof originalDelegate === 'function') {
+ return originalFunctionToString.call(originalDelegate);
+ }
+ else {
+ return Object.prototype.toString.call(originalDelegate);
+ }
+ }
+ if (this === Promise) {
+ const nativePromise = global[PROMISE_SYMBOL];
+ if (nativePromise) {
+ return originalFunctionToString.call(nativePromise);
+ }
+ }
+ if (this === Error) {
+ const nativeError = global[ERROR_SYMBOL];
+ if (nativeError) {
+ return originalFunctionToString.call(nativeError);
+ }
+ }
+ }
+ return originalFunctionToString.call(this);
+ };
+ newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
+ Function.prototype.toString = newFunctionToString;
+ // patch Object.prototype.toString to let them look like native
+ const originalObjectToString = Object.prototype.toString;
+ const PROMISE_OBJECT_TO_STRING = '[object Promise]';
+ Object.prototype.toString = function () {
+ if (this instanceof Promise) {
+ return PROMISE_OBJECT_TO_STRING;
+ }
+ return originalObjectToString.call(this);
+ };
+});
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {missingRequire}
+ */
+let passiveSupported = false;
+if (typeof window !== 'undefined') {
+ try {
+ const options = Object.defineProperty({}, 'passive', {
+ get: function () {
+ passiveSupported = true;
+ }
+ });
+ window.addEventListener('test', options, options);
+ window.removeEventListener('test', options, options);
+ }
+ catch (err) {
+ passiveSupported = false;
+ }
+}
+// an identifier to tell ZoneTask do not create a new invoke closure
+const OPTIMIZED_ZONE_EVENT_TASK_DATA = {
+ useG: true
+};
+const zoneSymbolEventNames$1 = {};
+const globalSources = {};
+const EVENT_NAME_SYMBOL_REGX = /^__zone_symbol__(\w+)(true|false)$/;
+const IMMEDIATE_PROPAGATION_SYMBOL = ('__zone_symbol__propagationStopped');
+function patchEventTarget(_global, apis, patchOptions) {
+ const ADD_EVENT_LISTENER = (patchOptions && patchOptions.add) || ADD_EVENT_LISTENER_STR;
+ const REMOVE_EVENT_LISTENER = (patchOptions && patchOptions.rm) || REMOVE_EVENT_LISTENER_STR;
+ const LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.listeners) || 'eventListeners';
+ const REMOVE_ALL_LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.rmAll) || 'removeAllListeners';
+ const zoneSymbolAddEventListener = zoneSymbol(ADD_EVENT_LISTENER);
+ const ADD_EVENT_LISTENER_SOURCE = '.' + ADD_EVENT_LISTENER + ':';
+ const PREPEND_EVENT_LISTENER = 'prependListener';
+ const PREPEND_EVENT_LISTENER_SOURCE = '.' + PREPEND_EVENT_LISTENER + ':';
+ const invokeTask = function (task, target, event) {
+ // for better performance, check isRemoved which is set
+ // by removeEventListener
+ if (task.isRemoved) {
+ return;
+ }
+ const delegate = task.callback;
+ if (typeof delegate === 'object' && delegate.handleEvent) {
+ // create the bind version of handleEvent when invoke
+ task.callback = (event) => delegate.handleEvent(event);
+ task.originalDelegate = delegate;
+ }
+ // invoke static task.invoke
+ task.invoke(task, target, [event]);
+ const options = task.options;
+ if (options && typeof options === 'object' && options.once) {
+ // if options.once is true, after invoke once remove listener here
+ // only browser need to do this, nodejs eventEmitter will cal removeListener
+ // inside EventEmitter.once
+ const delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+ target[REMOVE_EVENT_LISTENER].call(target, event.type, delegate, options);
+ }
+ };
+ // global shared zoneAwareCallback to handle all event callback with capture = false
+ const globalZoneAwareCallback = function (event) {
+ // https://github.com/angular/zone.js/issues/911, in IE, sometimes
+ // event will be undefined, so we need to use window.event
+ event = event || _global.event;
+ if (!event) {
+ return;
+ }
+ // event.target is needed for Samsung TV and SourceBuffer
+ // || global is needed https://github.com/angular/zone.js/issues/190
+ const target = this || event.target || _global;
+ const tasks = target[zoneSymbolEventNames$1[event.type][FALSE_STR]];
+ if (tasks) {
+ // invoke all tasks which attached to current target with given event.type and capture = false
+ // for performance concern, if task.length === 1, just invoke
+ if (tasks.length === 1) {
+ invokeTask(tasks[0], target, event);
+ }
+ else {
+ // https://github.com/angular/zone.js/issues/836
+ // copy the tasks array before invoke, to avoid
+ // the callback will remove itself or other listener
+ const copyTasks = tasks.slice();
+ for (let i = 0; i < copyTasks.length; i++) {
+ if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
+ break;
+ }
+ invokeTask(copyTasks[i], target, event);
+ }
+ }
+ }
+ };
+ // global shared zoneAwareCallback to handle all event callback with capture = true
+ const globalZoneAwareCaptureCallback = function (event) {
+ // https://github.com/angular/zone.js/issues/911, in IE, sometimes
+ // event will be undefined, so we need to use window.event
+ event = event || _global.event;
+ if (!event) {
+ return;
+ }
+ // event.target is needed for Samsung TV and SourceBuffer
+ // || global is needed https://github.com/angular/zone.js/issues/190
+ const target = this || event.target || _global;
+ const tasks = target[zoneSymbolEventNames$1[event.type][TRUE_STR]];
+ if (tasks) {
+ // invoke all tasks which attached to current target with given event.type and capture = false
+ // for performance concern, if task.length === 1, just invoke
+ if (tasks.length === 1) {
+ invokeTask(tasks[0], target, event);
+ }
+ else {
+ // https://github.com/angular/zone.js/issues/836
+ // copy the tasks array before invoke, to avoid
+ // the callback will remove itself or other listener
+ const copyTasks = tasks.slice();
+ for (let i = 0; i < copyTasks.length; i++) {
+ if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
+ break;
+ }
+ invokeTask(copyTasks[i], target, event);
+ }
+ }
+ }
+ };
+ function patchEventTargetMethods(obj, patchOptions) {
+ if (!obj) {
+ return false;
+ }
+ let useGlobalCallback = true;
+ if (patchOptions && patchOptions.useG !== undefined) {
+ useGlobalCallback = patchOptions.useG;
+ }
+ const validateHandler = patchOptions && patchOptions.vh;
+ let checkDuplicate = true;
+ if (patchOptions && patchOptions.chkDup !== undefined) {
+ checkDuplicate = patchOptions.chkDup;
+ }
+ let returnTarget = false;
+ if (patchOptions && patchOptions.rt !== undefined) {
+ returnTarget = patchOptions.rt;
+ }
+ let proto = obj;
+ while (proto && !proto.hasOwnProperty(ADD_EVENT_LISTENER)) {
+ proto = ObjectGetPrototypeOf(proto);
+ }
+ if (!proto && obj[ADD_EVENT_LISTENER]) {
+ // somehow we did not find it, but we can see it. This happens on IE for Window properties.
+ proto = obj;
+ }
+ if (!proto) {
+ return false;
+ }
+ if (proto[zoneSymbolAddEventListener]) {
+ return false;
+ }
+ const eventNameToString = patchOptions && patchOptions.eventNameToString;
+ // a shared global taskData to pass data for scheduleEventTask
+ // so we do not need to create a new object just for pass some data
+ const taskData = {};
+ const nativeAddEventListener = proto[zoneSymbolAddEventListener] = proto[ADD_EVENT_LISTENER];
+ const nativeRemoveEventListener = proto[zoneSymbol(REMOVE_EVENT_LISTENER)] =
+ proto[REMOVE_EVENT_LISTENER];
+ const nativeListeners = proto[zoneSymbol(LISTENERS_EVENT_LISTENER)] =
+ proto[LISTENERS_EVENT_LISTENER];
+ const nativeRemoveAllListeners = proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)] =
+ proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER];
+ let nativePrependEventListener;
+ if (patchOptions && patchOptions.prepend) {
+ nativePrependEventListener = proto[zoneSymbol(patchOptions.prepend)] =
+ proto[patchOptions.prepend];
+ }
+ function checkIsPassive(task) {
+ if (!passiveSupported && typeof taskData.options !== 'boolean' &&
+ typeof taskData.options !== 'undefined' && taskData.options !== null) {
+ // options is a non-null non-undefined object
+ // passive is not supported
+ // don't pass options as object
+ // just pass capture as a boolean
+ task.options = !!taskData.options.capture;
+ taskData.options = task.options;
+ }
+ }
+ const customScheduleGlobal = function (task) {
+ // if there is already a task for the eventName + capture,
+ // just return, because we use the shared globalZoneAwareCallback here.
+ if (taskData.isExisting) {
+ return;
+ }
+ checkIsPassive(task);
+ return nativeAddEventListener.call(taskData.target, taskData.eventName, taskData.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, taskData.options);
+ };
+ const customCancelGlobal = function (task) {
+ // if task is not marked as isRemoved, this call is directly
+ // from Zone.prototype.cancelTask, we should remove the task
+ // from tasksList of target first
+ if (!task.isRemoved) {
+ const symbolEventNames = zoneSymbolEventNames$1[task.eventName];
+ let symbolEventName;
+ if (symbolEventNames) {
+ symbolEventName = symbolEventNames[task.capture ? TRUE_STR : FALSE_STR];
+ }
+ const existingTasks = symbolEventName && task.target[symbolEventName];
+ if (existingTasks) {
+ for (let i = 0; i < existingTasks.length; i++) {
+ const existingTask = existingTasks[i];
+ if (existingTask === task) {
+ existingTasks.splice(i, 1);
+ // set isRemoved to data for faster invokeTask check
+ task.isRemoved = true;
+ if (existingTasks.length === 0) {
+ // all tasks for the eventName + capture have gone,
+ // remove globalZoneAwareCallback and remove the task cache from target
+ task.allRemoved = true;
+ task.target[symbolEventName] = null;
+ }
+ break;
+ }
+ }
+ }
+ }
+ // if all tasks for the eventName + capture have gone,
+ // we will really remove the global event callback,
+ // if not, return
+ if (!task.allRemoved) {
+ return;
+ }
+ return nativeRemoveEventListener.call(task.target, task.eventName, task.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, task.options);
+ };
+ const customScheduleNonGlobal = function (task) {
+ checkIsPassive(task);
+ return nativeAddEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
+ };
+ const customSchedulePrepend = function (task) {
+ return nativePrependEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
+ };
+ const customCancelNonGlobal = function (task) {
+ return nativeRemoveEventListener.call(task.target, task.eventName, task.invoke, task.options);
+ };
+ const customSchedule = useGlobalCallback ? customScheduleGlobal : customScheduleNonGlobal;
+ const customCancel = useGlobalCallback ? customCancelGlobal : customCancelNonGlobal;
+ const compareTaskCallbackVsDelegate = function (task, delegate) {
+ const typeOfDelegate = typeof delegate;
+ return (typeOfDelegate === 'function' && task.callback === delegate) ||
+ (typeOfDelegate === 'object' && task.originalDelegate === delegate);
+ };
+ const compare = (patchOptions && patchOptions.diff) ? patchOptions.diff : compareTaskCallbackVsDelegate;
+ const blackListedEvents = Zone[Zone.__symbol__('BLACK_LISTED_EVENTS')];
+ const makeAddListener = function (nativeListener, addSource, customScheduleFn, customCancelFn, returnTarget = false, prepend = false) {
+ return function () {
+ const target = this || _global;
+ const eventName = arguments[0];
+ let delegate = arguments[1];
+ if (!delegate) {
+ return nativeListener.apply(this, arguments);
+ }
+ if (isNode && eventName === 'uncaughtException') {
+ // don't patch uncaughtException of nodejs to prevent endless loop
+ return nativeListener.apply(this, arguments);
+ }
+ // don't create the bind delegate function for handleEvent
+ // case here to improve addEventListener performance
+ // we will create the bind delegate when invoke
+ let isHandleEvent = false;
+ if (typeof delegate !== 'function') {
+ if (!delegate.handleEvent) {
+ return nativeListener.apply(this, arguments);
+ }
+ isHandleEvent = true;
+ }
+ if (validateHandler && !validateHandler(nativeListener, delegate, target, arguments)) {
+ return;
+ }
+ const options = arguments[2];
+ if (blackListedEvents) {
+ // check black list
+ for (let i = 0; i < blackListedEvents.length; i++) {
+ if (eventName === blackListedEvents[i]) {
+ return nativeListener.apply(this, arguments);
+ }
+ }
+ }
+ let capture;
+ let once = false;
+ if (options === undefined) {
+ capture = false;
+ }
+ else if (options === true) {
+ capture = true;
+ }
+ else if (options === false) {
+ capture = false;
+ }
+ else {
+ capture = options ? !!options.capture : false;
+ once = options ? !!options.once : false;
+ }
+ const zone = Zone.current;
+ const symbolEventNames = zoneSymbolEventNames$1[eventName];
+ let symbolEventName;
+ if (!symbolEventNames) {
+ // the code is duplicate, but I just want to get some better performance
+ const falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
+ const trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
+ const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
+ const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
+ zoneSymbolEventNames$1[eventName] = {};
+ zoneSymbolEventNames$1[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames$1[eventName][TRUE_STR] = symbolCapture;
+ symbolEventName = capture ? symbolCapture : symbol;
+ }
+ else {
+ symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
+ }
+ let existingTasks = target[symbolEventName];
+ let isExisting = false;
+ if (existingTasks) {
+ // already have task registered
+ isExisting = true;
+ if (checkDuplicate) {
+ for (let i = 0; i < existingTasks.length; i++) {
+ if (compare(existingTasks[i], delegate)) {
+ // same callback, same capture, same event name, just return
+ return;
+ }
+ }
+ }
+ }
+ else {
+ existingTasks = target[symbolEventName] = [];
+ }
+ let source;
+ const constructorName = target.constructor['name'];
+ const targetSource = globalSources[constructorName];
+ if (targetSource) {
+ source = targetSource[eventName];
+ }
+ if (!source) {
+ source = constructorName + addSource +
+ (eventNameToString ? eventNameToString(eventName) : eventName);
+ }
+ // do not create a new object as task.data to pass those things
+ // just use the global shared one
+ taskData.options = options;
+ if (once) {
+ // if addEventListener with once options, we don't pass it to
+ // native addEventListener, instead we keep the once setting
+ // and handle ourselves.
+ taskData.options.once = false;
+ }
+ taskData.target = target;
+ taskData.capture = capture;
+ taskData.eventName = eventName;
+ taskData.isExisting = isExisting;
+ const data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : undefined;
+ // keep taskData into data to allow onScheduleEventTask to access the task information
+ if (data) {
+ data.taskData = taskData;
+ }
+ const task = zone.scheduleEventTask(source, delegate, data, customScheduleFn, customCancelFn);
+ // should clear taskData.target to avoid memory leak
+ // issue, https://github.com/angular/angular/issues/20442
+ taskData.target = null;
+ // need to clear up taskData because it is a global object
+ if (data) {
+ data.taskData = null;
+ }
+ // have to save those information to task in case
+ // application may call task.zone.cancelTask() directly
+ if (once) {
+ options.once = true;
+ }
+ if (!(!passiveSupported && typeof task.options === 'boolean')) {
+ // if not support passive, and we pass an option object
+ // to addEventListener, we should save the options to task
+ task.options = options;
+ }
+ task.target = target;
+ task.capture = capture;
+ task.eventName = eventName;
+ if (isHandleEvent) {
+ // save original delegate for compare to check duplicate
+ task.originalDelegate = delegate;
+ }
+ if (!prepend) {
+ existingTasks.push(task);
+ }
+ else {
+ existingTasks.unshift(task);
+ }
+ if (returnTarget) {
+ return target;
+ }
+ };
+ };
+ proto[ADD_EVENT_LISTENER] = makeAddListener(nativeAddEventListener, ADD_EVENT_LISTENER_SOURCE, customSchedule, customCancel, returnTarget);
+ if (nativePrependEventListener) {
+ proto[PREPEND_EVENT_LISTENER] = makeAddListener(nativePrependEventListener, PREPEND_EVENT_LISTENER_SOURCE, customSchedulePrepend, customCancel, returnTarget, true);
+ }
+ proto[REMOVE_EVENT_LISTENER] = function () {
+ const target = this || _global;
+ const eventName = arguments[0];
+ const options = arguments[2];
+ let capture;
+ if (options === undefined) {
+ capture = false;
+ }
+ else if (options === true) {
+ capture = true;
+ }
+ else if (options === false) {
+ capture = false;
+ }
+ else {
+ capture = options ? !!options.capture : false;
+ }
+ const delegate = arguments[1];
+ if (!delegate) {
+ return nativeRemoveEventListener.apply(this, arguments);
+ }
+ if (validateHandler &&
+ !validateHandler(nativeRemoveEventListener, delegate, target, arguments)) {
+ return;
+ }
+ const symbolEventNames = zoneSymbolEventNames$1[eventName];
+ let symbolEventName;
+ if (symbolEventNames) {
+ symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
+ }
+ const existingTasks = symbolEventName && target[symbolEventName];
+ if (existingTasks) {
+ for (let i = 0; i < existingTasks.length; i++) {
+ const existingTask = existingTasks[i];
+ if (compare(existingTask, delegate)) {
+ existingTasks.splice(i, 1);
+ // set isRemoved to data for faster invokeTask check
+ existingTask.isRemoved = true;
+ if (existingTasks.length === 0) {
+ // all tasks for the eventName + capture have gone,
+ // remove globalZoneAwareCallback and remove the task cache from target
+ existingTask.allRemoved = true;
+ target[symbolEventName] = null;
+ }
+ existingTask.zone.cancelTask(existingTask);
+ if (returnTarget) {
+ return target;
+ }
+ return;
+ }
+ }
+ }
+ // issue 930, didn't find the event name or callback
+ // from zone kept existingTasks, the callback maybe
+ // added outside of zone, we need to call native removeEventListener
+ // to try to remove it.
+ return nativeRemoveEventListener.apply(this, arguments);
+ };
+ proto[LISTENERS_EVENT_LISTENER] = function () {
+ const target = this || _global;
+ const eventName = arguments[0];
+ const listeners = [];
+ const tasks = findEventTasks(target, eventNameToString ? eventNameToString(eventName) : eventName);
+ for (let i = 0; i < tasks.length; i++) {
+ const task = tasks[i];
+ let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+ listeners.push(delegate);
+ }
+ return listeners;
+ };
+ proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER] = function () {
+ const target = this || _global;
+ const eventName = arguments[0];
+ if (!eventName) {
+ const keys = Object.keys(target);
+ for (let i = 0; i < keys.length; i++) {
+ const prop = keys[i];
+ const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
+ let evtName = match && match[1];
+ // in nodejs EventEmitter, removeListener event is
+ // used for monitoring the removeListener call,
+ // so just keep removeListener eventListener until
+ // all other eventListeners are removed
+ if (evtName && evtName !== 'removeListener') {
+ this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, evtName);
+ }
+ }
+ // remove removeListener listener finally
+ this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, 'removeListener');
+ }
+ else {
+ const symbolEventNames = zoneSymbolEventNames$1[eventName];
+ if (symbolEventNames) {
+ const symbolEventName = symbolEventNames[FALSE_STR];
+ const symbolCaptureEventName = symbolEventNames[TRUE_STR];
+ const tasks = target[symbolEventName];
+ const captureTasks = target[symbolCaptureEventName];
+ if (tasks) {
+ const removeTasks = tasks.slice();
+ for (let i = 0; i < removeTasks.length; i++) {
+ const task = removeTasks[i];
+ let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+ this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
+ }
+ }
+ if (captureTasks) {
+ const removeTasks = captureTasks.slice();
+ for (let i = 0; i < removeTasks.length; i++) {
+ const task = removeTasks[i];
+ let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+ this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
+ }
+ }
+ }
+ }
+ if (returnTarget) {
+ return this;
+ }
+ };
+ // for native toString patch
+ attachOriginToPatched(proto[ADD_EVENT_LISTENER], nativeAddEventListener);
+ attachOriginToPatched(proto[REMOVE_EVENT_LISTENER], nativeRemoveEventListener);
+ if (nativeRemoveAllListeners) {
+ attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER], nativeRemoveAllListeners);
+ }
+ if (nativeListeners) {
+ attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER], nativeListeners);
+ }
+ return true;
+ }
+ let results = [];
+ for (let i = 0; i < apis.length; i++) {
+ results[i] = patchEventTargetMethods(apis[i], patchOptions);
+ }
+ return results;
+}
+function findEventTasks(target, eventName) {
+ const foundTasks = [];
+ for (let prop in target) {
+ const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
+ let evtName = match && match[1];
+ if (evtName && (!eventName || evtName === eventName)) {
+ const tasks = target[prop];
+ if (tasks) {
+ for (let i = 0; i < tasks.length; i++) {
+ foundTasks.push(tasks[i]);
+ }
+ }
+ }
+ }
+ return foundTasks;
+}
+function patchEventPrototype(global, api) {
+ const Event = global['Event'];
+ if (Event && Event.prototype) {
+ api.patchMethod(Event.prototype, 'stopImmediatePropagation', (delegate) => function (self, args) {
+ self[IMMEDIATE_PROPAGATION_SYMBOL] = true;
+ // we need to call the native stopImmediatePropagation
+ // in case in some hybrid application, some part of
+ // application will be controlled by zone, some are not
+ delegate && delegate.apply(self, args);
+ });
+ }
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function patchCallbacks(api, target, targetName, method, callbacks) {
+ const symbol = Zone.__symbol__(method);
+ if (target[symbol]) {
+ return;
+ }
+ const nativeDelegate = target[symbol] = target[method];
+ target[method] = function (name, opts, options) {
+ if (opts && opts.prototype) {
+ callbacks.forEach(function (callback) {
+ const source = `${targetName}.${method}::` + callback;
+ const prototype = opts.prototype;
+ if (prototype.hasOwnProperty(callback)) {
+ const descriptor = api.ObjectGetOwnPropertyDescriptor(prototype, callback);
+ if (descriptor && descriptor.value) {
+ descriptor.value = api.wrapWithCurrentZone(descriptor.value, source);
+ api._redefineProperty(opts.prototype, callback, descriptor);
+ }
+ else if (prototype[callback]) {
+ prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
+ }
+ }
+ else if (prototype[callback]) {
+ prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
+ }
+ });
+ }
+ return nativeDelegate.call(target, name, opts, options);
+ };
+ api.attachOriginToPatched(target[method], nativeDelegate);
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/*
+ * This is necessary for Chrome and Chrome mobile, to enable
+ * things like redefining `createdCallback` on an element.
+ */
+const zoneSymbol$1 = Zone.__symbol__;
+const _defineProperty = Object[zoneSymbol$1('defineProperty')] = Object.defineProperty;
+const _getOwnPropertyDescriptor = Object[zoneSymbol$1('getOwnPropertyDescriptor')] =
+ Object.getOwnPropertyDescriptor;
+const _create = Object.create;
+const unconfigurablesKey = zoneSymbol$1('unconfigurables');
+function propertyPatch() {
+ Object.defineProperty = function (obj, prop, desc) {
+ if (isUnconfigurable(obj, prop)) {
+ throw new TypeError('Cannot assign to read only property \'' + prop + '\' of ' + obj);
+ }
+ const originalConfigurableFlag = desc.configurable;
+ if (prop !== 'prototype') {
+ desc = rewriteDescriptor(obj, prop, desc);
+ }
+ return _tryDefineProperty(obj, prop, desc, originalConfigurableFlag);
+ };
+ Object.defineProperties = function (obj, props) {
+ Object.keys(props).forEach(function (prop) {
+ Object.defineProperty(obj, prop, props[prop]);
+ });
+ return obj;
+ };
+ Object.create = function (obj, proto) {
+ if (typeof proto === 'object' && !Object.isFrozen(proto)) {
+ Object.keys(proto).forEach(function (prop) {
+ proto[prop] = rewriteDescriptor(obj, prop, proto[prop]);
+ });
+ }
+ return _create(obj, proto);
+ };
+ Object.getOwnPropertyDescriptor = function (obj, prop) {
+ const desc = _getOwnPropertyDescriptor(obj, prop);
+ if (desc && isUnconfigurable(obj, prop)) {
+ desc.configurable = false;
+ }
+ return desc;
+ };
+}
+function _redefineProperty(obj, prop, desc) {
+ const originalConfigurableFlag = desc.configurable;
+ desc = rewriteDescriptor(obj, prop, desc);
+ return _tryDefineProperty(obj, prop, desc, originalConfigurableFlag);
+}
+function isUnconfigurable(obj, prop) {
+ return obj && obj[unconfigurablesKey] && obj[unconfigurablesKey][prop];
+}
+function rewriteDescriptor(obj, prop, desc) {
+ // issue-927, if the desc is frozen, don't try to change the desc
+ if (!Object.isFrozen(desc)) {
+ desc.configurable = true;
+ }
+ if (!desc.configurable) {
+ // issue-927, if the obj is frozen, don't try to set the desc to obj
+ if (!obj[unconfigurablesKey] && !Object.isFrozen(obj)) {
+ _defineProperty(obj, unconfigurablesKey, { writable: true, value: {} });
+ }
+ if (obj[unconfigurablesKey]) {
+ obj[unconfigurablesKey][prop] = true;
+ }
+ }
+ return desc;
+}
+function _tryDefineProperty(obj, prop, desc, originalConfigurableFlag) {
+ try {
+ return _defineProperty(obj, prop, desc);
+ }
+ catch (error) {
+ if (desc.configurable) {
+ // In case of errors, when the configurable flag was likely set by rewriteDescriptor(), let's
+ // retry with the original flag value
+ if (typeof originalConfigurableFlag == 'undefined') {
+ delete desc.configurable;
+ }
+ else {
+ desc.configurable = originalConfigurableFlag;
+ }
+ try {
+ return _defineProperty(obj, prop, desc);
+ }
+ catch (error) {
+ let descJson = null;
+ try {
+ descJson = JSON.stringify(desc);
+ }
+ catch (error) {
+ descJson = desc.toString();
+ }
+ console.log(`Attempting to configure '${prop}' with descriptor '${descJson}' on object '${obj}' and got error, giving up: ${error}`);
+ }
+ }
+ else {
+ throw error;
+ }
+ }
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {globalThis}
+ */
+const globalEventHandlersEventNames = [
+ 'abort',
+ 'animationcancel',
+ 'animationend',
+ 'animationiteration',
+ 'auxclick',
+ 'beforeinput',
+ 'blur',
+ 'cancel',
+ 'canplay',
+ 'canplaythrough',
+ 'change',
+ 'compositionstart',
+ 'compositionupdate',
+ 'compositionend',
+ 'cuechange',
+ 'click',
+ 'close',
+ 'contextmenu',
+ 'curechange',
+ 'dblclick',
+ 'drag',
+ 'dragend',
+ 'dragenter',
+ 'dragexit',
+ 'dragleave',
+ 'dragover',
+ 'drop',
+ 'durationchange',
+ 'emptied',
+ 'ended',
+ 'error',
+ 'focus',
+ 'focusin',
+ 'focusout',
+ 'gotpointercapture',
+ 'input',
+ 'invalid',
+ 'keydown',
+ 'keypress',
+ 'keyup',
+ 'load',
+ 'loadstart',
+ 'loadeddata',
+ 'loadedmetadata',
+ 'lostpointercapture',
+ 'mousedown',
+ 'mouseenter',
+ 'mouseleave',
+ 'mousemove',
+ 'mouseout',
+ 'mouseover',
+ 'mouseup',
+ 'mousewheel',
+ 'orientationchange',
+ 'pause',
+ 'play',
+ 'playing',
+ 'pointercancel',
+ 'pointerdown',
+ 'pointerenter',
+ 'pointerleave',
+ 'pointerlockchange',
+ 'mozpointerlockchange',
+ 'webkitpointerlockerchange',
+ 'pointerlockerror',
+ 'mozpointerlockerror',
+ 'webkitpointerlockerror',
+ 'pointermove',
+ 'pointout',
+ 'pointerover',
+ 'pointerup',
+ 'progress',
+ 'ratechange',
+ 'reset',
+ 'resize',
+ 'scroll',
+ 'seeked',
+ 'seeking',
+ 'select',
+ 'selectionchange',
+ 'selectstart',
+ 'show',
+ 'sort',
+ 'stalled',
+ 'submit',
+ 'suspend',
+ 'timeupdate',
+ 'volumechange',
+ 'touchcancel',
+ 'touchmove',
+ 'touchstart',
+ 'touchend',
+ 'transitioncancel',
+ 'transitionend',
+ 'waiting',
+ 'wheel'
+];
+const documentEventNames = [
+ 'afterscriptexecute', 'beforescriptexecute', 'DOMContentLoaded', 'freeze', 'fullscreenchange',
+ 'mozfullscreenchange', 'webkitfullscreenchange', 'msfullscreenchange', 'fullscreenerror',
+ 'mozfullscreenerror', 'webkitfullscreenerror', 'msfullscreenerror', 'readystatechange',
+ 'visibilitychange', 'resume'
+];
+const windowEventNames = [
+ 'absolutedeviceorientation',
+ 'afterinput',
+ 'afterprint',
+ 'appinstalled',
+ 'beforeinstallprompt',
+ 'beforeprint',
+ 'beforeunload',
+ 'devicelight',
+ 'devicemotion',
+ 'deviceorientation',
+ 'deviceorientationabsolute',
+ 'deviceproximity',
+ 'hashchange',
+ 'languagechange',
+ 'message',
+ 'mozbeforepaint',
+ 'offline',
+ 'online',
+ 'paint',
+ 'pageshow',
+ 'pagehide',
+ 'popstate',
+ 'rejectionhandled',
+ 'storage',
+ 'unhandledrejection',
+ 'unload',
+ 'userproximity',
+ 'vrdisplyconnected',
+ 'vrdisplaydisconnected',
+ 'vrdisplaypresentchange'
+];
+const htmlElementEventNames = [
+ 'beforecopy', 'beforecut', 'beforepaste', 'copy', 'cut', 'paste', 'dragstart', 'loadend',
+ 'animationstart', 'search', 'transitionrun', 'transitionstart', 'webkitanimationend',
+ 'webkitanimationiteration', 'webkitanimationstart', 'webkittransitionend'
+];
+const mediaElementEventNames = ['encrypted', 'waitingforkey', 'msneedkey', 'mozinterruptbegin', 'mozinterruptend'];
+const ieElementEventNames = [
+ 'activate',
+ 'afterupdate',
+ 'ariarequest',
+ 'beforeactivate',
+ 'beforedeactivate',
+ 'beforeeditfocus',
+ 'beforeupdate',
+ 'cellchange',
+ 'controlselect',
+ 'dataavailable',
+ 'datasetchanged',
+ 'datasetcomplete',
+ 'errorupdate',
+ 'filterchange',
+ 'layoutcomplete',
+ 'losecapture',
+ 'move',
+ 'moveend',
+ 'movestart',
+ 'propertychange',
+ 'resizeend',
+ 'resizestart',
+ 'rowenter',
+ 'rowexit',
+ 'rowsdelete',
+ 'rowsinserted',
+ 'command',
+ 'compassneedscalibration',
+ 'deactivate',
+ 'help',
+ 'mscontentzoom',
+ 'msmanipulationstatechanged',
+ 'msgesturechange',
+ 'msgesturedoubletap',
+ 'msgestureend',
+ 'msgesturehold',
+ 'msgesturestart',
+ 'msgesturetap',
+ 'msgotpointercapture',
+ 'msinertiastart',
+ 'mslostpointercapture',
+ 'mspointercancel',
+ 'mspointerdown',
+ 'mspointerenter',
+ 'mspointerhover',
+ 'mspointerleave',
+ 'mspointermove',
+ 'mspointerout',
+ 'mspointerover',
+ 'mspointerup',
+ 'pointerout',
+ 'mssitemodejumplistitemremoved',
+ 'msthumbnailclick',
+ 'stop',
+ 'storagecommit'
+];
+const webglEventNames = ['webglcontextrestored', 'webglcontextlost', 'webglcontextcreationerror'];
+const formEventNames = ['autocomplete', 'autocompleteerror'];
+const detailEventNames = ['toggle'];
+const frameEventNames = ['load'];
+const frameSetEventNames = ['blur', 'error', 'focus', 'load', 'resize', 'scroll', 'messageerror'];
+const marqueeEventNames = ['bounce', 'finish', 'start'];
+const XMLHttpRequestEventNames = [
+ 'loadstart', 'progress', 'abort', 'error', 'load', 'progress', 'timeout', 'loadend',
+ 'readystatechange'
+];
+const IDBIndexEventNames = ['upgradeneeded', 'complete', 'abort', 'success', 'error', 'blocked', 'versionchange', 'close'];
+const websocketEventNames = ['close', 'error', 'open', 'message'];
+const workerEventNames = ['error', 'message'];
+const eventNames = globalEventHandlersEventNames.concat(webglEventNames, formEventNames, detailEventNames, documentEventNames, windowEventNames, htmlElementEventNames, ieElementEventNames);
+function filterProperties(target, onProperties, ignoreProperties) {
+ if (!ignoreProperties || ignoreProperties.length === 0) {
+ return onProperties;
+ }
+ const tip = ignoreProperties.filter(ip => ip.target === target);
+ if (!tip || tip.length === 0) {
+ return onProperties;
+ }
+ const targetIgnoreProperties = tip[0].ignoreProperties;
+ return onProperties.filter(op => targetIgnoreProperties.indexOf(op) === -1);
+}
+function patchFilteredProperties(target, onProperties, ignoreProperties, prototype) {
+ // check whether target is available, sometimes target will be undefined
+ // because different browser or some 3rd party plugin.
+ if (!target) {
+ return;
+ }
+ const filteredProperties = filterProperties(target, onProperties, ignoreProperties);
+ patchOnProperties(target, filteredProperties, prototype);
+}
+function propertyDescriptorPatch(api, _global) {
+ if (isNode && !isMix) {
+ return;
+ }
+ if (Zone[api.symbol('patchEvents')]) {
+ // events are already been patched by legacy patch.
+ return;
+ }
+ const supportsWebSocket = typeof WebSocket !== 'undefined';
+ const ignoreProperties = _global['__Zone_ignore_on_properties'];
+ // for browsers that we can patch the descriptor: Chrome & Firefox
+ if (isBrowser) {
+ const internalWindow = window;
+ const ignoreErrorProperties = isIE ? [{ target: internalWindow, ignoreProperties: ['error'] }] : [];
+ // in IE/Edge, onProp not exist in window object, but in WindowPrototype
+ // so we need to pass WindowPrototype to check onProp exist or not
+ patchFilteredProperties(internalWindow, eventNames.concat(['messageerror']), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow));
+ patchFilteredProperties(Document.prototype, eventNames, ignoreProperties);
+ if (typeof internalWindow['SVGElement'] !== 'undefined') {
+ patchFilteredProperties(internalWindow['SVGElement'].prototype, eventNames, ignoreProperties);
+ }
+ patchFilteredProperties(Element.prototype, eventNames, ignoreProperties);
+ patchFilteredProperties(HTMLElement.prototype, eventNames, ignoreProperties);
+ patchFilteredProperties(HTMLMediaElement.prototype, mediaElementEventNames, ignoreProperties);
+ patchFilteredProperties(HTMLFrameSetElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
+ patchFilteredProperties(HTMLBodyElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
+ patchFilteredProperties(HTMLFrameElement.prototype, frameEventNames, ignoreProperties);
+ patchFilteredProperties(HTMLIFrameElement.prototype, frameEventNames, ignoreProperties);
+ const HTMLMarqueeElement = internalWindow['HTMLMarqueeElement'];
+ if (HTMLMarqueeElement) {
+ patchFilteredProperties(HTMLMarqueeElement.prototype, marqueeEventNames, ignoreProperties);
+ }
+ const Worker = internalWindow['Worker'];
+ if (Worker) {
+ patchFilteredProperties(Worker.prototype, workerEventNames, ignoreProperties);
+ }
+ }
+ patchFilteredProperties(XMLHttpRequest.prototype, XMLHttpRequestEventNames, ignoreProperties);
+ const XMLHttpRequestEventTarget = _global['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget) {
+ patchFilteredProperties(XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype, XMLHttpRequestEventNames, ignoreProperties);
+ }
+ if (typeof IDBIndex !== 'undefined') {
+ patchFilteredProperties(IDBIndex.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBOpenDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBDatabase.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBTransaction.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBCursor.prototype, IDBIndexEventNames, ignoreProperties);
+ }
+ if (supportsWebSocket) {
+ patchFilteredProperties(WebSocket.prototype, websocketEventNames, ignoreProperties);
+ }
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+Zone.__load_patch('util', (global, Zone, api) => {
+ api.patchOnProperties = patchOnProperties;
+ api.patchMethod = patchMethod;
+ api.bindArguments = bindArguments;
+ api.patchMacroTask = patchMacroTask;
+ // In earlier version of zone.js (<0.9.0), we use env name `__zone_symbol__BLACK_LISTED_EVENTS` to
+ // define which events will not be patched by `Zone.js`.
+ // In newer version (>=0.9.0), we change the env name to `__zone_symbol__UNPATCHED_EVENTS` to keep
+ // the name consistent with angular repo.
+ // The `__zone_symbol__BLACK_LISTED_EVENTS` is deprecated, but it is still be supported for
+ // backwards compatibility.
+ const SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');
+ const SYMBOL_UNPATCHED_EVENTS = Zone.__symbol__('UNPATCHED_EVENTS');
+ if (global[SYMBOL_UNPATCHED_EVENTS]) {
+ global[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_UNPATCHED_EVENTS];
+ }
+ if (global[SYMBOL_BLACK_LISTED_EVENTS]) {
+ Zone[SYMBOL_BLACK_LISTED_EVENTS] = Zone[SYMBOL_UNPATCHED_EVENTS] =
+ global[SYMBOL_BLACK_LISTED_EVENTS];
+ }
+ api.patchEventPrototype = patchEventPrototype;
+ api.patchEventTarget = patchEventTarget;
+ api.isIEOrEdge = isIEOrEdge;
+ api.ObjectDefineProperty = ObjectDefineProperty;
+ api.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;
+ api.ObjectCreate = ObjectCreate;
+ api.ArraySlice = ArraySlice;
+ api.patchClass = patchClass;
+ api.wrapWithCurrentZone = wrapWithCurrentZone;
+ api.filterProperties = filterProperties;
+ api.attachOriginToPatched = attachOriginToPatched;
+ api._redefineProperty = _redefineProperty;
+ api.patchCallbacks = patchCallbacks;
+ api.getGlobalObjects = () => ({
+ globalSources,
+ zoneSymbolEventNames: zoneSymbolEventNames$1,
+ eventNames,
+ isBrowser,
+ isMix,
+ isNode,
+ TRUE_STR,
+ FALSE_STR,
+ ZONE_SYMBOL_PREFIX,
+ ADD_EVENT_LISTENER_STR,
+ REMOVE_EVENT_LISTENER_STR
+ });
+});
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {missingRequire}
+ */
+const taskSymbol = zoneSymbol('zoneTask');
+function patchTimer(window, setName, cancelName, nameSuffix) {
+ let setNative = null;
+ let clearNative = null;
+ setName += nameSuffix;
+ cancelName += nameSuffix;
+ const tasksByHandleId = {};
+ function scheduleTask(task) {
+ const data = task.data;
+ function timer() {
+ try {
+ task.invoke.apply(this, arguments);
+ }
+ finally {
+ // issue-934, task will be cancelled
+ // even it is a periodic task such as
+ // setInterval
+ if (!(task.data && task.data.isPeriodic)) {
+ if (typeof data.handleId === 'number') {
+ // in non-nodejs env, we remove timerId
+ // from local cache
+ delete tasksByHandleId[data.handleId];
+ }
+ else if (data.handleId) {
+ // Node returns complex objects as handleIds
+ // we remove task reference from timer object
+ data.handleId[taskSymbol] = null;
+ }
+ }
+ }
+ }
+ data.args[0] = timer;
+ data.handleId = setNative.apply(window, data.args);
+ return task;
+ }
+ function clearTask(task) {
+ return clearNative(task.data.handleId);
+ }
+ setNative =
+ patchMethod(window, setName, (delegate) => function (self, args) {
+ if (typeof args[0] === 'function') {
+ const options = {
+ isPeriodic: nameSuffix === 'Interval',
+ delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 :
+ undefined,
+ args: args
+ };
+ const task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask);
+ if (!task) {
+ return task;
+ }
+ // Node.js must additionally support the ref and unref functions.
+ const handle = task.data.handleId;
+ if (typeof handle === 'number') {
+ // for non nodejs env, we save handleId: task
+ // mapping in local cache for clearTimeout
+ tasksByHandleId[handle] = task;
+ }
+ else if (handle) {
+ // for nodejs env, we save task
+ // reference in timerId Object for clearTimeout
+ handle[taskSymbol] = task;
+ }
+ // check whether handle is null, because some polyfill or browser
+ // may return undefined from setTimeout/setInterval/setImmediate/requestAnimationFrame
+ if (handle && handle.ref && handle.unref && typeof handle.ref === 'function' &&
+ typeof handle.unref === 'function') {
+ task.ref = handle.ref.bind(handle);
+ task.unref = handle.unref.bind(handle);
+ }
+ if (typeof handle === 'number' || handle) {
+ return handle;
+ }
+ return task;
+ }
+ else {
+ // cause an error by calling it directly.
+ return delegate.apply(window, args);
+ }
+ });
+ clearNative =
+ patchMethod(window, cancelName, (delegate) => function (self, args) {
+ const id = args[0];
+ let task;
+ if (typeof id === 'number') {
+ // non nodejs env.
+ task = tasksByHandleId[id];
+ }
+ else {
+ // nodejs env.
+ task = id && id[taskSymbol];
+ // other environments.
+ if (!task) {
+ task = id;
+ }
+ }
+ if (task && typeof task.type === 'string') {
+ if (task.state !== 'notScheduled' &&
+ (task.cancelFn && task.data.isPeriodic || task.runCount === 0)) {
+ if (typeof id === 'number') {
+ delete tasksByHandleId[id];
+ }
+ else if (id) {
+ id[taskSymbol] = null;
+ }
+ // Do not cancel already canceled functions
+ task.zone.cancelTask(task);
+ }
+ }
+ else {
+ // cause an error by calling it directly.
+ delegate.apply(window, args);
+ }
+ });
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function patchCustomElements(_global, api) {
+ const { isBrowser, isMix } = api.getGlobalObjects();
+ if ((!isBrowser && !isMix) || !('customElements' in _global)) {
+ return;
+ }
+ const callbacks = ['connectedCallback', 'disconnectedCallback', 'adoptedCallback', 'attributeChangedCallback'];
+ api.patchCallbacks(api, _global.customElements, 'customElements', 'define', callbacks);
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function eventTargetPatch(_global, api) {
+ const { eventNames, zoneSymbolEventNames, TRUE_STR, FALSE_STR, ZONE_SYMBOL_PREFIX } = api.getGlobalObjects();
+ // predefine all __zone_symbol__ + eventName + true/false string
+ for (let i = 0; i < eventNames.length; i++) {
+ const eventName = eventNames[i];
+ const falseEventName = eventName + FALSE_STR;
+ const trueEventName = eventName + TRUE_STR;
+ const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
+ const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
+ zoneSymbolEventNames[eventName] = {};
+ zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
+ }
+ const EVENT_TARGET = _global['EventTarget'];
+ if (!EVENT_TARGET || !EVENT_TARGET.prototype) {
+ return;
+ }
+ api.patchEventTarget(_global, [EVENT_TARGET && EVENT_TARGET.prototype]);
+ return true;
+}
+function patchEvent(global, api) {
+ api.patchEventPrototype(global, api);
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {missingRequire}
+ */
+Zone.__load_patch('legacy', (global) => {
+ const legacyPatch = global[Zone.__symbol__('legacyPatch')];
+ if (legacyPatch) {
+ legacyPatch();
+ }
+});
+Zone.__load_patch('timers', (global) => {
+ const set = 'set';
+ const clear = 'clear';
+ patchTimer(global, set, clear, 'Timeout');
+ patchTimer(global, set, clear, 'Interval');
+ patchTimer(global, set, clear, 'Immediate');
+});
+Zone.__load_patch('requestAnimationFrame', (global) => {
+ patchTimer(global, 'request', 'cancel', 'AnimationFrame');
+ patchTimer(global, 'mozRequest', 'mozCancel', 'AnimationFrame');
+ patchTimer(global, 'webkitRequest', 'webkitCancel', 'AnimationFrame');
+});
+Zone.__load_patch('blocking', (global, Zone) => {
+ 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, args) {
+ return Zone.current.run(delegate, global, args, name);
+ };
+ });
+ }
+});
+Zone.__load_patch('EventTarget', (global, Zone, api) => {
+ patchEvent(global, api);
+ eventTargetPatch(global, api);
+ // patch XMLHttpRequestEventTarget's addEventListener/removeEventListener
+ const XMLHttpRequestEventTarget = global['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) {
+ api.patchEventTarget(global, [XMLHttpRequestEventTarget.prototype]);
+ }
+ patchClass('MutationObserver');
+ patchClass('WebKitMutationObserver');
+ patchClass('IntersectionObserver');
+ patchClass('FileReader');
+});
+Zone.__load_patch('on_property', (global, Zone, api) => {
+ propertyDescriptorPatch(api, global);
+ propertyPatch();
+});
+Zone.__load_patch('customElements', (global, Zone, api) => {
+ patchCustomElements(global, api);
+});
+Zone.__load_patch('XHR', (global, Zone) => {
+ // 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_URL = zoneSymbol('xhrURL');
+ const XHR_ERROR_BEFORE_SCHEDULED = zoneSymbol('xhrErrorBeforeScheduled');
+ function patchXHR(window) {
+ const XMLHttpRequestPrototype = XMLHttpRequest.prototype;
+ function findPendingTask(target) {
+ return target[XHR_TASK];
+ }
+ let oriAddListener = XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+ let oriRemoveListener = XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+ if (!oriAddListener) {
+ const XMLHttpRequestEventTarget = window['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget) {
+ const XMLHttpRequestEventTargetPrototype = XMLHttpRequestEventTarget.prototype;
+ oriAddListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+ oriRemoveListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+ }
+ }
+ const READY_STATE_CHANGE = 'readystatechange';
+ const SCHEDULED = 'scheduled';
+ function scheduleTask(task) {
+ const data = task.data;
+ const target = data.target;
+ target[XHR_SCHEDULED] = false;
+ target[XHR_ERROR_BEFORE_SCHEDULED] = false;
+ // remove existing event listener
+ const listener = target[XHR_LISTENER];
+ if (!oriAddListener) {
+ oriAddListener = target[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+ oriRemoveListener = target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+ }
+ if (listener) {
+ oriRemoveListener.call(target, READY_STATE_CHANGE, listener);
+ }
+ const newListener = target[XHR_LISTENER] = () => {
+ if (target.readyState === 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 && target[XHR_SCHEDULED] && task.state === SCHEDULED) {
+ // check whether the xhr has registered onload listener
+ // if that is the case, the task should invoke after all
+ // onload listeners finish.
+ const loadTasks = target['__zone_symbol__loadfalse'];
+ if (loadTasks && loadTasks.length > 0) {
+ const oriInvoke = task.invoke;
+ task.invoke = function () {
+ // need to load the tasks again, because in other
+ // load listener, they may remove themselves
+ const loadTasks = target['__zone_symbol__loadfalse'];
+ for (let i = 0; i < loadTasks.length; i++) {
+ if (loadTasks[i] === task) {
+ loadTasks.splice(i, 1);
+ }
+ }
+ if (!data.aborted && task.state === SCHEDULED) {
+ oriInvoke.call(task);
+ }
+ };
+ loadTasks.push(task);
+ }
+ else {
+ task.invoke();
+ }
+ }
+ else if (!data.aborted && target[XHR_SCHEDULED] === false) {
+ // error occurs when xhr.send()
+ target[XHR_ERROR_BEFORE_SCHEDULED] = true;
+ }
+ }
+ };
+ oriAddListener.call(target, READY_STATE_CHANGE, newListener);
+ const storedTask = target[XHR_TASK];
+ if (!storedTask) {
+ target[XHR_TASK] = task;
+ }
+ sendNative.apply(target, data.args);
+ target[XHR_SCHEDULED] = true;
+ return task;
+ }
+ function placeholderCallback() { }
+ function clearTask(task) {
+ const data = 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 openNative = patchMethod(XMLHttpRequestPrototype, 'open', () => function (self, args) {
+ self[XHR_SYNC] = args[2] == false;
+ self[XHR_URL] = args[1];
+ return openNative.apply(self, args);
+ });
+ const XMLHTTPREQUEST_SOURCE = 'XMLHttpRequest.send';
+ const fetchTaskAborting = zoneSymbol('fetchTaskAborting');
+ const fetchTaskScheduling = zoneSymbol('fetchTaskScheduling');
+ const sendNative = patchMethod(XMLHttpRequestPrototype, 'send', () => function (self, args) {
+ if (Zone.current[fetchTaskScheduling] === true) {
+ // a fetch is scheduling, so we are using xhr to polyfill fetch
+ // and because we already schedule macroTask for fetch, we should
+ // not schedule a macroTask for xhr again
+ return sendNative.apply(self, args);
+ }
+ 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 = { target: self, url: self[XHR_URL], isPeriodic: false, args: args, aborted: false };
+ const task = scheduleMacroTaskWithCurrentZone(XMLHTTPREQUEST_SOURCE, placeholderCallback, options, scheduleTask, clearTask);
+ if (self && self[XHR_ERROR_BEFORE_SCHEDULED] === true && !options.aborted &&
+ task.state === SCHEDULED) {
+ // xhr request throw error when send
+ // we should invoke task instead of leaving a scheduled
+ // pending macroTask
+ task.invoke();
+ }
+ }
+ });
+ const abortNative = patchMethod(XMLHttpRequestPrototype, 'abort', () => function (self, args) {
+ const 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 && task.data.aborted)) {
+ return;
+ }
+ task.zone.cancelTask(task);
+ }
+ else if (Zone.current[fetchTaskAborting] === true) {
+ // the abort is called from fetch polyfill, we need to call native abort of XHR.
+ return abortNative.apply(self, args);
+ }
+ // Otherwise, we are trying to abort an XHR which has not yet been sent, so there is no
+ // task
+ // to cancel. Do nothing.
+ });
+ }
+});
+Zone.__load_patch('geolocation', (global) => {
+ /// GEO_LOCATION
+ if (global['navigator'] && global['navigator'].geolocation) {
+ patchPrototype(global['navigator'].geolocation, ['getCurrentPosition', 'watchPosition']);
+ }
+});
+Zone.__load_patch('PromiseRejectionEvent', (global, Zone) => {
+ // handle unhandled promise rejection
+ function findPromiseRejectionHandler(evtName) {
+ return function (e) {
+ const eventTasks = findEventTasks(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[zoneSymbol('unhandledPromiseRejectionHandler')] =
+ findPromiseRejectionHandler('unhandledrejection');
+ Zone[zoneSymbol('rejectionHandledHandler')] =
+ findPromiseRejectionHandler('rejectionhandled');
+ }
+});
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
diff --git a/dist/zone-evergreen.min.js b/dist/zone-evergreen.min.js
new file mode 100644
index 000000000..7d044141c
--- /dev/null
+++ b/dist/zone-evergreen.min.js
@@ -0,0 +1 @@
+const Zone$1=function(e){const t=e.performance;function n(e){t&&t.mark&&t.mark(e)}function o(e,n){t&&t.measure&&t.measure(e,n)}n("Zone");const r=!0===e.__zone_symbol__forceDuplicateZoneCheck;if(e.Zone){if(r||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}class s{constructor(e,t){this._parent=e,this._name=t?t.name||"unnamed":"",this._properties=t&&t.properties||{},this._zoneDelegate=new a(this,this._parent&&this._parent._zoneDelegate,t)}static assertZonePatched(){if(e.Promise!==P.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.)")}static get root(){let e=s.current;for(;e.parent;)e=e.parent;return e}static get current(){return D.zone}static get currentTask(){return z}static __load_patch(t,i){if(P.hasOwnProperty(t)){if(r)throw Error("Already loaded patch: "+t)}else if(!e["__Zone_disable_"+t]){const r="Zone:"+t;n(r),P[t]=i(e,s,N),o(r,r)}}get parent(){return this._parent}get name(){return this._name}get(e){const t=this.getZoneWith(e);if(t)return t._properties[e]}getZoneWith(e){let t=this;for(;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null}fork(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)}wrap(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);const n=this._zoneDelegate.intercept(this,e,t),o=this;return function(){return o.runGuarded(n,this,arguments,t)}}run(e,t,n,o){D={parent:D,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,o)}finally{D=D.parent}}runGuarded(e,t=null,n,o){D={parent:D,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,o)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{D=D.parent}}runTask(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||g).name+"; Execution: "+this.name+")");if(e.state===y&&(e.type===w||e.type===O))return;const o=e.state!=T;o&&e._transitionTo(T,b),e.runCount++;const r=z;z=e,D={parent:D,zone:this};try{e.type==O&&e.data&&!e.data.isPeriodic&&(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{e.state!==y&&e.state!==v&&(e.type==w||e.data&&e.data.isPeriodic?o&&e._transitionTo(b,T):(e.runCount=0,this._updateTaskCount(e,-1),o&&e._transitionTo(y,T,y))),D=D.parent,z=r}}scheduleTask(e){if(e.zone&&e.zone!==this){let t=this;for(;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(E,y);const t=[];e._zoneDelegates=t,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(t){throw e._transitionTo(v,E,y),this._zoneDelegate.handleError(this,t),t}return e._zoneDelegates===t&&this._updateTaskCount(e,1),e.state==E&&e._transitionTo(b,E),e}scheduleMicroTask(e,t,n,o){return this.scheduleTask(new c(S,e,t,n,o,void 0))}scheduleMacroTask(e,t,n,o,r){return this.scheduleTask(new c(O,e,t,n,o,r))}scheduleEventTask(e,t,n,o,r){return this.scheduleTask(new c(w,e,t,n,o,r))}cancelTask(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||g).name+"; Execution: "+this.name+")");e._transitionTo(k,b,T);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(v,k),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(y,k),e.runCount=0,e}_updateTaskCount(e,t){const n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(let o=0;oe.hasTask(n,o),onScheduleTask:(e,t,n,o)=>e.scheduleTask(n,o),onInvokeTask:(e,t,n,o,r,s)=>e.invokeTask(n,o,r,s),onCancelTask:(e,t,n,o)=>e.cancelTask(n,o)};class a{constructor(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;const o=n&&n.onHasTask,r=t&&t._hasTaskZS;(o||r)&&(this._hasTaskZS=o?n:i,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=e,n.onScheduleTask||(this._scheduleTaskZS=i,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this.zone),n.onInvokeTask||(this._invokeTaskZS=i,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this.zone),n.onCancelTask||(this._cancelTaskZS=i,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this.zone))}fork(e,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,e,t):new s(e,t)}intercept(e,t,n){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,e,t,n):t}invoke(e,t,n,o,r){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,e,t,n,o,r):t.apply(n,o)}handleError(e,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,e,t)}scheduleTask(e,t){let n=t;if(this._scheduleTaskZS)this._hasTaskZS&&n._zoneDelegates.push(this._hasTaskDlgtOwner),(n=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,e,t))||(n=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=S)throw new Error("Task is missing scheduleFn.");_(t)}return n}invokeTask(e,t,n,o){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,e,t,n,o):t.callback.apply(n,o)}cancelTask(e,t){let 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}hasTask(e,t){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,e,t)}catch(t){this.handleError(e,t)}}_updateTaskCount(e,t){const n=this._taskCounts,o=n[e],r=n[e]=o+t;if(r<0)throw new Error("More tasks executed then were scheduled.");if(0==o||0==r){const t={microTask:n.microTask>0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e};this.hasTask(this.zone,t)}}}class c{constructor(t,n,o,r,s,i){this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=t,this.source=n,this.data=r,this.scheduleFn=s,this.cancelFn=i,this.callback=o;const a=this;t===w&&r&&r.useG?this.invoke=c.invokeTask:this.invoke=function(){return c.invokeTask.call(e,a,this,arguments)}}static invokeTask(e,t,n){e||(e=this),Z++;try{return e.runCount++,e.zone.runTask(e,t,n)}finally{1==Z&&m(),Z--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(y,E)}_transitionTo(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==y&&(this._zoneDelegates=null)}toString(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}const l=R("setTimeout"),u=R("Promise"),p=R("then");let h,f=[],d=!1;function _(t){if(0===Z&&0===f.length)if(h||e[u]&&(h=e[u].resolve(0)),h){let e=h[p];e||(e=h.then),e.call(h,m)}else e[l](m,0);t&&f.push(t)}function m(){if(!d){for(d=!0;f.length;){const e=f;f=[];for(let t=0;tD,onUnhandledError:I,microtaskDrainDone:I,scheduleMicroTask:_,showUncaughtError:()=>!s[R("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:I,patchMethod:()=>I,bindArguments:()=>[],patchThen:()=>I,patchMacroTask:()=>I,setNativePromise:e=>{e&&"function"==typeof e.resolve&&(h=e.resolve(0))},patchEventPrototype:()=>I,isIEOrEdge:()=>!1,getGlobalObjects:()=>void 0,ObjectDefineProperty:()=>I,ObjectGetOwnPropertyDescriptor:()=>void 0,ObjectCreate:()=>void 0,ArraySlice:()=>[],patchClass:()=>I,wrapWithCurrentZone:()=>I,filterProperties:()=>[],attachOriginToPatched:()=>I,_redefineProperty:()=>I,patchCallbacks:()=>I};let D={parent:null,zone:new s(null,null)},z=null,Z=0;function I(){}function R(e){return"__zone_symbol__"+e}return o("Zone","Zone"),e.Zone=s}("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global);Zone.__load_patch("ZoneAwarePromise",(e,t,n)=>{const o=Object.getOwnPropertyDescriptor,r=Object.defineProperty;const s=n.symbol,i=[],a=s("Promise"),c=s("then"),l="__creationTrace__";n.onUnhandledError=(e=>{if(n.showUncaughtError()){const 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=(()=>{for(;i.length;)for(;i.length;){const e=i.shift();try{e.zone.runGuarded(()=>{throw e})}catch(e){p(e)}}});const u=s("unhandledPromiseRejectionHandler");function p(e){n.onUnhandledError(e);try{const n=t[u];n&&"function"==typeof n&&n.call(this,e)}catch(e){}}function h(e){return e&&e.then}function f(e){return e}function d(e){return M.reject(e)}const _=s("state"),m=s("value"),g=s("finally"),y=s("parentPromiseValue"),E=s("parentPromiseState"),b="Promise.then",T=null,k=!0,v=!1,S=0;function O(e,t){return n=>{try{D(e,t,n)}catch(t){D(e,!1,t)}}}const w=function(){let e=!1;return function(t){return function(){e||(e=!0,t.apply(null,arguments))}}},P="Promise resolved with itself",N=s("currentTaskTrace");function D(e,o,s){const a=w();if(e===s)throw new TypeError(P);if(e[_]===T){let c=null;try{"object"!=typeof s&&"function"!=typeof s||(c=s&&s.then)}catch(t){return a(()=>{D(e,!1,t)})(),e}if(o!==v&&s instanceof M&&s.hasOwnProperty(_)&&s.hasOwnProperty(m)&&s[_]!==T)Z(s),D(e,s[_],s[m]);else if(o!==v&&"function"==typeof c)try{c.call(s,a(O(e,o)),a(O(e,!1)))}catch(t){a(()=>{D(e,!1,t)})()}else{e[_]=o;const a=e[m];if(e[m]=s,e[g]===g&&o===k&&(e[_]=e[E],e[m]=e[y]),o===v&&s instanceof Error){const e=t.currentTask&&t.currentTask.data&&t.currentTask.data[l];e&&r(s,N,{configurable:!0,enumerable:!1,writable:!0,value:e})}for(let t=0;t{try{const o=e[m],r=n&&g===n[g];r&&(n[y]=o,n[E]=s);const a=t.run(i,void 0,r&&i!==d&&i!==f?[]:[o]);D(n,!0,a)}catch(e){D(n,!1,e)}},n)}const R="function ZoneAwarePromise() { [native code] }";class M{constructor(e){const t=this;if(!(t instanceof M))throw new Error("Must be an instanceof Promise.");t[_]=T,t[m]=[];try{e&&e(O(t,k),O(t,v))}catch(e){D(t,!1,e)}}static toString(){return R}static resolve(e){return D(new this(null),k,e)}static reject(e){return D(new this(null),v,e)}static race(e){let t,n,o=new this((e,o)=>{t=e,n=o});function r(e){t(e)}function s(e){n(e)}for(let t of e)h(t)||(t=this.resolve(t)),t.then(r,s);return o}static all(e){let t,n,o=new this((e,o)=>{t=e,n=o}),r=2,s=0;const i=[];for(let o of e){h(o)||(o=this.resolve(o));const e=s;o.then(n=>{i[e]=n,0===--r&&t(i)},n),r++,s++}return 0===(r-=2)&&t(i),o}get[Symbol.toStringTag](){return"Promise"}then(e,n){const o=new this.constructor(null),r=t.current;return this[_]==T?this[m].push(r,o,e,n):I(this,r,o,e,n),o}catch(e){return this.then(null,e)}finally(e){const n=new this.constructor(null);n[g]=g;const o=t.current;return this[_]==T?this[m].push(o,n,e,e):I(this,o,n,e,e),n}}M.resolve=M.resolve,M.reject=M.reject,M.race=M.race,M.all=M.all;const j=e[a]=e.Promise,C=t.__symbol__("ZoneAwarePromise");let L=o(e,"Promise");L&&!L.configurable||(L&&delete L.writable,L&&delete L.value,L||(L={configurable:!0,enumerable:!0}),L.get=function(){return e[C]?e[C]:e[a]},L.set=function(t){t===M?e[C]=t:(e[a]=t,t.prototype[c]||F(t),n.setNativePromise(t))},r(e,"Promise",L)),e.Promise=M;const A=s("thenPatched");function F(e){const t=e.prototype,n=o(t,"then");if(n&&(!1===n.writable||!n.configurable))return;const r=t.then;t[c]=r,e.prototype.then=function(e,t){return new M((e,t)=>{r.call(this,e,t)}).then(e,t)},e[A]=!0}if(n.patchThen=F,j){F(j);const t=e.fetch;"function"==typeof t&&(e[n.symbol("fetch")]=t,e.fetch=function(e){return function(){let t=e.apply(this,arguments);if(t instanceof M)return t;let n=t.constructor;return n[A]||F(n),t}}(t))}return Promise[t.__symbol__("uncaughtPromiseErrors")]=i,M});const ObjectGetOwnPropertyDescriptor=Object.getOwnPropertyDescriptor,ObjectDefineProperty=Object.defineProperty,ObjectGetPrototypeOf=Object.getPrototypeOf,ObjectCreate=Object.create,ArraySlice=Array.prototype.slice,ADD_EVENT_LISTENER_STR="addEventListener",REMOVE_EVENT_LISTENER_STR="removeEventListener",ZONE_SYMBOL_ADD_EVENT_LISTENER=Zone.__symbol__(ADD_EVENT_LISTENER_STR),ZONE_SYMBOL_REMOVE_EVENT_LISTENER=Zone.__symbol__(REMOVE_EVENT_LISTENER_STR),TRUE_STR="true",FALSE_STR="false",ZONE_SYMBOL_PREFIX="__zone_symbol__";function wrapWithCurrentZone(e,t){return Zone.current.wrap(e,t)}function scheduleMacroTaskWithCurrentZone(e,t,n,o,r){return Zone.current.scheduleMacroTask(e,t,n,o,r)}const zoneSymbol=Zone.__symbol__,isWindowExists="undefined"!=typeof window,internalWindow=isWindowExists?window:void 0,_global=isWindowExists&&internalWindow||"object"==typeof self&&self||global,REMOVE_ATTRIBUTE="removeAttribute",NULL_ON_PROP_VALUE=[null];function bindArguments(e,t){for(let n=e.length-1;n>=0;n--)"function"==typeof e[n]&&(e[n]=wrapWithCurrentZone(e[n],t+"_"+n));return e}function patchPrototype(e,t){const n=e.constructor.name;for(let o=0;o{const t=function(){return e.apply(this,bindArguments(arguments,n+"."+r))};return attachOriginToPatched(t,e),t})(s)}}}function isPropertyWritable(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&void 0===e.set)}const isWebWorker="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,isNode=!("nw"in _global)&&void 0!==_global.process&&"[object process]"==={}.toString.call(_global.process),isBrowser=!isNode&&!isWebWorker&&!(!isWindowExists||!internalWindow.HTMLElement),isMix=void 0!==_global.process&&"[object process]"==={}.toString.call(_global.process)&&!isWebWorker&&!(!isWindowExists||!internalWindow.HTMLElement),zoneSymbolEventNames={},wrapFn=function(e){if(!(e=e||_global.event))return;let t=zoneSymbolEventNames[e.type];t||(t=zoneSymbolEventNames[e.type]=zoneSymbol("ON_PROPERTY"+e.type));const n=this||e.target||_global,o=n[t];let r;if(isBrowser&&n===internalWindow&&"error"===e.type){const t=e;!0===(r=o&&o.call(this,t.message,t.filename,t.lineno,t.colno,t.error))&&e.preventDefault()}else null==(r=o&&o.apply(this,arguments))||r||e.preventDefault();return r};function patchProperty(e,t,n){let o=ObjectGetOwnPropertyDescriptor(e,t);if(!o&&n){ObjectGetOwnPropertyDescriptor(n,t)&&(o={enumerable:!0,configurable:!0})}if(!o||!o.configurable)return;const r=zoneSymbol("on"+t+"patched");if(e.hasOwnProperty(r)&&e[r])return;delete o.writable,delete o.value;const s=o.get,i=o.set,a=t.substr(2);let c=zoneSymbolEventNames[a];c||(c=zoneSymbolEventNames[a]=zoneSymbol("ON_PROPERTY"+a)),o.set=function(t){let n=this;n||e!==_global||(n=_global),n&&(n[c]&&n.removeEventListener(a,wrapFn),i&&i.apply(n,NULL_ON_PROP_VALUE),"function"==typeof t?(n[c]=t,n.addEventListener(a,wrapFn,!1)):n[c]=null)},o.get=function(){let n=this;if(n||e!==_global||(n=_global),!n)return null;const r=n[c];if(r)return r;if(s){let e=s&&s.call(this);if(e)return o.set.call(this,e),"function"==typeof n[REMOVE_ATTRIBUTE]&&n.removeAttribute(t),e}return null},ObjectDefineProperty(e,t,o),e[r]=!0}function patchOnProperties(e,t,n){if(t)for(let o=0;o{const o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,{get:function(){return e[n]},set:function(t){(!o||o.writable&&"function"==typeof o.set)&&(e[n]=t)},enumerable:!o||o.enumerable,configurable:!o||o.configurable})})}let shouldCopySymbolProperties=!1;function patchMethod(e,t,n){let o=e;for(;o&&!o.hasOwnProperty(t);)o=ObjectGetPrototypeOf(o);!o&&e[t]&&(o=e);const r=zoneSymbol(t);let s=null;if(o&&!(s=o[r])){if(s=o[r]=o[t],isPropertyWritable(o&&ObjectGetOwnPropertyDescriptor(o,t))){const e=n(s,r,t);o[t]=function(){return e(this,arguments)},attachOriginToPatched(o[t],s),shouldCopySymbolProperties&©SymbolProperties(s,o[t])}}return s}function patchMacroTask(e,t,n){let o=null;function r(e){const t=e.data;return t.args[t.cbIdx]=function(){e.invoke.apply(this,arguments)},o.apply(t.target,t.args),e}o=patchMethod(e,t,e=>(function(t,o){const s=n(t,o);return s.cbIdx>=0&&"function"==typeof o[s.cbIdx]?scheduleMacroTaskWithCurrentZone(s.name,o[s.cbIdx],s,r):e.apply(t,o)}))}function attachOriginToPatched(e,t){e[zoneSymbol("OriginalDelegate")]=t}let isDetectedIEOrEdge=!1,ieOrEdge=!1;function isIE(){try{const e=internalWindow.navigator.userAgent;if(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/"))return!0}catch(e){}return!1}function isIEOrEdge(){if(isDetectedIEOrEdge)return ieOrEdge;isDetectedIEOrEdge=!0;try{const e=internalWindow.navigator.userAgent;-1===e.indexOf("MSIE ")&&-1===e.indexOf("Trident/")&&-1===e.indexOf("Edge/")||(ieOrEdge=!0)}catch(e){}return ieOrEdge}Zone.__load_patch("toString",e=>{const t=Function.prototype.toString,n=zoneSymbol("OriginalDelegate"),o=zoneSymbol("Promise"),r=zoneSymbol("Error"),s=function(){if("function"==typeof this){const s=this[n];if(s)return"function"==typeof s?t.call(s):Object.prototype.toString.call(s);if(this===Promise){const n=e[o];if(n)return t.call(n)}if(this===Error){const n=e[r];if(n)return t.call(n)}}return t.call(this)};s[n]=t,Function.prototype.toString=s;const i=Object.prototype.toString;Object.prototype.toString=function(){return this instanceof Promise?"[object Promise]":i.call(this)}});let passiveSupported=!1;if("undefined"!=typeof window)try{const e=Object.defineProperty({},"passive",{get:function(){passiveSupported=!0}});window.addEventListener("test",e,e),window.removeEventListener("test",e,e)}catch(e){passiveSupported=!1}const OPTIMIZED_ZONE_EVENT_TASK_DATA={useG:!0},zoneSymbolEventNames$1={},globalSources={},EVENT_NAME_SYMBOL_REGX=/^__zone_symbol__(\w+)(true|false)$/,IMMEDIATE_PROPAGATION_SYMBOL="__zone_symbol__propagationStopped";function patchEventTarget(e,t,n){const o=n&&n.add||ADD_EVENT_LISTENER_STR,r=n&&n.rm||REMOVE_EVENT_LISTENER_STR,s=n&&n.listeners||"eventListeners",i=n&&n.rmAll||"removeAllListeners",a=zoneSymbol(o),c="."+o+":",l="prependListener",u="."+l+":",p=function(e,t,n){if(e.isRemoved)return;const o=e.callback;"object"==typeof o&&o.handleEvent&&(e.callback=(e=>o.handleEvent(e)),e.originalDelegate=o),e.invoke(e,t,[n]);const s=e.options;if(s&&"object"==typeof s&&s.once){const o=e.originalDelegate?e.originalDelegate:e.callback;t[r].call(t,n.type,o,s)}},h=function(t){if(!(t=t||e.event))return;const n=this||t.target||e,o=n[zoneSymbolEventNames$1[t.type][FALSE_STR]];if(o)if(1===o.length)p(o[0],n,t);else{const e=o.slice();for(let o=0;o(function(t,n){t[IMMEDIATE_PROPAGATION_SYMBOL]=!0,e&&e.apply(t,n)}))}function patchCallbacks(e,t,n,o,r){const s=Zone.__symbol__(o);if(t[s])return;const i=t[s]=t[o];t[o]=function(s,a,c){return a&&a.prototype&&r.forEach(function(t){const r=`${n}.${o}::`+t,s=a.prototype;if(s.hasOwnProperty(t)){const n=e.ObjectGetOwnPropertyDescriptor(s,t);n&&n.value?(n.value=e.wrapWithCurrentZone(n.value,r),e._redefineProperty(a.prototype,t,n)):s[t]&&(s[t]=e.wrapWithCurrentZone(s[t],r))}else s[t]&&(s[t]=e.wrapWithCurrentZone(s[t],r))}),i.call(t,s,a,c)},e.attachOriginToPatched(t[o],i)}const zoneSymbol$1=Zone.__symbol__,_defineProperty=Object[zoneSymbol$1("defineProperty")]=Object.defineProperty,_getOwnPropertyDescriptor=Object[zoneSymbol$1("getOwnPropertyDescriptor")]=Object.getOwnPropertyDescriptor,_create=Object.create,unconfigurablesKey=zoneSymbol$1("unconfigurables");function propertyPatch(){Object.defineProperty=function(e,t,n){if(isUnconfigurable(e,t))throw new TypeError("Cannot assign to read only property '"+t+"' of "+e);const o=n.configurable;return"prototype"!==t&&(n=rewriteDescriptor(e,t,n)),_tryDefineProperty(e,t,n,o)},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]=rewriteDescriptor(e,n,t[n])}),_create(e,t)},Object.getOwnPropertyDescriptor=function(e,t){const n=_getOwnPropertyDescriptor(e,t);return n&&isUnconfigurable(e,t)&&(n.configurable=!1),n}}function _redefineProperty(e,t,n){const o=n.configurable;return _tryDefineProperty(e,t,n=rewriteDescriptor(e,t,n),o)}function isUnconfigurable(e,t){return e&&e[unconfigurablesKey]&&e[unconfigurablesKey][t]}function rewriteDescriptor(e,t,n){return Object.isFrozen(n)||(n.configurable=!0),n.configurable||(e[unconfigurablesKey]||Object.isFrozen(e)||_defineProperty(e,unconfigurablesKey,{writable:!0,value:{}}),e[unconfigurablesKey]&&(e[unconfigurablesKey][t]=!0)),n}function _tryDefineProperty(e,t,n,o){try{return _defineProperty(e,t,n)}catch(r){if(!n.configurable)throw r;void 0===o?delete n.configurable:n.configurable=o;try{return _defineProperty(e,t,n)}catch(o){let r=null;try{r=JSON.stringify(n)}catch(e){r=n.toString()}console.log(`Attempting to configure '${t}' with descriptor '${r}' on object '${e}' and got error, giving up: ${o}`)}}}const globalEventHandlersEventNames=["abort","animationcancel","animationend","animationiteration","auxclick","beforeinput","blur","cancel","canplay","canplaythrough","change","compositionstart","compositionupdate","compositionend","cuechange","click","close","contextmenu","curechange","dblclick","drag","dragend","dragenter","dragexit","dragleave","dragover","drop","durationchange","emptied","ended","error","focus","focusin","focusout","gotpointercapture","input","invalid","keydown","keypress","keyup","load","loadstart","loadeddata","loadedmetadata","lostpointercapture","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","mousewheel","orientationchange","pause","play","playing","pointercancel","pointerdown","pointerenter","pointerleave","pointerlockchange","mozpointerlockchange","webkitpointerlockerchange","pointerlockerror","mozpointerlockerror","webkitpointerlockerror","pointermove","pointout","pointerover","pointerup","progress","ratechange","reset","resize","scroll","seeked","seeking","select","selectionchange","selectstart","show","sort","stalled","submit","suspend","timeupdate","volumechange","touchcancel","touchmove","touchstart","touchend","transitioncancel","transitionend","waiting","wheel"],documentEventNames=["afterscriptexecute","beforescriptexecute","DOMContentLoaded","freeze","fullscreenchange","mozfullscreenchange","webkitfullscreenchange","msfullscreenchange","fullscreenerror","mozfullscreenerror","webkitfullscreenerror","msfullscreenerror","readystatechange","visibilitychange","resume"],windowEventNames=["absolutedeviceorientation","afterinput","afterprint","appinstalled","beforeinstallprompt","beforeprint","beforeunload","devicelight","devicemotion","deviceorientation","deviceorientationabsolute","deviceproximity","hashchange","languagechange","message","mozbeforepaint","offline","online","paint","pageshow","pagehide","popstate","rejectionhandled","storage","unhandledrejection","unload","userproximity","vrdisplyconnected","vrdisplaydisconnected","vrdisplaypresentchange"],htmlElementEventNames=["beforecopy","beforecut","beforepaste","copy","cut","paste","dragstart","loadend","animationstart","search","transitionrun","transitionstart","webkitanimationend","webkitanimationiteration","webkitanimationstart","webkittransitionend"],mediaElementEventNames=["encrypted","waitingforkey","msneedkey","mozinterruptbegin","mozinterruptend"],ieElementEventNames=["activate","afterupdate","ariarequest","beforeactivate","beforedeactivate","beforeeditfocus","beforeupdate","cellchange","controlselect","dataavailable","datasetchanged","datasetcomplete","errorupdate","filterchange","layoutcomplete","losecapture","move","moveend","movestart","propertychange","resizeend","resizestart","rowenter","rowexit","rowsdelete","rowsinserted","command","compassneedscalibration","deactivate","help","mscontentzoom","msmanipulationstatechanged","msgesturechange","msgesturedoubletap","msgestureend","msgesturehold","msgesturestart","msgesturetap","msgotpointercapture","msinertiastart","mslostpointercapture","mspointercancel","mspointerdown","mspointerenter","mspointerhover","mspointerleave","mspointermove","mspointerout","mspointerover","mspointerup","pointerout","mssitemodejumplistitemremoved","msthumbnailclick","stop","storagecommit"],webglEventNames=["webglcontextrestored","webglcontextlost","webglcontextcreationerror"],formEventNames=["autocomplete","autocompleteerror"],detailEventNames=["toggle"],frameEventNames=["load"],frameSetEventNames=["blur","error","focus","load","resize","scroll","messageerror"],marqueeEventNames=["bounce","finish","start"],XMLHttpRequestEventNames=["loadstart","progress","abort","error","load","progress","timeout","loadend","readystatechange"],IDBIndexEventNames=["upgradeneeded","complete","abort","success","error","blocked","versionchange","close"],websocketEventNames=["close","error","open","message"],workerEventNames=["error","message"],eventNames=globalEventHandlersEventNames.concat(webglEventNames,formEventNames,detailEventNames,documentEventNames,windowEventNames,htmlElementEventNames,ieElementEventNames);function filterProperties(e,t,n){if(!n||0===n.length)return t;const o=n.filter(t=>t.target===e);if(!o||0===o.length)return t;const r=o[0].ignoreProperties;return t.filter(e=>-1===r.indexOf(e))}function patchFilteredProperties(e,t,n,o){if(!e)return;patchOnProperties(e,filterProperties(e,t,n),o)}function propertyDescriptorPatch(e,t){if(isNode&&!isMix)return;if(Zone[e.symbol("patchEvents")])return;const n="undefined"!=typeof WebSocket,o=t.__Zone_ignore_on_properties;if(isBrowser){const e=window,t=isIE?[{target:e,ignoreProperties:["error"]}]:[];patchFilteredProperties(e,eventNames.concat(["messageerror"]),o?o.concat(t):o,ObjectGetPrototypeOf(e)),patchFilteredProperties(Document.prototype,eventNames,o),void 0!==e.SVGElement&&patchFilteredProperties(e.SVGElement.prototype,eventNames,o),patchFilteredProperties(Element.prototype,eventNames,o),patchFilteredProperties(HTMLElement.prototype,eventNames,o),patchFilteredProperties(HTMLMediaElement.prototype,mediaElementEventNames,o),patchFilteredProperties(HTMLFrameSetElement.prototype,windowEventNames.concat(frameSetEventNames),o),patchFilteredProperties(HTMLBodyElement.prototype,windowEventNames.concat(frameSetEventNames),o),patchFilteredProperties(HTMLFrameElement.prototype,frameEventNames,o),patchFilteredProperties(HTMLIFrameElement.prototype,frameEventNames,o);const n=e.HTMLMarqueeElement;n&&patchFilteredProperties(n.prototype,marqueeEventNames,o);const r=e.Worker;r&&patchFilteredProperties(r.prototype,workerEventNames,o)}patchFilteredProperties(XMLHttpRequest.prototype,XMLHttpRequestEventNames,o);const r=t.XMLHttpRequestEventTarget;r&&patchFilteredProperties(r&&r.prototype,XMLHttpRequestEventNames,o),"undefined"!=typeof IDBIndex&&(patchFilteredProperties(IDBIndex.prototype,IDBIndexEventNames,o),patchFilteredProperties(IDBRequest.prototype,IDBIndexEventNames,o),patchFilteredProperties(IDBOpenDBRequest.prototype,IDBIndexEventNames,o),patchFilteredProperties(IDBDatabase.prototype,IDBIndexEventNames,o),patchFilteredProperties(IDBTransaction.prototype,IDBIndexEventNames,o),patchFilteredProperties(IDBCursor.prototype,IDBIndexEventNames,o)),n&&patchFilteredProperties(WebSocket.prototype,websocketEventNames,o)}Zone.__load_patch("util",(e,t,n)=>{n.patchOnProperties=patchOnProperties,n.patchMethod=patchMethod,n.bindArguments=bindArguments,n.patchMacroTask=patchMacroTask;const o=t.__symbol__("BLACK_LISTED_EVENTS"),r=t.__symbol__("UNPATCHED_EVENTS");e[r]&&(e[o]=e[r]),e[o]&&(t[o]=t[r]=e[o]),n.patchEventPrototype=patchEventPrototype,n.patchEventTarget=patchEventTarget,n.isIEOrEdge=isIEOrEdge,n.ObjectDefineProperty=ObjectDefineProperty,n.ObjectGetOwnPropertyDescriptor=ObjectGetOwnPropertyDescriptor,n.ObjectCreate=ObjectCreate,n.ArraySlice=ArraySlice,n.patchClass=patchClass,n.wrapWithCurrentZone=wrapWithCurrentZone,n.filterProperties=filterProperties,n.attachOriginToPatched=attachOriginToPatched,n._redefineProperty=_redefineProperty,n.patchCallbacks=patchCallbacks,n.getGlobalObjects=(()=>({globalSources,zoneSymbolEventNames:zoneSymbolEventNames$1,eventNames,isBrowser,isMix,isNode,TRUE_STR,FALSE_STR,ZONE_SYMBOL_PREFIX,ADD_EVENT_LISTENER_STR,REMOVE_EVENT_LISTENER_STR}))});const taskSymbol=zoneSymbol("zoneTask");function patchTimer(e,t,n,o){let r=null,s=null;n+=o;const i={};function a(t){const n=t.data;return n.args[0]=function(){try{t.invoke.apply(this,arguments)}finally{t.data&&t.data.isPeriodic||("number"==typeof n.handleId?delete i[n.handleId]:n.handleId&&(n.handleId[taskSymbol]=null))}},n.handleId=r.apply(e,n.args),t}function c(e){return s(e.data.handleId)}r=patchMethod(e,t+=o,n=>(function(r,s){if("function"==typeof s[0]){const e={isPeriodic:"Interval"===o,delay:"Timeout"===o||"Interval"===o?s[1]||0:void 0,args:s},n=scheduleMacroTaskWithCurrentZone(t,s[0],e,a,c);if(!n)return n;const r=n.data.handleId;return"number"==typeof r?i[r]=n:r&&(r[taskSymbol]=n),r&&r.ref&&r.unref&&"function"==typeof r.ref&&"function"==typeof r.unref&&(n.ref=r.ref.bind(r),n.unref=r.unref.bind(r)),"number"==typeof r||r?r:n}return n.apply(e,s)})),s=patchMethod(e,n,t=>(function(n,o){const r=o[0];let s;"number"==typeof r?s=i[r]:(s=r&&r[taskSymbol])||(s=r),s&&"string"==typeof s.type?"notScheduled"!==s.state&&(s.cancelFn&&s.data.isPeriodic||0===s.runCount)&&("number"==typeof r?delete i[r]:r&&(r[taskSymbol]=null),s.zone.cancelTask(s)):t.apply(e,o)}))}function patchCustomElements(e,t){const{isBrowser:n,isMix:o}=t.getGlobalObjects();if(!n&&!o||!("customElements"in e))return;t.patchCallbacks(t,e.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback"])}function eventTargetPatch(e,t){const{eventNames:n,zoneSymbolEventNames:o,TRUE_STR:r,FALSE_STR:s,ZONE_SYMBOL_PREFIX:i}=t.getGlobalObjects();for(let e=0;e{const t=e[Zone.__symbol__("legacyPatch")];t&&t()}),Zone.__load_patch("timers",e=>{patchTimer(e,"set","clear","Timeout"),patchTimer(e,"set","clear","Interval"),patchTimer(e,"set","clear","Immediate")}),Zone.__load_patch("requestAnimationFrame",e=>{patchTimer(e,"request","cancel","AnimationFrame"),patchTimer(e,"mozRequest","mozCancel","AnimationFrame"),patchTimer(e,"webkitRequest","webkitCancel","AnimationFrame")}),Zone.__load_patch("blocking",(e,t)=>{const n=["alert","prompt","confirm"];for(let o=0;o(function(o,s){return t.current.run(n,e,s,r)}))}}),Zone.__load_patch("EventTarget",(e,t,n)=>{patchEvent(e,n),eventTargetPatch(e,n);const o=e.XMLHttpRequestEventTarget;o&&o.prototype&&n.patchEventTarget(e,[o.prototype]),patchClass("MutationObserver"),patchClass("WebKitMutationObserver"),patchClass("IntersectionObserver"),patchClass("FileReader")}),Zone.__load_patch("on_property",(e,t,n)=>{propertyDescriptorPatch(n,e),propertyPatch()}),Zone.__load_patch("customElements",(e,t,n)=>{patchCustomElements(e,n)}),Zone.__load_patch("XHR",(e,t)=>{!function(e){const c=XMLHttpRequest.prototype;let l=c[ZONE_SYMBOL_ADD_EVENT_LISTENER],u=c[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];if(!l){const t=e.XMLHttpRequestEventTarget;if(t){const e=t.prototype;l=e[ZONE_SYMBOL_ADD_EVENT_LISTENER],u=e[ZONE_SYMBOL_REMOVE_EVENT_LISTENER]}}const p="readystatechange",h="scheduled";function f(e){const t=e.data,o=t.target;o[s]=!1,o[a]=!1;const i=o[r];l||(l=o[ZONE_SYMBOL_ADD_EVENT_LISTENER],u=o[ZONE_SYMBOL_REMOVE_EVENT_LISTENER]),i&&u.call(o,p,i);const c=o[r]=(()=>{if(o.readyState===o.DONE)if(!t.aborted&&o[s]&&e.state===h){const n=o.__zone_symbol__loadfalse;if(n&&n.length>0){const r=e.invoke;e.invoke=function(){const n=o.__zone_symbol__loadfalse;for(let t=0;t(function(e,t){return e[o]=0==t[2],e[i]=t[1],m.apply(e,t)})),g=zoneSymbol("fetchTaskAborting"),y=zoneSymbol("fetchTaskScheduling"),E=patchMethod(c,"send",()=>(function(e,n){if(!0===t.current[y])return E.apply(e,n);if(e[o])return E.apply(e,n);{const t={target:e,url:e[i],isPeriodic:!1,args:n,aborted:!1},o=scheduleMacroTaskWithCurrentZone("XMLHttpRequest.send",d,t,f,_);e&&!0===e[a]&&!t.aborted&&o.state===h&&o.invoke()}})),b=patchMethod(c,"abort",()=>(function(e,o){const r=e[n];if(r&&"string"==typeof r.type){if(null==r.cancelFn||r.data&&r.data.aborted)return;r.zone.cancelTask(r)}else if(!0===t.current[g])return b.apply(e,o)}))}(e);const n=zoneSymbol("xhrTask"),o=zoneSymbol("xhrSync"),r=zoneSymbol("xhrListener"),s=zoneSymbol("xhrScheduled"),i=zoneSymbol("xhrURL"),a=zoneSymbol("xhrErrorBeforeScheduled")}),Zone.__load_patch("geolocation",e=>{e.navigator&&e.navigator.geolocation&&patchPrototype(e.navigator.geolocation,["getCurrentPosition","watchPosition"])}),Zone.__load_patch("PromiseRejectionEvent",(e,t)=>{function n(t){return function(n){findEventTasks(e,t).forEach(o=>{const r=e.PromiseRejectionEvent;if(r){const e=new r(t,{promise:n.promise,reason:n.rejection});o.invoke(e)}})}}e.PromiseRejectionEvent&&(t[zoneSymbol("unhandledPromiseRejectionHandler")]=n("unhandledrejection"),t[zoneSymbol("rejectionHandledHandler")]=n("rejectionhandled"))});
\ No newline at end of file
diff --git a/dist/zone-legacy.js b/dist/zone-legacy.js
new file mode 100644
index 000000000..69d76cd2c
--- /dev/null
+++ b/dist/zone-legacy.js
@@ -0,0 +1,321 @@
+/**
+* @license
+* Copyright Google Inc. All Rights Reserved.
+*
+* Use of this source code is governed by an MIT-style license that can be
+* found in the LICENSE file at https://angular.io/license
+*/
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (factory());
+}(this, (function () { 'use strict';
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function eventTargetLegacyPatch(_global, api) {
+ var _a = api.getGlobalObjects(), eventNames = _a.eventNames, globalSources = _a.globalSources, zoneSymbolEventNames = _a.zoneSymbolEventNames, TRUE_STR = _a.TRUE_STR, FALSE_STR = _a.FALSE_STR, ZONE_SYMBOL_PREFIX = _a.ZONE_SYMBOL_PREFIX;
+ var WTF_ISSUE_555 = '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';
+ var NO_EVENT_TARGET = '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(',');
+ var EVENT_TARGET = 'EventTarget';
+ var apis = [];
+ var isWtf = _global['wtf'];
+ var WTF_ISSUE_555_ARRAY = WTF_ISSUE_555.split(',');
+ if (isWtf) {
+ // Workaround for: https://github.com/google/tracing-framework/issues/555
+ apis = WTF_ISSUE_555_ARRAY.map(function (v) { return 'HTML' + v + 'Element'; }).concat(NO_EVENT_TARGET);
+ }
+ else if (_global[EVENT_TARGET]) {
+ // EventTarget is already patched in browser.ts
+ }
+ else {
+ // Note: EventTarget is not available in all browsers,
+ // if it's not available, we instead patch the APIs in the IDL that inherit from EventTarget
+ apis = NO_EVENT_TARGET;
+ }
+ var isDisableIECheck = _global['__Zone_disable_IE_check'] || false;
+ var isEnableCrossContextCheck = _global['__Zone_enable_cross_context_check'] || false;
+ var ieOrEdge = api.isIEOrEdge();
+ var ADD_EVENT_LISTENER_SOURCE = '.addEventListener:';
+ var FUNCTION_WRAPPER = '[object FunctionWrapper]';
+ var BROWSER_TOOLS = 'function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }';
+ // predefine all __zone_symbol__ + eventName + true/false string
+ for (var i = 0; i < eventNames.length; i++) {
+ var eventName = eventNames[i];
+ var falseEventName = eventName + FALSE_STR;
+ var trueEventName = eventName + TRUE_STR;
+ var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
+ var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
+ zoneSymbolEventNames[eventName] = {};
+ zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
+ }
+ // predefine all task.source string
+ for (var i = 0; i < WTF_ISSUE_555.length; i++) {
+ var target = WTF_ISSUE_555_ARRAY[i];
+ var targets = globalSources[target] = {};
+ for (var j = 0; j < eventNames.length; j++) {
+ var eventName = eventNames[j];
+ targets[eventName] = target + ADD_EVENT_LISTENER_SOURCE + eventName;
+ }
+ }
+ var checkIEAndCrossContext = function (nativeDelegate, delegate, target, args) {
+ if (!isDisableIECheck && ieOrEdge) {
+ if (isEnableCrossContextCheck) {
+ try {
+ var testString = delegate.toString();
+ if ((testString === FUNCTION_WRAPPER || testString == BROWSER_TOOLS)) {
+ nativeDelegate.apply(target, args);
+ return false;
+ }
+ }
+ catch (error) {
+ nativeDelegate.apply(target, args);
+ return false;
+ }
+ }
+ else {
+ var testString = delegate.toString();
+ if ((testString === FUNCTION_WRAPPER || testString == BROWSER_TOOLS)) {
+ nativeDelegate.apply(target, args);
+ return false;
+ }
+ }
+ }
+ else if (isEnableCrossContextCheck) {
+ try {
+ delegate.toString();
+ }
+ catch (error) {
+ nativeDelegate.apply(target, args);
+ return false;
+ }
+ }
+ return true;
+ };
+ var apiTypes = [];
+ for (var i = 0; i < apis.length; i++) {
+ var type = _global[apis[i]];
+ apiTypes.push(type && type.prototype);
+ }
+ // vh is validateHandler to check event handler
+ // is valid or not(for security check)
+ api.patchEventTarget(_global, apiTypes, { vh: checkIEAndCrossContext });
+ return true;
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// we have to patch the instance since the proto is non-configurable
+function apply(api, _global) {
+ var _a = api.getGlobalObjects(), ADD_EVENT_LISTENER_STR = _a.ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR = _a.REMOVE_EVENT_LISTENER_STR;
+ var WS = _global.WebSocket;
+ // On Safari window.EventTarget doesn't exist so need to patch WS add/removeEventListener
+ // On older Chrome, no need since EventTarget was already patched
+ if (!_global.EventTarget) {
+ api.patchEventTarget(_global, [WS.prototype]);
+ }
+ _global.WebSocket = function (x, y) {
+ var socket = arguments.length > 1 ? new WS(x, y) : new WS(x);
+ var proxySocket;
+ var proxySocketProto;
+ // Safari 7.0 has non-configurable own 'onmessage' and friends properties on the socket instance
+ var onmessageDesc = api.ObjectGetOwnPropertyDescriptor(socket, 'onmessage');
+ if (onmessageDesc && onmessageDesc.configurable === false) {
+ proxySocket = api.ObjectCreate(socket);
+ // socket have own property descriptor 'onopen', 'onmessage', 'onclose', 'onerror'
+ // but proxySocket not, so we will keep socket as prototype and pass it to
+ // patchOnProperties method
+ proxySocketProto = socket;
+ [ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR, 'send', 'close'].forEach(function (propName) {
+ proxySocket[propName] = function () {
+ var args = api.ArraySlice.call(arguments);
+ if (propName === ADD_EVENT_LISTENER_STR || propName === REMOVE_EVENT_LISTENER_STR) {
+ var eventName = args.length > 0 ? args[0] : undefined;
+ if (eventName) {
+ var propertySymbol = Zone.__symbol__('ON_PROPERTY' + eventName);
+ socket[propertySymbol] = proxySocket[propertySymbol];
+ }
+ }
+ return socket[propName].apply(socket, args);
+ };
+ });
+ }
+ else {
+ // we can patch the real socket
+ proxySocket = socket;
+ }
+ api.patchOnProperties(proxySocket, ['close', 'error', 'message', 'open'], proxySocketProto);
+ return proxySocket;
+ };
+ var globalWebSocket = _global['WebSocket'];
+ for (var prop in WS) {
+ globalWebSocket[prop] = WS[prop];
+ }
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {globalThis}
+ */
+function propertyDescriptorLegacyPatch(api, _global) {
+ var _a = api.getGlobalObjects(), isNode = _a.isNode, isMix = _a.isMix;
+ if (isNode && !isMix) {
+ return;
+ }
+ var supportsWebSocket = typeof WebSocket !== 'undefined';
+ if (!canPatchViaPropertyDescriptor(api)) {
+ // Safari, Android browsers (Jelly Bean)
+ patchViaCapturingAllTheEvents(api);
+ api.patchClass('XMLHttpRequest');
+ if (supportsWebSocket) {
+ apply(api, _global);
+ }
+ Zone[api.symbol('patchEvents')] = true;
+ }
+}
+function canPatchViaPropertyDescriptor(api) {
+ var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
+ if ((isBrowser || isMix) &&
+ !api.ObjectGetOwnPropertyDescriptor(HTMLElement.prototype, 'onclick') &&
+ typeof Element !== 'undefined') {
+ // WebKit https://bugs.webkit.org/show_bug.cgi?id=134364
+ // IDL interface attributes are not configurable
+ var desc = api.ObjectGetOwnPropertyDescriptor(Element.prototype, 'onclick');
+ if (desc && !desc.configurable)
+ return false;
+ }
+ var ON_READY_STATE_CHANGE = 'onreadystatechange';
+ var XMLHttpRequestPrototype = XMLHttpRequest.prototype;
+ var xhrDesc = api.ObjectGetOwnPropertyDescriptor(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE);
+ // add enumerable and configurable here because in opera
+ // by default XMLHttpRequest.prototype.onreadystatechange is undefined
+ // without adding enumerable and configurable will cause onreadystatechange
+ // non-configurable
+ // and if XMLHttpRequest.prototype.onreadystatechange is undefined,
+ // we should set a real desc instead a fake one
+ if (xhrDesc) {
+ api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
+ enumerable: true,
+ configurable: true,
+ get: function () {
+ return true;
+ }
+ });
+ var req = new XMLHttpRequest();
+ var result = !!req.onreadystatechange;
+ // restore original desc
+ api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, xhrDesc || {});
+ return result;
+ }
+ else {
+ var SYMBOL_FAKE_ONREADYSTATECHANGE_1 = api.symbol('fake');
+ api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
+ enumerable: true,
+ configurable: true,
+ get: function () {
+ return this[SYMBOL_FAKE_ONREADYSTATECHANGE_1];
+ },
+ set: function (value) {
+ this[SYMBOL_FAKE_ONREADYSTATECHANGE_1] = value;
+ }
+ });
+ var req = new XMLHttpRequest();
+ var detectFunc = function () { };
+ req.onreadystatechange = detectFunc;
+ var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
+ req.onreadystatechange = null;
+ return result;
+ }
+}
+// Whenever any eventListener fires, we check the eventListener target and all parents
+// for `onwhatever` properties and replace them with zone-bound functions
+// - Chrome (for now)
+function patchViaCapturingAllTheEvents(api) {
+ var eventNames = api.getGlobalObjects().eventNames;
+ var unboundKey = api.symbol('unbound');
+ var _loop_1 = function (i) {
+ var property = eventNames[i];
+ var onproperty = 'on' + property;
+ self.addEventListener(property, function (event) {
+ var elt = event.target, bound, source;
+ if (elt) {
+ source = elt.constructor['name'] + '.' + onproperty;
+ }
+ else {
+ source = 'unknown.' + onproperty;
+ }
+ while (elt) {
+ if (elt[onproperty] && !elt[onproperty][unboundKey]) {
+ bound = api.wrapWithCurrentZone(elt[onproperty], source);
+ bound[unboundKey] = elt[onproperty];
+ elt[onproperty] = bound;
+ }
+ elt = elt.parentElement;
+ }
+ }, true);
+ };
+ for (var i = 0; i < eventNames.length; i++) {
+ _loop_1(i);
+ }
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function registerElementPatch(_global, api) {
+ var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
+ if ((!isBrowser && !isMix) || !('registerElement' in _global.document)) {
+ return;
+ }
+ var callbacks = ['createdCallback', 'attachedCallback', 'detachedCallback', 'attributeChangedCallback'];
+ api.patchCallbacks(api, document, 'Document', 'registerElement', callbacks);
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {missingRequire}
+ */
+(function (_global) {
+ _global['__zone_symbol__legacyPatch'] = function () {
+ var Zone = _global['Zone'];
+ Zone.__load_patch('registerElement', function (global, Zone, api) {
+ registerElementPatch(global, api);
+ });
+ Zone.__load_patch('EventTargetLegacy', function (global, Zone, api) {
+ eventTargetLegacyPatch(global, api);
+ propertyDescriptorLegacyPatch(api, global);
+ });
+ };
+})(typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global);
+
+})));
diff --git a/dist/zone-legacy.min.js b/dist/zone-legacy.min.js
new file mode 100644
index 000000000..7ec8b01a1
--- /dev/null
+++ b/dist/zone-legacy.min.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){"use strict";function e(e,t){var n=e.getGlobalObjects(),r=n.isNode,a=n.isMix;if(!r||a){var o="undefined"!=typeof WebSocket;(function(e){var t=e.getGlobalObjects(),n=t.isBrowser,r=t.isMix;if((n||r)&&!e.ObjectGetOwnPropertyDescriptor(HTMLElement.prototype,"onclick")&&"undefined"!=typeof Element){var a=e.ObjectGetOwnPropertyDescriptor(Element.prototype,"onclick");if(a&&!a.configurable)return!1}var o=XMLHttpRequest.prototype,c=e.ObjectGetOwnPropertyDescriptor(o,"onreadystatechange");if(c){e.ObjectDefineProperty(o,"onreadystatechange",{enumerable:!0,configurable:!0,get:function(){return!0}});var i=new XMLHttpRequest,l=!!i.onreadystatechange;return e.ObjectDefineProperty(o,"onreadystatechange",c||{}),l}var s=e.symbol("fake");e.ObjectDefineProperty(o,"onreadystatechange",{enumerable:!0,configurable:!0,get:function(){return this[s]},set:function(e){this[s]=e}});var i=new XMLHttpRequest,u=function(){};i.onreadystatechange=u;var l=i[s]===u;return i.onreadystatechange=null,l})(e)||(!function(e){for(var t=e.getGlobalObjects().eventNames,n=e.symbol("unbound"),r=function(r){var a=t[r],o="on"+a;self.addEventListener(a,function(t){var r,a,c=t.target;for(a=c?c.constructor.name+"."+o:"unknown."+o;c;)c[o]&&!c[o][n]&&((r=e.wrapWithCurrentZone(c[o],a))[n]=c[o],c[o]=r),c=c.parentElement},!0)},a=0;a1?new o(t,n):new o(t),s=e.ObjectGetOwnPropertyDescriptor(l,"onmessage");return s&&!1===s.configurable?(c=e.ObjectCreate(l),i=l,[r,a,"send","close"].forEach(function(t){c[t]=function(){var n=e.ArraySlice.call(arguments);if(t===r||t===a){var o=n.length>0?n[0]:void 0;if(o){var i=Zone.__symbol__("ON_PROPERTY"+o);l[i]=c[i]}}return l[t].apply(l,n)}})):c=l,e.patchOnProperties(c,["close","error","message","open"],i),c};var c=t.WebSocket;for(var i in o)c[i]=o[i]}(e,t),Zone[e.symbol("patchEvents")]=!0)}}var t;(t="undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global).__zone_symbol__legacyPatch=function(){var n=t.Zone;n.__load_patch("registerElement",function(e,t,n){!function(e,t){var n=t.getGlobalObjects(),r=n.isBrowser,a=n.isMix;(r||a)&&"registerElement"in e.document&&t.patchCallbacks(t,document,"Document","registerElement",["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"])}(e,n)}),n.__load_patch("EventTargetLegacy",function(t,n,r){!function(e,t){var n=t.getGlobalObjects(),r=n.eventNames,a=n.globalSources,o=n.zoneSymbolEventNames,c=n.TRUE_STR,i=n.FALSE_STR,l=n.ZONE_SYMBOL_PREFIX,s="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(","),p=[],f=e.wtf,b=s.split(",");f?p=b.map(function(e){return"HTML"+e+"Element"}).concat(u):e.EventTarget||(p=u);for(var d=e.__Zone_disable_IE_check||!1,g=e.__Zone_enable_cross_context_check||!1,v=t.isIEOrEdge(),y="function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }",E=0;E 1 ? new WS(x, y) : new WS(x);
- var proxySocket;
- var proxySocketProto;
- // Safari 7.0 has non-configurable own 'onmessage' and friends properties on the socket instance
- var onmessageDesc = ObjectGetOwnPropertyDescriptor(socket, 'onmessage');
- if (onmessageDesc && onmessageDesc.configurable === false) {
- proxySocket = ObjectCreate(socket);
- // socket have own property descriptor 'onopen', 'onmessage', 'onclose', 'onerror'
- // but proxySocket not, so we will keep socket as prototype and pass it to
- // patchOnProperties method
- proxySocketProto = socket;
- [ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR, 'send', 'close'].forEach(function (propName) {
- proxySocket[propName] = function () {
- var args = ArraySlice.call(arguments);
- if (propName === ADD_EVENT_LISTENER_STR || propName === REMOVE_EVENT_LISTENER_STR) {
- var eventName = args.length > 0 ? args[0] : undefined;
- if (eventName) {
- var propertySymbol = Zone.__symbol__('ON_PROPERTY' + eventName);
- socket[propertySymbol] = proxySocket[propertySymbol];
- }
- }
- return socket[propName].apply(socket, args);
- };
- });
- }
- else {
- // we can patch the real socket
- proxySocket = socket;
- }
- patchOnProperties(proxySocket, ['close', 'error', 'message', 'open'], proxySocketProto);
- return proxySocket;
- };
- var globalWebSocket = _global['WebSocket'];
- for (var prop in WS) {
- globalWebSocket[prop] = WS[prop];
+function eventTargetPatch(_global, api) {
+ var _a = api.getGlobalObjects(), eventNames = _a.eventNames, zoneSymbolEventNames = _a.zoneSymbolEventNames, TRUE_STR = _a.TRUE_STR, FALSE_STR = _a.FALSE_STR, ZONE_SYMBOL_PREFIX = _a.ZONE_SYMBOL_PREFIX;
+ // predefine all __zone_symbol__ + eventName + true/false string
+ for (var i = 0; i < eventNames.length; i++) {
+ var eventName = eventNames[i];
+ var falseEventName = eventName + FALSE_STR;
+ var trueEventName = eventName + TRUE_STR;
+ var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
+ var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
+ zoneSymbolEventNames[eventName] = {};
+ zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
}
+ var EVENT_TARGET = _global['EventTarget'];
+ if (!EVENT_TARGET || !EVENT_TARGET.prototype) {
+ return;
+ }
+ api.patchEventTarget(_global, [EVENT_TARGET && EVENT_TARGET.prototype]);
+ return true;
+}
+function patchEvent(global, api) {
+ api.patchEventPrototype(global, api);
}
/**
@@ -2717,297 +2724,55 @@ function propertyDescriptorPatch(api, _global) {
if (isNode && !isMix) {
return;
}
- var supportsWebSocket = typeof WebSocket !== 'undefined';
- if (canPatchViaPropertyDescriptor()) {
- var ignoreProperties = _global['__Zone_ignore_on_properties'];
- // for browsers that we can patch the descriptor: Chrome & Firefox
- if (isBrowser) {
- var internalWindow = window;
- var ignoreErrorProperties = isIE ? [{ target: internalWindow, ignoreProperties: ['error'] }] : [];
- // in IE/Edge, onProp not exist in window object, but in WindowPrototype
- // so we need to pass WindowPrototype to check onProp exist or not
- patchFilteredProperties(internalWindow, eventNames.concat(['messageerror']), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow));
- patchFilteredProperties(Document.prototype, eventNames, ignoreProperties);
- if (typeof internalWindow['SVGElement'] !== 'undefined') {
- patchFilteredProperties(internalWindow['SVGElement'].prototype, eventNames, ignoreProperties);
- }
- patchFilteredProperties(Element.prototype, eventNames, ignoreProperties);
- patchFilteredProperties(HTMLElement.prototype, eventNames, ignoreProperties);
- patchFilteredProperties(HTMLMediaElement.prototype, mediaElementEventNames, ignoreProperties);
- patchFilteredProperties(HTMLFrameSetElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
- patchFilteredProperties(HTMLBodyElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
- patchFilteredProperties(HTMLFrameElement.prototype, frameEventNames, ignoreProperties);
- patchFilteredProperties(HTMLIFrameElement.prototype, frameEventNames, ignoreProperties);
- var HTMLMarqueeElement_1 = internalWindow['HTMLMarqueeElement'];
- if (HTMLMarqueeElement_1) {
- patchFilteredProperties(HTMLMarqueeElement_1.prototype, marqueeEventNames, ignoreProperties);
- }
- var Worker_1 = internalWindow['Worker'];
- if (Worker_1) {
- patchFilteredProperties(Worker_1.prototype, workerEventNames, ignoreProperties);
- }
- }
- patchFilteredProperties(XMLHttpRequest.prototype, XMLHttpRequestEventNames, ignoreProperties);
- var XMLHttpRequestEventTarget_1 = _global['XMLHttpRequestEventTarget'];
- if (XMLHttpRequestEventTarget_1) {
- patchFilteredProperties(XMLHttpRequestEventTarget_1 && XMLHttpRequestEventTarget_1.prototype, XMLHttpRequestEventNames, ignoreProperties);
- }
- if (typeof IDBIndex !== 'undefined') {
- patchFilteredProperties(IDBIndex.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBOpenDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBDatabase.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBTransaction.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBCursor.prototype, IDBIndexEventNames, ignoreProperties);
- }
- if (supportsWebSocket) {
- patchFilteredProperties(WebSocket.prototype, websocketEventNames, ignoreProperties);
- }
- }
- else {
- // Safari, Android browsers (Jelly Bean)
- patchViaCapturingAllTheEvents();
- patchClass('XMLHttpRequest');
- if (supportsWebSocket) {
- apply(api, _global);
- }
- }
-}
-function canPatchViaPropertyDescriptor() {
- if ((isBrowser || isMix) && !ObjectGetOwnPropertyDescriptor(HTMLElement.prototype, 'onclick') &&
- typeof Element !== 'undefined') {
- // WebKit https://bugs.webkit.org/show_bug.cgi?id=134364
- // IDL interface attributes are not configurable
- var desc = ObjectGetOwnPropertyDescriptor(Element.prototype, 'onclick');
- if (desc && !desc.configurable)
- return false;
- }
- var ON_READY_STATE_CHANGE = 'onreadystatechange';
- var XMLHttpRequestPrototype = XMLHttpRequest.prototype;
- var xhrDesc = ObjectGetOwnPropertyDescriptor(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE);
- // add enumerable and configurable here because in opera
- // by default XMLHttpRequest.prototype.onreadystatechange is undefined
- // without adding enumerable and configurable will cause onreadystatechange
- // non-configurable
- // and if XMLHttpRequest.prototype.onreadystatechange is undefined,
- // we should set a real desc instead a fake one
- if (xhrDesc) {
- ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
- enumerable: true,
- configurable: true,
- get: function () {
- return true;
- }
- });
- var req = new XMLHttpRequest();
- var result = !!req.onreadystatechange;
- // restore original desc
- ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, xhrDesc || {});
- return result;
- }
- else {
- var SYMBOL_FAKE_ONREADYSTATECHANGE_1 = zoneSymbol('fake');
- ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
- enumerable: true,
- configurable: true,
- get: function () {
- return this[SYMBOL_FAKE_ONREADYSTATECHANGE_1];
- },
- set: function (value) {
- this[SYMBOL_FAKE_ONREADYSTATECHANGE_1] = value;
- }
- });
- var req = new XMLHttpRequest();
- var detectFunc = function () { };
- req.onreadystatechange = detectFunc;
- var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
- req.onreadystatechange = null;
- return result;
- }
-}
-var unboundKey = zoneSymbol('unbound');
-// Whenever any eventListener fires, we check the eventListener target and all parents
-// for `onwhatever` properties and replace them with zone-bound functions
-// - Chrome (for now)
-function patchViaCapturingAllTheEvents() {
- var _loop_1 = function (i) {
- var property = eventNames[i];
- var onproperty = 'on' + property;
- self.addEventListener(property, function (event) {
- var elt = event.target, bound, source;
- if (elt) {
- source = elt.constructor['name'] + '.' + onproperty;
- }
- else {
- source = 'unknown.' + onproperty;
- }
- while (elt) {
- if (elt[onproperty] && !elt[onproperty][unboundKey]) {
- bound = wrapWithCurrentZone(elt[onproperty], source);
- bound[unboundKey] = elt[onproperty];
- elt[onproperty] = bound;
- }
- elt = elt.parentElement;
- }
- }, true);
- };
- for (var i = 0; i < eventNames.length; i++) {
- _loop_1(i);
- }
-}
-
-/**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
-function eventTargetPatch(_global, api) {
- var WTF_ISSUE_555 = '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';
- var NO_EVENT_TARGET = '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(',');
- var EVENT_TARGET = 'EventTarget';
- var apis = [];
- var isWtf = _global['wtf'];
- var WTF_ISSUE_555_ARRAY = WTF_ISSUE_555.split(',');
- if (isWtf) {
- // Workaround for: https://github.com/google/tracing-framework/issues/555
- apis = WTF_ISSUE_555_ARRAY.map(function (v) { return 'HTML' + v + 'Element'; }).concat(NO_EVENT_TARGET);
- }
- else if (_global[EVENT_TARGET]) {
- apis.push(EVENT_TARGET);
- }
- else {
- // Note: EventTarget is not available in all browsers,
- // if it's not available, we instead patch the APIs in the IDL that inherit from EventTarget
- apis = NO_EVENT_TARGET;
- }
- var isDisableIECheck = _global['__Zone_disable_IE_check'] || false;
- var isEnableCrossContextCheck = _global['__Zone_enable_cross_context_check'] || false;
- var ieOrEdge = isIEOrEdge();
- var ADD_EVENT_LISTENER_SOURCE = '.addEventListener:';
- var FUNCTION_WRAPPER = '[object FunctionWrapper]';
- var BROWSER_TOOLS = 'function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }';
- // predefine all __zone_symbol__ + eventName + true/false string
- for (var i = 0; i < eventNames.length; i++) {
- var eventName = eventNames[i];
- var falseEventName = eventName + FALSE_STR;
- var trueEventName = eventName + TRUE_STR;
- var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
- var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
- zoneSymbolEventNames$1[eventName] = {};
- zoneSymbolEventNames$1[eventName][FALSE_STR] = symbol;
- zoneSymbolEventNames$1[eventName][TRUE_STR] = symbolCapture;
- }
- // predefine all task.source string
- for (var i = 0; i < WTF_ISSUE_555.length; i++) {
- var target = WTF_ISSUE_555_ARRAY[i];
- var targets = globalSources[target] = {};
- for (var j = 0; j < eventNames.length; j++) {
- var eventName = eventNames[j];
- targets[eventName] = target + ADD_EVENT_LISTENER_SOURCE + eventName;
- }
- }
- var checkIEAndCrossContext = function (nativeDelegate, delegate, target, args) {
- if (!isDisableIECheck && ieOrEdge) {
- if (isEnableCrossContextCheck) {
- try {
- var testString = delegate.toString();
- if ((testString === FUNCTION_WRAPPER || testString == BROWSER_TOOLS)) {
- nativeDelegate.apply(target, args);
- return false;
- }
- }
- catch (error) {
- nativeDelegate.apply(target, args);
- return false;
- }
- }
- else {
- var testString = delegate.toString();
- if ((testString === FUNCTION_WRAPPER || testString == BROWSER_TOOLS)) {
- nativeDelegate.apply(target, args);
- return false;
- }
- }
- }
- else if (isEnableCrossContextCheck) {
- try {
- delegate.toString();
- }
- catch (error) {
- nativeDelegate.apply(target, args);
- return false;
- }
- }
- return true;
- };
- var apiTypes = [];
- for (var i = 0; i < apis.length; i++) {
- var type = _global[apis[i]];
- apiTypes.push(type && type.prototype);
- }
- // vh is validateHandler to check event handler
- // is valid or not(for security check)
- patchEventTarget(_global, apiTypes, { vh: checkIEAndCrossContext });
- api.patchEventTarget = patchEventTarget;
- return true;
-}
-function patchEvent(global, api) {
- patchEventPrototype(global, api);
-}
-
-/**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
-function patchCallbacks(target, targetName, method, callbacks) {
- var symbol = Zone.__symbol__(method);
- if (target[symbol]) {
- return;
- }
- var nativeDelegate = target[symbol] = target[method];
- target[method] = function (name, opts, options) {
- if (opts && opts.prototype) {
- callbacks.forEach(function (callback) {
- var source = targetName + "." + method + "::" + callback;
- var prototype = opts.prototype;
- if (prototype.hasOwnProperty(callback)) {
- var descriptor = ObjectGetOwnPropertyDescriptor(prototype, callback);
- if (descriptor && descriptor.value) {
- descriptor.value = wrapWithCurrentZone(descriptor.value, source);
- _redefineProperty(opts.prototype, callback, descriptor);
- }
- else if (prototype[callback]) {
- prototype[callback] = wrapWithCurrentZone(prototype[callback], source);
- }
- }
- else if (prototype[callback]) {
- prototype[callback] = wrapWithCurrentZone(prototype[callback], source);
- }
- });
- }
- return nativeDelegate.call(target, name, opts, options);
- };
- attachOriginToPatched(target[method], nativeDelegate);
-}
-function registerElementPatch(_global) {
- if ((!isBrowser && !isMix) || !('registerElement' in _global.document)) {
+ if (Zone[api.symbol('patchEvents')]) {
+ // events are already been patched by legacy patch.
return;
}
- var callbacks = ['createdCallback', 'attachedCallback', 'detachedCallback', 'attributeChangedCallback'];
- patchCallbacks(document, 'Document', 'registerElement', callbacks);
-}
-function patchCustomElements(_global) {
- if ((!isBrowser && !isMix) || !('customElements' in _global)) {
- return;
+ var supportsWebSocket = typeof WebSocket !== 'undefined';
+ var ignoreProperties = _global['__Zone_ignore_on_properties'];
+ // for browsers that we can patch the descriptor: Chrome & Firefox
+ if (isBrowser) {
+ var internalWindow = window;
+ var ignoreErrorProperties = isIE ? [{ target: internalWindow, ignoreProperties: ['error'] }] : [];
+ // in IE/Edge, onProp not exist in window object, but in WindowPrototype
+ // so we need to pass WindowPrototype to check onProp exist or not
+ patchFilteredProperties(internalWindow, eventNames.concat(['messageerror']), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow));
+ patchFilteredProperties(Document.prototype, eventNames, ignoreProperties);
+ if (typeof internalWindow['SVGElement'] !== 'undefined') {
+ patchFilteredProperties(internalWindow['SVGElement'].prototype, eventNames, ignoreProperties);
+ }
+ patchFilteredProperties(Element.prototype, eventNames, ignoreProperties);
+ patchFilteredProperties(HTMLElement.prototype, eventNames, ignoreProperties);
+ patchFilteredProperties(HTMLMediaElement.prototype, mediaElementEventNames, ignoreProperties);
+ patchFilteredProperties(HTMLFrameSetElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
+ patchFilteredProperties(HTMLBodyElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
+ patchFilteredProperties(HTMLFrameElement.prototype, frameEventNames, ignoreProperties);
+ patchFilteredProperties(HTMLIFrameElement.prototype, frameEventNames, ignoreProperties);
+ var HTMLMarqueeElement_1 = internalWindow['HTMLMarqueeElement'];
+ if (HTMLMarqueeElement_1) {
+ patchFilteredProperties(HTMLMarqueeElement_1.prototype, marqueeEventNames, ignoreProperties);
+ }
+ var Worker_1 = internalWindow['Worker'];
+ if (Worker_1) {
+ patchFilteredProperties(Worker_1.prototype, workerEventNames, ignoreProperties);
+ }
+ }
+ patchFilteredProperties(XMLHttpRequest.prototype, XMLHttpRequestEventNames, ignoreProperties);
+ var XMLHttpRequestEventTarget = _global['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget) {
+ patchFilteredProperties(XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype, XMLHttpRequestEventNames, ignoreProperties);
+ }
+ if (typeof IDBIndex !== 'undefined') {
+ patchFilteredProperties(IDBIndex.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBOpenDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBDatabase.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBTransaction.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBCursor.prototype, IDBIndexEventNames, ignoreProperties);
+ }
+ if (supportsWebSocket) {
+ patchFilteredProperties(WebSocket.prototype, websocketEventNames, ignoreProperties);
}
- var callbacks = ['connectedCallback', 'disconnectedCallback', 'adoptedCallback', 'attributeChangedCallback'];
- patchCallbacks(_global.customElements, 'customElements', 'define', callbacks);
}
/**
@@ -3021,10 +2786,11 @@ function patchCustomElements(_global) {
* @fileoverview
* @suppress {missingRequire}
*/
-Zone.__load_patch('util', function (global, Zone, api) {
- api.patchOnProperties = patchOnProperties;
- api.patchMethod = patchMethod;
- api.bindArguments = bindArguments;
+Zone.__load_patch('legacy', function (global) {
+ var legacyPatch = global[Zone.__symbol__('legacyPatch')];
+ if (legacyPatch) {
+ legacyPatch();
+ }
});
Zone.__load_patch('timers', function (global) {
var set = 'set';
@@ -3050,11 +2816,6 @@ Zone.__load_patch('blocking', function (global, Zone) {
}
});
Zone.__load_patch('EventTarget', function (global, Zone, api) {
- // load blackListEvents from global
- var SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');
- if (global[SYMBOL_BLACK_LISTED_EVENTS]) {
- Zone[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_BLACK_LISTED_EVENTS];
- }
patchEvent(global, api);
eventTargetPatch(global, api);
// patch XMLHttpRequestEventTarget's addEventListener/removeEventListener
@@ -3072,17 +2833,7 @@ Zone.__load_patch('on_property', function (global, Zone, api) {
propertyPatch();
});
Zone.__load_patch('customElements', function (global, Zone, api) {
- registerElementPatch(global);
- patchCustomElements(global);
-});
-Zone.__load_patch('canvas', function (global) {
- var HTMLCanvasElement = global['HTMLCanvasElement'];
- if (typeof HTMLCanvasElement !== 'undefined' && HTMLCanvasElement.prototype &&
- HTMLCanvasElement.prototype.toBlob) {
- patchMacroTask(HTMLCanvasElement.prototype, 'toBlob', function (self, args) {
- return { name: 'HTMLCanvasElement.toBlob', target: self, cbIdx: 0, args: args };
- });
- }
+ patchCustomElements(global, api);
});
Zone.__load_patch('XHR', function (global, Zone) {
// Treat XMLHttpRequest as a macrotask.
@@ -3271,6 +3022,7 @@ Zone.__load_patch('node_util', function (global, Zone, api) {
api.patchOnProperties = patchOnProperties;
api.patchMethod = patchMethod;
api.bindArguments = bindArguments;
+ api.patchMacroTask = patchMacroTask;
setShouldCopySymbolProperties(true);
});
diff --git a/dist/zone-node.js b/dist/zone-node.js
index 8bbe1e846..9f90c8cd6 100644
--- a/dist/zone-node.js
+++ b/dist/zone-node.js
@@ -630,6 +630,7 @@ var Zone$1 = (function (global) {
patchMethod: function () { return noop; },
bindArguments: function () { return []; },
patchThen: function () { return noop; },
+ patchMacroTask: function () { return noop; },
setNativePromise: function (NativePromise) {
// sometimes NativePromise.resolve static function
// is not ready yet, (such as core-js/es6.promise)
@@ -638,6 +639,19 @@ var Zone$1 = (function (global) {
nativeMicroTaskQueuePromise = NativePromise.resolve(0);
}
},
+ patchEventPrototype: function () { return noop; },
+ isIEOrEdge: function () { return false; },
+ getGlobalObjects: function () { return undefined; },
+ ObjectDefineProperty: function () { return noop; },
+ ObjectGetOwnPropertyDescriptor: function () { return undefined; },
+ ObjectCreate: function () { return undefined; },
+ ArraySlice: function () { return []; },
+ patchClass: function () { return noop; },
+ wrapWithCurrentZone: function () { return noop; },
+ filterProperties: function () { return []; },
+ attachOriginToPatched: function () { return noop; },
+ _redefineProperty: function () { return noop; },
+ patchCallbacks: function () { return noop; }
};
var _currentZoneFrame = { parent: null, zone: new Zone(null, null) };
var _currentTask = null;
@@ -660,6 +674,13 @@ var __values = (undefined && undefined.__values) || function (o) {
}
};
};
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
var ObjectDefineProperty = Object.defineProperty;
@@ -931,10 +952,10 @@ Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
reject = rej;
});
function onResolve(value) {
- promise && (promise = null || resolve(value));
+ resolve(value);
}
function onReject(error) {
- promise && (promise = null || reject(error));
+ reject(error);
}
try {
for (var values_1 = __values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) {
@@ -1002,6 +1023,13 @@ Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
}
return promise;
};
+ Object.defineProperty(ZoneAwarePromise.prototype, Symbol.toStringTag, {
+ get: function () {
+ return 'Promise';
+ },
+ enumerable: true,
+ configurable: true
+ });
ZoneAwarePromise.prototype.then = function (onFulfilled, onRejected) {
var chainPromise = new this.constructor(null);
var zone = Zone.current;
@@ -1096,8 +1124,26 @@ Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
Ctor[symbolThenPatched] = true;
}
api.patchThen = patchThen;
+ function zoneify(fn) {
+ return function () {
+ var resultPromise = fn.apply(this, arguments);
+ if (resultPromise instanceof ZoneAwarePromise) {
+ return resultPromise;
+ }
+ var ctor = resultPromise.constructor;
+ if (!ctor[symbolThenPatched]) {
+ patchThen(ctor);
+ }
+ return resultPromise;
+ };
+ }
if (NativePromise) {
patchThen(NativePromise);
+ var fetch_1 = global['fetch'];
+ if (typeof fetch_1 == 'function') {
+ global[api.symbol('fetch')] = fetch_1;
+ global['fetch'] = zoneify(fetch_1);
+ }
}
// This is not part of public API, but it is useful for tests, so we expose it.
Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors;
@@ -1458,7 +1504,7 @@ Zone.__load_patch('toString', function (global) {
var originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
if (originalDelegate) {
if (typeof originalDelegate === 'function') {
- return originalFunctionToString.apply(this[ORIGINAL_DELEGATE_SYMBOL], arguments);
+ return originalFunctionToString.call(originalDelegate);
}
else {
return Object.prototype.toString.call(originalDelegate);
@@ -1467,17 +1513,17 @@ Zone.__load_patch('toString', function (global) {
if (this === Promise) {
var nativePromise = global[PROMISE_SYMBOL];
if (nativePromise) {
- return originalFunctionToString.apply(nativePromise, arguments);
+ return originalFunctionToString.call(nativePromise);
}
}
if (this === Error) {
var nativeError = global[ERROR_SYMBOL];
if (nativeError) {
- return originalFunctionToString.apply(nativeError, arguments);
+ return originalFunctionToString.call(nativeError);
}
}
}
- return originalFunctionToString.apply(this, arguments);
+ return originalFunctionToString.call(this);
};
newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
Function.prototype.toString = newFunctionToString;
@@ -1488,7 +1534,7 @@ Zone.__load_patch('toString', function (global) {
if (this instanceof Promise) {
return PROMISE_OBJECT_TO_STRING;
}
- return originalObjectToString.apply(this, arguments);
+ return originalObjectToString.call(this);
};
});
@@ -1503,6 +1549,7 @@ Zone.__load_patch('node_util', function (global, Zone, api) {
api.patchOnProperties = patchOnProperties;
api.patchMethod = patchMethod;
api.bindArguments = bindArguments;
+ api.patchMacroTask = patchMacroTask;
setShouldCopySymbolProperties(true);
});
diff --git a/dist/zone-patch-canvas.js b/dist/zone-patch-canvas.js
new file mode 100644
index 000000000..593f4cc26
--- /dev/null
+++ b/dist/zone-patch-canvas.js
@@ -0,0 +1,31 @@
+/**
+* @license
+* Copyright Google Inc. All Rights Reserved.
+*
+* Use of this source code is governed by an MIT-style license that can be
+* found in the LICENSE file at https://angular.io/license
+*/
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (factory());
+}(this, (function () { 'use strict';
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+Zone.__load_patch('canvas', function (global, Zone, api) {
+ var HTMLCanvasElement = global['HTMLCanvasElement'];
+ if (typeof HTMLCanvasElement !== 'undefined' && HTMLCanvasElement.prototype &&
+ HTMLCanvasElement.prototype.toBlob) {
+ api.patchMacroTask(HTMLCanvasElement.prototype, 'toBlob', function (self, args) {
+ return { name: 'HTMLCanvasElement.toBlob', target: self, cbIdx: 0, args: args };
+ });
+ }
+});
+
+})));
diff --git a/dist/zone-patch-canvas.min.js b/dist/zone-patch-canvas.min.js
new file mode 100644
index 000000000..94168d1d4
--- /dev/null
+++ b/dist/zone-patch-canvas.min.js
@@ -0,0 +1 @@
+!function(t,o){"object"==typeof exports&&"undefined"!=typeof module?o():"function"==typeof define&&define.amd?define(o):o()}(0,function(){"use strict";Zone.__load_patch("canvas",function(t,o,e){var n=t.HTMLCanvasElement;void 0!==n&&n.prototype&&n.prototype.toBlob&&e.patchMacroTask(n.prototype,"toBlob",function(t,o){return{name:"HTMLCanvasElement.toBlob",target:t,cbIdx:0,args:o}})})});
\ No newline at end of file
diff --git a/dist/zone-patch-cordova.min.js b/dist/zone-patch-cordova.min.js
index b30c6e97e..6f6dad108 100644
--- a/dist/zone-patch-cordova.min.js
+++ b/dist/zone-patch-cordova.min.js
@@ -1 +1 @@
-!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o():"function"==typeof define&&define.amd?define(o):o()}(this,function(){"use strict";Zone.__load_patch("cordova",function(e,o,r){if(e.cordova)var t="cordova.exec.success",n="cordova.exec.error",a="function",c=r.patchMethod(e.cordova,"exec",function(){return function(e,r){return r.length>0&&typeof r[0]===a&&(r[0]=o.current.wrap(r[0],t)),r.length>1&&typeof r[1]===a&&(r[1]=o.current.wrap(r[1],n)),c.apply(e,r)}})}),Zone.__load_patch("cordova.FileReader",function(e,o){e.cordova&&"undefined"!=typeof e.FileReader&&document.addEventListener("deviceReady",function(){var r=e.FileReader;["abort","error","load","loadstart","loadend","progress"].forEach(function(e){var t=o.__symbol__("ON_PROPERTY"+e);Object.defineProperty(r.prototype,t,{configurable:!0,get:function(){return this._realReader&&this._realReader[t]}})})})})});
\ No newline at end of file
+!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o():"function"==typeof define&&define.amd?define(o):o()}(0,function(){"use strict";Zone.__load_patch("cordova",function(e,o,r){if(e.cordova)var t=r.patchMethod(e.cordova,"exec",function(){return function(e,r){return r.length>0&&"function"==typeof r[0]&&(r[0]=o.current.wrap(r[0],"cordova.exec.success")),r.length>1&&"function"==typeof r[1]&&(r[1]=o.current.wrap(r[1],"cordova.exec.error")),t.apply(e,r)}})}),Zone.__load_patch("cordova.FileReader",function(e,o){e.cordova&&void 0!==e.FileReader&&document.addEventListener("deviceReady",function(){var r=e.FileReader;["abort","error","load","loadstart","loadend","progress"].forEach(function(e){var t=o.__symbol__("ON_PROPERTY"+e);Object.defineProperty(r.prototype,t,{configurable:!0,get:function(){return this._realReader&&this._realReader[t]}})})})})});
\ No newline at end of file
diff --git a/dist/zone-patch-electron.min.js b/dist/zone-patch-electron.min.js
index 0c049edac..e23b6d97e 100644
--- a/dist/zone-patch-electron.min.js
+++ b/dist/zone-patch-electron.min.js
@@ -1 +1 @@
-!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("electron",function(e,t,n){function o(e,t,o){return n.patchMethod(e,t,function(e){return function(t,r){return e&&e.apply(t,n.bindArguments(r,o))}})}var r=require("electron"),c=r.desktopCapturer,u=r.shell,i=r.CallbacksRegistry;c&&o(c,"getSources","electron.desktopCapturer.getSources"),u&&o(u,"openExternal","electron.shell.openExternal"),i&&o(i.prototype,"add","CallbackRegistry.add")})});
\ No newline at end of file
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){"use strict";Zone.__load_patch("electron",function(e,t,n){function o(e,t,o){return n.patchMethod(e,t,function(e){return function(t,r){return e&&e.apply(t,n.bindArguments(r,o))}})}var r=require("electron"),c=r.desktopCapturer,u=r.shell,l=r.CallbacksRegistry;c&&o(c,"getSources","electron.desktopCapturer.getSources"),u&&o(u,"openExternal","electron.shell.openExternal"),l&&o(l.prototype,"add","CallbackRegistry.add")})});
\ No newline at end of file
diff --git a/dist/zone-patch-fetch.js b/dist/zone-patch-fetch.js
new file mode 100644
index 000000000..5fe62a84a
--- /dev/null
+++ b/dist/zone-patch-fetch.js
@@ -0,0 +1,120 @@
+/**
+* @license
+* Copyright Google Inc. All Rights Reserved.
+*
+* Use of this source code is governed by an MIT-style license that can be
+* found in the LICENSE file at https://angular.io/license
+*/
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (factory());
+}(this, (function () { 'use strict';
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {missingRequire}
+ */
+Zone.__load_patch('fetch', function (global, Zone, api) {
+ var fetch = global['fetch'];
+ if (typeof fetch !== 'function') {
+ return;
+ }
+ var originalFetch = global[api.symbol('fetch')];
+ if (originalFetch) {
+ // restore unpatched fetch first
+ fetch = originalFetch;
+ }
+ var ZoneAwarePromise = global.Promise;
+ var symbolThenPatched = api.symbol('thenPatched');
+ var fetchTaskScheduling = api.symbol('fetchTaskScheduling');
+ var fetchTaskAborting = api.symbol('fetchTaskAborting');
+ var OriginalAbortController = global['AbortController'];
+ var supportAbort = typeof OriginalAbortController === 'function';
+ var abortNative = null;
+ if (supportAbort) {
+ global['AbortController'] = function () {
+ var abortController = new OriginalAbortController();
+ var signal = abortController.signal;
+ signal.abortController = abortController;
+ return abortController;
+ };
+ abortNative = api.patchMethod(OriginalAbortController.prototype, 'abort', function (delegate) { return function (self, args) {
+ if (self.task) {
+ return self.task.zone.cancelTask(self.task);
+ }
+ return delegate.apply(self, args);
+ }; });
+ }
+ var placeholder = function () { };
+ global['fetch'] = function () {
+ var _this = this;
+ var args = Array.prototype.slice.call(arguments);
+ var options = args.length > 1 ? args[1] : null;
+ var signal = options && options.signal;
+ return new Promise(function (res, rej) {
+ var task = Zone.current.scheduleMacroTask('fetch', placeholder, { fetchArgs: args }, function () {
+ var fetchPromise;
+ var zone = Zone.current;
+ try {
+ zone[fetchTaskScheduling] = true;
+ fetchPromise = fetch.apply(_this, args);
+ }
+ catch (error) {
+ rej(error);
+ return;
+ }
+ finally {
+ zone[fetchTaskScheduling] = false;
+ }
+ if (!(fetchPromise instanceof ZoneAwarePromise)) {
+ var ctor = fetchPromise.constructor;
+ if (!ctor[symbolThenPatched]) {
+ api.patchThen(ctor);
+ }
+ }
+ fetchPromise.then(function (resource) {
+ if (task.state !== 'notScheduled') {
+ task.invoke();
+ }
+ res(resource);
+ }, function (error) {
+ if (task.state !== 'notScheduled') {
+ task.invoke();
+ }
+ rej(error);
+ });
+ }, function () {
+ if (!supportAbort) {
+ rej('No AbortController supported, can not cancel fetch');
+ return;
+ }
+ if (signal && signal.abortController && !signal.aborted &&
+ typeof signal.abortController.abort === 'function' && abortNative) {
+ try {
+ Zone.current[fetchTaskAborting] = true;
+ abortNative.call(signal.abortController);
+ }
+ finally {
+ Zone.current[fetchTaskAborting] = false;
+ }
+ }
+ else {
+ rej('cancel fetch need a AbortController.signal');
+ }
+ });
+ if (signal && signal.abortController) {
+ signal.abortController.task = task;
+ }
+ });
+ };
+});
+
+})));
diff --git a/dist/zone-patch-fetch.min.js b/dist/zone-patch-fetch.min.js
new file mode 100644
index 000000000..29c5d0db0
--- /dev/null
+++ b/dist/zone-patch-fetch.min.js
@@ -0,0 +1 @@
+!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n():"function"==typeof define&&define.amd?define(n):n()}(0,function(){"use strict";Zone.__load_patch("fetch",function(t,n,o){var e=t.fetch;if("function"==typeof e){var r=t[o.symbol("fetch")];r&&(e=r);var c=t.Promise,l=o.symbol("thenPatched"),a=o.symbol("fetchTaskScheduling"),f=o.symbol("fetchTaskAborting"),i=t.AbortController,u="function"==typeof i,s=null;u&&(t.AbortController=function(){var t=new i;return t.signal.abortController=t,t},s=o.patchMethod(i.prototype,"abort",function(t){return function(n,o){return n.task?n.task.zone.cancelTask(n.task):t.apply(n,o)}}));var h=function(){};t.fetch=function(){var t=this,r=Array.prototype.slice.call(arguments),i=r.length>1?r[1]:null,d=i&&i.signal;return new Promise(function(i,p){var b=n.current.scheduleMacroTask("fetch",h,{fetchArgs:r},function(){var f,u=n.current;try{u[a]=!0,f=e.apply(t,r)}catch(t){return void p(t)}finally{u[a]=!1}if(!(f instanceof c)){var s=f.constructor;s[l]||o.patchThen(s)}f.then(function(t){"notScheduled"!==b.state&&b.invoke(),i(t)},function(t){"notScheduled"!==b.state&&b.invoke(),p(t)})},function(){if(u)if(d&&d.abortController&&!d.aborted&&"function"==typeof d.abortController.abort&&s)try{n.current[f]=!0,s.call(d.abortController)}finally{n.current[f]=!1}else p("cancel fetch need a AbortController.signal");else p("No AbortController supported, can not cancel fetch")});d&&d.abortController&&(d.abortController.task=b)})}}})});
\ No newline at end of file
diff --git a/dist/zone-patch-jsonp.min.js b/dist/zone-patch-jsonp.min.js
index 6d8881776..854d97b9b 100644
--- a/dist/zone-patch-jsonp.min.js
+++ b/dist/zone-patch-jsonp.min.js
@@ -1 +1 @@
-!function(n,o){"object"==typeof exports&&"undefined"!=typeof module?o():"function"==typeof define&&define.amd?define(o):o()}(this,function(){"use strict";Zone.__load_patch("jsonp",function(n,o,e){o[o.__symbol__("jsonp")]=function(t){if(t&&t.jsonp&&t.sendFuncName){var c=function(){};[t.successFuncName,t.failedFuncName].forEach(function(o){if(o){var t=n[o];t?e.patchMethod(n,o,function(o){return function(t,c){var s=n[e.symbol("jsonTask")];return s?(s.callback=o,s.invoke.apply(t,c)):o.apply(t,c)}}):Object.defineProperty(n,o,{configurable:!0,enumerable:!0,get:function(){return function(){var t=n[e.symbol("jsonpTask")],c=n[e.symbol("jsonp"+o+"callback")];return t?(c&&(t.callback=c),n[e.symbol("jsonpTask")]=void 0,t.invoke.apply(this,arguments)):c?c.apply(this,arguments):null}},set:function(n){this[e.symbol("jsonp"+o+"callback")]=n}})}}),e.patchMethod(t.jsonp,t.sendFuncName,function(t){return function(s,a){n[e.symbol("jsonpTask")]=o.current.scheduleMacroTask("jsonp",c,{},function(n){return t.apply(s,a)},c)}})}}})});
\ No newline at end of file
+!function(n,o){"object"==typeof exports&&"undefined"!=typeof module?o():"function"==typeof define&&define.amd?define(o):o()}(0,function(){"use strict";Zone.__load_patch("jsonp",function(n,o,e){o[o.__symbol__("jsonp")]=function(t){if(t&&t.jsonp&&t.sendFuncName){var c=function(){};[t.successFuncName,t.failedFuncName].forEach(function(o){o&&(n[o]?e.patchMethod(n,o,function(o){return function(t,c){var s=n[e.symbol("jsonTask")];return s?(s.callback=o,s.invoke.apply(t,c)):o.apply(t,c)}}):Object.defineProperty(n,o,{configurable:!0,enumerable:!0,get:function(){return function(){var t=n[e.symbol("jsonpTask")],c=n[e.symbol("jsonp"+o+"callback")];return t?(c&&(t.callback=c),n[e.symbol("jsonpTask")]=void 0,t.invoke.apply(this,arguments)):c?c.apply(this,arguments):null}},set:function(n){this[e.symbol("jsonp"+o+"callback")]=n}}))}),e.patchMethod(t.jsonp,t.sendFuncName,function(t){return function(s,a){n[e.symbol("jsonpTask")]=o.current.scheduleMacroTask("jsonp",c,{},function(n){return t.apply(s,a)},c)}})}}})});
\ No newline at end of file
diff --git a/dist/zone-patch-promise-test.min.js b/dist/zone-patch-promise-test.min.js
index 55ac90a8c..276e491e8 100644
--- a/dist/zone-patch-promise-test.min.js
+++ b/dist/zone-patch-promise-test.min.js
@@ -1 +1 @@
-!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o():"function"==typeof define&&define.amd?define(o):o()}(this,function(){"use strict";Zone.__load_patch("promisefortest",function(e,o,n){var t=n.symbol("state"),s=null,r=n.symbol("parentUnresolved");Promise[n.symbol("patchPromiseForTest")]=function(){var e=Promise[o.__symbol__("ZonePromiseThen")];e||(e=Promise[o.__symbol__("ZonePromiseThen")]=Promise.prototype.then,Promise.prototype.then=function(){var n=e.apply(this,arguments);if(this[t]===s){var i=o.current.get("AsyncTestZoneSpec");i&&(i.unresolvedChainedPromiseCount++,n[r]=!0)}return n})},Promise[n.symbol("unPatchPromiseForTest")]=function(){var e=Promise[o.__symbol__("ZonePromiseThen")];e&&(Promise.prototype.then=e,Promise[o.__symbol__("ZonePromiseThen")]=void 0)}})});
\ No newline at end of file
+!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o():"function"==typeof define&&define.amd?define(o):o()}(0,function(){"use strict";Zone.__load_patch("promisefortest",function(e,o,n){var t=n.symbol("state"),s=n.symbol("parentUnresolved");Promise[n.symbol("patchPromiseForTest")]=function(){var e=Promise[o.__symbol__("ZonePromiseThen")];e||(e=Promise[o.__symbol__("ZonePromiseThen")]=Promise.prototype.then,Promise.prototype.then=function(){var n=e.apply(this,arguments);if(null===this[t]){var r=o.current.get("AsyncTestZoneSpec");r&&(r.unresolvedChainedPromiseCount++,n[s]=!0)}return n})},Promise[n.symbol("unPatchPromiseForTest")]=function(){var e=Promise[o.__symbol__("ZonePromiseThen")];e&&(Promise.prototype.then=e,Promise[o.__symbol__("ZonePromiseThen")]=void 0)}})});
\ No newline at end of file
diff --git a/dist/zone-patch-resize-observer.min.js b/dist/zone-patch-resize-observer.min.js
index 4762c8bc7..b118bc8d4 100644
--- a/dist/zone-patch-resize-observer.min.js
+++ b/dist/zone-patch-resize-observer.min.js
@@ -1 +1 @@
-!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n():"function"==typeof define&&define.amd?define(n):n()}(this,function(){"use strict";var e=function(e){var n="function"==typeof Symbol&&e[Symbol.iterator],r=0;return n?n.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Zone.__load_patch("ResizeObserver",function(n,r,t){var o=n.ResizeObserver;if(o){var i=t.symbol("ResizeObserver");t.patchMethod(n,"ResizeObserver",function(n){return function(n,t){var u=t.length>0?t[0]:null;return u&&(t[0]=function(n,t){var o,a,c=this,f={},l=r.current;try{for(var p=e(n),v=p.next();!v.done;v=p.next()){var s=v.value,h=s.target[i];h||(h=l);var d=f[h.name];d||(f[h.name]=d={entries:[],zone:h}),d.entries.push(s)}}catch(y){o={error:y}}finally{try{v&&!v.done&&(a=p["return"])&&a.call(p)}finally{if(o)throw o.error}}Object.keys(f).forEach(function(e){var n=f[e];n.zone!==r.current?n.zone.run(u,c,[n.entries,t],"ResizeObserver"):u.call(c,n.entries,t)})}),t.length>0?new o(t[0]):new o}}),t.patchMethod(o.prototype,"observe",function(e){return function(n,t){var o=t.length>0?t[0]:null;if(!o)return e.apply(n,t);var u=n[i];return u||(u=n[i]=[]),u.push(o),o[i]=r.current,e.apply(n,t)}}),t.patchMethod(o.prototype,"unobserve",function(e){return function(n,r){var t=r.length>0?r[0]:null;if(!t)return e.apply(n,r);var o=n[i];if(o)for(var u=0;u=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Zone.__load_patch("ResizeObserver",function(n,r,t){var o=n.ResizeObserver;if(o){var i=t.symbol("ResizeObserver");t.patchMethod(n,"ResizeObserver",function(n){return function(n,t){var u=t.length>0?t[0]:null;return u&&(t[0]=function(n,t){var o,a,c=this,f={},l=r.current;try{for(var p=e(n),v=p.next();!v.done;v=p.next()){var s=v.value,h=s.target[i];h||(h=l);var d=f[h.name];d||(f[h.name]=d={entries:[],zone:h}),d.entries.push(s)}}catch(e){o={error:e}}finally{try{v&&!v.done&&(a=p.return)&&a.call(p)}finally{if(o)throw o.error}}Object.keys(f).forEach(function(e){var n=f[e];n.zone!==r.current?n.zone.run(u,c,[n.entries,t],"ResizeObserver"):u.call(c,n.entries,t)})}),t.length>0?new o(t[0]):new o}}),t.patchMethod(o.prototype,"observe",function(e){return function(n,t){var o=t.length>0?t[0]:null;if(!o)return e.apply(n,t);var u=n[i];return u||(u=n[i]=[]),u.push(o),o[i]=r.current,e.apply(n,t)}}),t.patchMethod(o.prototype,"unobserve",function(e){return function(n,r){var t=r.length>0?r[0]:null;if(!t)return e.apply(n,r);var o=n[i];if(o)for(var u=0;u 1 ? args[1] : null;
- var signal = options && options.signal;
- return new Promise(function (res, rej) {
- var task = Zone.current.scheduleMacroTask('fetch', placeholder, args, function () {
- var fetchPromise;
- var zone = Zone.current;
- try {
- zone[fetchTaskScheduling] = true;
- fetchPromise = fetch.apply(_this, args);
- }
- catch (error) {
- rej(error);
- return;
- }
- finally {
- zone[fetchTaskScheduling] = false;
- }
- if (!(fetchPromise instanceof ZoneAwarePromise)) {
- var ctor = fetchPromise.constructor;
- if (!ctor[symbolThenPatched]) {
- api.patchThen(ctor);
- }
- }
- fetchPromise.then(function (resource) {
- if (task.state !== 'notScheduled') {
- task.invoke();
- }
- res(resource);
- }, function (error) {
- if (task.state !== 'notScheduled') {
- task.invoke();
- }
- rej(error);
- });
- }, function () {
- if (!supportAbort) {
- rej('No AbortController supported, can not cancel fetch');
- return;
- }
- if (signal && signal.abortController && !signal.aborted &&
- typeof signal.abortController.abort === 'function' && abortNative) {
- try {
- Zone.current[fetchTaskAborting] = true;
- abortNative.call(signal.abortController);
- }
- finally {
- Zone.current[fetchTaskAborting] = false;
- }
- }
- else {
- rej('cancel fetch need a AbortController.signal');
- }
- });
- if (signal && signal.abortController) {
- signal.abortController.task = task;
- }
- });
- };
-});
-
/**
* @license
* Copyright Google Inc. All Rights Reserved.
@@ -1625,10 +1574,10 @@ function isIEOrEdge() {
if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1 || ua.indexOf('Edge/') !== -1) {
ieOrEdge = true;
}
- return ieOrEdge;
}
catch (error) {
}
+ return ieOrEdge;
}
/**
@@ -1651,7 +1600,7 @@ Zone.__load_patch('toString', function (global) {
var originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
if (originalDelegate) {
if (typeof originalDelegate === 'function') {
- return originalFunctionToString.apply(this[ORIGINAL_DELEGATE_SYMBOL], arguments);
+ return originalFunctionToString.call(originalDelegate);
}
else {
return Object.prototype.toString.call(originalDelegate);
@@ -1660,17 +1609,17 @@ Zone.__load_patch('toString', function (global) {
if (this === Promise) {
var nativePromise = global[PROMISE_SYMBOL];
if (nativePromise) {
- return originalFunctionToString.apply(nativePromise, arguments);
+ return originalFunctionToString.call(nativePromise);
}
}
if (this === Error) {
var nativeError = global[ERROR_SYMBOL];
if (nativeError) {
- return originalFunctionToString.apply(nativeError, arguments);
+ return originalFunctionToString.call(nativeError);
}
}
}
- return originalFunctionToString.apply(this, arguments);
+ return originalFunctionToString.call(this);
};
newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
Function.prototype.toString = newFunctionToString;
@@ -1681,7 +1630,7 @@ Zone.__load_patch('toString', function (global) {
if (this instanceof Promise) {
return PROMISE_OBJECT_TO_STRING;
}
- return originalObjectToString.apply(this, arguments);
+ return originalObjectToString.call(this);
};
});
@@ -2263,124 +2212,35 @@ function patchEventPrototype(global, api) {
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
-/**
- * @fileoverview
- * @suppress {missingRequire}
- */
-var taskSymbol = zoneSymbol('zoneTask');
-function patchTimer(window, setName, cancelName, nameSuffix) {
- var setNative = null;
- var clearNative = null;
- setName += nameSuffix;
- cancelName += nameSuffix;
- var tasksByHandleId = {};
- function scheduleTask(task) {
- var data = task.data;
- function timer() {
- try {
- task.invoke.apply(this, arguments);
- }
- finally {
- // issue-934, task will be cancelled
- // even it is a periodic task such as
- // setInterval
- if (!(task.data && task.data.isPeriodic)) {
- if (typeof data.handleId === 'number') {
- // in non-nodejs env, we remove timerId
- // from local cache
- delete tasksByHandleId[data.handleId];
- }
- else if (data.handleId) {
- // Node returns complex objects as handleIds
- // we remove task reference from timer object
- data.handleId[taskSymbol] = null;
- }
- }
- }
- }
- data.args[0] = timer;
- data.handleId = setNative.apply(window, data.args);
- return task;
- }
- function clearTask(task) {
- return clearNative(task.data.handleId);
+function patchCallbacks(api, target, targetName, method, callbacks) {
+ var symbol = Zone.__symbol__(method);
+ if (target[symbol]) {
+ return;
}
- setNative =
- patchMethod(window, setName, function (delegate) { return function (self, args) {
- if (typeof args[0] === 'function') {
- var options = {
- isPeriodic: nameSuffix === 'Interval',
- delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 :
- undefined,
- args: args
- };
- var task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask);
- if (!task) {
- return task;
- }
- // Node.js must additionally support the ref and unref functions.
- var handle = task.data.handleId;
- if (typeof handle === 'number') {
- // for non nodejs env, we save handleId: task
- // mapping in local cache for clearTimeout
- tasksByHandleId[handle] = task;
- }
- else if (handle) {
- // for nodejs env, we save task
- // reference in timerId Object for clearTimeout
- handle[taskSymbol] = task;
- }
- // check whether handle is null, because some polyfill or browser
- // may return undefined from setTimeout/setInterval/setImmediate/requestAnimationFrame
- if (handle && handle.ref && handle.unref && typeof handle.ref === 'function' &&
- typeof handle.unref === 'function') {
- task.ref = handle.ref.bind(handle);
- task.unref = handle.unref.bind(handle);
- }
- if (typeof handle === 'number' || handle) {
- return handle;
- }
- return task;
- }
- else {
- // cause an error by calling it directly.
- return delegate.apply(window, args);
- }
- }; });
- clearNative =
- patchMethod(window, cancelName, function (delegate) { return function (self, args) {
- var id = args[0];
- var task;
- if (typeof id === 'number') {
- // non nodejs env.
- task = tasksByHandleId[id];
- }
- else {
- // nodejs env.
- task = id && id[taskSymbol];
- // other environments.
- if (!task) {
- task = id;
- }
- }
- if (task && typeof task.type === 'string') {
- if (task.state !== 'notScheduled' &&
- (task.cancelFn && task.data.isPeriodic || task.runCount === 0)) {
- if (typeof id === 'number') {
- delete tasksByHandleId[id];
+ var nativeDelegate = target[symbol] = target[method];
+ target[method] = function (name, opts, options) {
+ if (opts && opts.prototype) {
+ callbacks.forEach(function (callback) {
+ var source = targetName + "." + method + "::" + callback;
+ var prototype = opts.prototype;
+ if (prototype.hasOwnProperty(callback)) {
+ var descriptor = api.ObjectGetOwnPropertyDescriptor(prototype, callback);
+ if (descriptor && descriptor.value) {
+ descriptor.value = api.wrapWithCurrentZone(descriptor.value, source);
+ api._redefineProperty(opts.prototype, callback, descriptor);
}
- else if (id) {
- id[taskSymbol] = null;
+ else if (prototype[callback]) {
+ prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
}
- // Do not cancel already canceled functions
- task.zone.cancelTask(task);
}
- }
- else {
- // cause an error by calling it directly.
- delegate.apply(window, args);
- }
- }; });
+ else if (prototype[callback]) {
+ prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
+ }
+ });
+ }
+ return nativeDelegate.call(target, name, opts, options);
+ };
+ api.attachOriginToPatched(target[method], nativeDelegate);
}
/**
@@ -2394,11 +2254,12 @@ function patchTimer(window, setName, cancelName, nameSuffix) {
* This is necessary for Chrome and Chrome mobile, to enable
* things like redefining `createdCallback` on an element.
*/
-var _defineProperty = Object[zoneSymbol('defineProperty')] = Object.defineProperty;
-var _getOwnPropertyDescriptor = Object[zoneSymbol('getOwnPropertyDescriptor')] =
+var zoneSymbol$1 = Zone.__symbol__;
+var _defineProperty = Object[zoneSymbol$1('defineProperty')] = Object.defineProperty;
+var _getOwnPropertyDescriptor = Object[zoneSymbol$1('getOwnPropertyDescriptor')] =
Object.getOwnPropertyDescriptor;
var _create = Object.create;
-var unconfigurablesKey = zoneSymbol('unconfigurables');
+var unconfigurablesKey = zoneSymbol$1('unconfigurables');
function propertyPatch() {
Object.defineProperty = function (obj, prop, desc) {
if (isUnconfigurable(obj, prop)) {
@@ -2490,60 +2351,6 @@ function _tryDefineProperty(obj, prop, desc, originalConfigurableFlag) {
}
}
-/**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
-// we have to patch the instance since the proto is non-configurable
-function apply(api, _global) {
- var WS = _global.WebSocket;
- // On Safari window.EventTarget doesn't exist so need to patch WS add/removeEventListener
- // On older Chrome, no need since EventTarget was already patched
- if (!_global.EventTarget) {
- patchEventTarget(_global, [WS.prototype]);
- }
- _global.WebSocket = function (x, y) {
- var socket = arguments.length > 1 ? new WS(x, y) : new WS(x);
- var proxySocket;
- var proxySocketProto;
- // Safari 7.0 has non-configurable own 'onmessage' and friends properties on the socket instance
- var onmessageDesc = ObjectGetOwnPropertyDescriptor(socket, 'onmessage');
- if (onmessageDesc && onmessageDesc.configurable === false) {
- proxySocket = ObjectCreate(socket);
- // socket have own property descriptor 'onopen', 'onmessage', 'onclose', 'onerror'
- // but proxySocket not, so we will keep socket as prototype and pass it to
- // patchOnProperties method
- proxySocketProto = socket;
- [ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR, 'send', 'close'].forEach(function (propName) {
- proxySocket[propName] = function () {
- var args = ArraySlice.call(arguments);
- if (propName === ADD_EVENT_LISTENER_STR || propName === REMOVE_EVENT_LISTENER_STR) {
- var eventName = args.length > 0 ? args[0] : undefined;
- if (eventName) {
- var propertySymbol = Zone.__symbol__('ON_PROPERTY' + eventName);
- socket[propertySymbol] = proxySocket[propertySymbol];
- }
- }
- return socket[propName].apply(socket, args);
- };
- });
- }
- else {
- // we can patch the real socket
- proxySocket = socket;
- }
- patchOnProperties(proxySocket, ['close', 'error', 'message', 'open'], proxySocketProto);
- return proxySocket;
- };
- var globalWebSocket = _global['WebSocket'];
- for (var prop in WS) {
- globalWebSocket[prop] = WS[prop];
- }
-}
-
/**
* @license
* Copyright Google Inc. All Rights Reserved.
@@ -2792,144 +2599,111 @@ function propertyDescriptorPatch(api, _global) {
if (isNode && !isMix) {
return;
}
+ if (Zone[api.symbol('patchEvents')]) {
+ // events are already been patched by legacy patch.
+ return;
+ }
var supportsWebSocket = typeof WebSocket !== 'undefined';
- if (canPatchViaPropertyDescriptor()) {
- var ignoreProperties = _global['__Zone_ignore_on_properties'];
- // for browsers that we can patch the descriptor: Chrome & Firefox
- if (isBrowser) {
- var internalWindow = window;
- var ignoreErrorProperties = isIE ? [{ target: internalWindow, ignoreProperties: ['error'] }] : [];
- // in IE/Edge, onProp not exist in window object, but in WindowPrototype
- // so we need to pass WindowPrototype to check onProp exist or not
- patchFilteredProperties(internalWindow, eventNames.concat(['messageerror']), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow));
- patchFilteredProperties(Document.prototype, eventNames, ignoreProperties);
- if (typeof internalWindow['SVGElement'] !== 'undefined') {
- patchFilteredProperties(internalWindow['SVGElement'].prototype, eventNames, ignoreProperties);
- }
- patchFilteredProperties(Element.prototype, eventNames, ignoreProperties);
- patchFilteredProperties(HTMLElement.prototype, eventNames, ignoreProperties);
- patchFilteredProperties(HTMLMediaElement.prototype, mediaElementEventNames, ignoreProperties);
- patchFilteredProperties(HTMLFrameSetElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
- patchFilteredProperties(HTMLBodyElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
- patchFilteredProperties(HTMLFrameElement.prototype, frameEventNames, ignoreProperties);
- patchFilteredProperties(HTMLIFrameElement.prototype, frameEventNames, ignoreProperties);
- var HTMLMarqueeElement_1 = internalWindow['HTMLMarqueeElement'];
- if (HTMLMarqueeElement_1) {
- patchFilteredProperties(HTMLMarqueeElement_1.prototype, marqueeEventNames, ignoreProperties);
- }
- var Worker_1 = internalWindow['Worker'];
- if (Worker_1) {
- patchFilteredProperties(Worker_1.prototype, workerEventNames, ignoreProperties);
- }
- }
- patchFilteredProperties(XMLHttpRequest.prototype, XMLHttpRequestEventNames, ignoreProperties);
- var XMLHttpRequestEventTarget_1 = _global['XMLHttpRequestEventTarget'];
- if (XMLHttpRequestEventTarget_1) {
- patchFilteredProperties(XMLHttpRequestEventTarget_1 && XMLHttpRequestEventTarget_1.prototype, XMLHttpRequestEventNames, ignoreProperties);
- }
- if (typeof IDBIndex !== 'undefined') {
- patchFilteredProperties(IDBIndex.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBOpenDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBDatabase.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBTransaction.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBCursor.prototype, IDBIndexEventNames, ignoreProperties);
- }
- if (supportsWebSocket) {
- patchFilteredProperties(WebSocket.prototype, websocketEventNames, ignoreProperties);
+ var ignoreProperties = _global['__Zone_ignore_on_properties'];
+ // for browsers that we can patch the descriptor: Chrome & Firefox
+ if (isBrowser) {
+ var internalWindow = window;
+ var ignoreErrorProperties = isIE ? [{ target: internalWindow, ignoreProperties: ['error'] }] : [];
+ // in IE/Edge, onProp not exist in window object, but in WindowPrototype
+ // so we need to pass WindowPrototype to check onProp exist or not
+ patchFilteredProperties(internalWindow, eventNames.concat(['messageerror']), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow));
+ patchFilteredProperties(Document.prototype, eventNames, ignoreProperties);
+ if (typeof internalWindow['SVGElement'] !== 'undefined') {
+ patchFilteredProperties(internalWindow['SVGElement'].prototype, eventNames, ignoreProperties);
+ }
+ patchFilteredProperties(Element.prototype, eventNames, ignoreProperties);
+ patchFilteredProperties(HTMLElement.prototype, eventNames, ignoreProperties);
+ patchFilteredProperties(HTMLMediaElement.prototype, mediaElementEventNames, ignoreProperties);
+ patchFilteredProperties(HTMLFrameSetElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
+ patchFilteredProperties(HTMLBodyElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
+ patchFilteredProperties(HTMLFrameElement.prototype, frameEventNames, ignoreProperties);
+ patchFilteredProperties(HTMLIFrameElement.prototype, frameEventNames, ignoreProperties);
+ var HTMLMarqueeElement_1 = internalWindow['HTMLMarqueeElement'];
+ if (HTMLMarqueeElement_1) {
+ patchFilteredProperties(HTMLMarqueeElement_1.prototype, marqueeEventNames, ignoreProperties);
+ }
+ var Worker_1 = internalWindow['Worker'];
+ if (Worker_1) {
+ patchFilteredProperties(Worker_1.prototype, workerEventNames, ignoreProperties);
}
}
- else {
- // Safari, Android browsers (Jelly Bean)
- patchViaCapturingAllTheEvents();
- patchClass('XMLHttpRequest');
- if (supportsWebSocket) {
- apply(api, _global);
- }
+ patchFilteredProperties(XMLHttpRequest.prototype, XMLHttpRequestEventNames, ignoreProperties);
+ var XMLHttpRequestEventTarget = _global['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget) {
+ patchFilteredProperties(XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype, XMLHttpRequestEventNames, ignoreProperties);
+ }
+ if (typeof IDBIndex !== 'undefined') {
+ patchFilteredProperties(IDBIndex.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBOpenDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBDatabase.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBTransaction.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBCursor.prototype, IDBIndexEventNames, ignoreProperties);
+ }
+ if (supportsWebSocket) {
+ patchFilteredProperties(WebSocket.prototype, websocketEventNames, ignoreProperties);
}
}
-function canPatchViaPropertyDescriptor() {
- if ((isBrowser || isMix) && !ObjectGetOwnPropertyDescriptor(HTMLElement.prototype, 'onclick') &&
- typeof Element !== 'undefined') {
- // WebKit https://bugs.webkit.org/show_bug.cgi?id=134364
- // IDL interface attributes are not configurable
- var desc = ObjectGetOwnPropertyDescriptor(Element.prototype, 'onclick');
- if (desc && !desc.configurable)
- return false;
- }
- var ON_READY_STATE_CHANGE = 'onreadystatechange';
- var XMLHttpRequestPrototype = XMLHttpRequest.prototype;
- var xhrDesc = ObjectGetOwnPropertyDescriptor(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE);
- // add enumerable and configurable here because in opera
- // by default XMLHttpRequest.prototype.onreadystatechange is undefined
- // without adding enumerable and configurable will cause onreadystatechange
- // non-configurable
- // and if XMLHttpRequest.prototype.onreadystatechange is undefined,
- // we should set a real desc instead a fake one
- if (xhrDesc) {
- ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
- enumerable: true,
- configurable: true,
- get: function () {
- return true;
- }
- });
- var req = new XMLHttpRequest();
- var result = !!req.onreadystatechange;
- // restore original desc
- ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, xhrDesc || {});
- return result;
- }
- else {
- var SYMBOL_FAKE_ONREADYSTATECHANGE_1 = zoneSymbol('fake');
- ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
- enumerable: true,
- configurable: true,
- get: function () {
- return this[SYMBOL_FAKE_ONREADYSTATECHANGE_1];
- },
- set: function (value) {
- this[SYMBOL_FAKE_ONREADYSTATECHANGE_1] = value;
- }
- });
- var req = new XMLHttpRequest();
- var detectFunc = function () { };
- req.onreadystatechange = detectFunc;
- var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
- req.onreadystatechange = null;
- return result;
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+Zone.__load_patch('util', function (global, Zone, api) {
+ api.patchOnProperties = patchOnProperties;
+ api.patchMethod = patchMethod;
+ api.bindArguments = bindArguments;
+ api.patchMacroTask = patchMacroTask;
+ // In earlier version of zone.js (<0.9.0), we use env name `__zone_symbol__BLACK_LISTED_EVENTS` to
+ // define which events will not be patched by `Zone.js`.
+ // In newer version (>=0.9.0), we change the env name to `__zone_symbol__UNPATCHED_EVENTS` to keep
+ // the name consistent with angular repo.
+ // The `__zone_symbol__BLACK_LISTED_EVENTS` is deprecated, but it is still be supported for
+ // backwards compatibility.
+ var SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');
+ var SYMBOL_UNPATCHED_EVENTS = Zone.__symbol__('UNPATCHED_EVENTS');
+ if (global[SYMBOL_UNPATCHED_EVENTS]) {
+ global[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_UNPATCHED_EVENTS];
}
-}
-var unboundKey = zoneSymbol('unbound');
-// Whenever any eventListener fires, we check the eventListener target and all parents
-// for `onwhatever` properties and replace them with zone-bound functions
-// - Chrome (for now)
-function patchViaCapturingAllTheEvents() {
- var _loop_1 = function (i) {
- var property = eventNames[i];
- var onproperty = 'on' + property;
- self.addEventListener(property, function (event) {
- var elt = event.target, bound, source;
- if (elt) {
- source = elt.constructor['name'] + '.' + onproperty;
- }
- else {
- source = 'unknown.' + onproperty;
- }
- while (elt) {
- if (elt[onproperty] && !elt[onproperty][unboundKey]) {
- bound = wrapWithCurrentZone(elt[onproperty], source);
- bound[unboundKey] = elt[onproperty];
- elt[onproperty] = bound;
- }
- elt = elt.parentElement;
- }
- }, true);
- };
- for (var i = 0; i < eventNames.length; i++) {
- _loop_1(i);
+ if (global[SYMBOL_BLACK_LISTED_EVENTS]) {
+ Zone[SYMBOL_BLACK_LISTED_EVENTS] = Zone[SYMBOL_UNPATCHED_EVENTS] =
+ global[SYMBOL_BLACK_LISTED_EVENTS];
}
-}
+ api.patchEventPrototype = patchEventPrototype;
+ api.patchEventTarget = patchEventTarget;
+ api.isIEOrEdge = isIEOrEdge;
+ api.ObjectDefineProperty = ObjectDefineProperty;
+ api.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;
+ api.ObjectCreate = ObjectCreate;
+ api.ArraySlice = ArraySlice;
+ api.patchClass = patchClass;
+ api.wrapWithCurrentZone = wrapWithCurrentZone;
+ api.filterProperties = filterProperties;
+ api.attachOriginToPatched = attachOriginToPatched;
+ api._redefineProperty = _redefineProperty;
+ api.patchCallbacks = patchCallbacks;
+ api.getGlobalObjects = function () { return ({
+ globalSources: globalSources,
+ zoneSymbolEventNames: zoneSymbolEventNames$1,
+ eventNames: eventNames,
+ isBrowser: isBrowser,
+ isMix: isMix,
+ isNode: isNode,
+ TRUE_STR: TRUE_STR,
+ FALSE_STR: FALSE_STR,
+ ZONE_SYMBOL_PREFIX: ZONE_SYMBOL_PREFIX,
+ ADD_EVENT_LISTENER_STR: ADD_EVENT_LISTENER_STR,
+ REMOVE_EVENT_LISTENER_STR: REMOVE_EVENT_LISTENER_STR
+ }); };
+});
/**
* @license
@@ -2938,7 +2712,16 @@ function patchViaCapturingAllTheEvents() {
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
-function eventTargetPatch(_global, api) {
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function eventTargetLegacyPatch(_global, api) {
+ var _a = api.getGlobalObjects(), eventNames = _a.eventNames, globalSources = _a.globalSources, zoneSymbolEventNames = _a.zoneSymbolEventNames, TRUE_STR = _a.TRUE_STR, FALSE_STR = _a.FALSE_STR, ZONE_SYMBOL_PREFIX = _a.ZONE_SYMBOL_PREFIX;
var WTF_ISSUE_555 = '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';
var NO_EVENT_TARGET = '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(',');
@@ -2951,7 +2734,7 @@ function eventTargetPatch(_global, api) {
apis = WTF_ISSUE_555_ARRAY.map(function (v) { return 'HTML' + v + 'Element'; }).concat(NO_EVENT_TARGET);
}
else if (_global[EVENT_TARGET]) {
- apis.push(EVENT_TARGET);
+ // EventTarget is already patched in browser.ts
}
else {
// Note: EventTarget is not available in all browsers,
@@ -2960,7 +2743,7 @@ function eventTargetPatch(_global, api) {
}
var isDisableIECheck = _global['__Zone_disable_IE_check'] || false;
var isEnableCrossContextCheck = _global['__Zone_enable_cross_context_check'] || false;
- var ieOrEdge = isIEOrEdge();
+ var ieOrEdge = api.isIEOrEdge();
var ADD_EVENT_LISTENER_SOURCE = '.addEventListener:';
var FUNCTION_WRAPPER = '[object FunctionWrapper]';
var BROWSER_TOOLS = 'function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }';
@@ -2971,9 +2754,9 @@ function eventTargetPatch(_global, api) {
var trueEventName = eventName + TRUE_STR;
var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
- zoneSymbolEventNames$1[eventName] = {};
- zoneSymbolEventNames$1[eventName][FALSE_STR] = symbol;
- zoneSymbolEventNames$1[eventName][TRUE_STR] = symbolCapture;
+ zoneSymbolEventNames[eventName] = {};
+ zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
}
// predefine all task.source string
for (var i = 0; i < WTF_ISSUE_555.length; i++) {
@@ -3025,13 +2808,9 @@ function eventTargetPatch(_global, api) {
}
// vh is validateHandler to check event handler
// is valid or not(for security check)
- patchEventTarget(_global, apiTypes, { vh: checkIEAndCrossContext });
- api.patchEventTarget = patchEventTarget;
+ api.patchEventTarget(_global, apiTypes, { vh: checkIEAndCrossContext });
return true;
}
-function patchEvent(global, api) {
- patchEventPrototype(global, api);
-}
/**
* @license
@@ -3040,49 +2819,379 @@ function patchEvent(global, api) {
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
-function patchCallbacks(target, targetName, method, callbacks) {
- var symbol = Zone.__symbol__(method);
- if (target[symbol]) {
- return;
+// we have to patch the instance since the proto is non-configurable
+function apply(api, _global) {
+ var _a = api.getGlobalObjects(), ADD_EVENT_LISTENER_STR = _a.ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR = _a.REMOVE_EVENT_LISTENER_STR;
+ var WS = _global.WebSocket;
+ // On Safari window.EventTarget doesn't exist so need to patch WS add/removeEventListener
+ // On older Chrome, no need since EventTarget was already patched
+ if (!_global.EventTarget) {
+ api.patchEventTarget(_global, [WS.prototype]);
}
- var nativeDelegate = target[symbol] = target[method];
- target[method] = function (name, opts, options) {
- if (opts && opts.prototype) {
- callbacks.forEach(function (callback) {
- var source = targetName + "." + method + "::" + callback;
- var prototype = opts.prototype;
- if (prototype.hasOwnProperty(callback)) {
- var descriptor = ObjectGetOwnPropertyDescriptor(prototype, callback);
- if (descriptor && descriptor.value) {
- descriptor.value = wrapWithCurrentZone(descriptor.value, source);
- _redefineProperty(opts.prototype, callback, descriptor);
- }
- else if (prototype[callback]) {
- prototype[callback] = wrapWithCurrentZone(prototype[callback], source);
+ _global.WebSocket = function (x, y) {
+ var socket = arguments.length > 1 ? new WS(x, y) : new WS(x);
+ var proxySocket;
+ var proxySocketProto;
+ // Safari 7.0 has non-configurable own 'onmessage' and friends properties on the socket instance
+ var onmessageDesc = api.ObjectGetOwnPropertyDescriptor(socket, 'onmessage');
+ if (onmessageDesc && onmessageDesc.configurable === false) {
+ proxySocket = api.ObjectCreate(socket);
+ // socket have own property descriptor 'onopen', 'onmessage', 'onclose', 'onerror'
+ // but proxySocket not, so we will keep socket as prototype and pass it to
+ // patchOnProperties method
+ proxySocketProto = socket;
+ [ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR, 'send', 'close'].forEach(function (propName) {
+ proxySocket[propName] = function () {
+ var args = api.ArraySlice.call(arguments);
+ if (propName === ADD_EVENT_LISTENER_STR || propName === REMOVE_EVENT_LISTENER_STR) {
+ var eventName = args.length > 0 ? args[0] : undefined;
+ if (eventName) {
+ var propertySymbol = Zone.__symbol__('ON_PROPERTY' + eventName);
+ socket[propertySymbol] = proxySocket[propertySymbol];
+ }
}
- }
- else if (prototype[callback]) {
- prototype[callback] = wrapWithCurrentZone(prototype[callback], source);
- }
+ return socket[propName].apply(socket, args);
+ };
});
}
- return nativeDelegate.call(target, name, opts, options);
+ else {
+ // we can patch the real socket
+ proxySocket = socket;
+ }
+ api.patchOnProperties(proxySocket, ['close', 'error', 'message', 'open'], proxySocketProto);
+ return proxySocket;
};
- attachOriginToPatched(target[method], nativeDelegate);
+ var globalWebSocket = _global['WebSocket'];
+ for (var prop in WS) {
+ globalWebSocket[prop] = WS[prop];
+ }
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {globalThis}
+ */
+function propertyDescriptorLegacyPatch(api, _global) {
+ var _a = api.getGlobalObjects(), isNode = _a.isNode, isMix = _a.isMix;
+ if (isNode && !isMix) {
+ return;
+ }
+ var supportsWebSocket = typeof WebSocket !== 'undefined';
+ if (!canPatchViaPropertyDescriptor(api)) {
+ // Safari, Android browsers (Jelly Bean)
+ patchViaCapturingAllTheEvents(api);
+ api.patchClass('XMLHttpRequest');
+ if (supportsWebSocket) {
+ apply(api, _global);
+ }
+ Zone[api.symbol('patchEvents')] = true;
+ }
}
-function registerElementPatch(_global) {
+function canPatchViaPropertyDescriptor(api) {
+ var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
+ if ((isBrowser || isMix) &&
+ !api.ObjectGetOwnPropertyDescriptor(HTMLElement.prototype, 'onclick') &&
+ typeof Element !== 'undefined') {
+ // WebKit https://bugs.webkit.org/show_bug.cgi?id=134364
+ // IDL interface attributes are not configurable
+ var desc = api.ObjectGetOwnPropertyDescriptor(Element.prototype, 'onclick');
+ if (desc && !desc.configurable)
+ return false;
+ }
+ var ON_READY_STATE_CHANGE = 'onreadystatechange';
+ var XMLHttpRequestPrototype = XMLHttpRequest.prototype;
+ var xhrDesc = api.ObjectGetOwnPropertyDescriptor(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE);
+ // add enumerable and configurable here because in opera
+ // by default XMLHttpRequest.prototype.onreadystatechange is undefined
+ // without adding enumerable and configurable will cause onreadystatechange
+ // non-configurable
+ // and if XMLHttpRequest.prototype.onreadystatechange is undefined,
+ // we should set a real desc instead a fake one
+ if (xhrDesc) {
+ api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
+ enumerable: true,
+ configurable: true,
+ get: function () {
+ return true;
+ }
+ });
+ var req = new XMLHttpRequest();
+ var result = !!req.onreadystatechange;
+ // restore original desc
+ api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, xhrDesc || {});
+ return result;
+ }
+ else {
+ var SYMBOL_FAKE_ONREADYSTATECHANGE_1 = api.symbol('fake');
+ api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
+ enumerable: true,
+ configurable: true,
+ get: function () {
+ return this[SYMBOL_FAKE_ONREADYSTATECHANGE_1];
+ },
+ set: function (value) {
+ this[SYMBOL_FAKE_ONREADYSTATECHANGE_1] = value;
+ }
+ });
+ var req = new XMLHttpRequest();
+ var detectFunc = function () { };
+ req.onreadystatechange = detectFunc;
+ var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
+ req.onreadystatechange = null;
+ return result;
+ }
+}
+// Whenever any eventListener fires, we check the eventListener target and all parents
+// for `onwhatever` properties and replace them with zone-bound functions
+// - Chrome (for now)
+function patchViaCapturingAllTheEvents(api) {
+ var eventNames = api.getGlobalObjects().eventNames;
+ var unboundKey = api.symbol('unbound');
+ var _loop_1 = function (i) {
+ var property = eventNames[i];
+ var onproperty = 'on' + property;
+ self.addEventListener(property, function (event) {
+ var elt = event.target, bound, source;
+ if (elt) {
+ source = elt.constructor['name'] + '.' + onproperty;
+ }
+ else {
+ source = 'unknown.' + onproperty;
+ }
+ while (elt) {
+ if (elt[onproperty] && !elt[onproperty][unboundKey]) {
+ bound = api.wrapWithCurrentZone(elt[onproperty], source);
+ bound[unboundKey] = elt[onproperty];
+ elt[onproperty] = bound;
+ }
+ elt = elt.parentElement;
+ }
+ }, true);
+ };
+ for (var i = 0; i < eventNames.length; i++) {
+ _loop_1(i);
+ }
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function registerElementPatch(_global, api) {
+ var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
if ((!isBrowser && !isMix) || !('registerElement' in _global.document)) {
return;
}
var callbacks = ['createdCallback', 'attachedCallback', 'detachedCallback', 'attributeChangedCallback'];
- patchCallbacks(document, 'Document', 'registerElement', callbacks);
+ api.patchCallbacks(api, document, 'Document', 'registerElement', callbacks);
}
-function patchCustomElements(_global) {
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {missingRequire}
+ */
+(function (_global) {
+ _global['__zone_symbol__legacyPatch'] = function () {
+ var Zone = _global['Zone'];
+ Zone.__load_patch('registerElement', function (global, Zone, api) {
+ registerElementPatch(global, api);
+ });
+ Zone.__load_patch('EventTargetLegacy', function (global, Zone, api) {
+ eventTargetLegacyPatch(global, api);
+ propertyDescriptorLegacyPatch(api, global);
+ });
+ };
+})(typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global);
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {missingRequire}
+ */
+var taskSymbol = zoneSymbol('zoneTask');
+function patchTimer(window, setName, cancelName, nameSuffix) {
+ var setNative = null;
+ var clearNative = null;
+ setName += nameSuffix;
+ cancelName += nameSuffix;
+ var tasksByHandleId = {};
+ function scheduleTask(task) {
+ var data = task.data;
+ function timer() {
+ try {
+ task.invoke.apply(this, arguments);
+ }
+ finally {
+ // issue-934, task will be cancelled
+ // even it is a periodic task such as
+ // setInterval
+ if (!(task.data && task.data.isPeriodic)) {
+ if (typeof data.handleId === 'number') {
+ // in non-nodejs env, we remove timerId
+ // from local cache
+ delete tasksByHandleId[data.handleId];
+ }
+ else if (data.handleId) {
+ // Node returns complex objects as handleIds
+ // we remove task reference from timer object
+ data.handleId[taskSymbol] = null;
+ }
+ }
+ }
+ }
+ data.args[0] = timer;
+ data.handleId = setNative.apply(window, data.args);
+ return task;
+ }
+ function clearTask(task) {
+ return clearNative(task.data.handleId);
+ }
+ setNative =
+ patchMethod(window, setName, function (delegate) { return function (self, args) {
+ if (typeof args[0] === 'function') {
+ var options = {
+ isPeriodic: nameSuffix === 'Interval',
+ delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 :
+ undefined,
+ args: args
+ };
+ var task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask);
+ if (!task) {
+ return task;
+ }
+ // Node.js must additionally support the ref and unref functions.
+ var handle = task.data.handleId;
+ if (typeof handle === 'number') {
+ // for non nodejs env, we save handleId: task
+ // mapping in local cache for clearTimeout
+ tasksByHandleId[handle] = task;
+ }
+ else if (handle) {
+ // for nodejs env, we save task
+ // reference in timerId Object for clearTimeout
+ handle[taskSymbol] = task;
+ }
+ // check whether handle is null, because some polyfill or browser
+ // may return undefined from setTimeout/setInterval/setImmediate/requestAnimationFrame
+ if (handle && handle.ref && handle.unref && typeof handle.ref === 'function' &&
+ typeof handle.unref === 'function') {
+ task.ref = handle.ref.bind(handle);
+ task.unref = handle.unref.bind(handle);
+ }
+ if (typeof handle === 'number' || handle) {
+ return handle;
+ }
+ return task;
+ }
+ else {
+ // cause an error by calling it directly.
+ return delegate.apply(window, args);
+ }
+ }; });
+ clearNative =
+ patchMethod(window, cancelName, function (delegate) { return function (self, args) {
+ var id = args[0];
+ var task;
+ if (typeof id === 'number') {
+ // non nodejs env.
+ task = tasksByHandleId[id];
+ }
+ else {
+ // nodejs env.
+ task = id && id[taskSymbol];
+ // other environments.
+ if (!task) {
+ task = id;
+ }
+ }
+ if (task && typeof task.type === 'string') {
+ if (task.state !== 'notScheduled' &&
+ (task.cancelFn && task.data.isPeriodic || task.runCount === 0)) {
+ if (typeof id === 'number') {
+ delete tasksByHandleId[id];
+ }
+ else if (id) {
+ id[taskSymbol] = null;
+ }
+ // Do not cancel already canceled functions
+ task.zone.cancelTask(task);
+ }
+ }
+ else {
+ // cause an error by calling it directly.
+ delegate.apply(window, args);
+ }
+ }; });
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function patchCustomElements(_global, api) {
+ var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
if ((!isBrowser && !isMix) || !('customElements' in _global)) {
return;
}
var callbacks = ['connectedCallback', 'disconnectedCallback', 'adoptedCallback', 'attributeChangedCallback'];
- patchCallbacks(_global.customElements, 'customElements', 'define', callbacks);
+ api.patchCallbacks(api, _global.customElements, 'customElements', 'define', callbacks);
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function eventTargetPatch(_global, api) {
+ var _a = api.getGlobalObjects(), eventNames = _a.eventNames, zoneSymbolEventNames = _a.zoneSymbolEventNames, TRUE_STR = _a.TRUE_STR, FALSE_STR = _a.FALSE_STR, ZONE_SYMBOL_PREFIX = _a.ZONE_SYMBOL_PREFIX;
+ // predefine all __zone_symbol__ + eventName + true/false string
+ for (var i = 0; i < eventNames.length; i++) {
+ var eventName = eventNames[i];
+ var falseEventName = eventName + FALSE_STR;
+ var trueEventName = eventName + TRUE_STR;
+ var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
+ var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
+ zoneSymbolEventNames[eventName] = {};
+ zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
+ }
+ var EVENT_TARGET = _global['EventTarget'];
+ if (!EVENT_TARGET || !EVENT_TARGET.prototype) {
+ return;
+ }
+ api.patchEventTarget(_global, [EVENT_TARGET && EVENT_TARGET.prototype]);
+ return true;
+}
+function patchEvent$1(global, api) {
+ api.patchEventPrototype(global, api);
}
/**
@@ -3096,10 +3205,11 @@ function patchCustomElements(_global) {
* @fileoverview
* @suppress {missingRequire}
*/
-Zone.__load_patch('util', function (global, Zone, api) {
- api.patchOnProperties = patchOnProperties;
- api.patchMethod = patchMethod;
- api.bindArguments = bindArguments;
+Zone.__load_patch('legacy', function (global) {
+ var legacyPatch = global[Zone.__symbol__('legacyPatch')];
+ if (legacyPatch) {
+ legacyPatch();
+ }
});
Zone.__load_patch('timers', function (global) {
var set = 'set';
@@ -3125,12 +3235,7 @@ Zone.__load_patch('blocking', function (global, Zone) {
}
});
Zone.__load_patch('EventTarget', function (global, Zone, api) {
- // load blackListEvents from global
- var SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');
- if (global[SYMBOL_BLACK_LISTED_EVENTS]) {
- Zone[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_BLACK_LISTED_EVENTS];
- }
- patchEvent(global, api);
+ patchEvent$1(global, api);
eventTargetPatch(global, api);
// patch XMLHttpRequestEventTarget's addEventListener/removeEventListener
var XMLHttpRequestEventTarget = global['XMLHttpRequestEventTarget'];
@@ -3147,17 +3252,7 @@ Zone.__load_patch('on_property', function (global, Zone, api) {
propertyPatch();
});
Zone.__load_patch('customElements', function (global, Zone, api) {
- registerElementPatch(global);
- patchCustomElements(global);
-});
-Zone.__load_patch('canvas', function (global) {
- var HTMLCanvasElement = global['HTMLCanvasElement'];
- if (typeof HTMLCanvasElement !== 'undefined' && HTMLCanvasElement.prototype &&
- HTMLCanvasElement.prototype.toBlob) {
- patchMacroTask(HTMLCanvasElement.prototype, 'toBlob', function (self, args) {
- return { name: 'HTMLCanvasElement.toBlob', target: self, cbIdx: 0, args: args };
- });
- }
+ patchCustomElements(global, api);
});
Zone.__load_patch('XHR', function (global, Zone) {
// Treat XMLHttpRequest as a macrotask.
@@ -3354,6 +3449,17 @@ Zone.__load_patch('PromiseRejectionEvent', function (global, Zone) {
* @fileoverview
* @suppress {globalThis}
*/
+var __assign = (undefined && undefined.__assign) || function () {
+ __assign = Object.assign || function(t) {
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
+ s = arguments[i];
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+ t[p] = s[p];
+ }
+ return t;
+ };
+ return __assign.apply(this, arguments);
+};
var NEWLINE = '\n';
var IGNORE_FRAMES = {};
var creationTrace = '__creationTrace__';
@@ -3443,6 +3549,14 @@ Zone['longStackTraceZoneSpec'] = {
}
if (!task.data)
task.data = {};
+ if (task.type === 'eventTask') {
+ // Fix issue https://github.com/angular/zone.js/issues/1195,
+ // For event task of browser, by default, all task will share a
+ // singleton instance of data object, we should create a new one here
+ // The cast to `any` is required to workaround a closure bug which wrongly applies
+ // URL sanitization rules to .data access.
+ task.data = __assign({}, task.data);
+ }
task.data[creationTrace] = trace;
}
return parentZoneDelegate.scheduleTask(targetZone, task);
@@ -3749,6 +3863,30 @@ Zone['SyncTestZoneSpec'] = SyncTestZoneSpec;
var symbol = Zone.__symbol__;
// whether patch jasmine clock when in fakeAsync
var enableClockPatch = _global[symbol('fakeAsyncPatchLock')] === true;
+ var ignoreUnhandledRejection = _global[symbol('ignoreUnhandledRejection')] === true;
+ if (!ignoreUnhandledRejection) {
+ var globalErrors_1 = jasmine.GlobalErrors;
+ if (globalErrors_1 && !jasmine[symbol('GlobalErrors')]) {
+ jasmine[symbol('GlobalErrors')] = globalErrors_1;
+ jasmine.GlobalErrors = function () {
+ var instance = new globalErrors_1();
+ var originalInstall = instance.install;
+ if (originalInstall && !instance[symbol('install')]) {
+ instance[symbol('install')] = originalInstall;
+ instance.install = function () {
+ var originalHandlers = process.listeners('unhandledRejection');
+ var r = originalInstall.apply(this, arguments);
+ process.removeAllListeners('unhandledRejection');
+ if (originalHandlers) {
+ originalHandlers.forEach(function (h) { return process.on('unhandledRejection', h); });
+ }
+ return r;
+ };
+ }
+ return instance;
+ };
+ }
+ }
// Monkey patch all of the jasmine DSL so that each function runs in appropriate zone.
var jasmineEnv = jasmine.getEnv();
['describe', 'xdescribe', 'fdescribe'].forEach(function (methodName) {
@@ -3902,7 +4040,12 @@ Zone['SyncTestZoneSpec'] = SyncTestZoneSpec;
var proxyZoneSpec = this && this.testProxyZoneSpec;
if (proxyZoneSpec) {
var pendingTasksInfo = proxyZoneSpec.getAndClearPendingTasksInfo();
- error.message += pendingTasksInfo;
+ try {
+ // try catch here in case error.message is not writable
+ error.message += pendingTasksInfo;
+ }
+ catch (err) {
+ }
}
}
if (onException) {
@@ -4236,8 +4379,6 @@ var __spread = (undefined && undefined.__spread) || function () {
};
var Scheduler = /** @class */ (function () {
function Scheduler() {
- // Next scheduler id.
- this.nextId = 1;
// Scheduler queue with the tuple of end time and callback function - sorted by end time.
this._schedulerQueue = [];
// Current simulated time in millis.
@@ -4259,7 +4400,7 @@ var __spread = (undefined && undefined.__spread) || function () {
if (isPeriodic === void 0) { isPeriodic = false; }
if (isRequestAnimationFrame === void 0) { isRequestAnimationFrame = false; }
if (id === void 0) { id = -1; }
- var currentId = id < 0 ? this.nextId++ : id;
+ var currentId = id < 0 ? Scheduler.nextId++ : id;
var endTime = this._currentTime + delay;
// Insert so that scheduler queue remains sorted by end time.
var newEntry = {
@@ -4376,6 +4517,8 @@ var __spread = (undefined && undefined.__spread) || function () {
}
return this._currentTime - startTime;
};
+ // Next scheduler id.
+ Scheduler.nextId = 1;
return Scheduler;
}());
var FakeAsyncTestZoneSpec = /** @class */ (function () {
@@ -4456,7 +4599,7 @@ var __spread = (undefined && undefined.__spread) || function () {
};
FakeAsyncTestZoneSpec.prototype._setTimeout = function (fn, delay, args, isTimer) {
if (isTimer === void 0) { isTimer = true; }
- var removeTimerFn = this._dequeueTimer(this._scheduler.nextId);
+ var removeTimerFn = this._dequeueTimer(Scheduler.nextId);
// Queue the callback and dequeue the timer on success and error.
var cb = this._fnAndFlush(fn, { onSuccess: removeTimerFn, onError: removeTimerFn });
var id = this._scheduler.scheduleFunction(cb, delay, args, false, !isTimer);
@@ -4470,7 +4613,7 @@ var __spread = (undefined && undefined.__spread) || function () {
this._scheduler.removeScheduledFunctionWithId(id);
};
FakeAsyncTestZoneSpec.prototype._setInterval = function (fn, interval, args) {
- var id = this._scheduler.nextId;
+ var id = Scheduler.nextId;
var completers = { onSuccess: null, onError: this._dequeuePeriodicTimer(id) };
var cb = this._fnAndFlush(fn, completers);
// Use the callback created above to requeue on success.
@@ -4500,6 +4643,14 @@ var __spread = (undefined && undefined.__spread) || function () {
this._scheduler.setCurrentRealTime(realTime);
};
FakeAsyncTestZoneSpec.patchDate = function () {
+ if (!!global[Zone.__symbol__('disableDatePatching')]) {
+ // we don't want to patch global Date
+ // because in some case, global Date
+ // is already being patched, we need to provide
+ // an option to let user still use their
+ // own version of Date.
+ return;
+ }
if (global['Date'] === FakeDate) {
// already patched
return;
diff --git a/dist/zone-testing-node-bundle.js b/dist/zone-testing-node-bundle.js
index 28d496d71..1114a410a 100644
--- a/dist/zone-testing-node-bundle.js
+++ b/dist/zone-testing-node-bundle.js
@@ -630,6 +630,7 @@ var Zone$1 = (function (global) {
patchMethod: function () { return noop; },
bindArguments: function () { return []; },
patchThen: function () { return noop; },
+ patchMacroTask: function () { return noop; },
setNativePromise: function (NativePromise) {
// sometimes NativePromise.resolve static function
// is not ready yet, (such as core-js/es6.promise)
@@ -638,6 +639,19 @@ var Zone$1 = (function (global) {
nativeMicroTaskQueuePromise = NativePromise.resolve(0);
}
},
+ patchEventPrototype: function () { return noop; },
+ isIEOrEdge: function () { return false; },
+ getGlobalObjects: function () { return undefined; },
+ ObjectDefineProperty: function () { return noop; },
+ ObjectGetOwnPropertyDescriptor: function () { return undefined; },
+ ObjectCreate: function () { return undefined; },
+ ArraySlice: function () { return []; },
+ patchClass: function () { return noop; },
+ wrapWithCurrentZone: function () { return noop; },
+ filterProperties: function () { return []; },
+ attachOriginToPatched: function () { return noop; },
+ _redefineProperty: function () { return noop; },
+ patchCallbacks: function () { return noop; }
};
var _currentZoneFrame = { parent: null, zone: new Zone(null, null) };
var _currentTask = null;
@@ -660,6 +674,13 @@ var __values = (undefined && undefined.__values) || function (o) {
}
};
};
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
var ObjectDefineProperty = Object.defineProperty;
@@ -931,10 +952,10 @@ Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
reject = rej;
});
function onResolve(value) {
- promise && (promise = null || resolve(value));
+ resolve(value);
}
function onReject(error) {
- promise && (promise = null || reject(error));
+ reject(error);
}
try {
for (var values_1 = __values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) {
@@ -1002,6 +1023,13 @@ Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
}
return promise;
};
+ Object.defineProperty(ZoneAwarePromise.prototype, Symbol.toStringTag, {
+ get: function () {
+ return 'Promise';
+ },
+ enumerable: true,
+ configurable: true
+ });
ZoneAwarePromise.prototype.then = function (onFulfilled, onRejected) {
var chainPromise = new this.constructor(null);
var zone = Zone.current;
@@ -1096,8 +1124,26 @@ Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
Ctor[symbolThenPatched] = true;
}
api.patchThen = patchThen;
+ function zoneify(fn) {
+ return function () {
+ var resultPromise = fn.apply(this, arguments);
+ if (resultPromise instanceof ZoneAwarePromise) {
+ return resultPromise;
+ }
+ var ctor = resultPromise.constructor;
+ if (!ctor[symbolThenPatched]) {
+ patchThen(ctor);
+ }
+ return resultPromise;
+ };
+ }
if (NativePromise) {
patchThen(NativePromise);
+ var fetch_1 = global['fetch'];
+ if (typeof fetch_1 == 'function') {
+ global[api.symbol('fetch')] = fetch_1;
+ global['fetch'] = zoneify(fetch_1);
+ }
}
// This is not part of public API, but it is useful for tests, so we expose it.
Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors;
@@ -1458,7 +1504,7 @@ Zone.__load_patch('toString', function (global) {
var originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
if (originalDelegate) {
if (typeof originalDelegate === 'function') {
- return originalFunctionToString.apply(this[ORIGINAL_DELEGATE_SYMBOL], arguments);
+ return originalFunctionToString.call(originalDelegate);
}
else {
return Object.prototype.toString.call(originalDelegate);
@@ -1467,17 +1513,17 @@ Zone.__load_patch('toString', function (global) {
if (this === Promise) {
var nativePromise = global[PROMISE_SYMBOL];
if (nativePromise) {
- return originalFunctionToString.apply(nativePromise, arguments);
+ return originalFunctionToString.call(nativePromise);
}
}
if (this === Error) {
var nativeError = global[ERROR_SYMBOL];
if (nativeError) {
- return originalFunctionToString.apply(nativeError, arguments);
+ return originalFunctionToString.call(nativeError);
}
}
}
- return originalFunctionToString.apply(this, arguments);
+ return originalFunctionToString.call(this);
};
newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
Function.prototype.toString = newFunctionToString;
@@ -1488,7 +1534,7 @@ Zone.__load_patch('toString', function (global) {
if (this instanceof Promise) {
return PROMISE_OBJECT_TO_STRING;
}
- return originalObjectToString.apply(this, arguments);
+ return originalObjectToString.call(this);
};
});
@@ -1503,6 +1549,7 @@ Zone.__load_patch('node_util', function (global, Zone, api) {
api.patchOnProperties = patchOnProperties;
api.patchMethod = patchMethod;
api.bindArguments = bindArguments;
+ api.patchMacroTask = patchMacroTask;
setShouldCopySymbolProperties(true);
});
@@ -2446,6 +2493,17 @@ Zone.__load_patch('console', function (global, Zone) {
* @fileoverview
* @suppress {globalThis}
*/
+var __assign = (undefined && undefined.__assign) || function () {
+ __assign = Object.assign || function(t) {
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
+ s = arguments[i];
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+ t[p] = s[p];
+ }
+ return t;
+ };
+ return __assign.apply(this, arguments);
+};
var NEWLINE = '\n';
var IGNORE_FRAMES = {};
var creationTrace = '__creationTrace__';
@@ -2535,6 +2593,14 @@ Zone['longStackTraceZoneSpec'] = {
}
if (!task.data)
task.data = {};
+ if (task.type === 'eventTask') {
+ // Fix issue https://github.com/angular/zone.js/issues/1195,
+ // For event task of browser, by default, all task will share a
+ // singleton instance of data object, we should create a new one here
+ // The cast to `any` is required to workaround a closure bug which wrongly applies
+ // URL sanitization rules to .data access.
+ task.data = __assign({}, task.data);
+ }
task.data[creationTrace] = trace;
}
return parentZoneDelegate.scheduleTask(targetZone, task);
@@ -2841,6 +2907,30 @@ Zone['SyncTestZoneSpec'] = SyncTestZoneSpec;
var symbol = Zone.__symbol__;
// whether patch jasmine clock when in fakeAsync
var enableClockPatch = _global[symbol('fakeAsyncPatchLock')] === true;
+ var ignoreUnhandledRejection = _global[symbol('ignoreUnhandledRejection')] === true;
+ if (!ignoreUnhandledRejection) {
+ var globalErrors_1 = jasmine.GlobalErrors;
+ if (globalErrors_1 && !jasmine[symbol('GlobalErrors')]) {
+ jasmine[symbol('GlobalErrors')] = globalErrors_1;
+ jasmine.GlobalErrors = function () {
+ var instance = new globalErrors_1();
+ var originalInstall = instance.install;
+ if (originalInstall && !instance[symbol('install')]) {
+ instance[symbol('install')] = originalInstall;
+ instance.install = function () {
+ var originalHandlers = process.listeners('unhandledRejection');
+ var r = originalInstall.apply(this, arguments);
+ process.removeAllListeners('unhandledRejection');
+ if (originalHandlers) {
+ originalHandlers.forEach(function (h) { return process.on('unhandledRejection', h); });
+ }
+ return r;
+ };
+ }
+ return instance;
+ };
+ }
+ }
// Monkey patch all of the jasmine DSL so that each function runs in appropriate zone.
var jasmineEnv = jasmine.getEnv();
['describe', 'xdescribe', 'fdescribe'].forEach(function (methodName) {
@@ -2994,7 +3084,12 @@ Zone['SyncTestZoneSpec'] = SyncTestZoneSpec;
var proxyZoneSpec = this && this.testProxyZoneSpec;
if (proxyZoneSpec) {
var pendingTasksInfo = proxyZoneSpec.getAndClearPendingTasksInfo();
- error.message += pendingTasksInfo;
+ try {
+ // try catch here in case error.message is not writable
+ error.message += pendingTasksInfo;
+ }
+ catch (err) {
+ }
}
}
if (onException) {
@@ -3328,8 +3423,6 @@ var __spread = (undefined && undefined.__spread) || function () {
};
var Scheduler = /** @class */ (function () {
function Scheduler() {
- // Next scheduler id.
- this.nextId = 1;
// Scheduler queue with the tuple of end time and callback function - sorted by end time.
this._schedulerQueue = [];
// Current simulated time in millis.
@@ -3351,7 +3444,7 @@ var __spread = (undefined && undefined.__spread) || function () {
if (isPeriodic === void 0) { isPeriodic = false; }
if (isRequestAnimationFrame === void 0) { isRequestAnimationFrame = false; }
if (id === void 0) { id = -1; }
- var currentId = id < 0 ? this.nextId++ : id;
+ var currentId = id < 0 ? Scheduler.nextId++ : id;
var endTime = this._currentTime + delay;
// Insert so that scheduler queue remains sorted by end time.
var newEntry = {
@@ -3468,6 +3561,8 @@ var __spread = (undefined && undefined.__spread) || function () {
}
return this._currentTime - startTime;
};
+ // Next scheduler id.
+ Scheduler.nextId = 1;
return Scheduler;
}());
var FakeAsyncTestZoneSpec = /** @class */ (function () {
@@ -3548,7 +3643,7 @@ var __spread = (undefined && undefined.__spread) || function () {
};
FakeAsyncTestZoneSpec.prototype._setTimeout = function (fn, delay, args, isTimer) {
if (isTimer === void 0) { isTimer = true; }
- var removeTimerFn = this._dequeueTimer(this._scheduler.nextId);
+ var removeTimerFn = this._dequeueTimer(Scheduler.nextId);
// Queue the callback and dequeue the timer on success and error.
var cb = this._fnAndFlush(fn, { onSuccess: removeTimerFn, onError: removeTimerFn });
var id = this._scheduler.scheduleFunction(cb, delay, args, false, !isTimer);
@@ -3562,7 +3657,7 @@ var __spread = (undefined && undefined.__spread) || function () {
this._scheduler.removeScheduledFunctionWithId(id);
};
FakeAsyncTestZoneSpec.prototype._setInterval = function (fn, interval, args) {
- var id = this._scheduler.nextId;
+ var id = Scheduler.nextId;
var completers = { onSuccess: null, onError: this._dequeuePeriodicTimer(id) };
var cb = this._fnAndFlush(fn, completers);
// Use the callback created above to requeue on success.
@@ -3592,6 +3687,14 @@ var __spread = (undefined && undefined.__spread) || function () {
this._scheduler.setCurrentRealTime(realTime);
};
FakeAsyncTestZoneSpec.patchDate = function () {
+ if (!!global[Zone.__symbol__('disableDatePatching')]) {
+ // we don't want to patch global Date
+ // because in some case, global Date
+ // is already being patched, we need to provide
+ // an option to let user still use their
+ // own version of Date.
+ return;
+ }
if (global['Date'] === FakeDate) {
// already patched
return;
diff --git a/dist/zone-testing.js b/dist/zone-testing.js
index 8d59251d7..221d8d75e 100644
--- a/dist/zone-testing.js
+++ b/dist/zone-testing.js
@@ -22,6 +22,17 @@
* @fileoverview
* @suppress {globalThis}
*/
+var __assign = (undefined && undefined.__assign) || function () {
+ __assign = Object.assign || function(t) {
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
+ s = arguments[i];
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+ t[p] = s[p];
+ }
+ return t;
+ };
+ return __assign.apply(this, arguments);
+};
var NEWLINE = '\n';
var IGNORE_FRAMES = {};
var creationTrace = '__creationTrace__';
@@ -111,6 +122,14 @@ Zone['longStackTraceZoneSpec'] = {
}
if (!task.data)
task.data = {};
+ if (task.type === 'eventTask') {
+ // Fix issue https://github.com/angular/zone.js/issues/1195,
+ // For event task of browser, by default, all task will share a
+ // singleton instance of data object, we should create a new one here
+ // The cast to `any` is required to workaround a closure bug which wrongly applies
+ // URL sanitization rules to .data access.
+ task.data = __assign({}, task.data);
+ }
task.data[creationTrace] = trace;
}
return parentZoneDelegate.scheduleTask(targetZone, task);
@@ -417,6 +436,30 @@ Zone['SyncTestZoneSpec'] = SyncTestZoneSpec;
var symbol = Zone.__symbol__;
// whether patch jasmine clock when in fakeAsync
var enableClockPatch = _global[symbol('fakeAsyncPatchLock')] === true;
+ var ignoreUnhandledRejection = _global[symbol('ignoreUnhandledRejection')] === true;
+ if (!ignoreUnhandledRejection) {
+ var globalErrors_1 = jasmine.GlobalErrors;
+ if (globalErrors_1 && !jasmine[symbol('GlobalErrors')]) {
+ jasmine[symbol('GlobalErrors')] = globalErrors_1;
+ jasmine.GlobalErrors = function () {
+ var instance = new globalErrors_1();
+ var originalInstall = instance.install;
+ if (originalInstall && !instance[symbol('install')]) {
+ instance[symbol('install')] = originalInstall;
+ instance.install = function () {
+ var originalHandlers = process.listeners('unhandledRejection');
+ var r = originalInstall.apply(this, arguments);
+ process.removeAllListeners('unhandledRejection');
+ if (originalHandlers) {
+ originalHandlers.forEach(function (h) { return process.on('unhandledRejection', h); });
+ }
+ return r;
+ };
+ }
+ return instance;
+ };
+ }
+ }
// Monkey patch all of the jasmine DSL so that each function runs in appropriate zone.
var jasmineEnv = jasmine.getEnv();
['describe', 'xdescribe', 'fdescribe'].forEach(function (methodName) {
@@ -570,7 +613,12 @@ Zone['SyncTestZoneSpec'] = SyncTestZoneSpec;
var proxyZoneSpec = this && this.testProxyZoneSpec;
if (proxyZoneSpec) {
var pendingTasksInfo = proxyZoneSpec.getAndClearPendingTasksInfo();
- error.message += pendingTasksInfo;
+ try {
+ // try catch here in case error.message is not writable
+ error.message += pendingTasksInfo;
+ }
+ catch (err) {
+ }
}
}
if (onException) {
@@ -904,8 +952,6 @@ var __spread = (undefined && undefined.__spread) || function () {
};
var Scheduler = /** @class */ (function () {
function Scheduler() {
- // Next scheduler id.
- this.nextId = 1;
// Scheduler queue with the tuple of end time and callback function - sorted by end time.
this._schedulerQueue = [];
// Current simulated time in millis.
@@ -927,7 +973,7 @@ var __spread = (undefined && undefined.__spread) || function () {
if (isPeriodic === void 0) { isPeriodic = false; }
if (isRequestAnimationFrame === void 0) { isRequestAnimationFrame = false; }
if (id === void 0) { id = -1; }
- var currentId = id < 0 ? this.nextId++ : id;
+ var currentId = id < 0 ? Scheduler.nextId++ : id;
var endTime = this._currentTime + delay;
// Insert so that scheduler queue remains sorted by end time.
var newEntry = {
@@ -1044,6 +1090,8 @@ var __spread = (undefined && undefined.__spread) || function () {
}
return this._currentTime - startTime;
};
+ // Next scheduler id.
+ Scheduler.nextId = 1;
return Scheduler;
}());
var FakeAsyncTestZoneSpec = /** @class */ (function () {
@@ -1124,7 +1172,7 @@ var __spread = (undefined && undefined.__spread) || function () {
};
FakeAsyncTestZoneSpec.prototype._setTimeout = function (fn, delay, args, isTimer) {
if (isTimer === void 0) { isTimer = true; }
- var removeTimerFn = this._dequeueTimer(this._scheduler.nextId);
+ var removeTimerFn = this._dequeueTimer(Scheduler.nextId);
// Queue the callback and dequeue the timer on success and error.
var cb = this._fnAndFlush(fn, { onSuccess: removeTimerFn, onError: removeTimerFn });
var id = this._scheduler.scheduleFunction(cb, delay, args, false, !isTimer);
@@ -1138,7 +1186,7 @@ var __spread = (undefined && undefined.__spread) || function () {
this._scheduler.removeScheduledFunctionWithId(id);
};
FakeAsyncTestZoneSpec.prototype._setInterval = function (fn, interval, args) {
- var id = this._scheduler.nextId;
+ var id = Scheduler.nextId;
var completers = { onSuccess: null, onError: this._dequeuePeriodicTimer(id) };
var cb = this._fnAndFlush(fn, completers);
// Use the callback created above to requeue on success.
@@ -1168,6 +1216,14 @@ var __spread = (undefined && undefined.__spread) || function () {
this._scheduler.setCurrentRealTime(realTime);
};
FakeAsyncTestZoneSpec.patchDate = function () {
+ if (!!global[Zone.__symbol__('disableDatePatching')]) {
+ // we don't want to patch global Date
+ // because in some case, global Date
+ // is already being patched, we need to provide
+ // an option to let user still use their
+ // own version of Date.
+ return;
+ }
if (global['Date'] === FakeDate) {
// already patched
return;
diff --git a/dist/zone.js b/dist/zone.js
index 80463ae48..f812a3b72 100644
--- a/dist/zone.js
+++ b/dist/zone.js
@@ -630,6 +630,7 @@ var Zone$1 = (function (global) {
patchMethod: function () { return noop; },
bindArguments: function () { return []; },
patchThen: function () { return noop; },
+ patchMacroTask: function () { return noop; },
setNativePromise: function (NativePromise) {
// sometimes NativePromise.resolve static function
// is not ready yet, (such as core-js/es6.promise)
@@ -638,6 +639,19 @@ var Zone$1 = (function (global) {
nativeMicroTaskQueuePromise = NativePromise.resolve(0);
}
},
+ patchEventPrototype: function () { return noop; },
+ isIEOrEdge: function () { return false; },
+ getGlobalObjects: function () { return undefined; },
+ ObjectDefineProperty: function () { return noop; },
+ ObjectGetOwnPropertyDescriptor: function () { return undefined; },
+ ObjectCreate: function () { return undefined; },
+ ArraySlice: function () { return []; },
+ patchClass: function () { return noop; },
+ wrapWithCurrentZone: function () { return noop; },
+ filterProperties: function () { return []; },
+ attachOriginToPatched: function () { return noop; },
+ _redefineProperty: function () { return noop; },
+ patchCallbacks: function () { return noop; }
};
var _currentZoneFrame = { parent: null, zone: new Zone(null, null) };
var _currentTask = null;
@@ -660,6 +674,13 @@ var __values = (undefined && undefined.__values) || function (o) {
}
};
};
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
var ObjectDefineProperty = Object.defineProperty;
@@ -931,10 +952,10 @@ Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
reject = rej;
});
function onResolve(value) {
- promise && (promise = null || resolve(value));
+ resolve(value);
}
function onReject(error) {
- promise && (promise = null || reject(error));
+ reject(error);
}
try {
for (var values_1 = __values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) {
@@ -1002,6 +1023,13 @@ Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
}
return promise;
};
+ Object.defineProperty(ZoneAwarePromise.prototype, Symbol.toStringTag, {
+ get: function () {
+ return 'Promise';
+ },
+ enumerable: true,
+ configurable: true
+ });
ZoneAwarePromise.prototype.then = function (onFulfilled, onRejected) {
var chainPromise = new this.constructor(null);
var zone = Zone.current;
@@ -1096,111 +1124,32 @@ Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) {
Ctor[symbolThenPatched] = true;
}
api.patchThen = patchThen;
+ function zoneify(fn) {
+ return function () {
+ var resultPromise = fn.apply(this, arguments);
+ if (resultPromise instanceof ZoneAwarePromise) {
+ return resultPromise;
+ }
+ var ctor = resultPromise.constructor;
+ if (!ctor[symbolThenPatched]) {
+ patchThen(ctor);
+ }
+ return resultPromise;
+ };
+ }
if (NativePromise) {
patchThen(NativePromise);
+ var fetch_1 = global['fetch'];
+ if (typeof fetch_1 == 'function') {
+ global[api.symbol('fetch')] = fetch_1;
+ global['fetch'] = zoneify(fetch_1);
+ }
}
// This is not part of public API, but it is useful for tests, so we expose it.
Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors;
return ZoneAwarePromise;
});
-/**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
-Zone.__load_patch('fetch', function (global, Zone, api) {
- var fetch = global['fetch'];
- var ZoneAwarePromise = global.Promise;
- var symbolThenPatched = api.symbol('thenPatched');
- var fetchTaskScheduling = api.symbol('fetchTaskScheduling');
- var fetchTaskAborting = api.symbol('fetchTaskAborting');
- if (typeof fetch !== 'function') {
- return;
- }
- var OriginalAbortController = global['AbortController'];
- var supportAbort = typeof OriginalAbortController === 'function';
- var abortNative = null;
- if (supportAbort) {
- global['AbortController'] = function () {
- var abortController = new OriginalAbortController();
- var signal = abortController.signal;
- signal.abortController = abortController;
- return abortController;
- };
- abortNative = api.patchMethod(OriginalAbortController.prototype, 'abort', function (delegate) { return function (self, args) {
- if (self.task) {
- return self.task.zone.cancelTask(self.task);
- }
- return delegate.apply(self, args);
- }; });
- }
- var placeholder = function () { };
- global['fetch'] = function () {
- var _this = this;
- var args = Array.prototype.slice.call(arguments);
- var options = args.length > 1 ? args[1] : null;
- var signal = options && options.signal;
- return new Promise(function (res, rej) {
- var task = Zone.current.scheduleMacroTask('fetch', placeholder, args, function () {
- var fetchPromise;
- var zone = Zone.current;
- try {
- zone[fetchTaskScheduling] = true;
- fetchPromise = fetch.apply(_this, args);
- }
- catch (error) {
- rej(error);
- return;
- }
- finally {
- zone[fetchTaskScheduling] = false;
- }
- if (!(fetchPromise instanceof ZoneAwarePromise)) {
- var ctor = fetchPromise.constructor;
- if (!ctor[symbolThenPatched]) {
- api.patchThen(ctor);
- }
- }
- fetchPromise.then(function (resource) {
- if (task.state !== 'notScheduled') {
- task.invoke();
- }
- res(resource);
- }, function (error) {
- if (task.state !== 'notScheduled') {
- task.invoke();
- }
- rej(error);
- });
- }, function () {
- if (!supportAbort) {
- rej('No AbortController supported, can not cancel fetch');
- return;
- }
- if (signal && signal.abortController && !signal.aborted &&
- typeof signal.abortController.abort === 'function' && abortNative) {
- try {
- Zone.current[fetchTaskAborting] = true;
- abortNative.call(signal.abortController);
- }
- finally {
- Zone.current[fetchTaskAborting] = false;
- }
- }
- else {
- rej('cancel fetch need a AbortController.signal');
- }
- });
- if (signal && signal.abortController) {
- signal.abortController.task = task;
- }
- });
- };
-});
-
/**
* @license
* Copyright Google Inc. All Rights Reserved.
@@ -1625,10 +1574,10 @@ function isIEOrEdge() {
if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1 || ua.indexOf('Edge/') !== -1) {
ieOrEdge = true;
}
- return ieOrEdge;
}
catch (error) {
}
+ return ieOrEdge;
}
/**
@@ -1651,7 +1600,7 @@ Zone.__load_patch('toString', function (global) {
var originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
if (originalDelegate) {
if (typeof originalDelegate === 'function') {
- return originalFunctionToString.apply(this[ORIGINAL_DELEGATE_SYMBOL], arguments);
+ return originalFunctionToString.call(originalDelegate);
}
else {
return Object.prototype.toString.call(originalDelegate);
@@ -1660,17 +1609,17 @@ Zone.__load_patch('toString', function (global) {
if (this === Promise) {
var nativePromise = global[PROMISE_SYMBOL];
if (nativePromise) {
- return originalFunctionToString.apply(nativePromise, arguments);
+ return originalFunctionToString.call(nativePromise);
}
}
if (this === Error) {
var nativeError = global[ERROR_SYMBOL];
if (nativeError) {
- return originalFunctionToString.apply(nativeError, arguments);
+ return originalFunctionToString.call(nativeError);
}
}
}
- return originalFunctionToString.apply(this, arguments);
+ return originalFunctionToString.call(this);
};
newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
Function.prototype.toString = newFunctionToString;
@@ -1681,7 +1630,7 @@ Zone.__load_patch('toString', function (global) {
if (this instanceof Promise) {
return PROMISE_OBJECT_TO_STRING;
}
- return originalObjectToString.apply(this, arguments);
+ return originalObjectToString.call(this);
};
});
@@ -2263,124 +2212,35 @@ function patchEventPrototype(global, api) {
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
-/**
- * @fileoverview
- * @suppress {missingRequire}
- */
-var taskSymbol = zoneSymbol('zoneTask');
-function patchTimer(window, setName, cancelName, nameSuffix) {
- var setNative = null;
- var clearNative = null;
- setName += nameSuffix;
- cancelName += nameSuffix;
- var tasksByHandleId = {};
- function scheduleTask(task) {
- var data = task.data;
- function timer() {
- try {
- task.invoke.apply(this, arguments);
- }
- finally {
- // issue-934, task will be cancelled
- // even it is a periodic task such as
- // setInterval
- if (!(task.data && task.data.isPeriodic)) {
- if (typeof data.handleId === 'number') {
- // in non-nodejs env, we remove timerId
- // from local cache
- delete tasksByHandleId[data.handleId];
- }
- else if (data.handleId) {
- // Node returns complex objects as handleIds
- // we remove task reference from timer object
- data.handleId[taskSymbol] = null;
- }
- }
- }
- }
- data.args[0] = timer;
- data.handleId = setNative.apply(window, data.args);
- return task;
- }
- function clearTask(task) {
- return clearNative(task.data.handleId);
+function patchCallbacks(api, target, targetName, method, callbacks) {
+ var symbol = Zone.__symbol__(method);
+ if (target[symbol]) {
+ return;
}
- setNative =
- patchMethod(window, setName, function (delegate) { return function (self, args) {
- if (typeof args[0] === 'function') {
- var options = {
- isPeriodic: nameSuffix === 'Interval',
- delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 :
- undefined,
- args: args
- };
- var task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask);
- if (!task) {
- return task;
- }
- // Node.js must additionally support the ref and unref functions.
- var handle = task.data.handleId;
- if (typeof handle === 'number') {
- // for non nodejs env, we save handleId: task
- // mapping in local cache for clearTimeout
- tasksByHandleId[handle] = task;
- }
- else if (handle) {
- // for nodejs env, we save task
- // reference in timerId Object for clearTimeout
- handle[taskSymbol] = task;
- }
- // check whether handle is null, because some polyfill or browser
- // may return undefined from setTimeout/setInterval/setImmediate/requestAnimationFrame
- if (handle && handle.ref && handle.unref && typeof handle.ref === 'function' &&
- typeof handle.unref === 'function') {
- task.ref = handle.ref.bind(handle);
- task.unref = handle.unref.bind(handle);
- }
- if (typeof handle === 'number' || handle) {
- return handle;
- }
- return task;
- }
- else {
- // cause an error by calling it directly.
- return delegate.apply(window, args);
- }
- }; });
- clearNative =
- patchMethod(window, cancelName, function (delegate) { return function (self, args) {
- var id = args[0];
- var task;
- if (typeof id === 'number') {
- // non nodejs env.
- task = tasksByHandleId[id];
- }
- else {
- // nodejs env.
- task = id && id[taskSymbol];
- // other environments.
- if (!task) {
- task = id;
- }
- }
- if (task && typeof task.type === 'string') {
- if (task.state !== 'notScheduled' &&
- (task.cancelFn && task.data.isPeriodic || task.runCount === 0)) {
- if (typeof id === 'number') {
- delete tasksByHandleId[id];
+ var nativeDelegate = target[symbol] = target[method];
+ target[method] = function (name, opts, options) {
+ if (opts && opts.prototype) {
+ callbacks.forEach(function (callback) {
+ var source = targetName + "." + method + "::" + callback;
+ var prototype = opts.prototype;
+ if (prototype.hasOwnProperty(callback)) {
+ var descriptor = api.ObjectGetOwnPropertyDescriptor(prototype, callback);
+ if (descriptor && descriptor.value) {
+ descriptor.value = api.wrapWithCurrentZone(descriptor.value, source);
+ api._redefineProperty(opts.prototype, callback, descriptor);
}
- else if (id) {
- id[taskSymbol] = null;
+ else if (prototype[callback]) {
+ prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
}
- // Do not cancel already canceled functions
- task.zone.cancelTask(task);
}
- }
- else {
- // cause an error by calling it directly.
- delegate.apply(window, args);
- }
- }; });
+ else if (prototype[callback]) {
+ prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
+ }
+ });
+ }
+ return nativeDelegate.call(target, name, opts, options);
+ };
+ api.attachOriginToPatched(target[method], nativeDelegate);
}
/**
@@ -2394,11 +2254,12 @@ function patchTimer(window, setName, cancelName, nameSuffix) {
* This is necessary for Chrome and Chrome mobile, to enable
* things like redefining `createdCallback` on an element.
*/
-var _defineProperty = Object[zoneSymbol('defineProperty')] = Object.defineProperty;
-var _getOwnPropertyDescriptor = Object[zoneSymbol('getOwnPropertyDescriptor')] =
+var zoneSymbol$1 = Zone.__symbol__;
+var _defineProperty = Object[zoneSymbol$1('defineProperty')] = Object.defineProperty;
+var _getOwnPropertyDescriptor = Object[zoneSymbol$1('getOwnPropertyDescriptor')] =
Object.getOwnPropertyDescriptor;
var _create = Object.create;
-var unconfigurablesKey = zoneSymbol('unconfigurables');
+var unconfigurablesKey = zoneSymbol$1('unconfigurables');
function propertyPatch() {
Object.defineProperty = function (obj, prop, desc) {
if (isUnconfigurable(obj, prop)) {
@@ -2490,60 +2351,6 @@ function _tryDefineProperty(obj, prop, desc, originalConfigurableFlag) {
}
}
-/**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
-// we have to patch the instance since the proto is non-configurable
-function apply(api, _global) {
- var WS = _global.WebSocket;
- // On Safari window.EventTarget doesn't exist so need to patch WS add/removeEventListener
- // On older Chrome, no need since EventTarget was already patched
- if (!_global.EventTarget) {
- patchEventTarget(_global, [WS.prototype]);
- }
- _global.WebSocket = function (x, y) {
- var socket = arguments.length > 1 ? new WS(x, y) : new WS(x);
- var proxySocket;
- var proxySocketProto;
- // Safari 7.0 has non-configurable own 'onmessage' and friends properties on the socket instance
- var onmessageDesc = ObjectGetOwnPropertyDescriptor(socket, 'onmessage');
- if (onmessageDesc && onmessageDesc.configurable === false) {
- proxySocket = ObjectCreate(socket);
- // socket have own property descriptor 'onopen', 'onmessage', 'onclose', 'onerror'
- // but proxySocket not, so we will keep socket as prototype and pass it to
- // patchOnProperties method
- proxySocketProto = socket;
- [ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR, 'send', 'close'].forEach(function (propName) {
- proxySocket[propName] = function () {
- var args = ArraySlice.call(arguments);
- if (propName === ADD_EVENT_LISTENER_STR || propName === REMOVE_EVENT_LISTENER_STR) {
- var eventName = args.length > 0 ? args[0] : undefined;
- if (eventName) {
- var propertySymbol = Zone.__symbol__('ON_PROPERTY' + eventName);
- socket[propertySymbol] = proxySocket[propertySymbol];
- }
- }
- return socket[propName].apply(socket, args);
- };
- });
- }
- else {
- // we can patch the real socket
- proxySocket = socket;
- }
- patchOnProperties(proxySocket, ['close', 'error', 'message', 'open'], proxySocketProto);
- return proxySocket;
- };
- var globalWebSocket = _global['WebSocket'];
- for (var prop in WS) {
- globalWebSocket[prop] = WS[prop];
- }
-}
-
/**
* @license
* Copyright Google Inc. All Rights Reserved.
@@ -2792,144 +2599,111 @@ function propertyDescriptorPatch(api, _global) {
if (isNode && !isMix) {
return;
}
- var supportsWebSocket = typeof WebSocket !== 'undefined';
- if (canPatchViaPropertyDescriptor()) {
- var ignoreProperties = _global['__Zone_ignore_on_properties'];
- // for browsers that we can patch the descriptor: Chrome & Firefox
- if (isBrowser) {
- var internalWindow = window;
- var ignoreErrorProperties = isIE ? [{ target: internalWindow, ignoreProperties: ['error'] }] : [];
- // in IE/Edge, onProp not exist in window object, but in WindowPrototype
- // so we need to pass WindowPrototype to check onProp exist or not
- patchFilteredProperties(internalWindow, eventNames.concat(['messageerror']), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow));
- patchFilteredProperties(Document.prototype, eventNames, ignoreProperties);
- if (typeof internalWindow['SVGElement'] !== 'undefined') {
- patchFilteredProperties(internalWindow['SVGElement'].prototype, eventNames, ignoreProperties);
- }
- patchFilteredProperties(Element.prototype, eventNames, ignoreProperties);
- patchFilteredProperties(HTMLElement.prototype, eventNames, ignoreProperties);
- patchFilteredProperties(HTMLMediaElement.prototype, mediaElementEventNames, ignoreProperties);
- patchFilteredProperties(HTMLFrameSetElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
- patchFilteredProperties(HTMLBodyElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
- patchFilteredProperties(HTMLFrameElement.prototype, frameEventNames, ignoreProperties);
- patchFilteredProperties(HTMLIFrameElement.prototype, frameEventNames, ignoreProperties);
- var HTMLMarqueeElement_1 = internalWindow['HTMLMarqueeElement'];
- if (HTMLMarqueeElement_1) {
- patchFilteredProperties(HTMLMarqueeElement_1.prototype, marqueeEventNames, ignoreProperties);
- }
- var Worker_1 = internalWindow['Worker'];
- if (Worker_1) {
- patchFilteredProperties(Worker_1.prototype, workerEventNames, ignoreProperties);
- }
- }
- patchFilteredProperties(XMLHttpRequest.prototype, XMLHttpRequestEventNames, ignoreProperties);
- var XMLHttpRequestEventTarget_1 = _global['XMLHttpRequestEventTarget'];
- if (XMLHttpRequestEventTarget_1) {
- patchFilteredProperties(XMLHttpRequestEventTarget_1 && XMLHttpRequestEventTarget_1.prototype, XMLHttpRequestEventNames, ignoreProperties);
- }
- if (typeof IDBIndex !== 'undefined') {
- patchFilteredProperties(IDBIndex.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBOpenDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBDatabase.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBTransaction.prototype, IDBIndexEventNames, ignoreProperties);
- patchFilteredProperties(IDBCursor.prototype, IDBIndexEventNames, ignoreProperties);
- }
- if (supportsWebSocket) {
- patchFilteredProperties(WebSocket.prototype, websocketEventNames, ignoreProperties);
- }
+ if (Zone[api.symbol('patchEvents')]) {
+ // events are already been patched by legacy patch.
+ return;
}
- else {
- // Safari, Android browsers (Jelly Bean)
- patchViaCapturingAllTheEvents();
- patchClass('XMLHttpRequest');
- if (supportsWebSocket) {
- apply(api, _global);
- }
+ var supportsWebSocket = typeof WebSocket !== 'undefined';
+ var ignoreProperties = _global['__Zone_ignore_on_properties'];
+ // for browsers that we can patch the descriptor: Chrome & Firefox
+ if (isBrowser) {
+ var internalWindow = window;
+ var ignoreErrorProperties = isIE ? [{ target: internalWindow, ignoreProperties: ['error'] }] : [];
+ // in IE/Edge, onProp not exist in window object, but in WindowPrototype
+ // so we need to pass WindowPrototype to check onProp exist or not
+ patchFilteredProperties(internalWindow, eventNames.concat(['messageerror']), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow));
+ patchFilteredProperties(Document.prototype, eventNames, ignoreProperties);
+ if (typeof internalWindow['SVGElement'] !== 'undefined') {
+ patchFilteredProperties(internalWindow['SVGElement'].prototype, eventNames, ignoreProperties);
+ }
+ patchFilteredProperties(Element.prototype, eventNames, ignoreProperties);
+ patchFilteredProperties(HTMLElement.prototype, eventNames, ignoreProperties);
+ patchFilteredProperties(HTMLMediaElement.prototype, mediaElementEventNames, ignoreProperties);
+ patchFilteredProperties(HTMLFrameSetElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
+ patchFilteredProperties(HTMLBodyElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties);
+ patchFilteredProperties(HTMLFrameElement.prototype, frameEventNames, ignoreProperties);
+ patchFilteredProperties(HTMLIFrameElement.prototype, frameEventNames, ignoreProperties);
+ var HTMLMarqueeElement_1 = internalWindow['HTMLMarqueeElement'];
+ if (HTMLMarqueeElement_1) {
+ patchFilteredProperties(HTMLMarqueeElement_1.prototype, marqueeEventNames, ignoreProperties);
+ }
+ var Worker_1 = internalWindow['Worker'];
+ if (Worker_1) {
+ patchFilteredProperties(Worker_1.prototype, workerEventNames, ignoreProperties);
+ }
+ }
+ patchFilteredProperties(XMLHttpRequest.prototype, XMLHttpRequestEventNames, ignoreProperties);
+ var XMLHttpRequestEventTarget = _global['XMLHttpRequestEventTarget'];
+ if (XMLHttpRequestEventTarget) {
+ patchFilteredProperties(XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype, XMLHttpRequestEventNames, ignoreProperties);
+ }
+ if (typeof IDBIndex !== 'undefined') {
+ patchFilteredProperties(IDBIndex.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBOpenDBRequest.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBDatabase.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBTransaction.prototype, IDBIndexEventNames, ignoreProperties);
+ patchFilteredProperties(IDBCursor.prototype, IDBIndexEventNames, ignoreProperties);
+ }
+ if (supportsWebSocket) {
+ patchFilteredProperties(WebSocket.prototype, websocketEventNames, ignoreProperties);
}
}
-function canPatchViaPropertyDescriptor() {
- if ((isBrowser || isMix) && !ObjectGetOwnPropertyDescriptor(HTMLElement.prototype, 'onclick') &&
- typeof Element !== 'undefined') {
- // WebKit https://bugs.webkit.org/show_bug.cgi?id=134364
- // IDL interface attributes are not configurable
- var desc = ObjectGetOwnPropertyDescriptor(Element.prototype, 'onclick');
- if (desc && !desc.configurable)
- return false;
- }
- var ON_READY_STATE_CHANGE = 'onreadystatechange';
- var XMLHttpRequestPrototype = XMLHttpRequest.prototype;
- var xhrDesc = ObjectGetOwnPropertyDescriptor(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE);
- // add enumerable and configurable here because in opera
- // by default XMLHttpRequest.prototype.onreadystatechange is undefined
- // without adding enumerable and configurable will cause onreadystatechange
- // non-configurable
- // and if XMLHttpRequest.prototype.onreadystatechange is undefined,
- // we should set a real desc instead a fake one
- if (xhrDesc) {
- ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
- enumerable: true,
- configurable: true,
- get: function () {
- return true;
- }
- });
- var req = new XMLHttpRequest();
- var result = !!req.onreadystatechange;
- // restore original desc
- ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, xhrDesc || {});
- return result;
- }
- else {
- var SYMBOL_FAKE_ONREADYSTATECHANGE_1 = zoneSymbol('fake');
- ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
- enumerable: true,
- configurable: true,
- get: function () {
- return this[SYMBOL_FAKE_ONREADYSTATECHANGE_1];
- },
- set: function (value) {
- this[SYMBOL_FAKE_ONREADYSTATECHANGE_1] = value;
- }
- });
- var req = new XMLHttpRequest();
- var detectFunc = function () { };
- req.onreadystatechange = detectFunc;
- var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
- req.onreadystatechange = null;
- return result;
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+Zone.__load_patch('util', function (global, Zone, api) {
+ api.patchOnProperties = patchOnProperties;
+ api.patchMethod = patchMethod;
+ api.bindArguments = bindArguments;
+ api.patchMacroTask = patchMacroTask;
+ // In earlier version of zone.js (<0.9.0), we use env name `__zone_symbol__BLACK_LISTED_EVENTS` to
+ // define which events will not be patched by `Zone.js`.
+ // In newer version (>=0.9.0), we change the env name to `__zone_symbol__UNPATCHED_EVENTS` to keep
+ // the name consistent with angular repo.
+ // The `__zone_symbol__BLACK_LISTED_EVENTS` is deprecated, but it is still be supported for
+ // backwards compatibility.
+ var SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');
+ var SYMBOL_UNPATCHED_EVENTS = Zone.__symbol__('UNPATCHED_EVENTS');
+ if (global[SYMBOL_UNPATCHED_EVENTS]) {
+ global[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_UNPATCHED_EVENTS];
}
-}
-var unboundKey = zoneSymbol('unbound');
-// Whenever any eventListener fires, we check the eventListener target and all parents
-// for `onwhatever` properties and replace them with zone-bound functions
-// - Chrome (for now)
-function patchViaCapturingAllTheEvents() {
- var _loop_1 = function (i) {
- var property = eventNames[i];
- var onproperty = 'on' + property;
- self.addEventListener(property, function (event) {
- var elt = event.target, bound, source;
- if (elt) {
- source = elt.constructor['name'] + '.' + onproperty;
- }
- else {
- source = 'unknown.' + onproperty;
- }
- while (elt) {
- if (elt[onproperty] && !elt[onproperty][unboundKey]) {
- bound = wrapWithCurrentZone(elt[onproperty], source);
- bound[unboundKey] = elt[onproperty];
- elt[onproperty] = bound;
- }
- elt = elt.parentElement;
- }
- }, true);
- };
- for (var i = 0; i < eventNames.length; i++) {
- _loop_1(i);
+ if (global[SYMBOL_BLACK_LISTED_EVENTS]) {
+ Zone[SYMBOL_BLACK_LISTED_EVENTS] = Zone[SYMBOL_UNPATCHED_EVENTS] =
+ global[SYMBOL_BLACK_LISTED_EVENTS];
}
-}
+ api.patchEventPrototype = patchEventPrototype;
+ api.patchEventTarget = patchEventTarget;
+ api.isIEOrEdge = isIEOrEdge;
+ api.ObjectDefineProperty = ObjectDefineProperty;
+ api.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;
+ api.ObjectCreate = ObjectCreate;
+ api.ArraySlice = ArraySlice;
+ api.patchClass = patchClass;
+ api.wrapWithCurrentZone = wrapWithCurrentZone;
+ api.filterProperties = filterProperties;
+ api.attachOriginToPatched = attachOriginToPatched;
+ api._redefineProperty = _redefineProperty;
+ api.patchCallbacks = patchCallbacks;
+ api.getGlobalObjects = function () { return ({
+ globalSources: globalSources,
+ zoneSymbolEventNames: zoneSymbolEventNames$1,
+ eventNames: eventNames,
+ isBrowser: isBrowser,
+ isMix: isMix,
+ isNode: isNode,
+ TRUE_STR: TRUE_STR,
+ FALSE_STR: FALSE_STR,
+ ZONE_SYMBOL_PREFIX: ZONE_SYMBOL_PREFIX,
+ ADD_EVENT_LISTENER_STR: ADD_EVENT_LISTENER_STR,
+ REMOVE_EVENT_LISTENER_STR: REMOVE_EVENT_LISTENER_STR
+ }); };
+});
/**
* @license
@@ -2938,7 +2712,16 @@ function patchViaCapturingAllTheEvents() {
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
-function eventTargetPatch(_global, api) {
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function eventTargetLegacyPatch(_global, api) {
+ var _a = api.getGlobalObjects(), eventNames = _a.eventNames, globalSources = _a.globalSources, zoneSymbolEventNames = _a.zoneSymbolEventNames, TRUE_STR = _a.TRUE_STR, FALSE_STR = _a.FALSE_STR, ZONE_SYMBOL_PREFIX = _a.ZONE_SYMBOL_PREFIX;
var WTF_ISSUE_555 = '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';
var NO_EVENT_TARGET = '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(',');
@@ -2951,7 +2734,7 @@ function eventTargetPatch(_global, api) {
apis = WTF_ISSUE_555_ARRAY.map(function (v) { return 'HTML' + v + 'Element'; }).concat(NO_EVENT_TARGET);
}
else if (_global[EVENT_TARGET]) {
- apis.push(EVENT_TARGET);
+ // EventTarget is already patched in browser.ts
}
else {
// Note: EventTarget is not available in all browsers,
@@ -2960,7 +2743,7 @@ function eventTargetPatch(_global, api) {
}
var isDisableIECheck = _global['__Zone_disable_IE_check'] || false;
var isEnableCrossContextCheck = _global['__Zone_enable_cross_context_check'] || false;
- var ieOrEdge = isIEOrEdge();
+ var ieOrEdge = api.isIEOrEdge();
var ADD_EVENT_LISTENER_SOURCE = '.addEventListener:';
var FUNCTION_WRAPPER = '[object FunctionWrapper]';
var BROWSER_TOOLS = 'function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }';
@@ -2971,9 +2754,9 @@ function eventTargetPatch(_global, api) {
var trueEventName = eventName + TRUE_STR;
var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
- zoneSymbolEventNames$1[eventName] = {};
- zoneSymbolEventNames$1[eventName][FALSE_STR] = symbol;
- zoneSymbolEventNames$1[eventName][TRUE_STR] = symbolCapture;
+ zoneSymbolEventNames[eventName] = {};
+ zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
}
// predefine all task.source string
for (var i = 0; i < WTF_ISSUE_555.length; i++) {
@@ -3025,13 +2808,9 @@ function eventTargetPatch(_global, api) {
}
// vh is validateHandler to check event handler
// is valid or not(for security check)
- patchEventTarget(_global, apiTypes, { vh: checkIEAndCrossContext });
- api.patchEventTarget = patchEventTarget;
+ api.patchEventTarget(_global, apiTypes, { vh: checkIEAndCrossContext });
return true;
}
-function patchEvent(global, api) {
- patchEventPrototype(global, api);
-}
/**
* @license
@@ -3040,49 +2819,379 @@ function patchEvent(global, api) {
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
-function patchCallbacks(target, targetName, method, callbacks) {
- var symbol = Zone.__symbol__(method);
- if (target[symbol]) {
- return;
+// we have to patch the instance since the proto is non-configurable
+function apply(api, _global) {
+ var _a = api.getGlobalObjects(), ADD_EVENT_LISTENER_STR = _a.ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR = _a.REMOVE_EVENT_LISTENER_STR;
+ var WS = _global.WebSocket;
+ // On Safari window.EventTarget doesn't exist so need to patch WS add/removeEventListener
+ // On older Chrome, no need since EventTarget was already patched
+ if (!_global.EventTarget) {
+ api.patchEventTarget(_global, [WS.prototype]);
}
- var nativeDelegate = target[symbol] = target[method];
- target[method] = function (name, opts, options) {
- if (opts && opts.prototype) {
- callbacks.forEach(function (callback) {
- var source = targetName + "." + method + "::" + callback;
- var prototype = opts.prototype;
- if (prototype.hasOwnProperty(callback)) {
- var descriptor = ObjectGetOwnPropertyDescriptor(prototype, callback);
- if (descriptor && descriptor.value) {
- descriptor.value = wrapWithCurrentZone(descriptor.value, source);
- _redefineProperty(opts.prototype, callback, descriptor);
- }
- else if (prototype[callback]) {
- prototype[callback] = wrapWithCurrentZone(prototype[callback], source);
+ _global.WebSocket = function (x, y) {
+ var socket = arguments.length > 1 ? new WS(x, y) : new WS(x);
+ var proxySocket;
+ var proxySocketProto;
+ // Safari 7.0 has non-configurable own 'onmessage' and friends properties on the socket instance
+ var onmessageDesc = api.ObjectGetOwnPropertyDescriptor(socket, 'onmessage');
+ if (onmessageDesc && onmessageDesc.configurable === false) {
+ proxySocket = api.ObjectCreate(socket);
+ // socket have own property descriptor 'onopen', 'onmessage', 'onclose', 'onerror'
+ // but proxySocket not, so we will keep socket as prototype and pass it to
+ // patchOnProperties method
+ proxySocketProto = socket;
+ [ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR, 'send', 'close'].forEach(function (propName) {
+ proxySocket[propName] = function () {
+ var args = api.ArraySlice.call(arguments);
+ if (propName === ADD_EVENT_LISTENER_STR || propName === REMOVE_EVENT_LISTENER_STR) {
+ var eventName = args.length > 0 ? args[0] : undefined;
+ if (eventName) {
+ var propertySymbol = Zone.__symbol__('ON_PROPERTY' + eventName);
+ socket[propertySymbol] = proxySocket[propertySymbol];
+ }
}
- }
- else if (prototype[callback]) {
- prototype[callback] = wrapWithCurrentZone(prototype[callback], source);
- }
+ return socket[propName].apply(socket, args);
+ };
});
}
- return nativeDelegate.call(target, name, opts, options);
+ else {
+ // we can patch the real socket
+ proxySocket = socket;
+ }
+ api.patchOnProperties(proxySocket, ['close', 'error', 'message', 'open'], proxySocketProto);
+ return proxySocket;
};
- attachOriginToPatched(target[method], nativeDelegate);
+ var globalWebSocket = _global['WebSocket'];
+ for (var prop in WS) {
+ globalWebSocket[prop] = WS[prop];
+ }
}
-function registerElementPatch(_global) {
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {globalThis}
+ */
+function propertyDescriptorLegacyPatch(api, _global) {
+ var _a = api.getGlobalObjects(), isNode = _a.isNode, isMix = _a.isMix;
+ if (isNode && !isMix) {
+ return;
+ }
+ var supportsWebSocket = typeof WebSocket !== 'undefined';
+ if (!canPatchViaPropertyDescriptor(api)) {
+ // Safari, Android browsers (Jelly Bean)
+ patchViaCapturingAllTheEvents(api);
+ api.patchClass('XMLHttpRequest');
+ if (supportsWebSocket) {
+ apply(api, _global);
+ }
+ Zone[api.symbol('patchEvents')] = true;
+ }
+}
+function canPatchViaPropertyDescriptor(api) {
+ var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
+ if ((isBrowser || isMix) &&
+ !api.ObjectGetOwnPropertyDescriptor(HTMLElement.prototype, 'onclick') &&
+ typeof Element !== 'undefined') {
+ // WebKit https://bugs.webkit.org/show_bug.cgi?id=134364
+ // IDL interface attributes are not configurable
+ var desc = api.ObjectGetOwnPropertyDescriptor(Element.prototype, 'onclick');
+ if (desc && !desc.configurable)
+ return false;
+ }
+ var ON_READY_STATE_CHANGE = 'onreadystatechange';
+ var XMLHttpRequestPrototype = XMLHttpRequest.prototype;
+ var xhrDesc = api.ObjectGetOwnPropertyDescriptor(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE);
+ // add enumerable and configurable here because in opera
+ // by default XMLHttpRequest.prototype.onreadystatechange is undefined
+ // without adding enumerable and configurable will cause onreadystatechange
+ // non-configurable
+ // and if XMLHttpRequest.prototype.onreadystatechange is undefined,
+ // we should set a real desc instead a fake one
+ if (xhrDesc) {
+ api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
+ enumerable: true,
+ configurable: true,
+ get: function () {
+ return true;
+ }
+ });
+ var req = new XMLHttpRequest();
+ var result = !!req.onreadystatechange;
+ // restore original desc
+ api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, xhrDesc || {});
+ return result;
+ }
+ else {
+ var SYMBOL_FAKE_ONREADYSTATECHANGE_1 = api.symbol('fake');
+ api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, {
+ enumerable: true,
+ configurable: true,
+ get: function () {
+ return this[SYMBOL_FAKE_ONREADYSTATECHANGE_1];
+ },
+ set: function (value) {
+ this[SYMBOL_FAKE_ONREADYSTATECHANGE_1] = value;
+ }
+ });
+ var req = new XMLHttpRequest();
+ var detectFunc = function () { };
+ req.onreadystatechange = detectFunc;
+ var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
+ req.onreadystatechange = null;
+ return result;
+ }
+}
+// Whenever any eventListener fires, we check the eventListener target and all parents
+// for `onwhatever` properties and replace them with zone-bound functions
+// - Chrome (for now)
+function patchViaCapturingAllTheEvents(api) {
+ var eventNames = api.getGlobalObjects().eventNames;
+ var unboundKey = api.symbol('unbound');
+ var _loop_1 = function (i) {
+ var property = eventNames[i];
+ var onproperty = 'on' + property;
+ self.addEventListener(property, function (event) {
+ var elt = event.target, bound, source;
+ if (elt) {
+ source = elt.constructor['name'] + '.' + onproperty;
+ }
+ else {
+ source = 'unknown.' + onproperty;
+ }
+ while (elt) {
+ if (elt[onproperty] && !elt[onproperty][unboundKey]) {
+ bound = api.wrapWithCurrentZone(elt[onproperty], source);
+ bound[unboundKey] = elt[onproperty];
+ elt[onproperty] = bound;
+ }
+ elt = elt.parentElement;
+ }
+ }, true);
+ };
+ for (var i = 0; i < eventNames.length; i++) {
+ _loop_1(i);
+ }
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function registerElementPatch(_global, api) {
+ var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
if ((!isBrowser && !isMix) || !('registerElement' in _global.document)) {
return;
}
var callbacks = ['createdCallback', 'attachedCallback', 'detachedCallback', 'attributeChangedCallback'];
- patchCallbacks(document, 'Document', 'registerElement', callbacks);
+ api.patchCallbacks(api, document, 'Document', 'registerElement', callbacks);
}
-function patchCustomElements(_global) {
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {missingRequire}
+ */
+(function (_global) {
+ _global['__zone_symbol__legacyPatch'] = function () {
+ var Zone = _global['Zone'];
+ Zone.__load_patch('registerElement', function (global, Zone, api) {
+ registerElementPatch(global, api);
+ });
+ Zone.__load_patch('EventTargetLegacy', function (global, Zone, api) {
+ eventTargetLegacyPatch(global, api);
+ propertyDescriptorLegacyPatch(api, global);
+ });
+ };
+})(typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global);
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+/**
+ * @fileoverview
+ * @suppress {missingRequire}
+ */
+var taskSymbol = zoneSymbol('zoneTask');
+function patchTimer(window, setName, cancelName, nameSuffix) {
+ var setNative = null;
+ var clearNative = null;
+ setName += nameSuffix;
+ cancelName += nameSuffix;
+ var tasksByHandleId = {};
+ function scheduleTask(task) {
+ var data = task.data;
+ function timer() {
+ try {
+ task.invoke.apply(this, arguments);
+ }
+ finally {
+ // issue-934, task will be cancelled
+ // even it is a periodic task such as
+ // setInterval
+ if (!(task.data && task.data.isPeriodic)) {
+ if (typeof data.handleId === 'number') {
+ // in non-nodejs env, we remove timerId
+ // from local cache
+ delete tasksByHandleId[data.handleId];
+ }
+ else if (data.handleId) {
+ // Node returns complex objects as handleIds
+ // we remove task reference from timer object
+ data.handleId[taskSymbol] = null;
+ }
+ }
+ }
+ }
+ data.args[0] = timer;
+ data.handleId = setNative.apply(window, data.args);
+ return task;
+ }
+ function clearTask(task) {
+ return clearNative(task.data.handleId);
+ }
+ setNative =
+ patchMethod(window, setName, function (delegate) { return function (self, args) {
+ if (typeof args[0] === 'function') {
+ var options = {
+ isPeriodic: nameSuffix === 'Interval',
+ delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 :
+ undefined,
+ args: args
+ };
+ var task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask);
+ if (!task) {
+ return task;
+ }
+ // Node.js must additionally support the ref and unref functions.
+ var handle = task.data.handleId;
+ if (typeof handle === 'number') {
+ // for non nodejs env, we save handleId: task
+ // mapping in local cache for clearTimeout
+ tasksByHandleId[handle] = task;
+ }
+ else if (handle) {
+ // for nodejs env, we save task
+ // reference in timerId Object for clearTimeout
+ handle[taskSymbol] = task;
+ }
+ // check whether handle is null, because some polyfill or browser
+ // may return undefined from setTimeout/setInterval/setImmediate/requestAnimationFrame
+ if (handle && handle.ref && handle.unref && typeof handle.ref === 'function' &&
+ typeof handle.unref === 'function') {
+ task.ref = handle.ref.bind(handle);
+ task.unref = handle.unref.bind(handle);
+ }
+ if (typeof handle === 'number' || handle) {
+ return handle;
+ }
+ return task;
+ }
+ else {
+ // cause an error by calling it directly.
+ return delegate.apply(window, args);
+ }
+ }; });
+ clearNative =
+ patchMethod(window, cancelName, function (delegate) { return function (self, args) {
+ var id = args[0];
+ var task;
+ if (typeof id === 'number') {
+ // non nodejs env.
+ task = tasksByHandleId[id];
+ }
+ else {
+ // nodejs env.
+ task = id && id[taskSymbol];
+ // other environments.
+ if (!task) {
+ task = id;
+ }
+ }
+ if (task && typeof task.type === 'string') {
+ if (task.state !== 'notScheduled' &&
+ (task.cancelFn && task.data.isPeriodic || task.runCount === 0)) {
+ if (typeof id === 'number') {
+ delete tasksByHandleId[id];
+ }
+ else if (id) {
+ id[taskSymbol] = null;
+ }
+ // Do not cancel already canceled functions
+ task.zone.cancelTask(task);
+ }
+ }
+ else {
+ // cause an error by calling it directly.
+ delegate.apply(window, args);
+ }
+ }; });
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function patchCustomElements(_global, api) {
+ var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix;
if ((!isBrowser && !isMix) || !('customElements' in _global)) {
return;
}
var callbacks = ['connectedCallback', 'disconnectedCallback', 'adoptedCallback', 'attributeChangedCallback'];
- patchCallbacks(_global.customElements, 'customElements', 'define', callbacks);
+ api.patchCallbacks(api, _global.customElements, 'customElements', 'define', callbacks);
+}
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+function eventTargetPatch(_global, api) {
+ var _a = api.getGlobalObjects(), eventNames = _a.eventNames, zoneSymbolEventNames = _a.zoneSymbolEventNames, TRUE_STR = _a.TRUE_STR, FALSE_STR = _a.FALSE_STR, ZONE_SYMBOL_PREFIX = _a.ZONE_SYMBOL_PREFIX;
+ // predefine all __zone_symbol__ + eventName + true/false string
+ for (var i = 0; i < eventNames.length; i++) {
+ var eventName = eventNames[i];
+ var falseEventName = eventName + FALSE_STR;
+ var trueEventName = eventName + TRUE_STR;
+ var symbol = ZONE_SYMBOL_PREFIX + falseEventName;
+ var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
+ zoneSymbolEventNames[eventName] = {};
+ zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
+ zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
+ }
+ var EVENT_TARGET = _global['EventTarget'];
+ if (!EVENT_TARGET || !EVENT_TARGET.prototype) {
+ return;
+ }
+ api.patchEventTarget(_global, [EVENT_TARGET && EVENT_TARGET.prototype]);
+ return true;
+}
+function patchEvent$1(global, api) {
+ api.patchEventPrototype(global, api);
}
/**
@@ -3096,10 +3205,11 @@ function patchCustomElements(_global) {
* @fileoverview
* @suppress {missingRequire}
*/
-Zone.__load_patch('util', function (global, Zone, api) {
- api.patchOnProperties = patchOnProperties;
- api.patchMethod = patchMethod;
- api.bindArguments = bindArguments;
+Zone.__load_patch('legacy', function (global) {
+ var legacyPatch = global[Zone.__symbol__('legacyPatch')];
+ if (legacyPatch) {
+ legacyPatch();
+ }
});
Zone.__load_patch('timers', function (global) {
var set = 'set';
@@ -3125,12 +3235,7 @@ Zone.__load_patch('blocking', function (global, Zone) {
}
});
Zone.__load_patch('EventTarget', function (global, Zone, api) {
- // load blackListEvents from global
- var SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');
- if (global[SYMBOL_BLACK_LISTED_EVENTS]) {
- Zone[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_BLACK_LISTED_EVENTS];
- }
- patchEvent(global, api);
+ patchEvent$1(global, api);
eventTargetPatch(global, api);
// patch XMLHttpRequestEventTarget's addEventListener/removeEventListener
var XMLHttpRequestEventTarget = global['XMLHttpRequestEventTarget'];
@@ -3147,17 +3252,7 @@ Zone.__load_patch('on_property', function (global, Zone, api) {
propertyPatch();
});
Zone.__load_patch('customElements', function (global, Zone, api) {
- registerElementPatch(global);
- patchCustomElements(global);
-});
-Zone.__load_patch('canvas', function (global) {
- var HTMLCanvasElement = global['HTMLCanvasElement'];
- if (typeof HTMLCanvasElement !== 'undefined' && HTMLCanvasElement.prototype &&
- HTMLCanvasElement.prototype.toBlob) {
- patchMacroTask(HTMLCanvasElement.prototype, 'toBlob', function (self, args) {
- return { name: 'HTMLCanvasElement.toBlob', target: self, cbIdx: 0, args: args };
- });
- }
+ patchCustomElements(global, api);
});
Zone.__load_patch('XHR', function (global, Zone) {
// Treat XMLHttpRequest as a macrotask.
diff --git a/dist/zone.js.d.ts b/dist/zone.js.d.ts
index 5420fe1ba..8a033d536 100644
--- a/dist/zone.js.d.ts
+++ b/dist/zone.js.d.ts
@@ -93,9 +93,9 @@
* yielding.
*
*
- * ### [TimerTask]
+ * ### [MacroTask]
*
- * [TimerTask]s represent work which will be done after some delay. (Sometimes the delay is
+ * [MacroTask]s represent work which will be done after some delay. (Sometimes the delay is
* approximate such as on next available animation frame). Typically these methods include:
* `setTimeout`, `setImmediate`, `setInterval`, `requestAnimationFrame`, and all browser specific
* variants.
diff --git a/dist/zone.min.js b/dist/zone.min.js
index 00515ef75..3c96665e7 100644
--- a/dist/zone.min.js
+++ b/dist/zone.min.js
@@ -1,2 +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){return Zone.current.wrap(e,t)}function t(e,t,n,r,o){return Zone.current.scheduleMacroTask(e,t,n,r,o)}function n(t,n){for(var r=t.length-1;r>=0;r--)"function"==typeof t[r]&&(t[r]=e(t[r],n+"_"+r));return t}function r(e,t){for(var r=e.constructor.name,a=function(a){var i=t[a],s=e[i];if(s){var c=L(e,i);if(!o(c))return"continue";e[i]=function(e){var t=function(){return e.apply(this,n(arguments,r+"."+i))};return f(t,e),t}(s)}},i=0;i=0&&"function"==typeof a[i.cbIdx]?t(i.name,a[i.cbIdx],i,o):e.apply(n,a)}})}function f(e,t){e[U("OriginalDelegate")]=t}function p(){try{var e=K.navigator.userAgent;if(e.indexOf("MSIE ")!==-1||e.indexOf("Trident/")!==-1)return!0}catch(t){}return!1}function h(){if(se)return ce;se=!0;try{var e=K.navigator.userAgent;return e.indexOf("MSIE ")===-1&&e.indexOf("Trident/")===-1&&e.indexOf("Edge/")===-1||(ce=!0),ce}catch(t){}}function d(e,t,n){function r(t,n){function r(e){ue||"boolean"==typeof w.options||"undefined"==typeof w.options||null===w.options||(e.options=!!w.options.capture,w.options=e.options)}if(!t)return!1;var h=!0;n&&void 0!==n.useG&&(h=n.useG);var y=n&&n.vh,m=!0;n&&void 0!==n.chkDup&&(m=n.chkDup);var k=!1;n&&void 0!==n.rt&&(k=n.rt);for(var _=t;_&&!_.hasOwnProperty(o);)_=R(_);if(!_&&t[o]&&(_=t),!_)return!1;if(_[c])return!1;var b,T=n&&n.eventNameToString,w={},E=_[c]=_[o],S=_[U(a)]=_[a],D=_[U(i)]=_[i],Z=_[U(s)]=_[s];n&&n.prepend&&(b=_[U(n.prepend)]=_[n.prepend]);var z=function(e){if(!w.isExisting)return r(e),E.call(w.target,w.eventName,w.capture?g:d,w.options)},O=function(e){if(!e.isRemoved){var t=he[e.eventName],n=void 0;t&&(n=t[e.capture?W:X]);var r=n&&e.target[n];if(r)for(var o=0;o1?new n(e,t):new n(e),s=L(a,"onmessage");return s&&s.configurable===!1?(r=H(a),o=a,[A,B,"send","close"].forEach(function(e){r[e]=function(){var t=F.call(arguments);if(e===A||e===B){var n=t.length>0?t[0]:void 0;if(n){var o=Zone.__symbol__("ON_PROPERTY"+n);a[o]=r[o]}}return a[e].apply(a,t)}})):r=a,i(r,["close","error","message","open"],o),r};var r=t.WebSocket;for(var o in n)r[o]=n[o]}function E(e,t,n){if(!n||0===n.length)return t;var r=n.filter(function(t){return t.target===e});if(!r||0===r.length)return t;var o=r[0].ignoreProperties;return t.filter(function(e){return o.indexOf(e)===-1})}function S(e,t,n,r){if(e){var o=E(e,t,n);i(e,o,r)}}function D(e,t){if(!ee||ne){var n="undefined"!=typeof WebSocket;if(Z()){var r=t.__Zone_ignore_on_properties;if(te){var o=window,a=p?[{target:o,ignoreProperties:["error"]}]:[];S(o,He.concat(["messageerror"]),r?r.concat(a):r,R(o)),S(Document.prototype,He,r),"undefined"!=typeof o.SVGElement&&S(o.SVGElement.prototype,He,r),S(Element.prototype,He,r),S(HTMLElement.prototype,He,r),S(HTMLMediaElement.prototype,De,r),S(HTMLFrameSetElement.prototype,Ee.concat(je),r),S(HTMLBodyElement.prototype,Ee.concat(je),r),S(HTMLFrameElement.prototype,Ce,r),S(HTMLIFrameElement.prototype,Ce,r);var i=o.HTMLMarqueeElement;i&&S(i.prototype,Ie,r);var c=o.Worker;c&&S(c.prototype,Re,r)}S(XMLHttpRequest.prototype,Me,r);var u=t.XMLHttpRequestEventTarget;u&&S(u&&u.prototype,Me,r),"undefined"!=typeof IDBIndex&&(S(IDBIndex.prototype,Le,r),S(IDBRequest.prototype,Le,r),S(IDBOpenDBRequest.prototype,Le,r),S(IDBDatabase.prototype,Le,r),S(IDBTransaction.prototype,Le,r),S(IDBCursor.prototype,Le,r)),n&&S(WebSocket.prototype,xe,r)}else z(),s("XMLHttpRequest"),n&&w(e,t)}}function Z(){if((te||ne)&&!L(HTMLElement.prototype,"onclick")&&"undefined"!=typeof Element){var e=L(Element.prototype,"onclick");if(e&&!e.configurable)return!1}var t="onreadystatechange",n=XMLHttpRequest.prototype,r=L(n,t);if(r){x(n,t,{enumerable:!0,configurable:!0,get:function(){return!0}});var o=new XMLHttpRequest,a=!!o.onreadystatechange;return x(n,t,r||{}),a}var i=U("fake");x(n,t,{enumerable:!0,configurable:!0,get:function(){return this[i]},set:function(e){this[i]=e}});var o=new XMLHttpRequest,s=function(){};o.onreadystatechange=s;var a=o[i]===s;return o.onreadystatechange=null,a}function z(){for(var t=function(t){var n=He[t],r="on"+n;self.addEventListener(n,function(t){var n,o,a=t.target;for(o=a?a.constructor.name+"."+r:"unknown."+r;a;)a[r]&&!a[r][Fe]&&(n=e(a[r],o),n[Fe]=a[r],a[r]=n),a=a.parentElement},!0)},n=0;n",this._properties=t&&t.properties||{},this._zoneDelegate=new p(this,this._parent&&this._parent._zoneDelegate,t)}return r.assertZonePatched=function(){if(e.Promise!==O.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 C.zone},enumerable:!0,configurable:!0}),Object.defineProperty(r,"currentTask",{get:function(){return j},enumerable:!0,configurable:!0}),r.__load_patch=function(o,a){if(O.hasOwnProperty(o)){if(c)throw Error("Already loaded patch: "+o)}else if(!e["__Zone_disable_"+o]){var i="Zone:"+o;t(i),O[o]=a(e,r,P),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){C={parent:C,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{C=C.parent}},r.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),C={parent:C,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(o){if(this._zoneDelegate.handleError(this,o))throw o}}finally{C=C.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+")");if(e.state!==_||e.type!==z&&e.type!==Z){var r=e.state!=w;r&&e._transitionTo(w,T),e.runCount++;var o=j;j=e,C={parent:C,zone:this};try{e.type==Z&&e.data&&!e.data.isPeriodic&&(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(a){if(this._zoneDelegate.handleError(this,a))throw a}}finally{e.state!==_&&e.state!==S&&(e.type==z||e.data&&e.data.isPeriodic?r&&e._transitionTo(T,w):(e.runCount=0,this._updateTaskCount(e,-1),r&&e._transitionTo(_,w,_))),C=C.parent,j=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(b,_);var n=[];e._zoneDelegates=n,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(r){throw e._transitionTo(S,b,_),this._zoneDelegate.handleError(this,r),r}return e._zoneDelegates===n&&this._updateTaskCount(e,1),e.state==b&&e._transitionTo(T,b),e},r.prototype.scheduleMicroTask=function(e,t,n,r){return this.scheduleTask(new h(D,e,t,n,r,(void 0)))},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(z,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(E,T,w);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(S,E),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(_,E),e.runCount=0,e},r.prototype._updateTaskCount=function(e,t){var n=e._zoneDelegates;t==-1&&(e._zoneDelegates=null);for(var r=0;r0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e};this.hasTask(this.zone,a)}},e}(),h=function(){function t(n,r,o,a,i,s){this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=n,this.source=r,this.data=a,this.scheduleFn=i,this.cancelFn=s,this.callback=o;var c=this;n===z&&a&&a.useG?this.invoke=t.invokeTask:this.invoke=function(){return t.invokeTask.call(e,c,this,arguments)}}return t.invokeTask=function(e,t,n){e||(e=this),I++;try{return e.runCount++,e.zone.runTask(e,t,n)}finally{1==I&&o(),I--}},Object.defineProperty(t.prototype,"zone",{get:function(){return this._zone},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"state",{get:function(){return this._state},enumerable:!0,configurable:!0}),t.prototype.cancelScheduleRequest=function(){this._transitionTo(_,b)},t.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==_&&(this._zoneDelegates=null)},t.prototype.toString=function(){return this.data&&"undefined"!=typeof this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)},t.prototype.toJSON=function(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}},t}(),d=i("setTimeout"),v=i("Promise"),g=i("then"),y=[],m=!1,k={name:"NO ZONE"},_="notScheduled",b="scheduling",T="scheduled",w="running",E="canceling",S="unknown",D="microTask",Z="macroTask",z="eventTask",O={},P={symbol:i,currentZoneFrame:function(){return C},onUnhandledError:a,microtaskDrainDone:a,scheduleMicroTask:r,showUncaughtError:function(){return!l[i("ignoreConsoleErrorUncaughtError")]},patchEventTarget:function(){return[]},patchOnProperties:a,patchMethod:function(){return a},bindArguments:function(){return[]},patchThen:function(){return a},setNativePromise:function(e){e&&"function"==typeof e.resolve&&(u=e.resolve(0))}},C={parent:null,zone:new l(null,null)},j=null,I=0;return n("Zone","Zone"),e.Zone=l}("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global),function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;return t?t.call(e):{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}});Zone.__load_patch("ZoneAwarePromise",function(e,t,n){function r(e){if(e&&e.toString===Object.prototype.toString){var t=e.constructor&&e.constructor.name;return(t?t:"")+": "+JSON.stringify(e)}return e?e.toString():Object.prototype.toString.call(e)}function o(e){n.onUnhandledError(e);try{var r=t[_];r&&"function"==typeof r&&r.call(this,e)}catch(o){}}function a(e){return e&&e.then}function i(e){return e}function s(e){return R.reject(e)}function c(e,t){return function(n){try{u(e,t,n)}catch(r){u(e,!1,r)}}}function u(e,o,a){var i=C();if(e===a)throw new TypeError(j);if(e[b]===Z){var s=null;try{"object"!=typeof a&&"function"!=typeof a||(s=a&&a.then)}catch(p){return i(function(){u(e,!1,p)})(),e}if(o!==O&&a instanceof R&&a.hasOwnProperty(b)&&a.hasOwnProperty(T)&&a[b]!==Z)l(a),u(e,a[b],a[T]);else if(o!==O&&"function"==typeof s)try{s.call(a,i(c(e,o)),i(c(e,!1)))}catch(p){i(function(){u(e,!1,p)})()}else{e[b]=o;var h=e[T];if(e[T]=a,e[w]===w&&o===z&&(e[b]=e[S],e[T]=e[E]),o===O&&a instanceof Error){var v=t.currentTask&&t.currentTask.data&&t.currentTask.data[k];v&&d(a,I,{configurable:!0,enumerable:!1,writable:!0,value:v})}for(var y=0;y1?c[1]:null,h=p&&p.signal;return new Promise(function(p,d){var v=t.current.scheduleMacroTask("fetch",f,c,function(){var s,u=t.current;try{u[i]=!0,s=r.apply(e,c)}catch(l){return void d(l)}finally{u[i]=!1}if(!(s instanceof o)){var f=s.constructor;f[a]||n.patchThen(f)}s.then(function(e){"notScheduled"!==v.state&&v.invoke(),p(e)},function(e){"notScheduled"!==v.state&&v.invoke(),d(e)})},function(){if(!u)return void d("No AbortController supported, can not cancel fetch");if(h&&h.abortController&&!h.aborted&&"function"==typeof h.abortController.abort&&l)try{t.current[s]=!0,l.call(h.abortController)}finally{t.current[s]=!1}else d("cancel fetch need a AbortController.signal")});h&&h.abortController&&(h.abortController.task=v)})}}});var L=Object.getOwnPropertyDescriptor,x=Object.defineProperty,R=Object.getPrototypeOf,H=Object.create,F=Array.prototype.slice,A="addEventListener",B="removeEventListener",q=Zone.__symbol__(A),N=Zone.__symbol__(B),W="true",X="false",G="__zone_symbol__",U=Zone.__symbol__,V="undefined"!=typeof window,K=V?window:void 0,J=V&&K||"object"==typeof self&&self||global,Y="removeAttribute",Q=[null],$="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,ee=!("nw"in J)&&"undefined"!=typeof J.process&&"[object process]"==={}.toString.call(J.process),te=!ee&&!$&&!(!V||!K.HTMLElement),ne="undefined"!=typeof J.process&&"[object process]"==={}.toString.call(J.process)&&!$&&!(!V||!K.HTMLElement),re={},oe=function(e){if(e=e||J.event){var t=re[e.type];t||(t=re[e.type]=U("ON_PROPERTY"+e.type));var n,r=this||e.target||J,o=r[t];if(te&&r===K&&"error"===e.type){var a=e;n=o&&o.call(this,a.message,a.filename,a.lineno,a.colno,a.error),n===!0&&e.preventDefault()}else n=o&&o.apply(this,arguments),void 0==n||n||e.preventDefault();return n}},ae=U("originalInstance"),ie=!1,se=!1,ce=!1;Zone.__load_patch("toString",function(e){var t=Function.prototype.toString,n=U("OriginalDelegate"),r=U("Promise"),o=U("Error"),a=function(){if("function"==typeof this){var a=this[n];if(a)return"function"==typeof a?t.apply(this[n],arguments):Object.prototype.toString.call(a);if(this===Promise){var i=e[r];if(i)return t.apply(i,arguments)}if(this===Error){var s=e[o];if(s)return t.apply(s,arguments)}}return t.apply(this,arguments)};a[n]=t,Function.prototype.toString=a;var i=Object.prototype.toString,s="[object Promise]";Object.prototype.toString=function(){return this instanceof Promise?s:i.apply(this,arguments)}});var ue=!1;if("undefined"!=typeof window)try{var le=Object.defineProperty({},"passive",{get:function(){ue=!0}});window.addEventListener("test",le,le),window.removeEventListener("test",le,le)}catch(fe){ue=!1}var pe={useG:!0},he={},de={},ve=/^__zone_symbol__(\w+)(true|false)$/,ge="__zone_symbol__propagationStopped",ye=U("zoneTask"),me=Object[U("defineProperty")]=Object.defineProperty,ke=Object[U("getOwnPropertyDescriptor")]=Object.getOwnPropertyDescriptor,_e=Object.create,be=U("unconfigurables"),Te=["abort","animationcancel","animationend","animationiteration","auxclick","beforeinput","blur","cancel","canplay","canplaythrough","change","compositionstart","compositionupdate","compositionend","cuechange","click","close","contextmenu","curechange","dblclick","drag","dragend","dragenter","dragexit","dragleave","dragover","drop","durationchange","emptied","ended","error","focus","focusin","focusout","gotpointercapture","input","invalid","keydown","keypress","keyup","load","loadstart","loadeddata","loadedmetadata","lostpointercapture","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","mousewheel","orientationchange","pause","play","playing","pointercancel","pointerdown","pointerenter","pointerleave","pointerlockchange","mozpointerlockchange","webkitpointerlockerchange","pointerlockerror","mozpointerlockerror","webkitpointerlockerror","pointermove","pointout","pointerover","pointerup","progress","ratechange","reset","resize","scroll","seeked","seeking","select","selectionchange","selectstart","show","sort","stalled","submit","suspend","timeupdate","volumechange","touchcancel","touchmove","touchstart","touchend","transitioncancel","transitionend","waiting","wheel"],we=["afterscriptexecute","beforescriptexecute","DOMContentLoaded","freeze","fullscreenchange","mozfullscreenchange","webkitfullscreenchange","msfullscreenchange","fullscreenerror","mozfullscreenerror","webkitfullscreenerror","msfullscreenerror","readystatechange","visibilitychange","resume"],Ee=["absolutedeviceorientation","afterinput","afterprint","appinstalled","beforeinstallprompt","beforeprint","beforeunload","devicelight","devicemotion","deviceorientation","deviceorientationabsolute","deviceproximity","hashchange","languagechange","message","mozbeforepaint","offline","online","paint","pageshow","pagehide","popstate","rejectionhandled","storage","unhandledrejection","unload","userproximity","vrdisplyconnected","vrdisplaydisconnected","vrdisplaypresentchange"],Se=["beforecopy","beforecut","beforepaste","copy","cut","paste","dragstart","loadend","animationstart","search","transitionrun","transitionstart","webkitanimationend","webkitanimationiteration","webkitanimationstart","webkittransitionend"],De=["encrypted","waitingforkey","msneedkey","mozinterruptbegin","mozinterruptend"],Ze=["activate","afterupdate","ariarequest","beforeactivate","beforedeactivate","beforeeditfocus","beforeupdate","cellchange","controlselect","dataavailable","datasetchanged","datasetcomplete","errorupdate","filterchange","layoutcomplete","losecapture","move","moveend","movestart","propertychange","resizeend","resizestart","rowenter","rowexit","rowsdelete","rowsinserted","command","compassneedscalibration","deactivate","help","mscontentzoom","msmanipulationstatechanged","msgesturechange","msgesturedoubletap","msgestureend","msgesturehold","msgesturestart","msgesturetap","msgotpointercapture","msinertiastart","mslostpointercapture","mspointercancel","mspointerdown","mspointerenter","mspointerhover","mspointerleave","mspointermove","mspointerout","mspointerover","mspointerup","pointerout","mssitemodejumplistitemremoved","msthumbnailclick","stop","storagecommit"],ze=["webglcontextrestored","webglcontextlost","webglcontextcreationerror"],Oe=["autocomplete","autocompleteerror"],Pe=["toggle"],Ce=["load"],je=["blur","error","focus","load","resize","scroll","messageerror"],Ie=["bounce","finish","start"],Me=["loadstart","progress","abort","error","load","progress","timeout","loadend","readystatechange"],Le=["upgradeneeded","complete","abort","success","error","blocked","versionchange","close"],xe=["close","error","open","message"],Re=["error","message"],He=Te.concat(ze,Oe,Pe,we,Ee,Se,Ze),Fe=U("unbound");Zone.__load_patch("util",function(e,t,r){r.patchOnProperties=i,r.patchMethod=u,r.bindArguments=n}),Zone.__load_patch("timers",function(e){var t="set",n="clear";y(e,t,n,"Timeout"),y(e,t,n,"Interval"),y(e,t,n,"Immediate")}),Zone.__load_patch("requestAnimationFrame",function(e){y(e,"request","cancel","AnimationFrame"),y(e,"mozRequest","mozCancel","AnimationFrame"),y(e,"webkitRequest","webkitCancel","AnimationFrame")}),Zone.__load_patch("blocking",function(e,t){for(var n=["alert","prompt","confirm"],r=0;r0){var o=e.invoke;e.invoke=function(){for(var r=n.__zone_symbol__loadfalse,a=0;a",this._properties=t&&t.properties||{},this._zoneDelegate=new c(this,this._parent&&this._parent._zoneDelegate,t)}return t.assertZonePatched=function(){if(e.Promise!==P.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(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 Z.zone},enumerable:!0,configurable:!0}),Object.defineProperty(t,"currentTask",{get:function(){return j},enumerable:!0,configurable:!0}),t.__load_patch=function(a,i){if(P.hasOwnProperty(a)){if(o)throw Error("Already loaded patch: "+a)}else if(!e["__Zone_disable_"+a]){var s="Zone:"+a;n(s),P[a]=i(e,t,D),r(s,s)}},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){Z={parent:Z,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{Z=Z.parent}},t.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),Z={parent:Z,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{Z=Z.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+")");if(e.state!==_||e.type!==O&&e.type!==S){var r=e.state!=k;r&&e._transitionTo(k,b),e.runCount++;var o=j;j=e,Z={parent:Z,zone:this};try{e.type==S&&e.data&&!e.data.isPeriodic&&(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{e.state!==_&&e.state!==E&&(e.type==O||e.data&&e.data.isPeriodic?r&&e._transitionTo(b,k):(e.runCount=0,this._updateTaskCount(e,-1),r&&e._transitionTo(_,k,_))),Z=Z.parent,j=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(m,_);var n=[];e._zoneDelegates=n,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(t){throw e._transitionTo(E,m,_),this._zoneDelegate.handleError(this,t),t}return e._zoneDelegates===n&&this._updateTaskCount(e,1),e.state==m&&e._transitionTo(b,m),e},t.prototype.scheduleMicroTask=function(e,t,n,r){return this.scheduleTask(new l(w,e,t,n,r,void 0))},t.prototype.scheduleMacroTask=function(e,t,n,r,o){return this.scheduleTask(new l(S,e,t,n,r,o))},t.prototype.scheduleEventTask=function(e,t,n,r,o){return this.scheduleTask(new l(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(T,b,k);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(E,T),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(_,T),e.runCount=0,e},t.prototype._updateTaskCount=function(e,t){var n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(var r=0;r0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e};this.hasTask(this.zone,a)}},e}(),l=function(){function t(n,r,o,a,i,s){this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=n,this.source=r,this.data=a,this.scheduleFn=i,this.cancelFn=s,this.callback=o;var c=this;n===O&&a&&a.useG?this.invoke=t.invokeTask:this.invoke=function(){return t.invokeTask.call(e,c,this,arguments)}}return t.invokeTask=function(e,t,n){e||(e=this),z++;try{return e.runCount++,e.zone.runTask(e,t,n)}finally{1==z&&g(),z--}},Object.defineProperty(t.prototype,"zone",{get:function(){return this._zone},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"state",{get:function(){return this._state},enumerable:!0,configurable:!0}),t.prototype.cancelScheduleRequest=function(){this._transitionTo(_,m)},t.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==_&&(this._zoneDelegates=null)},t.prototype.toString=function(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)},t.prototype.toJSON=function(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}},t}(),u=I("setTimeout"),f=I("Promise"),p=I("then"),h=[],d=!1;function v(t){if(0===z&&0===h.length)if(a||e[f]&&(a=e[f].resolve(0)),a){var n=a[p];n||(n=a.then),n.call(a,g)}else e[u](g,0);t&&h.push(t)}function g(){if(!d){for(d=!0;h.length;){var e=h;h=[];for(var t=0;t=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}};Zone.__load_patch("ZoneAwarePromise",function(t,n,r){var o=Object.getOwnPropertyDescriptor,a=Object.defineProperty;var i=r.symbol,s=[],c=i("Promise"),l=i("then"),u="__creationTrace__";r.onUnhandledError=function(e){if(r.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)}},r.microtaskDrainDone=function(){for(;s.length;)for(var e=function(){var e=s.shift();try{e.zone.runGuarded(function(){throw e})}catch(e){p(e)}};s.length;)e()};var f=i("unhandledPromiseRejectionHandler");function p(e){r.onUnhandledError(e);try{var t=n[f];t&&"function"==typeof t&&t.call(this,e)}catch(e){}}function h(e){return e&&e.then}function d(e){return e}function v(e){return R.reject(e)}var g=i("state"),y=i("value"),_=i("finally"),m=i("parentPromiseValue"),b=i("parentPromiseState"),k="Promise.then",T=null,E=!0,w=!1,S=0;function O(e,t){return function(n){try{j(e,t,n)}catch(t){j(e,!1,t)}}}var P=function(){var e=!1;return function(t){return function(){e||(e=!0,t.apply(null,arguments))}}},D="Promise resolved with itself",Z=i("currentTaskTrace");function j(e,t,o){var i=P();if(e===o)throw new TypeError(D);if(e[g]===T){var c=null;try{"object"!=typeof o&&"function"!=typeof o||(c=o&&o.then)}catch(t){return i(function(){j(e,!1,t)})(),e}if(t!==w&&o instanceof R&&o.hasOwnProperty(g)&&o.hasOwnProperty(y)&&o[g]!==T)C(o),j(e,o[g],o[y]);else if(t!==w&&"function"==typeof c)try{c.call(o,i(O(e,t)),i(O(e,!1)))}catch(t){i(function(){j(e,!1,t)})()}else{e[g]=t;var l=e[y];if(e[y]=o,e[_]===_&&t===E&&(e[g]=e[b],e[y]=e[m]),t===w&&o instanceof Error){var f=n.currentTask&&n.currentTask.data&&n.currentTask.data[u];f&&a(o,Z,{configurable:!0,enumerable:!1,writable:!0,value:f})}for(var p=0;p=0;n--)"function"==typeof e[n]&&(e[n]=h(e[n],t+"_"+n));return e}function T(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&void 0===e.set)}var E="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,w=!("nw"in _)&&void 0!==_.process&&"[object process]"==={}.toString.call(_.process),S=!w&&!E&&!(!g||!y.HTMLElement),O=void 0!==_.process&&"[object process]"==={}.toString.call(_.process)&&!E&&!(!g||!y.HTMLElement),P={},D=function(e){if(e=e||_.event){var t=P[e.type];t||(t=P[e.type]=v("ON_PROPERTY"+e.type));var n,r=this||e.target||_,o=r[t];if(S&&r===y&&"error"===e.type){var a=e;!0===(n=o&&o.call(this,a.message,a.filename,a.lineno,a.colno,a.error))&&e.preventDefault()}else null==(n=o&&o.apply(this,arguments))||n||e.preventDefault();return n}};function Z(e,r,o){var a=t(e,r);!a&&o&&(t(o,r)&&(a={enumerable:!0,configurable:!0}));if(a&&a.configurable){var i=v("on"+r+"patched");if(!e.hasOwnProperty(i)||!e[i]){delete a.writable,delete a.value;var s=a.get,c=a.set,l=r.substr(2),u=P[l];u||(u=P[l]=v("ON_PROPERTY"+l)),a.set=function(t){var n=this;(n||e!==_||(n=_),n)&&(n[u]&&n.removeEventListener(l,D),c&&c.apply(n,b),"function"==typeof t?(n[u]=t,n.addEventListener(l,D,!1)):n[u]=null)},a.get=function(){var t=this;if(t||e!==_||(t=_),!t)return null;var n=t[u];if(n)return n;if(s){var o=s&&s.call(this);if(o)return a.set.call(this,o),"function"==typeof t[m]&&t.removeAttribute(r),o}return null},n(e,r,a),e[i]=!0}}}function j(e,t,n){if(t)for(var r=0;r=0&&"function"==typeof r[a.cbIdx]?d(a.name,r[a.cbIdx],a,o):e.apply(t,r)}})}function M(e,t){e[v("OriginalDelegate")]=t}var x=!1,N=!1;function F(){try{var e=y.navigator.userAgent;if(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/"))return!0}catch(e){}return!1}function H(){if(x)return N;x=!0;try{var e=y.navigator.userAgent;-1===e.indexOf("MSIE ")&&-1===e.indexOf("Trident/")&&-1===e.indexOf("Edge/")||(N=!0)}catch(e){}return N}Zone.__load_patch("toString",function(e){var t=Function.prototype.toString,n=v("OriginalDelegate"),r=v("Promise"),o=v("Error"),a=function(){if("function"==typeof this){var a=this[n];if(a)return"function"==typeof a?t.call(a):Object.prototype.toString.call(a);if(this===Promise){var i=e[r];if(i)return t.call(i)}if(this===Error){var s=e[o];if(s)return t.call(s)}}return t.call(this)};a[n]=t,Function.prototype.toString=a;var i=Object.prototype.toString;Object.prototype.toString=function(){return this instanceof Promise?"[object Promise]":i.call(this)}});var A=!1;if("undefined"!=typeof window)try{var B=Object.defineProperty({},"passive",{get:function(){A=!0}});window.addEventListener("test",B,B),window.removeEventListener("test",B,B)}catch(e){A=!1}var G={useG:!0},q={},W={},U=/^__zone_symbol__(\w+)(true|false)$/,X="__zone_symbol__propagationStopped";function V(e,t,n){var o=n&&n.add||i,a=n&&n.rm||s,c=n&&n.listeners||"eventListeners",l=n&&n.rmAll||"removeAllListeners",h=v(o),d="."+o+":",g="prependListener",y="."+g+":",_=function(e,t,n){if(!e.isRemoved){var r=e.callback;"object"==typeof r&&r.handleEvent&&(e.callback=function(e){return r.handleEvent(e)},e.originalDelegate=r),e.invoke(e,t,[n]);var o=e.options;if(o&&"object"==typeof o&&o.once){var i=e.originalDelegate?e.originalDelegate:e.callback;t[a].call(t,n.type,i,o)}}},m=function(t){if(t=t||e.event){var n=this||t.target||e,r=n[q[t.type][f]];if(r)if(1===r.length)_(r[0],n,t);else for(var o=r.slice(),a=0;a1?new a(t,n):new a(t),l=e.ObjectGetOwnPropertyDescriptor(c,"onmessage");return l&&!1===l.configurable?(i=e.ObjectCreate(c),s=c,[r,o,"send","close"].forEach(function(t){i[t]=function(){var n=e.ArraySlice.call(arguments);if(t===r||t===o){var a=n.length>0?n[0]:void 0;if(a){var s=Zone.__symbol__("ON_PROPERTY"+a);c[s]=i[s]}}return c[t].apply(c,n)}})):i=c,e.patchOnProperties(i,["close","error","message","open"],s),i};var i=t.WebSocket;for(var s in a)i[s]=a[s]}(e,t),Zone[e.symbol("patchEvents")]=!0)}}Zone.__load_patch("util",function(e,r,c){c.patchOnProperties=j,c.patchMethod=R,c.bindArguments=k,c.patchMacroTask=L;var l=r.__symbol__("BLACK_LISTED_EVENTS"),d=r.__symbol__("UNPATCHED_EVENTS");e[d]&&(e[l]=e[d]),e[l]&&(r[l]=r[d]=e[l]),c.patchEventPrototype=K,c.patchEventTarget=V,c.isIEOrEdge=H,c.ObjectDefineProperty=n,c.ObjectGetOwnPropertyDescriptor=t,c.ObjectCreate=o,c.ArraySlice=a,c.patchClass=C,c.wrapWithCurrentZone=h,c.filterProperties=ye,c.attachOriginToPatched=M,c._redefineProperty=re,c.patchCallbacks=J,c.getGlobalObjects=function(){return{globalSources:W,zoneSymbolEventNames:q,eventNames:ge,isBrowser:S,isMix:O,isNode:w,TRUE_STR:u,FALSE_STR:f,ZONE_SYMBOL_PREFIX:p,ADD_EVENT_LISTENER_STR:i,REMOVE_EVENT_LISTENER_STR:s}}}),function(e){e.__zone_symbol__legacyPatch=function(){var t=e.Zone;t.__load_patch("registerElement",function(e,t,n){!function(e,t){var n=t.getGlobalObjects(),r=n.isBrowser,o=n.isMix;(r||o)&&"registerElement"in e.document&&t.patchCallbacks(t,document,"Document","registerElement",["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"])}(e,n)}),t.__load_patch("EventTargetLegacy",function(e,t,n){!function(e,t){var n=t.getGlobalObjects(),r=n.eventNames,o=n.globalSources,a=n.zoneSymbolEventNames,i=n.TRUE_STR,s=n.FALSE_STR,c=n.ZONE_SYMBOL_PREFIX,l="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(","),f=[],p=e.wtf,h=l.split(",");p?f=h.map(function(e){return"HTML"+e+"Element"}).concat(u):e.EventTarget||(f=u);for(var d=e.__Zone_disable_IE_check||!1,v=e.__Zone_enable_cross_context_check||!1,g=t.isIEOrEdge(),y="function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }",_=0;_0){var o=e.invoke;e.invoke=function(){for(var n=r.__zone_symbol__loadfalse,a=0;a