writerfilter/source/dmapper/PropertyMap.cxx |   13 +++++++++----
 writerfilter/source/dmapper/PropertyMap.hxx |    3 ++-
 2 files changed, 11 insertions(+), 5 deletions(-)

New commits:
commit 94ef342679629c76eff2686243b423e926bbf680
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Wed Jan 19 19:35:15 2022 +0100
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Wed Jan 26 18:48:48 2022 +0100

    tdf#139737 sw_fieldmarkhide: writerfilter: don't copy header/footer
    
    ... when inserting into an existing document.
    
    The header/footer will not be removed by SwUndoInserts::UndoImpl() and
    thus the extra nodes will screw up subsequent Undo actions.
    
    Inserting a header from a file is already disabled, but there is a
    function that copies from a preceding page style that was missing a
    check.
    
    This never worked and reportedly crashes since commit
    4dc1615c80e8e66d339dc86fa95bbc76e884d988
    
    Change-Id: I895d867ee9fd30a936144492f3ee1633d045fe8f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128635
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>

diff --git a/writerfilter/source/dmapper/PropertyMap.cxx 
b/writerfilter/source/dmapper/PropertyMap.cxx
index 58871cc04538..dabdff851a9c 100644
--- a/writerfilter/source/dmapper/PropertyMap.cxx
+++ b/writerfilter/source/dmapper/PropertyMap.cxx
@@ -882,13 +882,18 @@ void SectionPropertyMap::CopyHeaderFooterTextProperty( 
const uno::Reference< bea
 }
 
 // Copy headers and footers from the previous page style.
-void SectionPropertyMap::CopyHeaderFooter( const uno::Reference< 
beans::XPropertySet >& xPrevStyle,
+void SectionPropertyMap::CopyHeaderFooter( DomainMapper_Impl& rDM_Impl,
+                                           const uno::Reference< 
beans::XPropertySet >& xPrevStyle,
                                            const uno::Reference< 
beans::XPropertySet >& xStyle,
                                            bool bOmitRightHeader,
                                            bool bOmitLeftHeader,
                                            bool bOmitRightFooter,
                                            bool bOmitLeftFooter )
 {
+    if (!rDM_Impl.IsNewDoc())
+    {   // see also DomainMapper_Impl::PushPageHeaderFooter()
+        return; // tdf#139737 SwUndoInserts cannot deal with new header/footer
+    }
     bool bHasPrevHeader = false;
     bool bHeaderIsShared = true;
     OUString sHeaderIsOn = getPropertyName( PROP_HEADER_IS_ON );
@@ -966,13 +971,13 @@ void SectionPropertyMap::CopyLastHeaderFooter( bool 
bFirstPage, DomainMapper_Imp
 
         if ( bFirstPage )
         {
-            CopyHeaderFooter( xPrevStyle, xStyle,
+            CopyHeaderFooter(rDM_Impl, xPrevStyle, xStyle,
                 !m_bFirstPageHeaderLinkToPrevious, true,
                 !m_bFirstPageFooterLinkToPrevious, true );
         }
         else
         {
-            CopyHeaderFooter( xPrevStyle, xStyle,
+            CopyHeaderFooter(rDM_Impl, xPrevStyle, xStyle,
                              !m_bDefaultHeaderLinkToPrevious,
                              !(m_bEvenPageHeaderLinkToPrevious && 
bUseEvenPages),
                              !m_bDefaultFooterLinkToPrevious,
@@ -1851,7 +1856,7 @@ void SectionPropertyMap::CloseSectionGroup( 
DomainMapper_Impl& rDM_Impl )
                 rDM_Impl.GetPageStyles()->insertByName( evenOddStyleName, 
uno::makeAny( evenOddStyle ) );
                 evenOddStyle->setPropertyValue( "HeaderIsOn", uno::makeAny( 
false ) );
                 evenOddStyle->setPropertyValue( "FooterIsOn", uno::makeAny( 
false ) );
-                CopyHeaderFooter( pageProperties, evenOddStyle );
+                CopyHeaderFooter(rDM_Impl, pageProperties, evenOddStyle);
                 *pageStyle = evenOddStyleName; // And use it instead of the 
original one (which is set as follow of this one).
                 if ( m_nBreakType == 
static_cast<sal_Int32>(NS_ooxml::LN_Value_ST_SectionMark_evenPage) )
                     evenOddStyle->setPropertyValue( getPropertyName( 
PROP_PAGE_STYLE_LAYOUT ), uno::makeAny( style::PageStyleLayout_LEFT ) );
diff --git a/writerfilter/source/dmapper/PropertyMap.hxx 
b/writerfilter/source/dmapper/PropertyMap.hxx
index 3314ce7451ae..b03ef7bd664c 100644
--- a/writerfilter/source/dmapper/PropertyMap.hxx
+++ b/writerfilter/source/dmapper/PropertyMap.hxx
@@ -299,7 +299,8 @@ private:
 
     void CopyLastHeaderFooter( bool bFirstPage, DomainMapper_Impl& rDM_Impl );
 
-    static void CopyHeaderFooter( const css::uno::Reference< 
css::beans::XPropertySet >& xPrevStyle,
+    static void CopyHeaderFooter( DomainMapper_Impl& rDM_Impl,
+                                  const css::uno::Reference< 
css::beans::XPropertySet >& xPrevStyle,
                                   const css::uno::Reference< 
css::beans::XPropertySet >& xStyle,
                                   bool bOmitRightHeader = false, bool 
bOmitLeftHeader = false,
                                   bool bOmitRightFooter = false, bool 
bOmitLeftFooter = false );

Reply via email to