From fe4b8d4eadc6025646b3fe0a21ca748d1fa0119a Mon Sep 17 00:00:00 2001 From: Stephen Crain Date: Fri, 21 Jun 2019 08:40:19 -0700 Subject: [PATCH 1/2] Fix Memory Leak in ViewViewManager --- vnext/ReactUWP/Views/ViewViewManager.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/vnext/ReactUWP/Views/ViewViewManager.cpp b/vnext/ReactUWP/Views/ViewViewManager.cpp index 48823aabba5..7c81d1693cd 100644 --- a/vnext/ReactUWP/Views/ViewViewManager.cpp +++ b/vnext/ReactUWP/Views/ViewViewManager.cpp @@ -102,7 +102,7 @@ class ViewShadowNode : public ShadowNodeBase void removeAllChildren() override { - GetViewPanel()->Clear(); + GetViewPanel(/* removeAllChildren */ true)->Clear(); } void ReplaceChild(XamlView oldChildView, XamlView newChildView) override @@ -134,7 +134,7 @@ class ViewShadowNode : public ShadowNodeBase static_cast(GetViewManager())->RefreshTransformMatrix(this); } - winrt::com_ptr GetViewPanel() + winrt::com_ptr GetViewPanel(bool removeAllChildren = false) { XamlView current = m_view; @@ -142,12 +142,18 @@ class ViewShadowNode : public ShadowNodeBase { auto control = m_view.as(); current = control.Content().as(); + if (removeAllChildren) { + control.Content(nullptr); + } } if (HasOuterBorder()) { auto border = current.try_as(); current = border.Child().try_as(); + if (removeAllChildren) { + border.Child(nullptr); + } } auto panel = current.try_as(); From 4deac8cfc67aa2bb89c32354ab353afece004892 Mon Sep 17 00:00:00 2001 From: Stephen Crain Date: Fri, 21 Jun 2019 10:44:38 -0700 Subject: [PATCH 2/2] switch it up --- vnext/ReactUWP/Views/ViewViewManager.cpp | 25 ++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/vnext/ReactUWP/Views/ViewViewManager.cpp b/vnext/ReactUWP/Views/ViewViewManager.cpp index 7c81d1693cd..9633f98e7e1 100644 --- a/vnext/ReactUWP/Views/ViewViewManager.cpp +++ b/vnext/ReactUWP/Views/ViewViewManager.cpp @@ -102,7 +102,22 @@ class ViewShadowNode : public ShadowNodeBase void removeAllChildren() override { - GetViewPanel(/* removeAllChildren */ true)->Clear(); + GetViewPanel()->Clear(); + + XamlView current = m_view; + + if (IsControl()) + { + auto control = m_view.as(); + current = control.Content().as(); + control.Content(nullptr); + } + + if (HasOuterBorder()) + { + auto border = current.try_as(); + border.Child(nullptr); + } } void ReplaceChild(XamlView oldChildView, XamlView newChildView) override @@ -134,7 +149,7 @@ class ViewShadowNode : public ShadowNodeBase static_cast(GetViewManager())->RefreshTransformMatrix(this); } - winrt::com_ptr GetViewPanel(bool removeAllChildren = false) + winrt::com_ptr GetViewPanel() { XamlView current = m_view; @@ -142,18 +157,12 @@ class ViewShadowNode : public ShadowNodeBase { auto control = m_view.as(); current = control.Content().as(); - if (removeAllChildren) { - control.Content(nullptr); - } } if (HasOuterBorder()) { auto border = current.try_as(); current = border.Child().try_as(); - if (removeAllChildren) { - border.Child(nullptr); - } } auto panel = current.try_as();