From f1d5dcb3b69e409c8b98c829a84eae33aa5b1bb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Fri, 13 Dec 2024 11:33:25 +0000 Subject: [PATCH] crashtesting: assert on reimport of docx export of ooo102874-2.doc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #0 SdrObjList::RemoveObjectFromContainer (this=0x1d12e30, nObjectPosition=3) at core/svx/source/svdraw/svdpage.cxx:1093 #1 0x00007ffff15da0bd in SdrObjList::SetObjectOrdNum (this=0x1d12e30, nOldObjNum=3, nNewObjNum=2) at core/svx/source/svdraw/svdpage.cxx:536 #2 0x00007ffff14c954c in SdrObject::ensureSortedImmediatelyAfter (this=0x4f56d30, rFirst=...) at core/svx/source/svdraw/svdobj.cxx:897 #3 0x00007fffcdc4978c in SwTextBoxHelper::DoTextBoxZOrderCorrection (pShape=0x4c3a660, pObj=0x4c3d730) at core/sw/source/core/doc/textboxhelper.cxx:1638 #4 0x00007fffcdc4bcbc in SwTextBoxHelper::changeAnchor (pShape=0x4c3a660, pObj=0x4c3d730) at core/sw/source/core/doc/textboxhelper.cxx:1247 #5 0x00007fffcdc4e613 in SwTextBoxHelper::synchronizeGroupTextBoxProperty (pFunc=0x7fffcdc4bc10 , pFormat=0x4c3a660, pObj=0x4c3d730) at core/sw/source/core/doc/textboxhelper.cxx:1652 #6 0x00007fffcdd41a89 in SwDrawContact::Changed_ (this=0x4c55400, rObj=..., eType=SdrUserCallType::ChildMoveOnly, pOldBoundRect=0x7fffffff09d8) at core/sw/source/core/draw/dcontact.cxx:1250 #7 0x00007fffcdd410a7 in SwDrawContact::Changed (this=0x4c55400, rObj=..., eType=SdrUserCallType::ChildMoveOnly, rOldBoundRect=...) at core/sw/source/core/draw/dcontact.cxx:1005 #8 0x00007ffff14c7356 in SdrObject::SendUserCall (this=0x4c3d730, eUserCall=SdrUserCallType::MoveOnly, rBoundRect=...) at core/svx/source/svdraw/svdobj.cxx:2827 #9 0x00007ffff14b11d8 in SdrObjCustomShape::Move (this=0x4c3d730, rSiz=Size = {...}) at core/svx/source/svdraw/svdoashp.cxx:1499 #10 0x00007ffff152753b in SdrObjGroup::Move (this=0x1be18e0, rSiz=Size = {...}) at core/svx/source/svdraw/svdogrp.cxx:561 #11 0x00007fffce8c80b8 in SwViewShellImp::NotifySizeChg (unique_ptrI7SdrMarkSt14default_deleteIS2_EESaIS5_EE11_M_allocateEm=, hrowE=) at core/sw/source/core/view/vdraw.cxx:274 #12 0x00007fffce032bc1 in AdjustSizeChgNotify (pRoot=0x5e1c7f0) at core/sw/source/core/layout/pagechg.cxx:851 #13 0x00007fffce03243f in SwRootFrame::CheckViewLayout (this=0x5e1c7f0, pViewOpt=0x0, pVisArea=0x0) at core/sw/source/core/layout/pagechg.cxx:2445 #14 0x00007fffce032eec in SwPageFrame::Cut (this=0x5f19910) at core/sw/source/core/layout/pagechg.cxx:921 #15 0x00007fffce037d40 in SwRootFrame::RemovePage (this=0x5e1c7f0, pDelRef=0x7fffffff13c0, eResult=SwRemoveResult::Prev) at core/sw/source/core/layout/pagechg.cxx:1518 #16 0x00007fffce03808e in SwRootFrame::RemoveSuperfluous (this=0x5e1c7f0) at core/sw/source/core/layout/pagechg.cxx:1557 #17 0x00007fffcdfe8d04 in SwLayAction::InternalAction (this=0x7fffffff1a30, pRenderContext=0x5211510) at core/sw/source/core/layout/layact.cxx:694 #18 0x00007fffcdfe7cc6 in SwLayAction::Action (this=0x7fffffff1a30, pRenderContext=0x5211510) at core/sw/source/core/layout/layact.cxx:396 #19 0x00007fffce8d5995 in SwViewShell::CalcLayout (this=0x521c540) at core/sw/source/core/view/viewsh.cxx:1197 #20 0x00007fffcde1233f in SwEditShell::CalcLayout (this=0x521c540) at core/sw/source/core/edit/edws.cxx:111 Change-Id: I66ffbbfc74e52eea2e24e486d52607e84ffb8fcb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178415 Tested-by: Jenkins Reviewed-by: Caolán McNamara (cherry picked from commit 71a9de600abb46e9f8bf61fd3c139dd895c60c28) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178544 Tested-by: Jenkins CollaboraOffice Reviewed-by: Miklos Vajna --- sw/source/core/view/vdraw.cxx | 49 ++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/sw/source/core/view/vdraw.cxx b/sw/source/core/view/vdraw.cxx index 5a95053cd7b9a..86d9d022175cd 100644 --- a/sw/source/core/view/vdraw.cxx +++ b/sw/source/core/view/vdraw.cxx @@ -212,6 +212,7 @@ void SwViewShellImp::NotifySizeChg( const Size &rNewSz ) OSL_ENSURE( m_pShell->getIDocumentDrawModelAccess().GetDrawModel(), "NotifySizeChg without DrawModel" ); SdrPage* pPage = m_pShell->getIDocumentDrawModelAccess().GetDrawModel()->GetPage( 0 ); + std::vector aCandidatesToMove; for (const rtl::Reference& pObj : *pPage) { if( dynamic_cast( pObj.get()) == nullptr ) @@ -252,27 +253,33 @@ void SwViewShellImp::NotifySizeChg( const Size &rNewSz ) continue; } - const tools::Rectangle aObjBound( pObj->GetCurrentBoundRect() ); - if ( !aDocRect.Contains( aObjBound ) ) - { - Size aSz; - if ( aObjBound.Left() > aDocRect.Right() ) - aSz.setWidth( (aDocRect.Right() - aObjBound.Left()) - MINFLY ); - if ( aObjBound.Top() > aDocRect.Bottom() ) - aSz.setHeight( (aDocRect.Bottom() - aObjBound.Top()) - MINFLY ); - if ( aSz.Width() || aSz.Height() ) - pObj->Move( aSz ); - - // Don't let large objects disappear to the top - aSz.setWidth(0); - aSz.setHeight(0); - if ( aObjBound.Right() < aDocRect.Left() ) - aSz.setWidth( (aDocRect.Left() - aObjBound.Right()) + MINFLY ); - if ( aObjBound.Bottom() < aDocRect.Top() ) - aSz.setHeight( (aDocRect.Top() - aObjBound.Bottom()) + MINFLY ); - if ( aSz.Width() || aSz.Height() ) - pObj->Move( aSz ); - } + aCandidatesToMove.push_back(pObj.get()); + } + } + + // Moving a SdrObject can invalidate their positions in SdrPage's container of objects + for (const auto pObj : aCandidatesToMove) + { + const tools::Rectangle aObjBound( pObj->GetCurrentBoundRect() ); + if ( !aDocRect.Contains( aObjBound ) ) + { + Size aSz; + if ( aObjBound.Left() > aDocRect.Right() ) + aSz.setWidth( (aDocRect.Right() - aObjBound.Left()) - MINFLY ); + if ( aObjBound.Top() > aDocRect.Bottom() ) + aSz.setHeight( (aDocRect.Bottom() - aObjBound.Top()) - MINFLY ); + if ( aSz.Width() || aSz.Height() ) + pObj->Move( aSz ); + + // Don't let large objects disappear to the top + aSz.setWidth(0); + aSz.setHeight(0); + if ( aObjBound.Right() < aDocRect.Left() ) + aSz.setWidth( (aDocRect.Left() - aObjBound.Right()) + MINFLY ); + if ( aObjBound.Bottom() < aDocRect.Top() ) + aSz.setHeight( (aDocRect.Top() - aObjBound.Bottom()) + MINFLY ); + if ( aSz.Width() || aSz.Height() ) + pObj->Move( aSz ); } } }