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.kagan...@collabora.com> AuthorDate: Fri Aug 21 00:15:29 2020 +0300 Commit: Miklos Vajna <vmik...@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 );