From a98fa489fb498273bdfde2fa4598893d1d53582e Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Fri, 5 Aug 2022 16:29:26 -0700 Subject: [PATCH] refactor(core): drop `RootContext` object (#47056) In a previous refactor, the `RootContext` was update to only contain a reference to a component. This commit perform further refactoring to get rid of the `RootContext` altogether, while storing component reference directly on the root view (without the `RootContext` wrapper). PR Close #47056 --- goldens/public-api/core/global_utils.md | 2 +- goldens/size-tracking/aio-payloads.json | 2 +- .../size-tracking/integration-payloads.json | 14 +-- packages/core/src/render3/component_ref.ts | 58 ++++++------ .../core/src/render3/instructions/shared.ts | 92 ++++--------------- packages/core/src/render3/interfaces/view.ts | 14 +-- .../core/src/render3/util/discovery_utils.ts | 8 +- .../src/render3/util/view_traversal_utils.ts | 14 +-- packages/core/src/render3/view_ref.ts | 12 ++- .../animations/bundle.golden_symbols.json | 15 ++- .../cyclic_import/bundle.golden_symbols.json | 15 ++- .../forms_reactive/bundle.golden_symbols.json | 15 ++- .../bundle.golden_symbols.json | 15 ++- .../hello_world/bundle.golden_symbols.json | 9 +- .../router/bundle.golden_symbols.json | 18 ++-- .../bundle.golden_symbols.json | 9 +- .../bundling/todo/bundle.golden_symbols.json | 15 ++- 17 files changed, 117 insertions(+), 210 deletions(-) diff --git a/goldens/public-api/core/global_utils.md b/goldens/public-api/core/global_utils.md index 7158f70d883..5b7650e9543 100644 --- a/goldens/public-api/core/global_utils.md +++ b/goldens/public-api/core/global_utils.md @@ -27,7 +27,7 @@ export interface DirectiveDebugMetadata { export function getComponent(element: Element): T | null; // @public -export function getContext(element: Element): T | null; +export function getContext(element: Element): T | null; // @public export function getDirectiveMetadata(directiveOrComponentInstance: any): ComponentDebugMetadata | DirectiveDebugMetadata | null; diff --git a/goldens/size-tracking/aio-payloads.json b/goldens/size-tracking/aio-payloads.json index a1bc168b630..ac8bc33ef8d 100755 --- a/goldens/size-tracking/aio-payloads.json +++ b/goldens/size-tracking/aio-payloads.json @@ -12,7 +12,7 @@ "aio-local": { "uncompressed": { "runtime": 4325, - "main": 455179, + "main": 454655, "polyfills": 33922, "styles": 73640, "light-theme": 78045, diff --git a/goldens/size-tracking/integration-payloads.json b/goldens/size-tracking/integration-payloads.json index 62f16d019f4..f9cc23ea53f 100644 --- a/goldens/size-tracking/integration-payloads.json +++ b/goldens/size-tracking/integration-payloads.json @@ -2,7 +2,7 @@ "cli-hello-world": { "uncompressed": { "runtime": 1083, - "main": 125276, + "main": 124633, "polyfills": 33824 } }, @@ -19,15 +19,15 @@ "cli-hello-world-ivy-compat": { "uncompressed": { "runtime": 1102, - "main": 132262, + "main": 131619, "polyfills": 33957 } }, "cli-hello-world-ivy-i18n": { "uncompressed": { "runtime": 926, - "main": 124860, - "polyfills": 35246 + "main": 124269, + "polyfills": 35252 } }, "cli-hello-world-lazy": { @@ -41,21 +41,21 @@ "forms": { "uncompressed": { "runtime": 1060, - "main": 157621, + "main": 156626, "polyfills": 33915 } }, "animations": { "uncompressed": { "runtime": 1070, - "main": 156816, + "main": 156225, "polyfills": 33814 } }, "standalone-bootstrap": { "uncompressed": { "runtime": 1090, - "main": 83515, + "main": 82906, "polyfills": 33945 } }, diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 647328855ae..dcfebe4fa22 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -6,17 +6,17 @@ * found in the LICENSE file at https://angular.io/license */ -import {ChangeDetectorRef as ViewEngine_ChangeDetectorRef} from '../change_detection/change_detector_ref'; +import {ChangeDetectorRef} from '../change_detection/change_detector_ref'; 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 AbstractComponentRef} from '../linker/component_factory'; -import {ComponentFactoryResolver as viewEngine_ComponentFactoryResolver} from '../linker/component_factory_resolver'; -import {createElementRef, ElementRef as viewEngine_ElementRef} from '../linker/element_ref'; -import {NgModuleRef as viewEngine_NgModuleRef} from '../linker/ng_module_factory'; +import {ComponentFactory as AbstractComponentFactory, ComponentRef as AbstractComponentRef} from '../linker/component_factory'; +import {ComponentFactoryResolver as AbstractComponentFactoryResolver} from '../linker/component_factory_resolver'; +import {createElementRef, ElementRef} from '../linker/element_ref'; +import {NgModuleRef} from '../linker/ng_module_factory'; import {RendererFactory2} from '../render/api'; import {Sanitizer} from '../sanitization/sanitizer'; import {assertDefined, assertIndexInRange} from '../util/assert'; @@ -29,12 +29,12 @@ import {diPublicInInjector, getOrCreateNodeInjectorForNode, NodeInjector} from ' import {throwProviderNotFoundError} from './errors_di'; import {registerPostOrderHooks} from './hooks'; import {reportUnknownPropertyError} from './instructions/element_validation'; -import {addToViewTree, createLView, createTView, getOrCreateTComponentView, getOrCreateTNode, initTNodeFlags, instantiateRootComponent, invokeHostBindingsInCreationMode, locateHostElement, markAsComponentHost, markDirtyIfOnPush, registerHostBindingOpCodes, renderView, setInputsForProperty} from './instructions/shared'; +import {addToViewTree, createLView, createTView, getOrCreateComponentTView, getOrCreateTNode, initTNodeFlags, instantiateRootComponent, invokeHostBindingsInCreationMode, locateHostElement, markAsComponentHost, markDirtyIfOnPush, registerHostBindingOpCodes, renderView, setInputsForProperty} from './instructions/shared'; import {ComponentDef, RenderFlags} from './interfaces/definition'; import {PropertyAliasValue, TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeType} from './interfaces/node'; import {Renderer, RendererFactory} from './interfaces/renderer'; import {RElement, RNode} from './interfaces/renderer_dom'; -import {CONTEXT, HEADER_OFFSET, LView, LViewFlags, RootContext, TVIEW, TViewType} from './interfaces/view'; +import {CONTEXT, HEADER_OFFSET, LView, LViewFlags, TVIEW, TViewType} from './interfaces/view'; import {MATH_ML_NAMESPACE, SVG_NAMESPACE} from './namespaces'; import {createElementNode, writeDirectClass, writeDirectStyle} from './node_manipulation'; import {extractAttrsAndClassesFromSelector, stringifyCSSSelectorList} from './node_selector_matcher'; @@ -45,15 +45,15 @@ import {stringifyForError} from './util/stringify_utils'; import {getTNode} from './util/view_utils'; import {RootViewRef, ViewRef} from './view_ref'; -export class ComponentFactoryResolver extends viewEngine_ComponentFactoryResolver { +export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { /** * @param ngModule The NgModuleRef to which all resolved factories are bound. */ - constructor(private ngModule?: viewEngine_NgModuleRef) { + constructor(private ngModule?: NgModuleRef) { super(); } - override resolveComponentFactory(component: Type): viewEngine_ComponentFactory { + override resolveComponentFactory(component: Type): AbstractComponentFactory { ngDevMode && assertComponentType(component); const componentDef = getComponentDef(component)!; return new ComponentFactory(componentDef, this.ngModule); @@ -102,9 +102,9 @@ class ChainedInjector implements Injector { } /** - * Render3 implementation of {@link viewEngine_ComponentFactory}. + * ComponentFactory interface implementation. */ -export class ComponentFactory extends viewEngine_ComponentFactory { +export class ComponentFactory extends AbstractComponentFactory { override selector: string; override componentType: Type; override ngContentSelectors: string[]; @@ -122,8 +122,7 @@ export class ComponentFactory extends viewEngine_ComponentFactory { * @param componentDef The component definition. * @param ngModule The NgModuleRef to which the factory is bound. */ - constructor( - private componentDef: ComponentDef, private ngModule?: viewEngine_NgModuleRef) { + constructor(private componentDef: ComponentDef, private ngModule?: NgModuleRef) { super(); this.componentType = componentDef.type; this.selector = stringifyCSSSelectorList(componentDef.selectors); @@ -134,7 +133,7 @@ export class ComponentFactory extends viewEngine_ComponentFactory { override create( injector: Injector, projectableNodes?: any[][]|undefined, rootSelectorOrNode?: any, - environmentInjector?: viewEngine_NgModuleRef|EnvironmentInjector| + environmentInjector?: NgModuleRef|EnvironmentInjector| undefined): AbstractComponentRef { environmentInjector = environmentInjector || this.ngModule; @@ -173,13 +172,12 @@ export class ComponentFactory extends viewEngine_ComponentFactory { const rootFlags = this.componentDef.onPush ? LViewFlags.Dirty | LViewFlags.IsRoot : LViewFlags.CheckAlways | LViewFlags.IsRoot; - const rootContext = createRootContext(); // Create the root view. Uses empty TView and ContentTemplate. const rootTView = createTView(TViewType.Root, null, null, 1, 0, null, null, null, null, null); const rootLView = createLView( - null, rootTView, rootContext, rootFlags, null, null, rendererFactory, hostRenderer, - sanitizer, rootViewInjector, null); + null, rootTView, null, rootFlags, null, null, rendererFactory, hostRenderer, sanitizer, + rootViewInjector, null); // rootView is the parent when bootstrapping // TODO(misko): it looks like we are entering view here but we don't really need to as @@ -230,8 +228,8 @@ export class ComponentFactory extends viewEngine_ComponentFactory { // TODO: should LifecycleHooksFeature and other host features be generated by the compiler and // executed here? // Angular 5 reference: https://stackblitz.com/edit/lifecycle-hooks-vcref - component = createRootComponent( - componentView, this.componentDef, rootLView, rootContext, [LifecycleHooksFeature]); + component = + createRootComponent(componentView, this.componentDef, rootLView, [LifecycleHooksFeature]); renderView(rootTView, rootLView, null); } finally { leaveView(); @@ -252,7 +250,7 @@ const componentFactoryResolver: ComponentFactoryResolver = new ComponentFactoryR * * @returns The ComponentFactoryResolver instance to use */ -export function injectComponentFactoryResolver(): viewEngine_ComponentFactoryResolver { +export function injectComponentFactoryResolver(): AbstractComponentFactoryResolver { return componentFactoryResolver; } @@ -267,12 +265,11 @@ export function injectComponentFactoryResolver(): viewEngine_ComponentFactoryRes export class ComponentRef extends AbstractComponentRef { override instance: T; override hostView: ViewRef; - override changeDetectorRef: ViewEngine_ChangeDetectorRef; + override changeDetectorRef: ChangeDetectorRef; override componentType: Type; constructor( - componentType: Type, instance: T, public location: viewEngine_ElementRef, - private _rootLView: LView, + componentType: Type, instance: T, public location: ElementRef, private _rootLView: LView, private _tNode: TElementNode|TContainerNode|TElementContainerNode) { super(); this.instance = instance; @@ -361,7 +358,7 @@ export function createRootComponentView( const viewRenderer = rendererFactory.createRenderer(rNode, def); const componentView = createLView( - rootView, getOrCreateTComponentView(def), null, + rootView, getOrCreateComponentTView(def), null, def.onPush ? LViewFlags.Dirty : LViewFlags.CheckAlways, rootView[index], tNode, rendererFactory, viewRenderer, sanitizer || null, null, null); @@ -382,14 +379,15 @@ export function createRootComponentView( * renderComponent() and ViewContainerRef.createComponent(). */ export function createRootComponent( - componentView: LView, componentDef: ComponentDef, rootLView: LView, rootContext: RootContext, + componentView: LView, componentDef: ComponentDef, rootLView: LView, hostFeatures: HostFeature[]|null): any { const tView = rootLView[TVIEW]; // Create directive instance with factory() and store at next index in viewData const component = instantiateRootComponent(tView, rootLView, componentDef); - rootContext.components.push(component); - componentView[CONTEXT] = component; + // Root view only contains an instance of this component, + // so we use a reference to that component instance as a context. + componentView[CONTEXT] = rootLView[CONTEXT] = component; if (hostFeatures !== null) { for (const feature of hostFeatures) { @@ -421,10 +419,6 @@ export function createRootComponent( return component; } -function createRootContext(): RootContext { - return {components: []}; -} - /** * Used to enable lifecycle hooks on the root component. * diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index 72c860fe250..b875c432810 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -33,7 +33,7 @@ import {Renderer, RendererFactory} from '../interfaces/renderer'; import {RComment, RElement, RNode, RText} from '../interfaces/renderer_dom'; import {SanitizerFn} from '../interfaces/sanitization'; import {isComponentDef, isComponentHost, isContentQueryHost, isRootView} from '../interfaces/type_checks'; -import {CHILD_HEAD, CHILD_TAIL, CLEANUP, CONTEXT, DECLARATION_COMPONENT_VIEW, DECLARATION_VIEW, EMBEDDED_VIEW_INJECTOR, FLAGS, HEADER_OFFSET, HOST, HostBindingOpCodes, ID, InitPhaseState, INJECTOR, LView, LViewFlags, NEXT, PARENT, RENDERER, RENDERER_FACTORY, RootContext, SANITIZER, T_HOST, TData, TRANSPLANTED_VIEWS_TO_REFRESH, TVIEW, TView, TViewType} from '../interfaces/view'; +import {CHILD_HEAD, CHILD_TAIL, CLEANUP, CONTEXT, DECLARATION_COMPONENT_VIEW, DECLARATION_VIEW, EMBEDDED_VIEW_INJECTOR, FLAGS, HEADER_OFFSET, HOST, HostBindingOpCodes, ID, InitPhaseState, INJECTOR, LView, LViewFlags, NEXT, PARENT, RENDERER, RENDERER_FACTORY, SANITIZER, T_HOST, TData, TRANSPLANTED_VIEWS_TO_REFRESH, TVIEW, TView, TViewType} from '../interfaces/view'; import {assertPureTNodeType, assertTNodeType} from '../node_assert'; import {updateTextNode} from '../node_manipulation'; import {isInlineTemplate, isNodeMatchingSelectorList} from '../node_selector_matcher'; @@ -480,30 +480,6 @@ export function refreshView( } } -export function renderComponentOrTemplate( - tView: TView, lView: LView, templateFn: ComponentTemplate<{}>|null, context: T) { - const rendererFactory = lView[RENDERER_FACTORY]; - - // Check no changes mode is a dev only mode used to verify that bindings have not changed - // since they were assigned. We do not want to invoke renderer factory functions in that mode - // to avoid any possible side-effects. - const checkNoChangesMode = !!ngDevMode && isInCheckNoChangesMode(); - const creationModeIsActive = isCreationMode(lView); - try { - if (!checkNoChangesMode && !creationModeIsActive && rendererFactory.begin) { - rendererFactory.begin(); - } - if (creationModeIsActive) { - renderView(tView, lView, context); - } - refreshView(tView, lView, templateFn, context); - } finally { - if (!checkNoChangesMode && !creationModeIsActive && rendererFactory.end) { - rendererFactory.end(); - } - } -} - function executeTemplate( tView: TView, lView: LView, templateFn: ComponentTemplate, rf: RenderFlags, context: T) { const prevSelectedIndex = getSelectedIndex(); @@ -586,7 +562,7 @@ export function saveResolvedLocalsInData( * @param def ComponentDef * @returns TView */ -export function getOrCreateTComponentView(def: ComponentDef): TView { +export function getOrCreateComponentTView(def: ComponentDef): TView { const tView = def.tView; // Create a TView if there isn't one, or recreate it if the first create pass didn't @@ -1420,7 +1396,7 @@ function configureViewWithDirective( function addComponentLogic(lView: LView, hostTNode: TElementNode, def: ComponentDef): void { const native = getNativeByTNode(hostTNode, lView) as RElement; - const tView = getOrCreateTComponentView(def); + const tView = getOrCreateComponentTView(def); // Only component views should be added to the view tree directly. Embedded views are // accessed through their containers because they may be removed / re-added later. @@ -1791,62 +1767,33 @@ export function markViewDirty(lView: LView): LView|null { return null; } -export function tickRootContext(rootContext: RootContext) { - for (let i = 0; i < rootContext.components.length; i++) { - const rootComponent = rootContext.components[i]; - const lView = readPatchedLView(rootComponent); - // We might not have an `LView` if the component was destroyed. - if (lView !== null) { - const tView = lView[TVIEW]; - renderComponentOrTemplate(tView, lView, tView.template, rootComponent); - } - } -} - -export function detectChangesInternal(tView: TView, lView: LView, context: T) { +export function detectChangesInternal( + tView: TView, lView: LView, context: T, notifyErrorHandler = true) { const rendererFactory = lView[RENDERER_FACTORY]; - if (rendererFactory.begin) rendererFactory.begin(); + + // Check no changes mode is a dev only mode used to verify that bindings have not changed + // since they were assigned. We do not want to invoke renderer factory functions in that mode + // to avoid any possible side-effects. + const checkNoChangesMode = !!ngDevMode && isInCheckNoChangesMode(); + + if (!checkNoChangesMode && rendererFactory.begin) rendererFactory.begin(); try { refreshView(tView, lView, tView.template, context); } catch (error) { - handleError(lView, error); + if (notifyErrorHandler) { + handleError(lView, error); + } throw error; } finally { - if (rendererFactory.end) rendererFactory.end(); + if (!checkNoChangesMode && rendererFactory.end) rendererFactory.end(); } } -/** - * Synchronously perform change detection on a root view and its components. - * - * @param lView The view which the change detection should be performed on. - */ -export function detectChangesInRootView(lView: LView): void { - tickRootContext(lView[CONTEXT] as RootContext); -} - -export function checkNoChangesInternal(tView: TView, view: LView, context: T) { +export function checkNoChangesInternal( + tView: TView, lView: LView, context: T, notifyErrorHandler = true) { setIsInCheckNoChangesMode(true); try { - detectChangesInternal(tView, view, context); - } finally { - setIsInCheckNoChangesMode(false); - } -} - -/** - * Checks the change detector on a root view and its components, and throws if any changes are - * detected. - * - * This is used in development mode to verify that running change detection doesn't - * introduce other changes. - * - * @param lView The view which the change detection should be checked on. - */ -export function checkNoChangesInRootView(lView: LView): void { - setIsInCheckNoChangesMode(true); - try { - detectChangesInRootView(lView); + detectChangesInternal(tView, lView, context, notifyErrorHandler); } finally { setIsInCheckNoChangesMode(false); } @@ -1859,7 +1806,6 @@ function executeViewQueryFn( viewQueryFn(flags, component); } - /////////////////////////////// //// Bindings & interpolations /////////////////////////////// diff --git a/packages/core/src/render3/interfaces/view.ts b/packages/core/src/render3/interfaces/view.ts index da2577d7621..e13cee23221 100644 --- a/packages/core/src/render3/interfaces/view.ts +++ b/packages/core/src/render3/interfaces/view.ts @@ -175,8 +175,8 @@ export interface LView extends Array { /** * - For dynamic views, this is the context with which to render the template (e.g. * `NgForContext`), or `{}` if not defined explicitly. - * - For root view of the root component the context contains change detection data. - * - For non-root components, the context is the component instance, + * - For root view of the root component it's a reference to the component instance itself. + * - For components, the context is a reference to the component instance itself. * - For inline views, the context is null. */ [CONTEXT]: T; @@ -789,16 +789,6 @@ export interface TView { incompleteFirstPass: boolean; } -/** - * Contains information which is shared for all bootstrapped components. - */ -export interface RootContext { - /** - * The components that were instantiated within this context. - */ - components: T[]; -} - /** Single hook callback function. */ export type HookFn = () => void; diff --git a/packages/core/src/render3/util/discovery_utils.ts b/packages/core/src/render3/util/discovery_utils.ts index 12c38e150b1..ac24234817a 100644 --- a/packages/core/src/render3/util/discovery_utils.ts +++ b/packages/core/src/render3/util/discovery_utils.ts @@ -15,13 +15,11 @@ import {discoverLocalRefs, getComponentAtNodeIndex, getDirectivesAtNodeIndex, ge import {getComponentDef, getDirectiveDef} from '../definition'; import {NodeInjector} from '../di'; import {buildDebugNode} from '../instructions/lview_debug'; -import {LContext} from '../interfaces/context'; import {DirectiveDef} from '../interfaces/definition'; import {TElementNode, TNode, TNodeProviderIndexes} from '../interfaces/node'; import {isLView} from '../interfaces/type_checks'; -import {CLEANUP, CONTEXT, DebugNode, FLAGS, LView, LViewFlags, RootContext, T_HOST, TVIEW, TViewType} from '../interfaces/view'; +import {CLEANUP, CONTEXT, DebugNode, FLAGS, LView, LViewFlags, T_HOST, TVIEW, TViewType} from '../interfaces/view'; -import {stringifyForError} from './stringify_utils'; import {getLViewParent, getRootContext} from './view_traversal_utils'; import {getTNode, unwrapRNode} from './view_utils'; @@ -83,7 +81,7 @@ export function getComponent(element: Element): T|null { * @publicApi * @globalApi ng */ -export function getContext(element: Element): T|null { +export function getContext(element: Element): T|null { assertDomElement(element); const context = getLContext(element)!; const lView = context ? context.lView : null; @@ -130,7 +128,7 @@ export function getOwningComponent(elementOrDir: Element|{}): T|null { */ export function getRootComponents(elementOrDir: Element|{}): {}[] { const lView = readPatchedLView<{}>(elementOrDir); - return lView !== null ? [...getRootContext(lView).components as unknown as {}[]] : []; + return lView !== null ? [getRootContext(lView)] : []; } /** diff --git a/packages/core/src/render3/util/view_traversal_utils.ts b/packages/core/src/render3/util/view_traversal_utils.ts index 9edaceaa46d..e056f8613d8 100644 --- a/packages/core/src/render3/util/view_traversal_utils.ts +++ b/packages/core/src/render3/util/view_traversal_utils.ts @@ -11,7 +11,7 @@ import {assertLView} from '../assert'; import {readPatchedLView} from '../context_discovery'; import {LContainer} from '../interfaces/container'; import {isLContainer, isLView} from '../interfaces/type_checks'; -import {CHILD_HEAD, CONTEXT, FLAGS, LView, LViewFlags, NEXT, PARENT, RootContext} from '../interfaces/view'; +import {CHILD_HEAD, CONTEXT, FLAGS, LView, LViewFlags, NEXT, PARENT} from '../interfaces/view'; /** @@ -42,17 +42,17 @@ export function getRootView(componentOrLView: LView|{}): LView { } /** - * Returns the `RootContext` instance that is associated with - * the application where the target is situated. It does this by walking the parent views until it - * gets to the root view, then getting the context off of that. + * Returns the context information associated with the application where the target is situated. It + * does this by walking the parent views until it gets to the root view, then getting the context + * off of that. * * @param viewOrComponent the `LView` or component to get the root context for. */ -export function getRootContext(viewOrComponent: LView|{}): RootContext { +export function getRootContext(viewOrComponent: LView|{}): T { const rootView = getRootView(viewOrComponent); ngDevMode && - assertDefined(rootView[CONTEXT], 'RootView has no context. Perhaps it is disconnected?'); - return rootView[CONTEXT] as RootContext; + assertDefined(rootView[CONTEXT], 'Root view has no context. Perhaps it is disconnected?'); + return rootView[CONTEXT] as T; } diff --git a/packages/core/src/render3/view_ref.ts b/packages/core/src/render3/view_ref.ts index 9bc150cfb43..cfc63a42ebe 100644 --- a/packages/core/src/render3/view_ref.ts +++ b/packages/core/src/render3/view_ref.ts @@ -13,7 +13,7 @@ import {removeFromArray} from '../util/array_utils'; import {assertEqual} from '../util/assert'; import {collectNativeNodes} from './collect_native_nodes'; -import {checkNoChangesInRootView, checkNoChangesInternal, detectChangesInRootView, detectChangesInternal, markViewDirty, storeCleanupWithContext} from './instructions/shared'; +import {checkNoChangesInternal, detectChangesInternal, markViewDirty, storeCleanupWithContext} from './instructions/shared'; import {CONTAINER_HEADER_OFFSET, VIEW_REFS} from './interfaces/container'; import {isLContainer} from './interfaces/type_checks'; import {CONTEXT, FLAGS, LView, LViewFlags, PARENT, TVIEW} from './interfaces/view'; @@ -317,12 +317,18 @@ export class RootViewRef extends ViewRef { } override detectChanges(): void { - detectChangesInRootView(this._view); + const lView = this._view; + const tView = lView[TVIEW]; + const context = lView[CONTEXT]; + detectChangesInternal(tView, lView, context, false); } override checkNoChanges(): void { if (ngDevMode) { - checkNoChangesInRootView(this._view); + const lView = this._view; + const tView = lView[TVIEW]; + const context = lView[CONTEXT]; + checkNoChangesInternal(tView, lView, context, false); } } diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index c5747e747d6..3e557caead9 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -707,6 +707,9 @@ { "name": "detachMovedView" }, + { + "name": "detectChangesInternal" + }, { "name": "diPublicInInjector" }, @@ -833,15 +836,15 @@ { "name": "getNullInjector" }, + { + "name": "getOrCreateComponentTView" + }, { "name": "getOrCreateInjectable" }, { "name": "getOrCreateNodeInjectorForNode" }, - { - "name": "getOrCreateTComponentView" - }, { "name": "getOrCreateTNode" }, @@ -1160,9 +1163,6 @@ { "name": "promise" }, - { - "name": "readPatchedLView" - }, { "name": "refCount" }, @@ -1205,9 +1205,6 @@ { "name": "renderComponent" }, - { - "name": "renderComponentOrTemplate" - }, { "name": "renderView" }, 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 5cd321e96ea..8ff223cda6f 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -494,6 +494,9 @@ { "name": "detachMovedView" }, + { + "name": "detectChangesInternal" + }, { "name": "diPublicInInjector" }, @@ -611,15 +614,15 @@ { "name": "getNullInjector" }, + { + "name": "getOrCreateComponentTView" + }, { "name": "getOrCreateInjectable" }, { "name": "getOrCreateNodeInjectorForNode" }, - { - "name": "getOrCreateTComponentView" - }, { "name": "getOrCreateTNode" }, @@ -866,9 +869,6 @@ { "name": "promise" }, - { - "name": "readPatchedLView" - }, { "name": "refCount" }, @@ -905,9 +905,6 @@ { "name": "renderComponent" }, - { - "name": "renderComponentOrTemplate" - }, { "name": "renderView" }, diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 8c9641f3017..ed6251937e6 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -728,6 +728,9 @@ { "name": "detachView" }, + { + "name": "detectChangesInternal" + }, { "name": "diPublicInInjector" }, @@ -887,6 +890,9 @@ { "name": "getNullInjector" }, + { + "name": "getOrCreateComponentTView" + }, { "name": "getOrCreateInjectable" }, @@ -896,9 +902,6 @@ { "name": "getOrCreateNodeInjectorForNode" }, - { - "name": "getOrCreateTComponentView" - }, { "name": "getOrCreateTNode" }, @@ -1304,9 +1307,6 @@ { "name": "providerToFactory" }, - { - "name": "readPatchedLView" - }, { "name": "refCount" }, @@ -1355,9 +1355,6 @@ { "name": "renderComponent" }, - { - "name": "renderComponentOrTemplate" - }, { "name": "renderView" }, diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index c413515d3f8..1136c35afb6 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -698,6 +698,9 @@ { "name": "detachView" }, + { + "name": "detectChangesInternal" + }, { "name": "diPublicInInjector" }, @@ -848,6 +851,9 @@ { "name": "getNullInjector" }, + { + "name": "getOrCreateComponentTView" + }, { "name": "getOrCreateInjectable" }, @@ -857,9 +863,6 @@ { "name": "getOrCreateNodeInjectorForNode" }, - { - "name": "getOrCreateTComponentView" - }, { "name": "getOrCreateTNode" }, @@ -1268,9 +1271,6 @@ { "name": "providerToFactory" }, - { - "name": "readPatchedLView" - }, { "name": "refCount" }, @@ -1319,9 +1319,6 @@ { "name": "renderComponent" }, - { - "name": "renderComponentOrTemplate" - }, { "name": "renderStringify" }, diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index e2a9d420a17..1fe7520deef 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -353,6 +353,9 @@ { "name": "detachMovedView" }, + { + "name": "detectChangesInternal" + }, { "name": "empty" }, @@ -635,9 +638,6 @@ { "name": "promise" }, - { - "name": "readPatchedLView" - }, { "name": "refCount" }, @@ -668,9 +668,6 @@ { "name": "renderComponent" }, - { - "name": "renderComponentOrTemplate" - }, { "name": "renderView" }, diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index a2e007400dc..285fc80198e 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -905,6 +905,9 @@ { "name": "detachView" }, + { + "name": "detectChangesInternal" + }, { "name": "diPublicInInjector" }, @@ -1115,6 +1118,9 @@ { "name": "getNullInjector" }, + { + "name": "getOrCreateComponentTView" + }, { "name": "getOrCreateInjectable" }, @@ -1127,9 +1133,6 @@ { "name": "getOrCreateRouteInjectorIfNeeded" }, - { - "name": "getOrCreateTComponentView" - }, { "name": "getOrCreateTNode" }, @@ -1313,9 +1316,6 @@ { "name": "isContentQueryHost" }, - { - "name": "isCreationMode" - }, { "name": "isCssClassMatching" }, @@ -1559,9 +1559,6 @@ { "name": "provideRoutes" }, - { - "name": "readPatchedLView" - }, { "name": "redirectIfUrlTree" }, @@ -1604,9 +1601,6 @@ { "name": "renderComponent" }, - { - "name": "renderComponentOrTemplate" - }, { "name": "renderStringify" }, 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 f95ecdb3ebf..b9448473f12 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -422,6 +422,9 @@ { "name": "detachMovedView" }, + { + "name": "detectChangesInternal" + }, { "name": "empty" }, @@ -722,9 +725,6 @@ { "name": "promise" }, - { - "name": "readPatchedLView" - }, { "name": "refCount" }, @@ -758,9 +758,6 @@ { "name": "renderComponent" }, - { - "name": "renderComponentOrTemplate" - }, { "name": "renderView" }, diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 413ecb6af3b..54bc6dc0fc8 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -608,6 +608,9 @@ { "name": "detachView" }, + { + "name": "detectChangesInternal" + }, { "name": "diPublicInInjector" }, @@ -740,6 +743,9 @@ { "name": "getNullInjector" }, + { + "name": "getOrCreateComponentTView" + }, { "name": "getOrCreateInjectable" }, @@ -749,9 +755,6 @@ { "name": "getOrCreateNodeInjectorForNode" }, - { - "name": "getOrCreateTComponentView" - }, { "name": "getOrCreateTNode" }, @@ -1079,9 +1082,6 @@ { "name": "promise" }, - { - "name": "readPatchedLView" - }, { "name": "refCount" }, @@ -1118,9 +1118,6 @@ { "name": "renderComponent" }, - { - "name": "renderComponentOrTemplate" - }, { "name": "renderStringify" },