diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2016-11-26 15:47:15 +0000 |
---|---|---|
committer | Julien Nabet <serval2412@yahoo.fr> | 2016-11-28 11:39:35 +0000 |
commit | 6c8bfac5329741530f7cb2740246dbd11449fb74 (patch) | |
tree | 65d76dee69a732b6029a0640f6c3d79a9e98ce9d | |
parent | 5b4b60b2d81452c79ece99c51f63199b7dcf4b1d (diff) |
tdf#101327 - tolerate exceptions during window construction better.
It appears we can end up being a frame window, which is not added
into the list of frames; so tolerate that.
Change-Id: I7696e79636f7794f327027f0ca73363eef1937e5
Reviewed-on: https://gerrit.libreoffice.org/31235
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Tested-by: Michael Meeks <michael.meeks@collabora.com>
(cherry picked from commit 115671bf929a82709c535b475bf19f4967a666c8)
Reviewed-on: https://gerrit.libreoffice.org/31254
Reviewed-by: Julien Nabet <serval2412@yahoo.fr>
Tested-by: Julien Nabet <serval2412@yahoo.fr>
-rw-r--r-- | vcl/source/window/window.cxx | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index 9170c6b31a06..ac89e1cc115d 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -535,12 +535,22 @@ void Window::dispose() pSVData->maWinData.mpFirstFrame = mpWindowImpl->mpFrameData->mpNextFrame; else { + sal_Int32 nWindows = 0; vcl::Window* pSysWin = pSVData->maWinData.mpFirstFrame; - while ( pSysWin->mpWindowImpl->mpFrameData->mpNextFrame.get() != this ) + while ( pSysWin && pSysWin->mpWindowImpl->mpFrameData->mpNextFrame.get() != this ) + { pSysWin = pSysWin->mpWindowImpl->mpFrameData->mpNextFrame; + nWindows++; + } - assert (mpWindowImpl->mpFrameData->mpNextFrame.get() != pSysWin); - pSysWin->mpWindowImpl->mpFrameData->mpNextFrame = mpWindowImpl->mpFrameData->mpNextFrame; + if ( pSysWin ) + { + assert (mpWindowImpl->mpFrameData->mpNextFrame.get() != pSysWin); + pSysWin->mpWindowImpl->mpFrameData->mpNextFrame = mpWindowImpl->mpFrameData->mpNextFrame; + } + else // if it is not in the list, we can't remove it. + SAL_WARN("vcl", "Window " << this << " marked as frame window, " + "is missing from list of " << nWindows << " frames"); } mpWindowImpl->mpFrame->SetCallback( nullptr, nullptr ); pSVData->mpDefInst->DestroyFrame( mpWindowImpl->mpFrame ); |