refactor(core): disable automatic usage of Renderer3 (#46605)

Previously, when instantiating a component, Angular would look in the DI
hierarchy for `RendererFactory2`. Any DI tree which rolls up through an
application injector (that is, one created with `BrowserModule`) should be
able to provide this interface. If not found, Angular would switch to the
experimental `Renderer3` mechanism. This switch was designed this way,
because it allowed for the creation of experimental applications where
`RendererFactory2` was not included in the bundle at all.

In this commit, instead of automatically falling back on `Renderer3`-style
rendering, an error is raised instead if `RendererFactory2` is missing from
the DI hierarchy.

PR Close #46605
This commit is contained in:
Alex Rickabaugh 2022-06-29 12:01:33 -07:00 committed by Andrew Scott
parent 31b396d49c
commit af600cd2b7
11 changed files with 13 additions and 28 deletions

View file

@ -75,6 +75,8 @@ export const enum RuntimeErrorCode {
// (undocumented)
RECURSIVE_APPLICATION_REF_TICK = 101,
// (undocumented)
RENDERER_NOT_FOUND = 407,
// (undocumented)
TEMPLATE_STRUCTURE_ERROR = 305,
// (undocumented)
TYPE_IS_NOT_STANDALONE = 907,

View file

@ -50,6 +50,7 @@ export const enum RuntimeErrorCode {
PLATFORM_ALREADY_DESTROYED = 404,
ASYNC_INITIALIZERS_STILL_RUNNING = 405,
APPLICATION_REF_ALREADY_DESTROYED = 406,
RENDERER_NOT_FOUND = 407,
// Styling Errors

View file

@ -11,6 +11,7 @@ import {Injector} from '../di/injector';
import {InjectFlags} from '../di/interface/injector';
import {ProviderToken} from '../di/provider_token';
import {EnvironmentInjector} from '../di/r3_injector';
import {RuntimeError, RuntimeErrorCode} from '../errors';
import {Type} from '../interface/type';
import {ComponentFactory as viewEngine_ComponentFactory, ComponentRef as viewEngine_ComponentRef} from '../linker/component_factory';
import {ComponentFactoryResolver as viewEngine_ComponentFactoryResolver} from '../linker/component_factory_resolver';
@ -28,7 +29,6 @@ import {NodeInjector} from './di';
import {createLView, createTView, locateHostElement, renderView} from './instructions/shared';
import {ComponentDef} from './interfaces/definition';
import {TContainerNode, TElementContainerNode, TElementNode, TNode} from './interfaces/node';
import {domRendererFactory3, RendererFactory} from './interfaces/renderer';
import {RNode} from './interfaces/renderer_dom';
import {HEADER_OFFSET, LView, LViewFlags, TViewType} from './interfaces/view';
import {MATH_ML_NAMESPACE, SVG_NAMESPACE} from './namespaces';
@ -144,9 +144,15 @@ export class ComponentFactory<T> extends viewEngine_ComponentFactory<T> {
const rootViewInjector =
realEnvironmentInjector ? new ChainedInjector(injector, realEnvironmentInjector) : injector;
const rendererFactory =
rootViewInjector.get(RendererFactory2, domRendererFactory3 as RendererFactory2) as
RendererFactory;
const rendererFactory = rootViewInjector.get(RendererFactory2, null);
if (rendererFactory === null) {
throw new RuntimeError(
RuntimeErrorCode.RENDERER_NOT_FOUND,
ngDevMode &&
'Angular was not able to inject a renderer (RendererFactory2). ' +
'Likely this is due to a broken DI hierarchy. ' +
'Make sure that any injector used to create this component has a correct parent.');
}
const sanitizer = rootViewInjector.get(Sanitizer, null);
const hostRenderer = rendererFactory.createRenderer(null, this.componentDef);

View file

@ -722,9 +722,6 @@
{
"name": "diPublicInInjector"
},
{
"name": "domRendererFactory3"
},
{
"name": "empty"
},

View file

@ -509,9 +509,6 @@
{
"name": "diPublicInInjector"
},
{
"name": "domRendererFactory3"
},
{
"name": "empty"
},

View file

@ -743,9 +743,6 @@
{
"name": "diPublicInInjector"
},
{
"name": "domRendererFactory3"
},
{
"name": "empty"
},

View file

@ -716,9 +716,6 @@
{
"name": "diPublicInInjector"
},
{
"name": "domRendererFactory3"
},
{
"name": "empty"
},

View file

@ -365,9 +365,6 @@
{
"name": "detachMovedView"
},
{
"name": "domRendererFactory3"
},
{
"name": "empty"
},

View file

@ -1028,9 +1028,6 @@
{
"name": "dispatch"
},
{
"name": "domRendererFactory3"
},
{
"name": "empty"
},

View file

@ -434,9 +434,6 @@
{
"name": "detachMovedView"
},
{
"name": "domRendererFactory3"
},
{
"name": "empty"
},

View file

@ -626,9 +626,6 @@
{
"name": "diPublicInInjector"
},
{
"name": "domRendererFactory3"
},
{
"name": "empty"
},