diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index ce2b1d8fa5882f..f1e8241be262d2 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -971,6 +971,9 @@ { "name": "getFactoryDef" }, + { + "name": "getFactoryOf" + }, { "name": "getFirstLContainer" }, @@ -1169,6 +1172,9 @@ { "name": "isEnvironmentProviders" }, + { + "name": "isForwardRef" + }, { "name": "isFunction" }, diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 63e16fa5f8e875..31d7b405565882 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -740,6 +740,9 @@ { "name": "getFactoryDef" }, + { + "name": "getFactoryOf" + }, { "name": "getFirstLContainer" }, @@ -917,6 +920,9 @@ { "name": "isEnvironmentProviders" }, + { + "name": "isForwardRef" + }, { "name": "isFunction" }, diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index 2e546c78f27f2b..758687505f3b82 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -809,6 +809,9 @@ { "name": "getFactoryDef" }, + { + "name": "getFactoryOf" + }, { "name": "getFirstLContainer" }, @@ -980,6 +983,9 @@ { "name": "isEnvironmentProviders" }, + { + "name": "isForwardRef" + }, { "name": "isFunction" }, @@ -1103,6 +1109,9 @@ { "name": "ngZoneApplicationErrorHandlerFactory" }, + { + "name": "noSideEffects" + }, { "name": "nonNull" }, diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 74f1d96def2026..6abe58b9b64ed0 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -2102,6 +2102,9 @@ { "name": "ɵɵelementStart" }, + { + "name": "ɵɵgetInheritedFactory" + }, { "name": "ɵɵinject" }, diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index 1794fbfbd2d4af..5ce24395c491f7 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -662,6 +662,9 @@ { "name": "getFactoryDef" }, + { + "name": "getFactoryOf" + }, { "name": "getFirstLContainer" }, @@ -809,6 +812,9 @@ { "name": "isEnvironmentProviders" }, + { + "name": "isForwardRef" + }, { "name": "isFunction" }, @@ -902,6 +908,9 @@ { "name": "ngZoneApplicationErrorHandlerFactory" }, + { + "name": "noSideEffects" + }, { "name": "nonNull" }, diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 3a123351045c29..10f9690e9698e4 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -878,6 +878,9 @@ { "name": "getFactoryDef" }, + { + "name": "getFactoryOf" + }, { "name": "getFirstLContainer" }, @@ -1103,6 +1106,9 @@ { "name": "isEnvironmentProviders" }, + { + "name": "isForwardRef" + }, { "name": "isFunction" }, diff --git a/packages/core/test/render3/imported_renderer2.ts b/packages/core/test/render3/imported_renderer2.ts index 4bb5312bede2d3..e8bc0a61b53d8b 100644 --- a/packages/core/test/render3/imported_renderer2.ts +++ b/packages/core/test/render3/imported_renderer2.ts @@ -17,10 +17,6 @@ import {EventManagerPlugin} from '@angular/platform-browser/src/dom/events/event import {isTextNode} from '@angular/platform-browser/testing/src/browser_util'; export class SimpleDomEventsPlugin extends EventManagerPlugin { - constructor(doc: any) { - super(doc); - } - override supports(eventName: string): boolean { return true; } @@ -38,7 +34,7 @@ export class SimpleDomEventsPlugin extends EventManagerPlugin { export function getRendererFactory2(document: any): RendererFactory2 { const fakeNgZone: NgZone = new NoopNgZone(); - const eventManager = new EventManager([new SimpleDomEventsPlugin(document)], fakeNgZone); + const eventManager = new EventManager([new SimpleDomEventsPlugin()], fakeNgZone); const appId = 'appid'; const rendererFactory = new ɵDomRendererFactory2( eventManager, new ɵSharedStylesHost(document, appId), appId, true, document, diff --git a/packages/platform-browser/src/dom/events/dom_events.ts b/packages/platform-browser/src/dom/events/dom_events.ts index e3826727e3dd55..5a3d82b2725240 100644 --- a/packages/platform-browser/src/dom/events/dom_events.ts +++ b/packages/platform-browser/src/dom/events/dom_events.ts @@ -6,24 +6,20 @@ * found in the LICENSE file at https://angular.io/license */ -import {DOCUMENT} from '@angular/common'; -import {Inject, Injectable} from '@angular/core'; +import {Injectable} from '@angular/core'; import {EventManagerPlugin} from './event_manager'; @Injectable() export class DomEventsPlugin extends EventManagerPlugin { - constructor(@Inject(DOCUMENT) doc: any) { - super(doc); - } - // This plugin should come last in the list of plugins, because it accepts all // events. override supports(eventName: string): boolean { return true; } - override addEventListener(element: HTMLElement, eventName: string, handler: Function): Function { + override addEventListener( + element: HTMLElement, eventName: string, handler: (event: Event) => void): () => void { element.addEventListener(eventName, handler as EventListener, false); return () => this.removeEventListener(element, eventName, handler as EventListener); } diff --git a/packages/platform-browser/src/dom/events/event_manager.ts b/packages/platform-browser/src/dom/events/event_manager.ts index 1784364c688bc4..e81ad987058a51 100644 --- a/packages/platform-browser/src/dom/events/event_manager.ts +++ b/packages/platform-browser/src/dom/events/event_manager.ts @@ -9,7 +9,7 @@ import {Inject, Injectable, InjectionToken, NgZone} from '@angular/core'; /** - * The injection token for the event-manager plug-in service. + * The injection token for plugins of the `EventManager` service. * * @publicApi */ @@ -48,7 +48,7 @@ export class EventManager { */ addEventListener(element: HTMLElement, eventName: string, handler: Function): Function { const plugin = this._findPluginFor(eventName); - return plugin.addEventListener(element, eventName, handler); + return plugin.addEventListener(element, eventName, handler as (event: Event) => void); } /** @@ -77,13 +77,24 @@ export class EventManager { } } +/** + * The plugin definition for the `EventManager` class + * + * @publicApi + */ +@Injectable() export abstract class EventManagerPlugin { - constructor(private _doc: any) {} - // Using non-null assertion because it's set by EventManager's constructor manager!: EventManager; + /** + * Should return `true` for every event name that should be supported by this plugin + */ abstract supports(eventName: string): boolean; - abstract addEventListener(element: HTMLElement, eventName: string, handler: Function): Function; + /** + * Implement the behaviour for the supported events + */ + abstract addEventListener( + element: HTMLElement, eventName: string, handler: (event: Event) => void): Function; } diff --git a/packages/platform-browser/src/dom/events/hammer_gestures.ts b/packages/platform-browser/src/dom/events/hammer_gestures.ts index 8084b5b81d0917..dea53a193cca86 100644 --- a/packages/platform-browser/src/dom/events/hammer_gestures.ts +++ b/packages/platform-browser/src/dom/events/hammer_gestures.ts @@ -165,10 +165,9 @@ export class HammerGesturesPlugin extends EventManagerPlugin { private _loaderPromise: Promise|null = null; constructor( - @Inject(DOCUMENT) doc: any, @Inject(HAMMER_GESTURE_CONFIG) private _config: HammerGestureConfig, private console: Console, @Optional() @Inject(HAMMER_LOADER) private loader?: HammerLoader|null) { - super(doc); + super(); } override supports(eventName: string): boolean { @@ -272,7 +271,7 @@ export class HammerGesturesPlugin extends EventManagerPlugin { * HammerJS to detect gesture events. * * Note that applications still need to include the HammerJS script itself. This module - * simply sets up the coordination layer between HammerJS and Angular's EventManager. + * simply sets up the coordination layer between HammerJS and Angular's `EventManager`. * * @publicApi */ diff --git a/packages/platform-browser/src/dom/events/key_events.ts b/packages/platform-browser/src/dom/events/key_events.ts index f9810ab893d671..c593481340d0d2 100644 --- a/packages/platform-browser/src/dom/events/key_events.ts +++ b/packages/platform-browser/src/dom/events/key_events.ts @@ -54,8 +54,9 @@ export class KeyEventsPlugin extends EventManagerPlugin { * Initializes an instance of the browser plug-in. * @param doc The document in which key events will be detected. */ + // TODO: doc is unused and should be remove in the next major. constructor(@Inject(DOCUMENT) doc: any) { - super(doc); + super(); } /** @@ -188,7 +189,6 @@ export class KeyEventsPlugin extends EventManagerPlugin { /** @internal */ static _normalizeKey(keyName: string): string { - // TODO: switch to a Map if the mapping grows too much switch (keyName) { case 'esc': return 'escape'; diff --git a/packages/platform-browser/src/platform-browser.ts b/packages/platform-browser/src/platform-browser.ts index 2efc7402599ea0..de878f7d926735 100644 --- a/packages/platform-browser/src/platform-browser.ts +++ b/packages/platform-browser/src/platform-browser.ts @@ -73,7 +73,7 @@ export {Title} from './browser/title'; export {disableDebugTools, enableDebugTools} from './browser/tools/tools'; export {By} from './dom/debug/by'; export {REMOVE_STYLES_ON_COMPONENT_DESTROY} from './dom/dom_renderer'; -export {EVENT_MANAGER_PLUGINS, EventManager} from './dom/events/event_manager'; +export {EVENT_MANAGER_PLUGINS, EventManager, EventManagerPlugin} from './dom/events/event_manager'; export {HAMMER_GESTURE_CONFIG, HAMMER_LOADER, HammerGestureConfig, HammerLoader, HammerModule} from './dom/events/hammer_gestures'; export {DomSanitizer, SafeHtml, SafeResourceUrl, SafeScript, SafeStyle, SafeUrl, SafeValue} from './security/dom_sanitization_service'; export {HydrationFeature, provideClientHydration, HydrationFeatureKind, withNoDomReuse, withNoHttpTransferCache} from './hydration'; 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 7f7aca8f06f0d1..16968a898c575f 100644 --- a/packages/platform-browser/test/dom/events/event_manager_spec.ts +++ b/packages/platform-browser/test/dom/events/event_manager_spec.ts @@ -23,14 +23,14 @@ describe('EventManager', () => { beforeEach(() => { doc = getDOM().supportsDOMEvents ? document : getDOM().createHtmlDocument(); zone = new NgZone({}); - domEventPlugin = new DomEventsPlugin(doc); + domEventPlugin = new DomEventsPlugin(); }); it('should delegate event bindings to plugins that are passed in from the most generic one to the most specific one', () => { const element = el('
'); const handler = (e: any /** TODO #9100 */) => e; - const plugin = new FakeEventManagerPlugin(doc, ['click']); + const plugin = new FakeEventManagerPlugin(['click']); const manager = new EventManager([domEventPlugin, plugin], new FakeNgZone()); manager.addEventListener(element, 'click', handler); expect(plugin.eventHandler['click']).toBe(handler); @@ -40,8 +40,8 @@ describe('EventManager', () => { const element = el('
'); const clickHandler = (e: any /** TODO #9100 */) => e; const dblClickHandler = (e: any /** TODO #9100 */) => e; - const plugin1 = new FakeEventManagerPlugin(doc, ['dblclick']); - const plugin2 = new FakeEventManagerPlugin(doc, ['click', 'dblclick']); + const plugin1 = new FakeEventManagerPlugin(['dblclick']); + const plugin2 = new FakeEventManagerPlugin(['click', 'dblclick']); const manager = new EventManager([plugin2, plugin1], new FakeNgZone()); manager.addEventListener(element, 'click', clickHandler); manager.addEventListener(element, 'dblclick', dblClickHandler); @@ -51,7 +51,7 @@ describe('EventManager', () => { it('should throw when no plugin can handle the event', () => { const element = el('
'); - const plugin = new FakeEventManagerPlugin(doc, ['dblclick']); + const plugin = new FakeEventManagerPlugin(['dblclick']); const manager = new EventManager([plugin], new FakeNgZone()); expect(() => manager.addEventListener(element, 'click', null!)) .toThrowError('No event manager plugin found for event click'); @@ -326,7 +326,7 @@ describe('EventManager', () => { (done: DoneFn) => { doc = getDOM().supportsDOMEvents ? document : getDOM().createHtmlDocument(); zone = new NgZone({shouldCoalesceEventChangeDetection: true}); - domEventPlugin = new DomEventsPlugin(doc); + domEventPlugin = new DomEventsPlugin(); const element = el('
'); const child = el('
'); element.appendChild(child); @@ -363,7 +363,7 @@ describe('EventManager', () => { (done: DoneFn) => { doc = getDOM().supportsDOMEvents ? document : getDOM().createHtmlDocument(); zone = new NgZone({shouldCoalesceRunChangeDetection: true}); - domEventPlugin = new DomEventsPlugin(doc); + domEventPlugin = new DomEventsPlugin(); const element = el('
'); const child = el('
'); element.appendChild(child); @@ -400,7 +400,7 @@ describe('EventManager', () => { (done: DoneFn) => { doc = getDOM().supportsDOMEvents ? document : getDOM().createHtmlDocument(); zone = new NgZone({shouldCoalesceEventChangeDetection: true}); - domEventPlugin = new DomEventsPlugin(doc); + domEventPlugin = new DomEventsPlugin(); const element = el('
'); const child = el('
'); doc.body.appendChild(element); @@ -446,7 +446,7 @@ describe('EventManager', () => { (done: DoneFn) => { doc = getDOM().supportsDOMEvents ? document : getDOM().createHtmlDocument(); zone = new NgZone({shouldCoalesceRunChangeDetection: true}); - domEventPlugin = new DomEventsPlugin(doc); + domEventPlugin = new DomEventsPlugin(); const element = el('
'); const child = el('
'); doc.body.appendChild(element); @@ -494,8 +494,8 @@ describe('EventManager', () => { class FakeEventManagerPlugin extends EventManagerPlugin { eventHandler: {[event: string]: Function} = {}; - constructor(doc: any, public supportedEvents: string[]) { - super(doc); + constructor(public supportedEvents: string[]) { + super(); } override supports(eventName: string): boolean { diff --git a/packages/platform-browser/test/dom/events/hammer_gestures_spec.ts b/packages/platform-browser/test/dom/events/hammer_gestures_spec.ts index c319ea5ef3bb0a..4064fa4c662529 100644 --- a/packages/platform-browser/test/dom/events/hammer_gestures_spec.ts +++ b/packages/platform-browser/test/dom/events/hammer_gestures_spec.ts @@ -27,7 +27,7 @@ import {HammerGestureConfig, HammerGesturesPlugin,} from '@angular/platform-brow describe('with no custom loader', () => { beforeEach(() => { - plugin = new HammerGesturesPlugin(document, new HammerGestureConfig(), fakeConsole); + plugin = new HammerGesturesPlugin(new HammerGestureConfig(), fakeConsole); }); it('should warn user and do nothing when Hammer.js not loaded', () => { @@ -88,7 +88,7 @@ import {HammerGestureConfig, HammerGesturesPlugin,} from '@angular/platform-brow const hammerConfig = new HammerGestureConfig(); spyOn(hammerConfig, 'buildHammer').and.returnValue(fakeHammerInstance); - plugin = new HammerGesturesPlugin(document, hammerConfig, fakeConsole, loader); + plugin = new HammerGesturesPlugin(hammerConfig, fakeConsole, loader); // Use a fake EventManager that has access to the NgZone. plugin.manager = {getZone: () => ngZone} as EventManager; diff --git a/packages/platform-server/src/server_events.ts b/packages/platform-server/src/server_events.ts index ea66012b0ed294..08eac783e5705a 100644 --- a/packages/platform-server/src/server_events.ts +++ b/packages/platform-server/src/server_events.ts @@ -6,19 +6,18 @@ * found in the LICENSE file at https://angular.io/license */ -import {DOCUMENT, ɵgetDOM as getDOM} from '@angular/common'; -import {Inject, Injectable} from '@angular/core'; +import {ɵgetDOM as getDOM} from '@angular/common'; +import {Injectable} from '@angular/core'; +import {EventManagerPlugin} from '@angular/platform-browser'; @Injectable() -export class ServerEventManagerPlugin /* extends EventManagerPlugin which is private */ { - constructor(@Inject(DOCUMENT) private doc: any) {} - +export class ServerEventManagerPlugin extends EventManagerPlugin { // Handle all events on the server. - supports(eventName: string) { + override supports(eventName: string) { return true; } - addEventListener(element: HTMLElement, eventName: string, handler: Function): Function { + override addEventListener(element: HTMLElement, eventName: string, handler: Function): Function { return getDOM().onAndCancel(element, eventName, handler); } }