[Libreoffice-commits] core.git: Branch 'libreoffice-6-2' - 2 commits - sw/source
Michael Stahl (via logerrit)
logerrit at kemper.freedesktop.org
Thu May 23 11:32:43 UTC 2019
sw/source/core/layout/calcmove.cxx | 34 ++++++++++++++++++++++++++++++++--
1 file changed, 32 insertions(+), 2 deletions(-)
New commits:
commit 98e4e308b365692ae2798192d6f4ca7e1cbd376e
Author: Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Wed May 22 17:09:13 2019 +0200
Commit: Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Thu May 23 13:32:08 2019 +0200
tdf#119109 sw: fix iteration in SwFrame::PrepareCursor() too
This is some copypasta, apply the same fix.
Change-Id: I096594f6d54fef68e63c982c2963499d24af6d15
Reviewed-on: https://gerrit.libreoffice.org/72798
Tested-by: Jenkins
Reviewed-by: Michael Stahl <Michael.Stahl at cib.de>
(cherry picked from commit c24299c36c3f94dd1920a6bc1b8c55b2fe6580d3)
Reviewed-on: https://gerrit.libreoffice.org/72818
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
diff --git a/sw/source/core/layout/calcmove.cxx b/sw/source/core/layout/calcmove.cxx
index 98c24c391cdf..1cdf8705d1d1 100644
--- a/sw/source/core/layout/calcmove.cxx
+++ b/sw/source/core/layout/calcmove.cxx
@@ -435,7 +435,20 @@ void SwFrame::PrepareCursor()
SwFlowFrame::CastFlowFrame(pFrame)->IsAnFollow( pThis ) )
break;
+ bool const isLast(pFrame->GetNext() == this);
pFrame->MakeAll(getRootFrame()->GetCurrShell()->GetOut());
+ if (isLast && pFrame->GetUpper() != GetUpper())
+ {
+ assert(GetUpper()->Lower() == this
+ // tab frame/section frame may split multiple times
+ || ( SwFlowFrame::CastFlowFrame(pFrame)
+ && SwFlowFrame::CastFlowFrame(GetUpper()->Lower())
+ && SwFlowFrame::CastFlowFrame(pFrame)->IsAnFollow(
+ SwFlowFrame::CastFlowFrame(GetUpper()->Lower()))
+ && GetUpper()->Lower()->GetNext() == this));
+ break; // tdf#119109 frame was moved backward, prevent
+ // FindNext() returning a frame inside this if
+ } // this is a table!
}
// With ContentFrames, the chain may be broken while walking through
// it. Therefore we have to figure out the next frame in a bit more
commit 7724fdc2ccf867e526e968ac6c27cc69408ec8ab
Author: Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Wed May 22 17:03:09 2019 +0200
Commit: Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Thu May 23 13:31:59 2019 +0200
tdf#119109 sw: fix iteration in SwFrame::PrepareMake()
The problem is that with the change in SwFlowFrame::MoveBwd(), a
SwTextFrame in a table may move backwards during MakeAll(); if the next
frame of the moved frame, and the "this" frame in PrepareMake(), is a
SwTabFrame, then the pFrame->FindNext() will return not this SwTabFrame,
but the first SwTextFrame *inside* the SwTabFrame - hence the iteration
will never meet the "pFrame == this" termination condition and the
SwTabFrame remains unformatted; this warning is printed:
warn:legacy.osl:6874:6874:sw/source/core/layout/calcmove.cxx:296: :-( Layout unstable (this not found).
(regression from 18765b9fa739337d2d891513f6e2fb7c3ce23b50)
Change-Id: I68207ba9cf68cd5abe51d647cb757176261eda40
Reviewed-on: https://gerrit.libreoffice.org/72797
Tested-by: Jenkins
Reviewed-by: Michael Stahl <Michael.Stahl at cib.de>
(cherry picked from commit e14056e6e88d9b8d988b7b88b2776a8fc952031b)
Reviewed-on: https://gerrit.libreoffice.org/72817
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
diff --git a/sw/source/core/layout/calcmove.cxx b/sw/source/core/layout/calcmove.cxx
index 96fa282153dc..98c24c391cdf 100644
--- a/sw/source/core/layout/calcmove.cxx
+++ b/sw/source/core/layout/calcmove.cxx
@@ -307,12 +307,29 @@ void SwFrame::PrepareMake(vcl::RenderContext* pRenderContext)
SwFlowFrame::CastFlowFrame(pFrame)->IsAnFollow( pThis ) )
break;
+ bool const isLast(pFrame->GetNext() == this);
+ // note: this seems obvious but does *not* hold, a MakeAll()
+ // could move more than 1 frame backwards!
+ // that's why FindNext() is used below
+ // assert(pFrame->GetUpper() == GetUpper());
pFrame->MakeAll(pRenderContext);
if( IsSctFrame() && !static_cast<SwSectionFrame*>(this)->GetSection() )
break;
+ if (isLast && pFrame->GetUpper() != GetUpper())
+ {
+ assert(GetUpper()->Lower() == this
+ // tab frame/section frame may split multiple times
+ || ( SwFlowFrame::CastFlowFrame(pFrame)
+ && SwFlowFrame::CastFlowFrame(GetUpper()->Lower())
+ && SwFlowFrame::CastFlowFrame(pFrame)->IsAnFollow(
+ SwFlowFrame::CastFlowFrame(GetUpper()->Lower()))
+ && GetUpper()->Lower()->GetNext() == this));
+ break; // tdf#119109 frame was moved backward, prevent
+ // FindNext() returning a frame inside this if
+ } // this is a table!
}
// With ContentFrames, the chain may be broken while walking through
- // it. Therefore we have to figure out the follower in a bit more
+ // it. Therefore we have to figure out the next frame in a bit more
// complicated way. However, I'll HAVE to get back to myself
// sometime again.
pFrame = pFrame->FindNext();
@@ -421,7 +438,7 @@ void SwFrame::PrepareCursor()
pFrame->MakeAll(getRootFrame()->GetCurrShell()->GetOut());
}
// With ContentFrames, the chain may be broken while walking through
- // it. Therefore we have to figure out the follower in a bit more
+ // it. Therefore we have to figure out the next frame in a bit more
// complicated way. However, I'll HAVE to get back to myself
// sometime again.
pFrame = pFrame->FindNext();
More information about the Libreoffice-commits
mailing list