| 'use strict'; |
| /** |
| * @license Angular v12.0.0-next.0 |
| * (c) 2010-2020 Google LLC. https://angular.io/ |
| * License: MIT |
| */ |
| /** |
| * @license |
| * Copyright Google LLC 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 |
| */ |
| class ProxyZoneSpec { |
| constructor(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); |
| } |
| static get() { |
| return Zone.current.get('ProxyZoneSpec'); |
| } |
| static isLoaded() { |
| return ProxyZoneSpec.get() instanceof ProxyZoneSpec; |
| } |
| static assertPresent() { |
| if (!ProxyZoneSpec.isLoaded()) { |
| throw new Error(`Expected to be running in 'ProxyZone', but it was not found.`); |
| } |
| return ProxyZoneSpec.get(); |
| } |
| setDelegate(delegateSpec) { |
| const isNewDelegate = this._delegateSpec !== delegateSpec; |
| this._delegateSpec = delegateSpec; |
| this.propertyKeys && this.propertyKeys.forEach((key) => delete this.properties[key]); |
| this.propertyKeys = null; |
| if (delegateSpec && delegateSpec.properties) { |
| this.propertyKeys = Object.keys(delegateSpec.properties); |
| this.propertyKeys.forEach((k) => this.properties[k] = delegateSpec.properties[k]); |
| } |
| // if a new delegateSpec was set, check if we need to trigger hasTask |
| if (isNewDelegate && this.lastTaskState && |
| (this.lastTaskState.macroTask || this.lastTaskState.microTask)) { |
| this.isNeedToTriggerHasTask = true; |
| } |
| } |
| getDelegate() { |
| return this._delegateSpec; |
| } |
| resetDelegate() { |
| const delegateSpec = this.getDelegate(); |
| this.setDelegate(this.defaultSpecDelegate); |
| } |
| tryTriggerHasTask(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); |
| } |
| } |
| removeFromTasks(task) { |
| if (!this.tasks) { |
| return; |
| } |
| for (let i = 0; i < this.tasks.length; i++) { |
| if (this.tasks[i] === task) { |
| this.tasks.splice(i, 1); |
| return; |
| } |
| } |
| } |
| getAndClearPendingTasksInfo() { |
| if (this.tasks.length === 0) { |
| return ''; |
| } |
| const taskInfo = this.tasks.map((task) => { |
| const dataInfo = task.data && |
| Object.keys(task.data) |
| .map((key) => { |
| return key + ':' + task.data[key]; |
| }) |
| .join(','); |
| return `type: ${task.type}, source: ${task.source}, args: {${dataInfo}}`; |
| }); |
| const pendingTasksInfo = '--Pending async tasks are: [' + taskInfo + ']'; |
| // clear tasks |
| this.tasks = []; |
| return pendingTasksInfo; |
| } |
| onFork(parentZoneDelegate, currentZone, targetZone, zoneSpec) { |
| if (this._delegateSpec && this._delegateSpec.onFork) { |
| return this._delegateSpec.onFork(parentZoneDelegate, currentZone, targetZone, zoneSpec); |
| } |
| else { |
| return parentZoneDelegate.fork(targetZone, zoneSpec); |
| } |
| } |
| onIntercept(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); |
| } |
| } |
| onInvoke(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); |
| } |
| } |
| onHandleError(parentZoneDelegate, currentZone, targetZone, error) { |
| if (this._delegateSpec && this._delegateSpec.onHandleError) { |
| return this._delegateSpec.onHandleError(parentZoneDelegate, currentZone, targetZone, error); |
| } |
| else { |
| return parentZoneDelegate.handleError(targetZone, error); |
| } |
| } |
| onScheduleTask(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); |
| } |
| } |
| onInvokeTask(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); |
| } |
| } |
| onCancelTask(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); |
| } |
| } |
| onHasTask(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); |
| } |
| } |
| } |
| // Export the class so that new instances can be created with proper |
| // constructor params. |
| Zone['ProxyZoneSpec'] = ProxyZoneSpec; |