tdf#129659 DOCX check global footnote context

Since tdf#121441 we parse custom footnotes to get at least the
DOCX footnote text, even if we can't represent the formating. This
might push additional contexts to the parser stack. Therefore it's
now not sufficient to check the current context for a footnote,
but one has to check the global parser for a footnote context.

The actual bug is the unsupported footnote page break, which was
not correctly ignored and added a paragraph context to the stack,
resulting in the async substream input and output stack size.

Change-Id: I143254e7df37a619cb4efb542b58d3eff3afffa7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87114
Tested-by: Jenkins
Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
(cherry picked from commit b87af9775167002d36a3bc16cb308ea7895d7ea0)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87742
Reviewed-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
diff --git a/sw/qa/extras/ooxmlimport/data/tdf129659.docx b/sw/qa/extras/ooxmlimport/data/tdf129659.docx
new file mode 100644
index 0000000..38bd040
--- /dev/null
+++ b/sw/qa/extras/ooxmlimport/data/tdf129659.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx
index 636e033..29a1e4e 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport2.cxx
@@ -536,6 +536,11 @@
    // Currently this file imports with errors because of tdf#126435; it must not segfault on load
}

DECLARE_OOXMLIMPORT_TEST(testTdf129659, "tdf129659.docx")
{
    // don't crash on footnote with page break
}

// tests should only be added to ooxmlIMPORT *if* they fail round-tripping in ooxmlEXPORT

CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index f7f2454..4ea227c 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -3174,8 +3174,7 @@
            }
        }

        PropertyMapPtr pContext = m_pImpl->GetTopContext();
        if (pContext && !pContext->GetFootnote().is())
        if (!m_pImpl->GetFootnoteContext())
        {
            if (m_pImpl->isBreakDeferred(PAGE_BREAK))
                m_pImpl->GetTopContext()->Insert(PROP_BREAK_TYPE, uno::makeAny(style::BreakType_PAGE_BEFORE));
@@ -3184,7 +3183,8 @@
            m_pImpl->clearDeferredBreaks();
        }

        if( pContext->GetFootnote().is() && m_pImpl->IsInCustomFootnote() )
        PropertyMapPtr pContext = m_pImpl->GetTopContext();
        if (pContext && pContext->GetFootnote().is() && m_pImpl->IsInCustomFootnote())
        {
            pContext->GetFootnote()->setLabel(sText);
            //otherwise ignore sText
@@ -3410,7 +3410,7 @@
            const bool bSingleParagraph = m_pImpl->GetIsFirstParagraphInSection() && m_pImpl->GetIsLastParagraphInSection();
            const bool bSingleParagraphAfterRedline = m_pImpl->GetIsFirstParagraphInSection(true) && m_pImpl->GetIsLastParagraphInSection();
            PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH);
            if (pContext && !pContext->GetFootnote().is())
            if (!m_pImpl->GetFootnoteContext())
            {
                if (m_pImpl->isBreakDeferred(PAGE_BREAK))
                {
@@ -3470,9 +3470,7 @@
        }
        else
        {

            PropertyMapPtr pContext = m_pImpl->GetTopContext();
            if ( pContext && !pContext->GetFootnote().is() )
            if (!m_pImpl->GetFootnoteContext())
            {
                if (m_pImpl->isBreakDeferred(PAGE_BREAK))
                {
@@ -3501,7 +3499,8 @@
                m_pImpl->clearDeferredBreaks();
            }

            if( pContext && pContext->GetFootnote().is() )
            PropertyMapPtr pContext = m_pImpl->GetTopContext();
            if (pContext && pContext->GetFootnote().is() && m_pImpl->IsInCustomFootnote())
            {
                pContext->GetFootnote()->setLabel( sText );
                //otherwise ignore sText