diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2020-08-21 00:15:29 +0300 |
---|---|---|
committer | Xisco Fauli <xiscofauli@libreoffice.org> | 2020-09-23 13:35:43 +0200 |
commit | 63fba1ef338f14e2451baf039e0ae30d992b6743 (patch) | |
tree | 2ce3746f592071aeee30f9e59a112a3c93978009 | |
parent | def6e51cd56814aad3cbb8c1035da71c47927854 (diff) |
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.
Change-Id: I74c0bb1aaacad095226c21e6bf51cc8668133bb3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101096
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
(cherry picked from commit f0286ad82465152b29bba01ab2edeb97291397fa)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101069
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
(cherry picked from commit 0273675e7dde577077ccca17571846a0942f2630)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102311
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
-rw-r--r-- | include/xmloff/txtparae.hxx | 2 | ||||
-rw-r--r-- | sw/qa/extras/odfexport/data/nestedTableInFooter.odt | bin | 0 -> 8611 bytes | |||
-rw-r--r-- | sw/qa/extras/odfexport/odfexport.cxx | 12 | ||||
-rw-r--r-- | sw/source/filter/xml/xmltble.cxx | 21 | ||||
-rw-r--r-- | xmloff/source/text/txtparae.cxx | 2 |
5 files changed, 36 insertions, 1 deletions
diff --git a/include/xmloff/txtparae.hxx b/include/xmloff/txtparae.hxx index 7ded21114fd6..c01c03eea4d3 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 Binary files differnew file mode 100644 index 000000000000..0356f04ee14e --- /dev/null +++ b/sw/qa/extras/odfexport/data/nestedTableInFooter.odt diff --git a/sw/qa/extras/odfexport/odfexport.cxx b/sw/qa/extras/odfexport/odfexport.cxx index bfc17ca284f3..321ce301fb9c 100644 --- a/sw/qa/extras/odfexport/odfexport.cxx +++ b/sw/qa/extras/odfexport/odfexport.cxx @@ -2355,5 +2355,17 @@ DECLARE_ODFEXPORT_TEST(tdf124470, "tdf124470TableAndEmbeddedUsedFonts.odt") } } +DECLARE_ODFEXPORT_TEST(tdf135942, "nestedTableInFooter.odt") +{ + // All table autostyles should be collected, including nested, and must not crash. + + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + if (xmlDocPtr pXmlDoc = parseExport("styles.xml")) + { + 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 80d786d8d884..6a4fa1c9902b 100644 --- a/sw/source/filter/xml/xmltble.cxx +++ b/sw/source/filter/xml/xmltble.cxx @@ -1183,8 +1183,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 b830da30579b..24b5a8f2cbae 100644 --- a/xmloff/source/text/txtparae.cxx +++ b/xmloff/source/text/txtparae.cxx @@ -3675,6 +3675,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( XML_STYLE_FAMILY_TEXT_PARAGRAPH ); |