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 );