[Libreoffice-commits] core.git: Branch 'distro/vector/vector-7.0' - include/xmloff sw/qa sw/source xmloff/source
Mike Kaganski (via logerrit)
logerrit at kemper.freedesktop.org
Tue Oct 5 12:26:18 UTC 2021
include/xmloff/txtparae.hxx | 2 +
sw/qa/extras/odfexport/data/nestedTableInFooter.odt |binary
sw/qa/extras/odfexport/odfexport.cxx | 13 ++++++++++++
sw/source/filter/xml/xmltble.cxx | 21 +++++++++++++++++++-
xmloff/source/text/txtparae.cxx | 2 +
5 files changed, 37 insertions(+), 1 deletion(-)
New commits:
commit c0675228b5267b3c3a04cd03b23f2636a2876853
Author: Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Fri Aug 21 00:15:29 2020 +0300
Commit: Miklos Vajna <vmiklos at collabora.com>
CommitDate: Tue Oct 5 14:24:33 2021 +0200
tdf#135942: avoid collecting autostyles during writing them
This modifies the container over which iteration is performed.
Additionally, make sure that all nested table autostyles are
collected on the first phase.
(cherry picked from commit 0273675e7dde577077ccca17571846a0942f2630)
Change-Id: I74c0bb1aaacad095226c21e6bf51cc8668133bb3
diff --git a/include/xmloff/txtparae.hxx b/include/xmloff/txtparae.hxx
index 44c15512cd70..e280db9fd4af 100644
--- a/include/xmloff/txtparae.hxx
+++ b/include/xmloff/txtparae.hxx
@@ -365,6 +365,8 @@ protected:
const css::uno::Reference< css::beans::XPropertySet> & i_xPortion,
bool i_bAutoStyles, bool i_isProgress, bool & rPrevCharIsSpace);
+ bool isAutoStylesCollected() const { return mbCollected; }
+
virtual void exportTableAutoStyles();
public:
diff --git a/sw/qa/extras/odfexport/data/nestedTableInFooter.odt b/sw/qa/extras/odfexport/data/nestedTableInFooter.odt
new file mode 100644
index 000000000000..0356f04ee14e
Binary files /dev/null and b/sw/qa/extras/odfexport/data/nestedTableInFooter.odt differ
diff --git a/sw/qa/extras/odfexport/odfexport.cxx b/sw/qa/extras/odfexport/odfexport.cxx
index d41ce2037d5e..6554b6abc38b 100644
--- a/sw/qa/extras/odfexport/odfexport.cxx
+++ b/sw/qa/extras/odfexport/odfexport.cxx
@@ -2538,5 +2538,18 @@ DECLARE_ODFEXPORT_TEST(tdf124470, "tdf124470TableAndEmbeddedUsedFonts.odt")
assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:family='paragraph']", 1);
}
+DECLARE_ODFEXPORT_TEST(tdf135942, "nestedTableInFooter.odt")
+{
+ // All table autostyles should be collected, including nested, and must not crash.
+
+ CPPUNIT_ASSERT_EQUAL(1, getPages());
+
+ xmlDocUniquePtr pXmlDoc = parseExport("styles.xml");
+ if (!pXmlDoc)
+ return;
+
+ assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='table']", 2);
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/xml/xmltble.cxx b/sw/source/filter/xml/xmltble.cxx
index 0d91074bd91b..fcc386c8c110 100644
--- a/sw/source/filter/xml/xmltble.cxx
+++ b/sw/source/filter/xml/xmltble.cxx
@@ -1199,8 +1199,27 @@ void SwXMLTextParagraphExport::exportTable(
// During the flat XML export (used e.g. by .sdw-export)
// ALL flags are set at the same time.
const bool bExportStyles = bool( GetExport().getExportFlags() & SvXMLExportFlags::STYLES );
- if ( bExportStyles || !pFormat->GetDoc()->IsInHeaderFooter( aIdx ) )
+ if (!isAutoStylesCollected()
+ && (bExportStyles || !pFormat->GetDoc()->IsInHeaderFooter(aIdx)))
+ {
maTableNodes.push_back(pTableNd);
+ // Collect all tables inside cells of this table, too
+ const auto aCellNames = pXTable->getCellNames();
+ for (const OUString& rCellName : aCellNames)
+ {
+ css::uno::Reference<css::container::XEnumerationAccess> xCell(
+ pXTable->getCellByName(rCellName), css::uno::UNO_QUERY);
+ if (!xCell)
+ continue;
+ auto xEnumeration = xCell->createEnumeration();
+ while (xEnumeration->hasMoreElements())
+ {
+ if (css::uno::Reference<css::text::XTextTable> xInnerTable{
+ xEnumeration->nextElement(), css::uno::UNO_QUERY })
+ exportTable(xInnerTable, bAutoStyles, _bProgress);
+ }
+ }
+ }
}
else
{
diff --git a/xmloff/source/text/txtparae.cxx b/xmloff/source/text/txtparae.cxx
index d0c067ac7ed3..7da33fb3a686 100644
--- a/xmloff/source/text/txtparae.cxx
+++ b/xmloff/source/text/txtparae.cxx
@@ -3696,6 +3696,8 @@ void XMLTextParagraphExport::exportTableAutoStyles() {}
void XMLTextParagraphExport::exportTextAutoStyles()
{
+ // tdf#135942: do not collect styles during their export: this may modify iterated containers
+ mbCollected = true;
exportTableAutoStyles();
GetAutoStylePool().exportXML( XmlStyleFamily::TEXT_PARAGRAPH );
More information about the Libreoffice-commits
mailing list