From 12354e46d49ea49a3aab1df2e11610f3de965746 Mon Sep 17 00:00:00 2001 From: benstevens48 Date: Fri, 4 Dec 2020 12:51:39 +0000 Subject: [PATCH 1/2] change last seen parent to weak ref --- winrt/lib/xaml/BaseControl.h | 15 ++++++++++++--- winrt/lib/xaml/CanvasSwapChainPanel.cpp | 13 +++++++++++-- winrt/lib/xaml/CanvasSwapChainPanel.h | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/winrt/lib/xaml/BaseControl.h b/winrt/lib/xaml/BaseControl.h index 1839f9022..4167d632b 100644 --- a/winrt/lib/xaml/BaseControl.h +++ b/winrt/lib/xaml/BaseControl.h @@ -134,7 +134,7 @@ namespace ABI { namespace Microsoft { namespace Graphics { namespace Canvas { na RenderTarget m_currentRenderTarget; - ComPtr m_lastSeenParent; + WeakRef m_lastSeenParent; ComPtr m_customDevice; @@ -233,7 +233,10 @@ namespace ABI { namespace Microsoft { namespace Graphics { namespace Canvas { na return ExceptionBoundary( [&] { - RemoveFromVisualTreeImpl(m_lastSeenParent.Get(), As(GetControl()).Get()); + if (!m_lastSeenParent) { + return; + } + RemoveFromVisualTreeImpl(LockWeakRef(m_lastSeenParent).Get(), As(GetControl()).Get()); }); } @@ -913,7 +916,13 @@ namespace ABI { namespace Microsoft { namespace Graphics { namespace Canvas { na void UpdateLastSeenParent() { - As(GetControl()->GetComposableBase())->get_Parent(&m_lastSeenParent); + ComPtr parent; + As(GetControl()->GetComposableBase())->get_Parent(&parent); + if (!parent) { + m_lastSeenParent.Reset(); + return; + } + m_lastSeenParent = AsWeak(parent.Get()); } HRESULT OnUnloaded(IInspectable*, IRoutedEventArgs*) diff --git a/winrt/lib/xaml/CanvasSwapChainPanel.cpp b/winrt/lib/xaml/CanvasSwapChainPanel.cpp index 51e42fb55..0efcb0797 100644 --- a/winrt/lib/xaml/CanvasSwapChainPanel.cpp +++ b/winrt/lib/xaml/CanvasSwapChainPanel.cpp @@ -88,7 +88,13 @@ HRESULT CanvasSwapChainPanel::OnLoaded(IInspectable*, IRoutedEventArgs*) return ExceptionBoundary( [&] { - As(GetComposableBase())->get_Parent(&m_lastSeenParent); + ComPtr parent; + As(GetComposableBase())->get_Parent(&parent); + if (!parent) { + m_lastSeenParent.Reset(); + return; + } + m_lastSeenParent = AsWeak(parent.Get()); }); } @@ -130,7 +136,10 @@ IFACEMETHODIMP CanvasSwapChainPanel::RemoveFromVisualTree() return ExceptionBoundary( [&] { - RemoveFromVisualTreeImpl(m_lastSeenParent.Get(), As(this).Get()); + if (!m_lastSeenParent) { + return; + } + RemoveFromVisualTreeImpl(LockWeakRef(m_lastSeenParent).Get(), As(this).Get()); }); } diff --git a/winrt/lib/xaml/CanvasSwapChainPanel.h b/winrt/lib/xaml/CanvasSwapChainPanel.h index 9e958a919..a43101be4 100644 --- a/winrt/lib/xaml/CanvasSwapChainPanel.h +++ b/winrt/lib/xaml/CanvasSwapChainPanel.h @@ -39,7 +39,7 @@ namespace ABI { namespace Microsoft { namespace Graphics { namespace Canvas { na std::shared_ptr m_adapter; ComPtr m_canvasSwapChain; - ComPtr m_lastSeenParent; + WeakRef m_lastSeenParent; public: CanvasSwapChainPanel(std::shared_ptr adapter); From 9da469426d07d2c571256420291f8a0346f3a636 Mon Sep 17 00:00:00 2001 From: benstevens48 Date: Sat, 5 Dec 2020 16:21:28 +0000 Subject: [PATCH 2/2] fix failing unit test --- winrt/lib/xaml/BaseControl.h | 3 ++- winrt/lib/xaml/CanvasSwapChainPanel.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/winrt/lib/xaml/BaseControl.h b/winrt/lib/xaml/BaseControl.h index 4167d632b..0b8cb4b07 100644 --- a/winrt/lib/xaml/BaseControl.h +++ b/winrt/lib/xaml/BaseControl.h @@ -233,10 +233,11 @@ namespace ABI { namespace Microsoft { namespace Graphics { namespace Canvas { na return ExceptionBoundary( [&] { + auto control = As(GetControl()); //Do this first because the unit tests expect a failure when this cast fails. if (!m_lastSeenParent) { return; } - RemoveFromVisualTreeImpl(LockWeakRef(m_lastSeenParent).Get(), As(GetControl()).Get()); + RemoveFromVisualTreeImpl(LockWeakRef(m_lastSeenParent).Get(), control.Get()); }); } diff --git a/winrt/lib/xaml/CanvasSwapChainPanel.cpp b/winrt/lib/xaml/CanvasSwapChainPanel.cpp index 0efcb0797..2a4a05804 100644 --- a/winrt/lib/xaml/CanvasSwapChainPanel.cpp +++ b/winrt/lib/xaml/CanvasSwapChainPanel.cpp @@ -136,10 +136,11 @@ IFACEMETHODIMP CanvasSwapChainPanel::RemoveFromVisualTree() return ExceptionBoundary( [&] { + auto control = As(this); //Do this first because the unit tests expect a failure when this cast fails. if (!m_lastSeenParent) { return; } - RemoveFromVisualTreeImpl(LockWeakRef(m_lastSeenParent).Get(), As(this).Get()); + RemoveFromVisualTreeImpl(LockWeakRef(m_lastSeenParent).Get(), control.Get()); }); }