diff --git a/goldens/public-api/platform-browser/platform-browser.d.ts b/goldens/public-api/platform-browser/platform-browser.d.ts index f38a0e676a..8f1bdeb7fc 100644 --- a/goldens/public-api/platform-browser/platform-browser.d.ts +++ b/goldens/public-api/platform-browser/platform-browser.d.ts @@ -32,7 +32,7 @@ export declare const EVENT_MANAGER_PLUGINS: InjectionToken<ɵangular_packages_pl export declare class EventManager { constructor(plugins: ɵangular_packages_platform_browser_platform_browser_g[], _zone: NgZone); addEventListener(element: HTMLElement, eventName: string, handler: Function): Function; - addGlobalEventListener(target: string, eventName: string, handler: Function): Function; + /** @deprecated */ addGlobalEventListener(target: string, eventName: string, handler: Function): Function; getZone(): NgZone; } diff --git a/packages/core/src/render3/instructions/listener.ts b/packages/core/src/render3/instructions/listener.ts index c469fd8ece..fb32c2b455 100644 --- a/packages/core/src/render3/instructions/listener.ts +++ b/packages/core/src/render3/instructions/listener.ts @@ -8,7 +8,6 @@ import {assertIndexInRange} from '../../util/assert'; -import {EMPTY_OBJ} from '../../util/empty'; import {isObservable} from '../../util/lang'; import {PropertyAliasValue, TNode, TNodeFlags, TNodeType} from '../interfaces/node'; import {GlobalTargetResolver, isProceduralRenderer, Renderer3} from '../interfaces/renderer'; @@ -39,13 +38,14 @@ import {getOrCreateLViewCleanup, getOrCreateTViewCleanup, handleError, loadCompo * @codeGenApi */ export function ɵɵlistener( - eventName: string, listenerFn: (e?: any) => any, useCapture = false, + eventName: string, listenerFn: (e?: any) => any, useCapture?: boolean, eventTargetResolver?: GlobalTargetResolver): typeof ɵɵlistener { const lView = getLView(); const tView = getTView(); const tNode = getCurrentTNode()!; listenerInternal( - tView, lView, lView[RENDERER], tNode, eventName, listenerFn, useCapture, eventTargetResolver); + tView, lView, lView[RENDERER], tNode, eventName, listenerFn, !!useCapture, + eventTargetResolver); return ɵɵlistener; } @@ -71,15 +71,13 @@ export function ɵɵlistener( * @codeGenApi */ export function ɵɵsyntheticHostListener( - eventName: string, listenerFn: (e?: any) => any, useCapture = false, - eventTargetResolver?: GlobalTargetResolver): typeof ɵɵsyntheticHostListener { + eventName: string, listenerFn: (e?: any) => any): typeof ɵɵsyntheticHostListener { const tNode = getCurrentTNode()!; const lView = getLView(); const tView = getTView(); const currentDef = getCurrentDirectiveDef(tView.data); const renderer = loadComponentRenderer(currentDef, tNode, lView); - listenerInternal( - tView, lView, renderer, tNode, eventName, listenerFn, useCapture, eventTargetResolver); + listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn, false); return ɵɵsyntheticHostListener; } @@ -117,7 +115,7 @@ function findExistingListener( function listenerInternal( tView: TView, lView: LView, renderer: Renderer3, tNode: TNode, eventName: string, - listenerFn: (e?: any) => any, useCapture = false, + listenerFn: (e?: any) => any, useCapture: boolean, eventTargetResolver?: GlobalTargetResolver): void { const isTNodeDirectiveHost = isDirectiveHost(tNode); const firstCreatePass = tView.firstCreatePass; @@ -136,11 +134,10 @@ function listenerInternal( // add native event listener - applicable to elements only if (tNode.type & TNodeType.AnyRNode) { const native = getNativeByTNode(tNode, lView) as RElement; - const resolved = eventTargetResolver ? eventTargetResolver(native) : EMPTY_OBJ as any; - const target = resolved.target || native; + const target = eventTargetResolver ? eventTargetResolver(native) : native; const lCleanupIndex = lCleanup.length; const idxOrTargetGetter = eventTargetResolver ? - (_lView: LView) => eventTargetResolver(unwrapRNode(_lView[tNode.index])).target : + (_lView: LView) => eventTargetResolver(unwrapRNode(_lView[tNode.index])) : tNode.index; // In order to match current behavior, native DOM event listeners must be added for all @@ -176,11 +173,8 @@ function listenerInternal( (existingListener).__ngLastListenerFn__ = listenerFn; processOutputs = false; } else { - // The first argument of `listen` function in Procedural Renderer is: - // - either a target name (as a string) in case of global target (window, document, body) - // - or element reference (in all other cases) listenerFn = wrapListener(tNode, lView, context, listenerFn, false /** preventDefault */); - const cleanupFn = renderer.listen(resolved.name || target, eventName, listenerFn); + const cleanupFn = renderer.listen(target as RElement, eventName, listenerFn); ngDevMode && ngDevMode.rendererAddEventListener++; lCleanup.push(listenerFn, cleanupFn); diff --git a/packages/core/src/render3/interfaces/renderer.ts b/packages/core/src/render3/interfaces/renderer.ts index 95d09ff976..6c91db9cec 100644 --- a/packages/core/src/render3/interfaces/renderer.ts +++ b/packages/core/src/render3/interfaces/renderer.ts @@ -30,9 +30,7 @@ export type Renderer3 = ObjectOrientedRenderer3|ProceduralRenderer3; export type GlobalTargetName = 'document'|'window'|'body'; -export type GlobalTargetResolver = (element: any) => { - name: GlobalTargetName, target: EventTarget -}; +export type GlobalTargetResolver = (element: any) => EventTarget; /** * Object Oriented style of API needed to create elements and text nodes. diff --git a/packages/core/src/render3/util/misc_utils.ts b/packages/core/src/render3/util/misc_utils.ts index 542cc06b8d..1ffad1839c 100644 --- a/packages/core/src/render3/util/misc_utils.ts +++ b/packages/core/src/render3/util/misc_utils.ts @@ -23,7 +23,7 @@ export const defaultScheduler = * @codeGenApi */ export function ɵɵresolveWindow(element: RElement&{ownerDocument: Document}) { - return {name: 'window', target: element.ownerDocument.defaultView}; + return element.ownerDocument.defaultView; } /** @@ -31,7 +31,7 @@ export function ɵɵresolveWindow(element: RElement&{ownerDocument: Document}) { * @codeGenApi */ export function ɵɵresolveDocument(element: RElement&{ownerDocument: Document}) { - return {name: 'document', target: element.ownerDocument}; + return element.ownerDocument; } /** @@ -39,7 +39,7 @@ export function ɵɵresolveDocument(element: RElement&{ownerDocument: Document}) * @codeGenApi */ export function ɵɵresolveBody(element: RElement&{ownerDocument: Document}) { - return {name: 'body', target: element.ownerDocument.body}; + return element.ownerDocument.body; } /** diff --git a/packages/platform-browser/src/browser/browser_adapter.ts b/packages/platform-browser/src/browser/browser_adapter.ts index fb0b79ee93..37a11494bf 100644 --- a/packages/platform-browser/src/browser/browser_adapter.ts +++ b/packages/platform-browser/src/browser/browser_adapter.ts @@ -57,6 +57,7 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter { return node instanceof DocumentFragment; } + /** @deprecated No longer being used in Ivy code. To be removed in version 14. */ getGlobalEventTarget(doc: Document, target: string): EventTarget|null { if (target === 'window') { return window; diff --git a/packages/platform-browser/src/dom/events/event_manager.ts b/packages/platform-browser/src/dom/events/event_manager.ts index e034cf1950..c8cfa17fc3 100644 --- a/packages/platform-browser/src/dom/events/event_manager.ts +++ b/packages/platform-browser/src/dom/events/event_manager.ts @@ -58,6 +58,7 @@ export class EventManager { * @param handler A function to call when the notification occurs. Receives the * event object as an argument. * @returns A callback function that can be used to remove the handler. + * @deprecated No longer being used in Ivy code. To be removed in version 14. */ addGlobalEventListener(target: string, eventName: string, handler: Function): Function { const plugin = this._findPluginFor(eventName); diff --git a/packages/platform-server/src/domino_adapter.ts b/packages/platform-server/src/domino_adapter.ts index 39d1c8f81d..b844231f27 100644 --- a/packages/platform-server/src/domino_adapter.ts +++ b/packages/platform-server/src/domino_adapter.ts @@ -62,6 +62,7 @@ export class DominoAdapter extends BrowserDomAdapter { return node.shadowRoot == node; } + /** @deprecated No longer being used in Ivy code. To be removed in version 14. */ getGlobalEventTarget(doc: Document, target: string): EventTarget|null { if (target === 'window') { return doc.defaultView; diff --git a/packages/platform-server/src/server_events.ts b/packages/platform-server/src/server_events.ts index 6c6b910478..225f436e99 100644 --- a/packages/platform-server/src/server_events.ts +++ b/packages/platform-server/src/server_events.ts @@ -22,6 +22,7 @@ export class ServerEventManagerPlugin /* extends EventManagerPlugin which is pri return getDOM().onAndCancel(element, eventName, handler); } + /** @deprecated No longer being used in Ivy code. To be removed in version 14. */ addGlobalEventListener(element: string, eventName: string, handler: Function): Function { const target: HTMLElement = getDOM().getGlobalEventTarget(this.doc, element); if (!target) {