sw/qa/extras/layout/layout4.cxx              |   10 +++++-----
 sw/source/filter/ww8/docxattributeoutput.cxx |    3 +++
 2 files changed, 8 insertions(+), 5 deletions(-)

New commits:
commit 3c552ee36404717735c1b4fa68ee4e50516592d7
Author:     [email protected] <[email protected]>
AuthorDate: Thu Jan 15 16:58:32 2026 -0500
Commit:     Justin Luth <[email protected]>
CommitDate: Tue Jan 20 02:30:25 2026 +0100

    tdf#170322 docx export: close blockSDT when frame is done
    
    If a framePr frame contains (only) a blockSDT,
    then it was NOT closing the SDT element that it had started,
    and the popFromTableExportContext guard
    was resetting m_aParagraphSdt.m_bStartedSdt to false,
    and thus it was NEVER getting closed, creating invalid XML.
    
    make CppunitTest_sw_layoutwriter4 CPPUNIT_TEST_NAME=testTdf159259
    
    Change-Id: I882686474346accc56b95322e39c0a2c4756d21f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197410
    Reviewed-by: Justin Luth <[email protected]>
    Tested-by: Jenkins
    Signed-off-by: Xisco Fauli <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197556

diff --git a/sw/qa/extras/layout/layout4.cxx b/sw/qa/extras/layout/layout4.cxx
index 37a32c3ab533..ebe72e405b53 100644
--- a/sw/qa/extras/layout/layout4.cxx
+++ b/sw/qa/extras/layout/layout4.cxx
@@ -1122,11 +1122,11 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter4, testTdf159259)
     CPPUNIT_ASSERT_EQUAL(paraHeight, flyHeight);
 
     // tdf#170322: MS Word considers the document corrupt if a plainText 
control contains a field
-    // save(TestFilter::DOCX);
-    // xmlDocUniquePtr pXmlDocument = parseExport(u"word/document.xml"_ustr);
-    // assertXPath(pXmlDocument, "//w:sdt/w:sdtPr", 1);
-    // // the sdtPr must be a richText control, not plainText
-    // assertXPath(pXmlDocument, "//w:sdt/w:sdtPr/w:text", 0);
+    save(TestFilter::DOCX);
+    xmlDocUniquePtr pXmlDocument = parseExport(u"word/document.xml"_ustr);
+    assertXPath(pXmlDocument, "//w:sdt/w:sdtPr", 1);
+    // the sdtPr must be a richText control, not plainText
+    assertXPath(pXmlDocument, "//w:sdt/w:sdtPr/w:text", 0);
 }
 
 CPPUNIT_TEST_FIXTURE(SwLayoutWriter4, testLargeTopParaMarginAfterHiddenSection)
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx 
b/sw/source/filter/ww8/docxattributeoutput.cxx
index 3423547728d3..a74fdf4a5b69 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -1292,7 +1292,10 @@ void DocxAttributeOutput::EndParagraph( const 
ww8::WW8TableNodeInfoInner::Pointe
     {
         DocxTableExportContext aTableExportContext(*this);
         m_aFramePr.SetFrame(pFrame.get(), !m_xTableWrt ? -1 : 
m_tableReference.m_nTableDepth);
+        const bool bOldStartedSdt = m_aParagraphSdt.m_bStartedSdt;
         m_rExport.SdrExporter().writeOnlyTextOfFrame(pFrame.get());
+        if (!bOldStartedSdt && m_aParagraphSdt.m_bStartedSdt)
+            m_aParagraphSdt.EndSdtBlock(m_pSerializer);
         m_aFramePr.SetFrame(nullptr);
     }
 

Reply via email to