sw/qa/extras/layout/data/tdf143239-1-min.odt |binary sw/qa/extras/layout/layout.cxx | 58 +++++++++++++++++++++++++++ sw/source/core/layout/layact.cxx | 3 + 3 files changed, 61 insertions(+)
New commits: commit 2b37e05133f7df3d1a40a8b903a7f69c5317a8eb Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Fri Feb 25 13:43:56 2022 +0100 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Mon Mar 7 13:52:39 2022 +0100 tdf#143239 sw: layout: invalidate fly position when moving off page It's possible that flags on the fly are all valid when it is moved off page when SwLayAction::FormatContent() returns and then it may not be positioned again, keeping its (wrong) position on the old page and will appear to be invisible unless you click on it. (regression from commits c799de145f7e289f31e3669646e5bd12814e6c5e and eb85de8e6b61fb3fcb6c03ae0145f7fe5478bccf) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130535 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@allotropia.de> (cherry picked from commit b14bb255199e7d6db6ec9155b5d9237cb35fdba7) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130548 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> (cherry picked from commit 2bed04d49fda2e2005699b3ef884c5295e56d8ca) Fix flaky test on Win64 Obviously the left values are unstable; they were excluded on macOS, and they fail exactly on the same lines for me locally on Win64 build. So just test that the values are restored after delete and undo. Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130738 Tested-by: Mike Kaganski <mike.kagan...@collabora.com> Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> (cherry picked from commit da77aec27e3121c895a6c6c287225216489cc8bc) Change-Id: If07d5af7b47eb288bef71d1b9e3459197b50fdc9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130972 Tested-by: Michael Stahl <michael.st...@allotropia.de> Reviewed-by: Michael Stahl <michael.st...@allotropia.de> diff --git a/sw/qa/extras/layout/data/tdf143239-1-min.odt b/sw/qa/extras/layout/data/tdf143239-1-min.odt new file mode 100644 index 000000000000..4271bfba775b Binary files /dev/null and b/sw/qa/extras/layout/data/tdf143239-1-min.odt differ diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx index 44a18c3393bd..abd99aae8f70 100644 --- a/sw/qa/extras/layout/layout.cxx +++ b/sw/qa/extras/layout/layout.cxx @@ -1163,6 +1163,64 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf138039) assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored", 0); } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf143239) +{ + SwDoc* pDoc = createDoc("tdf143239-1-min.odt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // These are unstable on macOS and Win64 builds, + // so only test that they restore original values for now + OUString p2txt1Left, p2txt2Left, p3txt1Left; + + { + xmlDocPtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly", 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds", "top", + "18540"); + p2txt1Left + = getXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds", "left"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly", 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly[1]/infos/bounds", "top", + "23894"); + p2txt2Left + = getXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly[1]/infos/bounds", "left"); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly", 1); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly[1]/infos/bounds", "top", + "35662"); + p3txt1Left + = getXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly[1]/infos/bounds", "left"); + assertXPath(pXmlDoc, "/root/page", 3); + discardDumpedLayout(); + } + + pWrtShell->SelAll(); + pWrtShell->Delete(); + pWrtShell->Undo(); + Scheduler::ProcessEventsToIdle(); + + { + xmlDocPtr pXmlDoc = parseLayoutDump(); + // now the 1st fly was on page 1, and the fly on page 2 was the 2nd one + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly", 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds", "top", + "18540"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds", "left", + p2txt1Left); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly", 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly[1]/infos/bounds", "top", + "23894"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly[1]/infos/bounds", "left", + p2txt2Left); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly", 1); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly[1]/infos/bounds", "top", + "35662"); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly[1]/infos/bounds", "left", + p3txt1Left); + assertXPath(pXmlDoc, "/root/page", 3); + discardDumpedLayout(); + } +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf116486) { SwDoc* pDoc = createDoc("tdf116486.docx"); diff --git a/sw/source/core/layout/layact.cxx b/sw/source/core/layout/layact.cxx index 1600f556e32a..abd255b69662 100644 --- a/sw/source/core/layout/layact.cxx +++ b/sw/source/core/layout/layact.cxx @@ -1683,6 +1683,9 @@ bool SwLayAction::FormatContent(SwPageFrame *const pPage) { SAL_INFO("sw.layout", "SwLayAction::FormatContent: move anchored " << pObj << " from " << pPage->GetPhyPageNum() << " to " << pAnchorPage->GetPhyPageNum()); pObj->RegisterAtPage(*pAnchorPage); + // tdf#143239 if the position remains valid, it may not be + // positioned again so would remain on the wrong page! + pObj->InvalidateObjPos(); ::Notify_Background(pObj->GetDrawObj(), pPage, pObj->GetObjRect(), PREP_FLY_LEAVE, false); }