Skip to content

Commit a322b7d

Browse files
alxhubdylhunn
authored andcommitted
refactor(core): disable renderer3 unless explicitly enabled by tests (#46530)
The `Renderer3` abstraction in Angular was an experimental code path in Ivy which uses direct DOM operations instead of the former `Renderer2` path. To allow `Renderer2` to tree-shake away, `Renderer3` is the default _unless_ `Renderer2` is provided. It was only an experiment, and never meant to be a production code path. However, it's possible for `Renderer3` to leak into user code. This commit prevents that possibility by causing the `Renderer3` path to throw, unless an explicit function has been called to enable it. PR Close #46530
1 parent 1c5f0cd commit a322b7d

13 files changed

Lines changed: 51 additions & 39 deletions

File tree

packages/core/src/render3/component.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {addToViewTree, CLEAN_PROMISE, createLView, createTView, getOrCreateTComp
2222
import {ComponentDef, ComponentType, RenderFlags} from './interfaces/definition';
2323
import {TElementNode, TNodeType} from './interfaces/node';
2424
import {PlayerHandler} from './interfaces/player';
25-
import {domRendererFactory3, Renderer3, RendererFactory3} from './interfaces/renderer';
25+
import {domRendererFactory3, enableRenderer3, Renderer3, RendererFactory3} from './interfaces/renderer';
2626
import {RElement} from './interfaces/renderer_dom';
2727
import {CONTEXT, HEADER_OFFSET, LView, LViewFlags, RootContext, RootContextFlags, TVIEW, TViewType} from './interfaces/view';
2828
import {writeDirectClass, writeDirectStyle} from './node_manipulation';
@@ -115,6 +115,8 @@ export function renderComponent<T>(
115115
ngDevMode && publishDefaultGlobalUtils();
116116
ngDevMode && assertComponentType(componentType);
117117

118+
enableRenderer3();
119+
118120
const rendererFactory = opts.rendererFactory || domRendererFactory3;
119121
const sanitizer = opts.sanitizer || null;
120122
const componentDef = getComponentDef<T>(componentType)!;

packages/core/src/render3/interfaces/renderer.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import {RendererStyleFlags2, RendererType2} from '../../render/api_flags';
1919
import {TrustedHTML, TrustedScript, TrustedScriptURL} from '../../util/security/trusted_type_defs';
20+
2021
import {getDocument} from './document';
2122
import {RComment, RElement, RNode, RText} from './renderer_dom';
2223

@@ -105,8 +106,20 @@ export interface RendererFactory3 {
105106
end?(): void;
106107
}
107108

109+
let renderer3Enabled = false;
110+
111+
export function enableRenderer3() {
112+
renderer3Enabled = true;
113+
}
114+
108115
export const domRendererFactory3: RendererFactory3 = {
109116
createRenderer: (hostElement: RElement|null, rendererType: RendererType2|null): Renderer3 => {
117+
if (!renderer3Enabled) {
118+
throw new Error(
119+
ngDevMode ?
120+
`Renderer3 is not supported. This problem is likely caused by some component in the hierarchy was constructed without a correct parent injector.` :
121+
'Renderer3 disabled');
122+
}
110123
return getDocument();
111124
}
112125
};

packages/core/test/acceptance/component_spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {TestBed} from '@angular/core/testing';
1212
import {ɵDomRendererFactory2 as DomRendererFactory2} from '@angular/platform-browser';
1313
import {expect} from '@angular/platform-browser/testing/src/matchers';
1414

15-
import {domRendererFactory3} from '../../src/render3/interfaces/renderer';
15+
import {domRendererFactory3, enableRenderer3} from '../../src/render3/interfaces/renderer';
1616
import {global} from '../../src/util/global';
1717

1818

@@ -582,6 +582,7 @@ describe('component', () => {
582582
});
583583

584584
describe('should clear host element if provided in ComponentFactory.create', () => {
585+
beforeAll(() => enableRenderer3());
585586
function runTestWithRenderer(rendererProviders: any[]) {
586587
@Component({
587588
selector: 'dynamic-comp',

packages/core/test/bundling/animations/bundle.golden_symbols.json

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,6 @@
149149
{
150150
"name": "DIMENSIONAL_PROP_SET"
151151
},
152-
{
153-
"name": "DOCUMENT"
154-
},
155152
{
156153
"name": "DOCUMENT2"
157154
},
@@ -548,9 +545,6 @@
548545
{
549546
"name": "_randomChar"
550547
},
551-
{
552-
"name": "componentDefCount"
553-
},
554548
{
555549
"name": "_testabilityGetter"
556550
},
@@ -641,6 +635,9 @@
641635
{
642636
"name": "collectNativeNodes"
643637
},
638+
{
639+
"name": "componentDefCount"
640+
},
644641
{
645642
"name": "computeStaticStyling"
646643
},
@@ -1403,4 +1400,4 @@
14031400
{
14041401
"name": "ɵɵproperty"
14051402
}
1406-
]
1403+
]

packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,6 @@
6565
{
6666
"name": "_injectImplementation"
6767
},
68-
{
69-
"name": "componentDefCount"
70-
},
7168
{
7269
"name": "addComponentLogic"
7370
},
@@ -98,6 +95,9 @@
9895
{
9996
"name": "classIndexOf"
10097
},
98+
{
99+
"name": "componentDefCount"
100+
},
101101
{
102102
"name": "computeStaticStyling"
103103
},
@@ -365,6 +365,9 @@
365365
{
366366
"name": "renderView"
367367
},
368+
{
369+
"name": "renderer3Enabled"
370+
},
368371
{
369372
"name": "resetPreOrderHookFlags"
370373
},
@@ -449,4 +452,4 @@
449452
{
450453
"name": "ɵɵinject"
451454
}
452-
]
455+
]

packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,6 @@
107107
{
108108
"name": "DEFAULT_VALUE_ACCESSOR"
109109
},
110-
{
111-
"name": "DOCUMENT"
112-
},
113110
{
114111
"name": "DOCUMENT2"
115112
},

packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,6 @@
113113
{
114114
"name": "DEFAULT_VALUE_ACCESSOR"
115115
},
116-
{
117-
"name": "DOCUMENT"
118-
},
119116
{
120117
"name": "DOCUMENT2"
121118
},

packages/core/test/bundling/hello_world/bundle.golden_symbols.json

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,6 @@
6262
{
6363
"name": "_injectImplementation"
6464
},
65-
{
66-
"name": "componentDefCount"
67-
},
6865
{
6966
"name": "allocExpando"
7067
},
@@ -86,6 +83,9 @@
8683
{
8784
"name": "callHooks"
8885
},
86+
{
87+
"name": "componentDefCount"
88+
},
8989
{
9090
"name": "concatStringsWithSpace"
9191
},
@@ -281,6 +281,9 @@
281281
{
282282
"name": "renderView"
283283
},
284+
{
285+
"name": "renderer3Enabled"
286+
},
284287
{
285288
"name": "resetPreOrderHookFlags"
286289
},
@@ -335,4 +338,4 @@
335338
{
336339
"name": "ɵɵinject"
337340
}
338-
]
341+
]

packages/core/test/bundling/router/bundle.golden_symbols.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,6 @@
140140
{
141141
"name": "DEFAULT_SERIALIZER"
142142
},
143-
{
144-
"name": "DOCUMENT"
145-
},
146143
{
147144
"name": "DOCUMENT2"
148145
},

packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,6 @@
5959
{
6060
"name": "ConnectableSubscriber"
6161
},
62-
{
63-
"name": "DOCUMENT"
64-
},
6562
{
6663
"name": "DOCUMENT2"
6764
},
@@ -341,9 +338,6 @@
341338
{
342339
"name": "_randomChar"
343340
},
344-
{
345-
"name": "componentDefCount"
346-
},
347341
{
348342
"name": "_wrapInTimeout"
349343
},
@@ -392,6 +386,9 @@
392386
{
393387
"name": "collectNativeNodes"
394388
},
389+
{
390+
"name": "componentDefCount"
391+
},
395392
{
396393
"name": "concatStringsWithSpace"
397394
},
@@ -881,4 +878,4 @@
881878
{
882879
"name": "ɵɵinject"
883880
}
884-
]
881+
]

0 commit comments

Comments
 (0)