[Libreoffice-commits] core.git: solenv/clang-format sw/CppunitTest_sw_odfexport2.mk sw/Module_sw.mk sw/qa sw/source

Justin Luth (via logerrit) logerrit at kemper.freedesktop.org
Wed Mar 17 08:29:27 UTC 2021


 solenv/clang-format/excludelist                         |    1 
 sw/CppunitTest_sw_odfexport2.mk                         |   72 ++++++++++++++++
 sw/Module_sw.mk                                         |    1 
 sw/qa/core/data/README                                  |   16 +++
 sw/qa/core/layout/data/tdf45908_invoice.odt             |binary
 sw/qa/core/layout/layout.cxx                            |    6 +
 sw/qa/extras/odfexport/data/testTdf52065_centerTabs.odt |binary
 sw/qa/extras/odfexport/odfexport2.cxx                   |   45 ++++++++++
 sw/source/core/text/porlin.hxx                          |    2 
 sw/source/core/text/txttab.cxx                          |    5 +
 10 files changed, 148 insertions(+)

New commits:
commit b6850b9827a13b8f8d9b9749a982e128b7e0e867
Author:     Justin Luth <justin.luth at collabora.com>
AuthorDate: Tue Mar 16 10:16:02 2021 +0200
Commit:     Miklos Vajna <vmiklos at collabora.com>
CommitDate: Wed Mar 17 09:28:46 2021 +0100

    tdf#52065 sw: revert tdf#45908: Cleaning up the tabs too early
    
    ... can cause loops
    from LO 3.5 commit 36c905d8c2874f6f984d5fbbc07784ec20c43524
    
    The PostFormat for Center and Decimal tabstops is critical
    since the space they take up is unknown until the following
    text is evaluated.
    The search position in these two cases is invalid
    until the text position is calculated by PostFormat.
    
    PostFormat normally returns FALSE, so in almost all
    cases the rest of NewTabPortion completes. The function only
    returned early if the start of the tabstop was beyond
    the right margin. I assume the original intent was to
    avoid potentially unnecessary processing.
    However, returning early can cause looping,
    which the LO 3.5 commit "fixed" by removing everything.
    Well, just remove the early return and both problems are solved.
    
    Change-Id: I4afc4cce8249f90097bc1f263df1a39bc219098d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112559
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <justin_luth at sil.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.com>

diff --git a/solenv/clang-format/excludelist b/solenv/clang-format/excludelist
index bd07aeebc58f..9aacb7ba1b77 100644
--- a/solenv/clang-format/excludelist
+++ b/solenv/clang-format/excludelist
@@ -12320,6 +12320,7 @@ sw/qa/extras/globalfilter/globalfilter.cxx
 sw/qa/extras/htmlimport/htmlimport.cxx
 sw/qa/extras/mailmerge/mailmerge.cxx
 sw/qa/extras/odfexport/odfexport.cxx
+sw/qa/extras/odfexport/odfexport2.cxx
 sw/qa/extras/odfimport/odfimport.cxx
 sw/qa/extras/ooxmlexport/ooxmlexport.cxx
 sw/qa/extras/ooxmlexport/ooxmlexport10.cxx
diff --git a/sw/CppunitTest_sw_odfexport2.mk b/sw/CppunitTest_sw_odfexport2.mk
new file mode 100644
index 000000000000..4ad073a9e2e2
--- /dev/null
+++ b/sw/CppunitTest_sw_odfexport2.mk
@@ -0,0 +1,72 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#*************************************************************************
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+#*************************************************************************
+
+$(eval $(call gb_CppunitTest_CppunitTest,sw_odfexport2))
+
+$(eval $(call gb_CppunitTest_use_common_precompiled_header,sw_odfexport2))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,sw_odfexport2, \
+    sw/qa/extras/odfexport/odfexport2 \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,sw_odfexport2, \
+    comphelper \
+    cppu \
+    cppuhelper \
+    sal \
+    sfx \
+    svl \
+    sw \
+    swqahelper \
+    test \
+    tl \
+    unotest \
+    utl \
+    vcl \
+))
+
+$(eval $(call gb_CppunitTest_use_externals,sw_odfexport2,\
+    boost_headers \
+    libxml2 \
+))
+
+$(eval $(call gb_CppunitTest_set_include,sw_odfexport2,\
+    -I$(SRCDIR)/sw/inc \
+    -I$(SRCDIR)/sw/source/core/inc \
+    -I$(SRCDIR)/sw/qa/inc \
+    $$(INCLUDE) \
+))
+
+$(eval $(call gb_CppunitTest_use_api,sw_odfexport2,\
+    udkapi \
+    offapi \
+    oovbaapi \
+))
+
+$(eval $(call gb_CppunitTest_use_ure,sw_odfexport2))
+$(eval $(call gb_CppunitTest_use_vcl,sw_odfexport2))
+
+$(eval $(call gb_CppunitTest_use_rdb,sw_odfexport2,services))
+
+$(eval $(call gb_CppunitTest_use_custom_headers,sw_odfexport2,\
+    officecfg/registry \
+))
+
+$(eval $(call gb_CppunitTest_use_configuration,sw_odfexport2))
+
+$(eval $(call gb_CppunitTest_use_uiconfigs,sw_odfexport2, \
+    modules/swriter \
+    svx \
+))
+
+$(eval $(call gb_CppunitTest_use_more_fonts,sw_odfexport2))
+
+# vim: set noet sw=4 ts=4:
diff --git a/sw/Module_sw.mk b/sw/Module_sw.mk
index 75bf13e75231..07a79c3ad951 100644
--- a/sw/Module_sw.mk
+++ b/sw/Module_sw.mk
@@ -96,6 +96,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,sw,\
     CppunitTest_sw_ww8import \
     CppunitTest_sw_rtfimport \
     CppunitTest_sw_odfexport \
+    CppunitTest_sw_odfexport2 \
     CppunitTest_sw_odfimport \
     CppunitTest_sw_txtexport \
     CppunitTest_sw_txtimport \
diff --git a/sw/qa/core/data/README b/sw/qa/core/data/README
index 2cc9fb3cb58f..a147d4be4c6a 100644
--- a/sw/qa/core/data/README
+++ b/sw/qa/core/data/README
@@ -5,3 +5,19 @@ mdecrypt --bare -a arcfour -o hex -k 435645 -s 3 foo.doc # to unencrypt
 mcrypt --bare -a arcfour -o hex -k 435645 -s 3   foo.doc # to create new tests
 
 to get access to the plain files for manual testing.
+
+
+The files in these subdirectories are tested to
+ensure that they import without crashing or hanging.
+Files that crash during export should go into exportdata.
+
+Both data and exportdata are tested with
+make CppunitTest_sw_filters_test      or
+make CppunitTest_sw_filters_test2     for ww6.
+
+Files that hang interactively, but pass filters_test
+might be failing because of layout issues. See core/layout.
+
+pass: these files now load - without the fix they crashed or hung.
+fail: these files still fail to load, but not because of crashing or hanging.
+indeterminate: untested temporary holding area - to be sorted as pass/fail.
diff --git a/sw/qa/core/layout/data/tdf45908_invoice.odt b/sw/qa/core/layout/data/tdf45908_invoice.odt
new file mode 100644
index 000000000000..37b76928cbf9
Binary files /dev/null and b/sw/qa/core/layout/data/tdf45908_invoice.odt differ
diff --git a/sw/qa/core/layout/layout.cxx b/sw/qa/core/layout/layout.cxx
index 8db099b6fc1b..7c37eec7fc7a 100644
--- a/sw/qa/core/layout/layout.cxx
+++ b/sw/qa/core/layout/layout.cxx
@@ -389,6 +389,12 @@ CPPUNIT_TEST_FIXTURE(SwCoreLayoutTest, testGutterMarginPageBorder)
 #endif
 }
 
+CPPUNIT_TEST_FIXTURE(SwCoreLayoutTest, testTdf45908_invoice)
+{
+    // without the fix, this was hanging (and slowly consuming memory) on fileopen.
+    load(DATA_DIRECTORY, "tdf45908_invoice.odt");
+}
+
 CPPUNIT_TEST_FIXTURE(SwCoreLayoutTest, testVerticallyMergedCellBorder)
 {
     // Given a document with a table: 2 columns, 5 rows. B2 -> B5 is merged:
diff --git a/sw/qa/extras/odfexport/data/testTdf52065_centerTabs.odt b/sw/qa/extras/odfexport/data/testTdf52065_centerTabs.odt
new file mode 100644
index 000000000000..8cdaf3eb9f31
Binary files /dev/null and b/sw/qa/extras/odfexport/data/testTdf52065_centerTabs.odt differ
diff --git a/sw/qa/extras/odfexport/odfexport2.cxx b/sw/qa/extras/odfexport/odfexport2.cxx
new file mode 100644
index 000000000000..21455b9d343d
--- /dev/null
+++ b/sw/qa/extras/odfexport/odfexport2.cxx
@@ -0,0 +1,45 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <swmodeltestbase.hxx>
+
+
+class Test : public SwModelTestBase
+{
+public:
+    Test() : SwModelTestBase("/sw/qa/extras/odfexport/data/", "writer8") {}
+
+    /**
+     * Denylist handling
+     */
+    bool mustTestImportOf(const char* filename) const override {
+        // Only test import of .odt document
+        return OString(filename).endsWith(".odt");
+    }
+
+    bool mustValidate(const char* /*filename*/) const override
+    {
+        return true;
+    }
+
+};
+
+DECLARE_ODFEXPORT_TEST(testTdf52065_centerTabs, "testTdf52065_centerTabs.odt")
+{
+    sal_Int32 nTabStop = parseDump("//body/txt[4]/Text[3]", "nWidth").toInt32();
+    // Without the fix, the text was unseen, with a tabstop width of 64057. It should be 3057
+    CPPUNIT_ASSERT(nTabStop < 4000);
+    CPPUNIT_ASSERT(3000 < nTabStop);
+    CPPUNIT_ASSERT_EQUAL(OUString(u"Pečiatka zamestnávateľa"), parseDump("//body/txt[4]/Text[4]", "Portion"));
+}
+
+// This test started in LO 7.2. Use the odfexport.cxx if you intend to backport to 7.1.
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/text/porlin.hxx b/sw/source/core/text/porlin.hxx
index a71c1112a99b..3f80a96dd7d0 100644
--- a/sw/source/core/text/porlin.hxx
+++ b/sw/source/core/text/porlin.hxx
@@ -116,6 +116,8 @@ public:
     bool IsQuoVadisPortion() const { return mnWhichPor == PortionType::QuoVadis; }
     bool IsTabLeftPortion() const { return mnWhichPor == PortionType::TabLeft; }
     bool IsTabRightPortion() const { return mnWhichPor == PortionType::TabRight; }
+    bool IsTabCenterPortion() const { return mnWhichPor == PortionType::TabCenter; }
+    bool IsTabDecimalPortion() const { return mnWhichPor == PortionType::TabDecimal; }
     bool IsFootnoteNumPortion() const { return mnWhichPor == PortionType::FootnoteNum; }
     bool IsFootnotePortion() const { return mnWhichPor == PortionType::Footnote; }
     bool IsDropPortion() const { return mnWhichPor == PortionType::Drop; }
diff --git a/sw/source/core/text/txttab.cxx b/sw/source/core/text/txttab.cxx
index 7ec721b73010..5a3d933f99f1 100644
--- a/sw/source/core/text/txttab.cxx
+++ b/sw/source/core/text/txttab.cxx
@@ -61,6 +61,11 @@ sal_uInt16 SwLineInfo::NumberOfTabStops() const
 
 SwTabPortion *SwTextFormatter::NewTabPortion( SwTextFormatInfo &rInf, bool bAuto ) const
 {
+    // Update search location - since Center/Decimal tabstops' width is dependent on the following text.
+    SwTabPortion* pTmpLastTab = rInf.GetLastTab();
+    if (pTmpLastTab && (pTmpLastTab->IsTabCenterPortion() || pTmpLastTab->IsTabDecimalPortion()))
+        pTmpLastTab->PostFormat(rInf);
+
     sal_Unicode cFill = 0;
     sal_Unicode cDec = 0;
     SvxTabAdjust eAdj;


More information about the Libreoffice-commits mailing list