refactor(zone.js): remove usages of blacklist related to UNPATCHED_EVENTS (#38930)
Remove usages of blacklist around UNPATCHED_EVENTS configuration PR Close #38930
This commit is contained in:
parent
ba3f4c26bb
commit
75610505c6
@ -1,11 +1,11 @@
|
|||||||
# Zone.js's support for standard apis
|
# Zone.js's support for standard apis
|
||||||
|
|
||||||
Zone.js patched most standard APIs such as DOM event listeners, XMLHttpRequest in Browser, EventEmitter and fs API in Node.js so they can be in zone.
|
Zone.js patched most standard APIs such as DOM event listeners, XMLHttpRequest in Browser, EventEmitter and fs API in Node.js so they can be in zone.
|
||||||
|
|
||||||
In this document, all patched API are listed.
|
In this document, all patched API are listed.
|
||||||
|
|
||||||
For non-standard APIs, please see [NON-STANDARD-APIS.md](NON-STANDARD-APIS.md)
|
For non-standard APIs, please see [NON-STANDARD-APIS.md](NON-STANDARD-APIS.md)
|
||||||
|
|
||||||
## Patch Mechanisms
|
## Patch Mechanisms
|
||||||
|
|
||||||
There are several patch mechanisms
|
There are several patch mechanisms
|
||||||
@ -15,10 +15,10 @@ There are several patch mechanisms
|
|||||||
1. MacroTask
|
1. MacroTask
|
||||||
2. MicroTask
|
2. MicroTask
|
||||||
3. EventTask
|
3. EventTask
|
||||||
|
|
||||||
Some APIs which should be treated as Tasks, but are currently still patched in the wrap way. These will be patched as Tasks soon.
|
Some APIs which should be treated as Tasks, but are currently still patched in the wrap way. These will be patched as Tasks soon.
|
||||||
|
|
||||||
## Browser
|
## Browser
|
||||||
|
|
||||||
Web APIs
|
Web APIs
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ Web APIs
|
|||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| setTimeout/clearTimeout | MacroTask | app can get handlerId, interval, args, isPeriodic(false) through task.data |
|
| setTimeout/clearTimeout | MacroTask | app can get handlerId, interval, args, isPeriodic(false) through task.data |
|
||||||
| setImmediate/clearImmediate | MacroTask | same with setTimeout |
|
| setImmediate/clearImmediate | MacroTask | same with setTimeout |
|
||||||
| setInterval/clearInterval | MacroTask | isPeriodic is true, so setInterval will not trigger onHasTask callback |
|
| setInterval/clearInterval | MacroTask | isPeriodic is true, so setInterval will not trigger onHasTask callback |
|
||||||
| requestAnimationFrame/cancelAnimationFrame | MacroTask | |
|
| requestAnimationFrame/cancelAnimationFrame | MacroTask | |
|
||||||
| mozRequestAnimationFrame/mozCancelAnimationFrame | MacroTask | |
|
| mozRequestAnimationFrame/mozCancelAnimationFrame | MacroTask | |
|
||||||
| webkitRequestAnimationFrame/webkitCancelAnimationFrame | MacroTask | |
|
| webkitRequestAnimationFrame/webkitCancelAnimationFrame | MacroTask | |
|
||||||
@ -56,7 +56,7 @@ EventTarget
|
|||||||
from EventTarget will also be patched.
|
from EventTarget will also be patched.
|
||||||
- For browsers that do not support EventTarget, Zone.js will patch the following APIs in the IDL
|
- For browsers that do not support EventTarget, Zone.js will patch the following APIs in the IDL
|
||||||
that inherit from EventTarget
|
that inherit from EventTarget
|
||||||
|
|
||||||
|||||
|
|||||
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
|ApplicationCache|EventSource|FileReader|InputMethodContext|
|
|ApplicationCache|EventSource|FileReader|InputMethodContext|
|
||||||
@ -94,8 +94,8 @@ The following 'on' properties, such as onclick, onreadystatechange, are patched
|
|||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| setTimeout/clearTimeout | MacroTask | app can get handlerId, interval, args, isPeriodic(false) through task.data |
|
| setTimeout/clearTimeout | MacroTask | app can get handlerId, interval, args, isPeriodic(false) through task.data |
|
||||||
| setImmediate/clearImmediate | MacroTask | same with setTimeout |
|
| setImmediate/clearImmediate | MacroTask | same with setTimeout |
|
||||||
| setInterval/clearInterval | MacroTask | isPeriodic is true, so setInterval will not trigger onHasTask callback |
|
| setInterval/clearInterval | MacroTask | isPeriodic is true, so setInterval will not trigger onHasTask callback |
|
||||||
| process.nextTick | Microtask | isPeriodic is true, so setInterval will not trigger onHasTask callback |
|
| process.nextTick | Microtask | isPeriodic is true, so setInterval will not trigger onHasTask callback |
|
||||||
| Promise | MicroTask | |
|
| Promise | MicroTask | |
|
||||||
| EventEmitter | EventTask | All APIs inherit EventEmitter are patched as EventTask |
|
| EventEmitter | EventTask | All APIs inherit EventEmitter are patched as EventTask |
|
||||||
| crypto | MacroTask | |
|
| crypto | MacroTask | |
|
||||||
@ -104,9 +104,9 @@ The following 'on' properties, such as onclick, onreadystatechange, are patched
|
|||||||
EventEmitter, addEventListener, prependEventListener and 'on' will be patched once as EventTasks, and removeEventListener and
|
EventEmitter, addEventListener, prependEventListener and 'on' will be patched once as EventTasks, and removeEventListener and
|
||||||
removeAllListeners will remove those EventTasks
|
removeAllListeners will remove those EventTasks
|
||||||
|
|
||||||
## Electron
|
## Electron
|
||||||
|
|
||||||
Zone.js does not patch the Electron API, although in Electron both browser APIs and node APIs are patched, so
|
Zone.js does not patch the Electron API, although in Electron both browser APIs and node APIs are patched, so
|
||||||
if you want to include Zone.js in Electron, please use dist/zone-mix.js
|
if you want to include Zone.js in Electron, please use dist/zone-mix.js
|
||||||
|
|
||||||
## ZoneAwareError
|
## ZoneAwareError
|
||||||
@ -117,7 +117,7 @@ This type of issue would happen when creating an error without `new`: `this` wou
|
|||||||
non-strict mode. It could cause some very difficult to detect issues.
|
non-strict mode. It could cause some very difficult to detect issues.
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
const error = Error();
|
const error = Error();
|
||||||
```
|
```
|
||||||
|
|
||||||
ZoneAwareError makes sure that `this` is ZoneAwareError even without new.
|
ZoneAwareError makes sure that `this` is ZoneAwareError even without new.
|
||||||
@ -127,10 +127,10 @@ ZoneAwareError makes sure that `this` is ZoneAwareError even without new.
|
|||||||
ZoneAwarePromise wraps the global Promise and makes it run in zones as a MicroTask.
|
ZoneAwarePromise wraps the global Promise and makes it run in zones as a MicroTask.
|
||||||
It also passes promise A+ tests.
|
It also passes promise A+ tests.
|
||||||
|
|
||||||
## BlackListEvents
|
## UnpatchedEvents
|
||||||
|
|
||||||
Sometimes we don't want some `event` to be patched by `zone.js`, we can blacklist events
|
Sometimes we don't want some `event` to be patched by `zone.js`, we can instruct zone.js to leave
|
||||||
by following settings.
|
these `event` to be unpatched by following settings.
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
// disable on properties
|
// disable on properties
|
||||||
@ -144,5 +144,5 @@ by following settings.
|
|||||||
});
|
});
|
||||||
|
|
||||||
// disable addEventListener
|
// disable addEventListener
|
||||||
global['__zone_symbol__BLACK_LISTED_EVENTS'] = ['scroll'];
|
global['__zone_symbol__UNPATCHED_EVENTS'] = ['scroll'];
|
||||||
```
|
```
|
||||||
|
@ -351,7 +351,7 @@ export function patchEventTarget(
|
|||||||
const compare =
|
const compare =
|
||||||
(patchOptions && patchOptions.diff) ? patchOptions.diff : compareTaskCallbackVsDelegate;
|
(patchOptions && patchOptions.diff) ? patchOptions.diff : compareTaskCallbackVsDelegate;
|
||||||
|
|
||||||
const blackListedEvents: string[] = (Zone as any)[zoneSymbol('BLACK_LISTED_EVENTS')];
|
const unpatchedEvents: string[] = (Zone as any)[zoneSymbol('UNPATCHED_EVENTS')];
|
||||||
const passiveEvents: string[] = _global[zoneSymbol('PASSIVE_EVENTS')];
|
const passiveEvents: string[] = _global[zoneSymbol('PASSIVE_EVENTS')];
|
||||||
|
|
||||||
const makeAddListener = function(
|
const makeAddListener = function(
|
||||||
@ -391,10 +391,10 @@ export function patchEventTarget(
|
|||||||
passiveSupported && !!passiveEvents && passiveEvents.indexOf(eventName) !== -1;
|
passiveSupported && !!passiveEvents && passiveEvents.indexOf(eventName) !== -1;
|
||||||
const options = buildEventListenerOptions(arguments[2], passive);
|
const options = buildEventListenerOptions(arguments[2], passive);
|
||||||
|
|
||||||
if (blackListedEvents) {
|
if (unpatchedEvents) {
|
||||||
// check black list
|
// check upatched list
|
||||||
for (let i = 0; i < blackListedEvents.length; i++) {
|
for (let i = 0; i < unpatchedEvents.length; i++) {
|
||||||
if (eventName === blackListedEvents[i]) {
|
if (eventName === unpatchedEvents[i]) {
|
||||||
if (passive) {
|
if (passive) {
|
||||||
return nativeListener.call(target, eventName, delegate, options);
|
return nativeListener.call(target, eventName, delegate, options);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1154,10 +1154,10 @@ describe('Zone', function() {
|
|||||||
it('should not be passive with global variable defined with passive false option', () => {
|
it('should not be passive with global variable defined with passive false option', () => {
|
||||||
testPassive('touchstart', 'defaultPrevented', {passive: false});
|
testPassive('touchstart', 'defaultPrevented', {passive: false});
|
||||||
});
|
});
|
||||||
it('should be passive with global variable defined and also blacklisted', () => {
|
it('should be passive with global variable defined and also unpatched', () => {
|
||||||
testPassive('scroll', 'default will run', undefined);
|
testPassive('scroll', 'default will run', undefined);
|
||||||
});
|
});
|
||||||
it('should not be passive without global variable defined and also blacklisted', () => {
|
it('should not be passive without global variable defined and also unpatched', () => {
|
||||||
testPassive('wheel', 'defaultPrevented', undefined);
|
testPassive('wheel', 'defaultPrevented', undefined);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -1376,7 +1376,7 @@ describe('Zone', function() {
|
|||||||
let hookSpy2 = jasmine.createSpy('spy2');
|
let hookSpy2 = jasmine.createSpy('spy2');
|
||||||
let hookSpy3 = jasmine.createSpy('spy3');
|
let hookSpy3 = jasmine.createSpy('spy3');
|
||||||
let logs: string[] = [];
|
let logs: string[] = [];
|
||||||
const isBlacklistedEvent = function(source: string) {
|
const isUnpatchedEvent = function(source: string) {
|
||||||
return source.lastIndexOf('click') !== -1;
|
return source.lastIndexOf('click') !== -1;
|
||||||
};
|
};
|
||||||
const zone1 = Zone.current.fork({
|
const zone1 = Zone.current.fork({
|
||||||
@ -1385,7 +1385,7 @@ describe('Zone', function() {
|
|||||||
parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, task: Task):
|
parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, task: Task):
|
||||||
any => {
|
any => {
|
||||||
if ((task.type === 'eventTask' || task.type === 'macroTask') &&
|
if ((task.type === 'eventTask' || task.type === 'macroTask') &&
|
||||||
isBlacklistedEvent(task.source)) {
|
isUnpatchedEvent(task.source)) {
|
||||||
task.cancelScheduleRequest();
|
task.cancelScheduleRequest();
|
||||||
|
|
||||||
return zone2.scheduleTask(task);
|
return zone2.scheduleTask(task);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user