8
8
9
9
import { DomElementSchemaRegistry } from '@angular/compiler' ;
10
10
import { APP_ID , Inject , Injectable , NgZone , RenderComponentType , Renderer , Renderer2 , RendererFactory2 , RendererStyleFlags2 , RendererType2 , RootRenderer , ViewEncapsulation , ɵstringify as stringify } from '@angular/core' ;
11
- import { DOCUMENT , ɵNAMESPACE_URIS as NAMESPACE_URIS , ɵSharedStylesHost as SharedStylesHost , ɵflattenStyles as flattenStyles , ɵgetDOM as getDOM , ɵshimContentAttribute as shimContentAttribute , ɵshimHostAttribute as shimHostAttribute } from '@angular/platform-browser' ;
11
+ import { DOCUMENT , EventManager , ɵNAMESPACE_URIS as NAMESPACE_URIS , ɵSharedStylesHost as SharedStylesHost , ɵflattenStyles as flattenStyles , ɵgetDOM as getDOM , ɵshimContentAttribute as shimContentAttribute , ɵshimHostAttribute as shimHostAttribute } from '@angular/platform-browser' ;
12
12
13
13
const EMPTY_ARRAY : any [ ] = [ ] ;
14
14
@@ -19,9 +19,9 @@ export class ServerRendererFactory2 implements RendererFactory2 {
19
19
private schema = new DomElementSchemaRegistry ( ) ;
20
20
21
21
constructor (
22
- private ngZone : NgZone , @ Inject ( DOCUMENT ) private document : any ,
23
- private sharedStylesHost : SharedStylesHost ) {
24
- this . defaultRenderer = new DefaultServerRenderer2 ( document , ngZone , this . schema ) ;
22
+ private eventManager : EventManager , private ngZone : NgZone ,
23
+ @ Inject ( DOCUMENT ) private document : any , private sharedStylesHost : SharedStylesHost ) {
24
+ this . defaultRenderer = new DefaultServerRenderer2 ( eventManager , document , ngZone , this . schema ) ;
25
25
}
26
26
27
27
createRenderer ( element : any , type : RendererType2 | null ) : Renderer2 {
@@ -34,7 +34,8 @@ export class ServerRendererFactory2 implements RendererFactory2 {
34
34
let renderer = this . rendererByCompId . get ( type . id ) ;
35
35
if ( ! renderer ) {
36
36
renderer = new EmulatedEncapsulationServerRenderer2 (
37
- this . document , this . ngZone , this . sharedStylesHost , this . schema , type ) ;
37
+ this . eventManager , this . document , this . ngZone , this . sharedStylesHost , this . schema ,
38
+ type ) ;
38
39
this . rendererByCompId . set ( type . id , renderer ) ;
39
40
}
40
41
( < EmulatedEncapsulationServerRenderer2 > renderer ) . applyToHost ( element ) ;
@@ -61,18 +62,19 @@ class DefaultServerRenderer2 implements Renderer2 {
61
62
data : { [ key : string ] : any } = Object . create ( null ) ;
62
63
63
64
constructor (
64
- private document : any , private ngZone : NgZone , private schema : DomElementSchemaRegistry ) { }
65
+ private eventManager : EventManager , protected document : any , private ngZone : NgZone ,
66
+ private schema : DomElementSchemaRegistry ) { }
65
67
66
68
destroy ( ) : void { }
67
69
68
70
destroyNode : null ;
69
71
70
72
createElement ( name : string , namespace ?: string , debugInfo ?: any ) : any {
71
73
if ( namespace ) {
72
- return getDOM ( ) . createElementNS ( NAMESPACE_URIS [ namespace ] , name ) ;
74
+ return getDOM ( ) . createElementNS ( NAMESPACE_URIS [ namespace ] , name , this . document ) ;
73
75
}
74
76
75
- return getDOM ( ) . createElement ( name ) ;
77
+ return getDOM ( ) . createElement ( name , this . document ) ;
76
78
}
77
79
78
80
createComment ( value : string , debugInfo ?: any ) : any { return getDOM ( ) . createComment ( value ) ; }
@@ -166,14 +168,25 @@ class DefaultServerRenderer2 implements Renderer2 {
166
168
listen (
167
169
target : 'document' | 'window' | 'body' | any , eventName : string ,
168
170
callback : ( event : any ) => boolean ) : ( ) => void {
169
- // Note: We are not using the EventsPlugin here as this is not needed
170
- // to run our tests.
171
171
checkNoSyntheticProp ( eventName , 'listener' ) ;
172
- const el =
173
- typeof target === 'string' ? getDOM ( ) . getGlobalEventTarget ( this . document , target ) : target ;
174
- const outsideHandler = ( event : any ) => this . ngZone . runGuarded ( ( ) => callback ( event ) ) ;
175
- return this . ngZone . runOutsideAngular (
176
- ( ) => getDOM ( ) . onAndCancel ( el , eventName , outsideHandler ) as any ) ;
172
+ if ( typeof target === 'string' ) {
173
+ return < ( ) => void > this . eventManager . addGlobalEventListener (
174
+ target , eventName , this . decoratePreventDefault ( callback ) ) ;
175
+ }
176
+ return < ( ) => void > this . eventManager . addEventListener (
177
+ target , eventName , this . decoratePreventDefault ( callback ) ) as ( ) => void ;
178
+ }
179
+
180
+ private decoratePreventDefault ( eventHandler : Function ) : Function {
181
+ return ( event : any ) => {
182
+ // Run the event handler inside the ngZone because event handlers are not patched
183
+ // by Zone on the server. This is required only for tests.
184
+ const allowDefaultBehavior = this . ngZone . runGuarded ( ( ) => eventHandler ( event ) ) ;
185
+ if ( allowDefaultBehavior === false ) {
186
+ event . preventDefault ( ) ;
187
+ event . returnValue = false ;
188
+ }
189
+ } ;
177
190
}
178
191
}
179
192
@@ -190,9 +203,9 @@ class EmulatedEncapsulationServerRenderer2 extends DefaultServerRenderer2 {
190
203
private hostAttr : string ;
191
204
192
205
constructor (
193
- document : any , ngZone : NgZone , sharedStylesHost : SharedStylesHost ,
206
+ eventManager : EventManager , document : any , ngZone : NgZone , sharedStylesHost : SharedStylesHost ,
194
207
schema : DomElementSchemaRegistry , private component : RendererType2 ) {
195
- super ( document , ngZone , schema ) ;
208
+ super ( eventManager , document , ngZone , schema ) ;
196
209
const styles = flattenStyles ( component . id , component . styles , [ ] ) ;
197
210
sharedStylesHost . addStyles ( styles ) ;
198
211
@@ -203,7 +216,7 @@ class EmulatedEncapsulationServerRenderer2 extends DefaultServerRenderer2 {
203
216
applyToHost ( element : any ) { super . setAttribute ( element , this . hostAttr , '' ) ; }
204
217
205
218
createElement ( parent : any , name : string ) : Element {
206
- const el = super . createElement ( parent , name ) ;
219
+ const el = super . createElement ( parent , name , this . document ) ;
207
220
super . setAttribute ( el , this . contentAttr , '' ) ;
208
221
return el ;
209
222
}
0 commit comments