summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <Michael.Stahl@cib.de>2018-08-06 19:03:22 +0200
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2018-08-08 12:18:02 +0200
commit8d14c10639a4ff161e31156348c9928498df71ef (patch)
tree8947bd068863f9f65fb1f043cfe6d1fd53bfdb7f
parent71aae473c9c3cf15f75e2722afc7153a3af76d44 (diff)
sw: fix ignored frames in AppendAllObjs()
The problem is that AppendAllObjs() doesn't check if MakeFrames() actually created frames, it just assumes success. If there are frames anchored in frames, then it could go through the circular_buffer, find a dependent frame before its anchor frame, unsuccessfully call MakeFrames(), then call MakeFrames() on the anchor frame, and then the vector is empty. A surprising aspect is that push_back on a boost::circular_buffer will silently pop the first element if it's already "full". Possibly this is what caused tdf#112447. 1. insert section 2. in paragraph in section, insert frame 3. repeat 2 4. drag anchor of frame 1 into body of frame 2 5. edit section, click hide 6. edit section, un-click hide 7. only one frame is displayed (regression from 575e222a1742918be052f2b716ddf57ce0008404 and/or ce2fce9a41729774689080c8b5552b60c2e6ee2d) Change-Id: Ie782252ac388524dfb083f655320a50e95239b24 Reviewed-on: https://gerrit.libreoffice.org/58676 Tested-by: Jenkins Reviewed-by: Michael Stahl <Michael.Stahl@cib.de> (cherry picked from commit 31e66bd07c1082bb375be8aaf7835f019351d9bb) Reviewed-on: https://gerrit.libreoffice.org/58680 Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
-rw-r--r--sw/source/core/layout/frmtool.cxx12
1 files changed, 9 insertions, 3 deletions
diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx
index 936c4e02dc40..3f9267d73422 100644
--- a/sw/source/core/layout/frmtool.cxx
+++ b/sw/source/core/layout/frmtool.cxx
@@ -1098,18 +1098,24 @@ void AppendAllObjs(const SwFrameFormats* pTable, const SwFrame* pSib)
if(!isConnected)
{
pFormat->MakeFrames();
- pFirstRequeued = nullptr;
+ pFormat->CallSwClientNotify(sw::GetObjectConnectedHint(isConnected, pRoot));
}
- else
+ // do this *before* push_back! the circular_buffer can be "full"!
+ vFormatsToConnect.pop_front();
+ if (!isConnected)
{
if(pFirstRequeued == pFormat)
// If nothing happens anymore we can stop.
break;
if(!pFirstRequeued)
pFirstRequeued = pFormat;
+ assert(!vFormatsToConnect.full());
vFormatsToConnect.push_back(pFormat);
}
- vFormatsToConnect.pop_front();
+ else
+ {
+ pFirstRequeued = nullptr;
+ }
}
}