Kaydet (Commit) 31e66bd0 authored tarafından Michael Stahl's avatar Michael Stahl

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 575e222a and/or
 ce2fce9a)

Change-Id: Ie782252ac388524dfb083f655320a50e95239b24
Reviewed-on: https://gerrit.libreoffice.org/58676
Tested-by: Jenkins
Reviewed-by: 's avatarMichael Stahl <Michael.Stahl@cib.de>
üst 8ca83479
......@@ -1190,18 +1190,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;
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment