Skip to content
This repository was archived by the owner on Feb 26, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions lib/common/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -396,13 +396,24 @@ export function patchEventTarget(
taskData.isExisting = isExisting;

const data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : null;

// keep taskData into data to allow onScheduleEventTask to acess the task information
if (data) {
(data as any).taskData = taskData;
}

const task: any =
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 as any).taskData = null;
}

// have to save those information to task in case
// application may call task.zone.cancelTask() directly
if (once) {
Expand Down
34 changes: 34 additions & 0 deletions test/browser/browser.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,40 @@ describe('Zone', function() {
expect(eventListenerSpy).toHaveBeenCalled();
});

it('should be able to access addEventListener information in onScheduleTask', function() {
const hookSpy = jasmine.createSpy('hook');
const eventListenerSpy = jasmine.createSpy('eventListener');
let scheduleButton;
let scheduleEventName;
let scheduleCapture;
let scheduleTask;
const zone = rootZone.fork({
name: 'spy',
onScheduleTask: (parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone,
task: Task): any => {
hookSpy();
scheduleButton = (task.data as any).taskData.target;
scheduleEventName = (task.data as any).taskData.eventName;
scheduleCapture = (task.data as any).taskData.capture;
scheduleTask = task;
return parentZoneDelegate.scheduleTask(targetZone, task);
}
});

zone.run(function() {
button.addEventListener('click', eventListenerSpy);
});

button.dispatchEvent(clickEvent);

expect(hookSpy).toHaveBeenCalled();
expect(eventListenerSpy).toHaveBeenCalled();
expect(scheduleButton).toBe(button);
expect(scheduleEventName).toBe('click');
expect(scheduleCapture).toBe(false);
expect(scheduleTask && (scheduleTask as any).data.taskData).toBe(null);
});

it('should support addEventListener on window', ifEnvSupports(windowPrototype, function() {
const hookSpy = jasmine.createSpy('hook');
const eventListenerSpy = jasmine.createSpy('eventListener');
Expand Down