diff --git a/packages/core/src/zone/ng_zone.ts b/packages/core/src/zone/ng_zone.ts index 5e78c3c4a688c..2d4443fd4105e 100644 --- a/packages/core/src/zone/ng_zone.ts +++ b/packages/core/src/zone/ng_zone.ts @@ -7,8 +7,10 @@ */ import {EventEmitter} from '../event_emitter'; +import {global} from '../util/global'; import {nativeRequestAnimationFrame} from '../util/raf'; + /** * An injectable service for executing work inside or outside of the Angular zone. * @@ -264,11 +266,12 @@ function delayChangeDetectionForEvents(zone: NgZonePrivate) { if (zone.lastRequestAnimationFrameId !== -1) { return; } - zone.lastRequestAnimationFrameId = nativeRequestAnimationFrame(() => { + zone.lastRequestAnimationFrameId = nativeRequestAnimationFrame.call(global, () => { zone.lastRequestAnimationFrameId = -1; + updateMicroTaskStatus(zone); checkStable(zone); }); - updateMicroTaskStatus(zone, zone.hasPendingMicrotasks); + updateMicroTaskStatus(zone); } function forkInnerZoneWithAngularBehavior(zone: NgZonePrivate) { @@ -310,7 +313,8 @@ function forkInnerZoneWithAngularBehavior(zone: NgZonePrivate) { // We are only interested in hasTask events which originate from our zone // (A child hasTask event is not interesting to us) if (hasTaskState.change == 'microTask') { - updateMicroTaskStatus(zone, hasTaskState.microTask); + zone._hasPendingMicrotasks = hasTaskState.microTask; + updateMicroTaskStatus(zone); checkStable(zone); } else if (hasTaskState.change == 'macroTask') { zone.hasPendingMacrotasks = hasTaskState.macroTask; @@ -326,8 +330,8 @@ function forkInnerZoneWithAngularBehavior(zone: NgZonePrivate) { }); } -function updateMicroTaskStatus(zone: NgZonePrivate, hasPendingMicrotasks: boolean) { - if (hasPendingMicrotasks || +function updateMicroTaskStatus(zone: NgZonePrivate) { + if (zone._hasPendingMicrotasks || (zone.shouldCoalesceEventChangeDetection && zone.lastRequestAnimationFrameId !== -1)) { zone.hasPendingMicrotasks = true; } else { diff --git a/packages/platform-browser/test/dom/events/event_manager_spec.ts b/packages/platform-browser/test/dom/events/event_manager_spec.ts index aa5cb1981dbc8..e8d454285fbe0 100644 --- a/packages/platform-browser/test/dom/events/event_manager_spec.ts +++ b/packages/platform-browser/test/dom/events/event_manager_spec.ts @@ -340,10 +340,7 @@ import {el} from '../../../testing/src/browser_util'; removerChild = manager.addEventListener(child, 'click', handler); removerParent = manager.addEventListener(element, 'click', handler); }); - zone.onStable.subscribe((isStable: any) => { - console.log('stable triggered'); - stables.push(isStable); - }); + zone.onStable.subscribe((isStable: any) => { stables.push(isStable); }); getDOM().dispatchEvent(child, dispatchedEvent); requestAnimationFrame(() => { expect(receivedEvents.length).toBe(2);