sw/qa/extras/ooxmlexport/data/tdf146171.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport11.cxx | 4 ++-- sw/qa/extras/ooxmlexport/ooxmlexport16.cxx | 18 ++++++++++++++++++ writerfilter/source/dmapper/DomainMapper_Impl.cxx | 11 ++++++++++- 4 files changed, 30 insertions(+), 3 deletions(-)
New commits: commit 902e23d6e95f86a6ffbc642e57e35dcd27a6e83b Author: László Németh <nem...@numbertext.org> AuthorDate: Wed Mar 2 16:41:04 2022 +0100 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu Mar 3 17:18:21 2022 +0100 tdf#146171 DOCX: fix loss of change tracking, if no date was specified, or it was specified as zero date (e.g. in a LO DOCX export). DateTime attribute w:date is optional in w:ins/w:del according to the OOXML standard. Not specified w:date was imported as invalid zero date "0-00-00T00:00:00Z" resulting loss of change tracking data completely during an ODF roundtrip. Import this invalid zero date as Epoch time to avoid losing change tracking data. Change-Id: If8442db9aa5e41c470827545c36c64f598887101 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130885 Tested-by: Jenkins Reviewed-by: László Németh <nem...@numbertext.org> Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130907 diff --git a/sw/qa/extras/ooxmlexport/data/tdf146171.docx b/sw/qa/extras/ooxmlexport/data/tdf146171.docx new file mode 100644 index 000000000000..bdd534527a99 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf146171.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx index d2922e940bf8..d39c1fdd6bcd 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx @@ -933,8 +933,8 @@ DECLARE_OOXMLEXPORT_TEST(testTdf145720, "tdf104797.docx") // mandatory authors and dates assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:moveFrom/w:moveFromRangeStart", "author", u"Tekijä"); assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:moveTo/w:moveToRangeStart", "author", u"Tekijä"); - assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:moveFrom/w:moveFromRangeStart", "date", "0-00-00T00:00:00Z"); - assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:moveTo/w:moveToRangeStart", "date", "0-00-00T00:00:00Z"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:moveFrom/w:moveFromRangeStart", "date", "1970-01-01T00:00:00Z"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:moveTo/w:moveToRangeStart", "date", "1970-01-01T00:00:00Z"); } } diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx index e3eb50c29ea4..78db013bc159 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx @@ -647,6 +647,24 @@ CPPUNIT_TEST_FIXTURE(Test, testTextframeHyperlink) assertXPath(pXmlDoc, "//w:pict/v:rect", "href", "https://libreoffice.org/"); } +CPPUNIT_TEST_FIXTURE(Test, testTdf146171_invalid_change_date) +{ + load(mpTestDocumentPath, "tdf146171.docx"); + // false alarm? during ODF roundtrip: + // 'Error: "1970-01-01" does not satisfy the "dateTime" type' + // disable and check only the conversion of the invalid (zeroed) change date + // reload("writer8", "tdf146171.odt"); + reload("Office Open XML Text", "tdf146171.docx"); + + xmlDocUniquePtr pXmlDoc = parseExport(); + // This was 0 + assertXPath(pXmlDoc, "//w:ins", 4); + // This was 0 + assertXPath(pXmlDoc, "//w:del", 1); + // This was 0000-00-00T00:00:00Z, resulting loss of change tracking during ODF roundtrip + assertXPath(pXmlDoc, "//w:del", "date", "1970-01-01T00:00:00Z"); +} + DECLARE_OOXMLEXPORT_TEST(testTdf139580, "tdf139580.odt") { // Without the fix in place, this test would have crashed at export time diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 13f1fb9056b9..8afcede51d13 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -3144,7 +3144,16 @@ void DomainMapper_Impl::CreateRedline(uno::Reference<text::XTextRange> const& xR pRedlineProperties[0].Name = getPropertyName( PROP_REDLINE_AUTHOR ); pRedlineProperties[0].Value <<= pRedline->m_sAuthor; pRedlineProperties[1].Name = getPropertyName( PROP_REDLINE_DATE_TIME ); - pRedlineProperties[1].Value <<= ConversionHelper::ConvertDateStringToDateTime( pRedline->m_sDate ); + util::DateTime aDateTime = ConversionHelper::ConvertDateStringToDateTime( pRedline->m_sDate ); + // tdf#146171 import not specified w:date (or specified as zero date "0-00-00") + // as Epoch time to avoid of losing change tracking data during ODF roundtrip + if ( aDateTime.Year == 0 && aDateTime.Month == 0 && aDateTime.Day == 0 ) + { + aDateTime.Year = 1970; + aDateTime.Month = 1; + aDateTime.Day = 1; + } + pRedlineProperties[1].Value <<= aDateTime; pRedlineProperties[2].Name = getPropertyName( PROP_REDLINE_REVERT_PROPERTIES ); pRedlineProperties[2].Value <<= pRedline->m_aRevertProperties; pRedlineProperties[3].Name = "RedlineMoved";