From 7c5c1fae622d94a7e6ff78fc622d5f22caa10a38 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Mon, 4 Feb 2019 10:51:45 +0100 Subject: [PATCH] refactor(ivy): move around logic of getting render parent (#28455) PR Close #28455 --- packages/core/src/render3/i18n.ts | 7 ++-- .../core/src/render3/node_manipulation.ts | 36 +++++++++---------- .../bundling/todo/bundle.golden_symbols.json | 3 ++ 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/packages/core/src/render3/i18n.ts b/packages/core/src/render3/i18n.ts index fe2081ba1a..c858ef845d 100644 --- a/packages/core/src/render3/i18n.ts +++ b/packages/core/src/render3/i18n.ts @@ -10,6 +10,7 @@ import {SRCSET_ATTRS, URI_ATTRS, VALID_ATTRS, VALID_ELEMENTS, getTemplateContent import {InertBodyHelper} from '../sanitization/inert_body'; import {_sanitizeUrl, sanitizeSrcset} from '../sanitization/url_sanitizer'; import {assertDefined, assertEqual, assertGreaterThan} from '../util/assert'; + import {attachPatchData} from './context_discovery'; import {allocExpando, createNodeAtIndex, elementAttribute, load, textBinding} from './instructions'; import {LContainer, NATIVE} from './interfaces/container'; @@ -19,7 +20,7 @@ import {RComment, RElement} from './interfaces/renderer'; import {SanitizerFn} from './interfaces/sanitization'; import {StylingContext} from './interfaces/styling'; import {BINDING_INDEX, HEADER_OFFSET, HOST_NODE, LView, RENDERER, TVIEW, TView} from './interfaces/view'; -import {appendChild, createTextNode, removeNode as removeRNode} from './node_manipulation'; +import {appendChild, createTextNode, nativeRemoveNode} from './node_manipulation'; import {getIsParent, getLView, getPreviousOrParentTNode, setIsParent, setPreviousOrParentTNode} from './state'; import {NO_CHANGE} from './tokens'; import {addAllToArray, getNativeByIndex, getNativeByTNode, getTNode, isLContainer, renderStringify} from './util'; @@ -830,7 +831,7 @@ function removeNode(index: number, viewData: LView) { const removedPhTNode = getTNode(index, viewData); const removedPhRNode = getNativeByIndex(index, viewData); if (removedPhRNode) { - removeRNode(removedPhTNode, removedPhRNode, viewData); + nativeRemoveNode(viewData[RENDERER], removedPhRNode); } removedPhTNode.detached = true; @@ -840,7 +841,7 @@ function removeNode(index: number, viewData: LView) { if (isLContainer(slotValue)) { const lContainer = slotValue as LContainer; if (removedPhTNode.type !== TNodeType.Container) { - removeRNode(removedPhTNode, lContainer[NATIVE], viewData); + nativeRemoveNode(viewData[RENDERER], lContainer[NATIVE]); } } } diff --git a/packages/core/src/render3/node_manipulation.ts b/packages/core/src/render3/node_manipulation.ts index 3ff7c10172..4fb1b6ce05 100644 --- a/packages/core/src/render3/node_manipulation.ts +++ b/packages/core/src/render3/node_manipulation.ts @@ -11,7 +11,7 @@ import {attachPatchData} from './context_discovery'; import {callHooks} from './hooks'; import {LContainer, NATIVE, VIEWS, unusedValueExportToPlacateAjd as unused1} from './interfaces/container'; import {ComponentDef} from './interfaces/definition'; -import {TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeFlags, TNodeType, TProjectionNode, TViewNode, unusedValueExportToPlacateAjd as unused2} from './interfaces/node'; +import {TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeFlags, TNodeType, TViewNode, unusedValueExportToPlacateAjd as unused2} from './interfaces/node'; import {unusedValueExportToPlacateAjd as unused3} from './interfaces/projection'; import {ProceduralRenderer3, RComment, RElement, RNode, RText, Renderer3, isProceduralRenderer, unusedValueExportToPlacateAjd as unused4} from './interfaces/renderer'; import {CLEANUP, CONTAINER_INDEX, FLAGS, HEADER_OFFSET, HOST_NODE, HookData, LView, LViewFlags, NEXT, PARENT, QUERIES, RENDERER, TVIEW, unusedValueExportToPlacateAjd as unused5} from './interfaces/view'; @@ -181,7 +181,7 @@ function executeNodeAction( if (action === WalkTNodeTreeAction.Insert) { nativeInsertBefore(renderer, parent !, node, beforeNode || null); } else if (action === WalkTNodeTreeAction.Detach) { - nativeRemoveChild(renderer, node, isComponent(tNode)); + nativeRemoveNode(renderer, node, isComponent(tNode)); } else if (action === WalkTNodeTreeAction.Destroy) { ngDevMode && ngDevMode.rendererDestroyNode++; (renderer as ProceduralRenderer3).destroyNode !(node); @@ -593,18 +593,13 @@ function nativeAppendOrInsertBefore( } } -/** Removes a node from the DOM. */ -export function nativeRemoveChild( - renderer: Renderer3, child: RNode, isHostElement?: boolean): void { +/** Removes a node from the DOM given its native parent. */ +function nativeRemoveChild( + renderer: Renderer3, parent: RElement, child: RNode, isHostElement?: boolean): void { if (isProceduralRenderer(renderer)) { - const renderParent = renderer.parentNode(child); - if (renderParent) { - renderer.removeChild(renderParent, child, isHostElement); - } + renderer.removeChild(parent, child, isHostElement); } else { - // We intentionally don't use the given parent node since it may no longer - // match the state of the DOM (if the child node has been manually moved). - child.parentNode && child.parentNode.removeChild(child); + parent.removeChild(child); } } @@ -693,14 +688,19 @@ export function getBeforeNodeForView(index: number, views: LView[], containerNat } /** - * Removes the `child` element from the DOM if not in view and not projected. + * Removes a native node itself using a given renderer. To remove the node we are looking up its + * parent from the native tree as not all platforms / browsers support the equivalent of + * node.remove(). * - * @param childTNode The TNode of the child to remove - * @param childEl The child that should be removed - * @param currentView The current LView + * @param renderer A renderer to be used + * @param rNode The native node that should be removed + * @param isHostElement A flag indicating if a node to be removed is a host of a component. */ -export function removeNode(childTNode: TNode, childEl: RNode, currentView: LView): void { - nativeRemoveChild(currentView[RENDERER], childEl); +export function nativeRemoveNode(renderer: Renderer3, rNode: RNode, isHostElement?: boolean): void { + const nativeParent = nativeParentNode(renderer, rNode); + if (nativeParent) { + nativeRemoveChild(renderer, nativeParent, rNode, isHostElement); + } } /** diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index b7aa53f597..a7ddca0a12 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -1022,6 +1022,9 @@ { "name": "nativeRemoveChild" }, + { + "name": "nativeRemoveNode" + }, { "name": "nextContext" },