-
Notifications
You must be signed in to change notification settings - Fork 24.7k
/
imported_renderer2.ts
113 lines (102 loc) · 4.3 KB
/
imported_renderer2.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import {ɵAnimationEngine, ɵNoopAnimationStyleNormalizer} from '@angular/animations/browser';
import {MockAnimationDriver} from '@angular/animations/browser/testing';
import {PLATFORM_BROWSER_ID, PLATFORM_SERVER_ID} from '@angular/common/src/platform_id';
import {NgZone, RendererFactory2, RendererType2} from '@angular/core';
import {NoopNgZone} from '@angular/core/src/zone/ng_zone';
import {EventManager, ɵDomRendererFactory2, ɵSharedStylesHost} from '@angular/platform-browser';
import {ɵAnimationRendererFactory} from '@angular/platform-browser/animations';
import {EventManagerPlugin} from '@angular/platform-browser/src/dom/events/event_manager';
import {isTextNode} from '@angular/platform-browser/testing/src/browser_util';
export class SimpleDomEventsPlugin extends EventManagerPlugin {
override supports(eventName: string): boolean {
return true;
}
override addEventListener(element: HTMLElement, eventName: string, handler: Function): Function {
let callback: EventListener = handler as EventListener;
element.addEventListener(eventName, callback, false);
return () => this.removeEventListener(element, eventName, callback);
}
removeEventListener(target: any, eventName: string, callback: Function): void {
return target.removeEventListener.apply(target, [eventName, callback, false]);
}
}
export function getRendererFactory2(document: any): RendererFactory2 {
const fakeNgZone: NgZone = new NoopNgZone();
const eventManager = new EventManager([new SimpleDomEventsPlugin()], fakeNgZone);
const appId = 'appid';
const rendererFactory = new ɵDomRendererFactory2(
eventManager, new ɵSharedStylesHost(document, appId), appId, true, document,
isNode ? PLATFORM_SERVER_ID : PLATFORM_BROWSER_ID, fakeNgZone);
const origCreateRenderer = rendererFactory.createRenderer;
rendererFactory.createRenderer = function(element: any, type: RendererType2|null) {
const renderer = origCreateRenderer.call(this, element, type);
renderer.destroyNode = () => {};
return renderer;
};
return rendererFactory;
}
export function getAnimationRendererFactory2(document: any): RendererFactory2 {
const fakeNgZone: NgZone = new NoopNgZone();
return new ɵAnimationRendererFactory(
getRendererFactory2(document),
new ɵAnimationEngine(
document.body, new MockAnimationDriver(), new ɵNoopAnimationStyleNormalizer()),
fakeNgZone);
}
// TODO: code duplicated from ../linker/change_detection_integration_spec.ts, to be removed
// START duplicated code
export class RenderLog {
log: string[] = [];
loggedValues: any[] = [];
setElementProperty(el: any, propName: string, propValue: any) {
this.log.push(`${propName}=${propValue}`);
this.loggedValues.push(propValue);
}
setText(node: any, value: string) {
this.log.push(`{{${value}}}`);
this.loggedValues.push(value);
}
clear() {
this.log = [];
this.loggedValues = [];
}
}
/**
* This function patches the DomRendererFactory2 so that it returns a DefaultDomRenderer2
* which logs some of the DOM operations through a RenderLog instance.
*/
export function patchLoggingRenderer2(rendererFactory: RendererFactory2, log: RenderLog) {
if ((<any>rendererFactory).__patchedForLogging) {
return;
}
(<any>rendererFactory).__patchedForLogging = true;
const origCreateRenderer = rendererFactory.createRenderer;
rendererFactory.createRenderer = function(element: any, type: RendererType2|null) {
const renderer = origCreateRenderer.call(this, element, type);
if ((<any>renderer).__patchedForLogging) {
return renderer;
}
(<any>renderer).__patchedForLogging = true;
const origSetProperty = renderer.setProperty;
const origSetValue = renderer.setValue;
renderer.setProperty = function(el: any, name: string, value: any): void {
log.setElementProperty(el, name, value);
origSetProperty.call(renderer, el, name, value);
};
renderer.setValue = function(node: any, value: string): void {
if (isTextNode(node)) {
log.setText(node, value);
}
origSetValue.call(renderer, node, value);
};
return renderer;
};
}
// END duplicated code