sd/source/ui/view/Outliner.cxx | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-)
New commits: commit 9fc3d9b445d8c2bb8e259b42430cfe089642ab03 Author: Jan Holesovsky <ke...@collabora.com> Date: Wed Mar 22 12:38:40 2017 +0100 lok sd: Fix crash when searching. This is a follow-up of ed5450f2a5ed8e72b48b4d976217746cea04a5c9 where the check for the HasView has been removed. Turns out that there are conditions when this really can happen, leading to crashes in the LOK searching. Unfortunately I did not manage to find a reliable reproducer to create a unit test :-( - so I suspect this commit might be more a workaround than a root cause fix. Would be great to find out the exact conditions leading to the situation when the EditEngine does not contain the EditView, and evaluate this fix against that - but that's hard without a reliable reproducer. A unit test for this fix is missing from the same reason. The unit test from ed5450f2a5ed8e72b48b4d976217746cea04a5c9 still passes. Change-Id: I1cca7219817119d27a224b35efb660a84d35b8fa diff --git a/sd/source/ui/view/Outliner.cxx b/sd/source/ui/view/Outliner.cxx index b123a036f507..9b4fe138301c 100644 --- a/sd/source/ui/view/Outliner.cxx +++ b/sd/source/ui/view/Outliner.cxx @@ -714,10 +714,14 @@ bool SdOutliner::SearchAndReplaceOnce(std::vector<sd::SearchSelection>* pSelecti DetectChange (); OutlinerView* pOutlinerView = mpImpl->GetOutlinerView(); - if (!pOutlinerView) - return true; // end of search - std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock()); + + if (!pOutlinerView || !GetEditEngine().HasView(&pOutlinerView->GetEditView())) + { + mpImpl->ProvideOutlinerView(*this, pViewShell, mpWindow); + pOutlinerView = mpImpl->GetOutlinerView(); + } + if (pViewShell != nullptr) { mpView = pViewShell->GetView(); @@ -1760,21 +1764,26 @@ void SdOutliner::Implementation::ProvideOutlinerView ( { // Create a new outline view to do the search on. bool bInsert = false; - if (mpOutlineView!=nullptr && !mbOwnOutlineView) + if (mpOutlineView != nullptr && !mbOwnOutlineView) mpOutlineView = nullptr; - if (mpOutlineView == nullptr) + + if (mpOutlineView == nullptr || !rOutliner.GetEditEngine().HasView(&mpOutlineView->GetEditView())) { + delete mpOutlineView; mpOutlineView = new OutlinerView(&rOutliner, pWindow); mbOwnOutlineView = true; bInsert = true; } else mpOutlineView->SetWindow(pWindow); + EVControlBits nStat = mpOutlineView->GetControlWord(); nStat &= ~EVControlBits::AUTOSCROLL; mpOutlineView->SetControlWord(nStat); + if (bInsert) rOutliner.InsertView( mpOutlineView ); + rOutliner.SetUpdateMode(false); mpOutlineView->SetOutputArea (Rectangle (Point(), Size(1, 1))); rOutliner.SetPaperSize( Size(1, 1) ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits