sw/qa/extras/rtfimport/data/fdo61193.rtf          |    1 
 sw/qa/extras/rtfimport/data/hello.rtf             |    1 
 sw/qa/extras/rtfimport/rtfimport.cxx              |   31 ++++++++++++++++++++++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |   10 ++++---
 4 files changed, 40 insertions(+), 3 deletions(-)

New commits:
commit dfe4974119bcd17fa65a5f0600fd12af02425c56
Author: Miklos Vajna <vmik...@suse.cz>
Date:   Mon Apr 15 20:37:52 2013 +0200

    fdo#61193 fix crash on RTF paste of footnote
    
    Regression from 232ad2f2588beff50cb5c1f3b689c581ba317583.
    
    (cherry picked from commit e7664052d6693598e773f4c9dd6b819213d80d60)
    
    Change-Id: Ia0873851979df5bba0a4693f044aab2aeff2b8e4
    Reviewed-on: https://gerrit.libreoffice.org/3404
    Reviewed-by: Petr Mladek <pmla...@suse.cz>
    Tested-by: Petr Mladek <pmla...@suse.cz>

diff --git a/sw/qa/extras/rtfimport/data/fdo61193.rtf 
b/sw/qa/extras/rtfimport/data/fdo61193.rtf
new file mode 100644
index 0000000..6618bda
--- /dev/null
+++ b/sw/qa/extras/rtfimport/data/fdo61193.rtf
@@ -0,0 +1 @@
+{\rtf1\ansi text.{\footnote footnote}}
diff --git a/sw/qa/extras/rtfimport/data/hello.rtf 
b/sw/qa/extras/rtfimport/data/hello.rtf
new file mode 100644
index 0000000..472817d
--- /dev/null
+++ b/sw/qa/extras/rtfimport/data/hello.rtf
@@ -0,0 +1 @@
+{\rtf1 Hello world!\par}
diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx 
b/sw/qa/extras/rtfimport/rtfimport.cxx
index 6a70ad7..246358e 100644
--- a/sw/qa/extras/rtfimport/rtfimport.cxx
+++ b/sw/qa/extras/rtfimport/rtfimport.cxx
@@ -145,6 +145,7 @@ public:
     void testFdo62288();
     void testFdo37716();
     void testFdo51916();
+    void testFdo61193();
 
     CPPUNIT_TEST_SUITE(Test);
 #if !defined(MACOSX) && !defined(WNT)
@@ -156,6 +157,26 @@ private:
     void run();
     /// Get page count.
     int getPages();
+    /// Copy&paste helper.
+    void paste(OUString aFilename, uno::Reference<text::XTextRange> xTextRange 
= uno::Reference<text::XTextRange>())
+    {
+        uno::Reference<document::XFilter> 
xFilter(m_xSFactory->createInstance("com.sun.star.comp.Writer.RtfFilter"), 
uno::UNO_QUERY_THROW);
+        uno::Reference<document::XImporter> xImporter(xFilter, 
uno::UNO_QUERY_THROW);
+        xImporter->setTargetDocument(mxComponent);
+        uno::Sequence<beans::PropertyValue> aDescriptor(xTextRange.is() ? 3 : 
2);
+        aDescriptor[0].Name = "InputStream";
+        SvStream* pStream = 
utl::UcbStreamHelper::CreateStream(getURLFromSrc("/sw/qa/extras/rtfimport/data/")
 + aFilename, STREAM_WRITE);
+        uno::Reference<io::XStream> xStream(new utl::OStreamWrapper(*pStream));
+        aDescriptor[0].Value <<= xStream;
+        aDescriptor[1].Name = "IsNewDoc";
+        aDescriptor[1].Value <<= sal_False;
+        if (xTextRange.is())
+        {
+            aDescriptor[2].Name = "TextInsertModeRange";
+            aDescriptor[2].Value <<= xTextRange;
+        }
+        xFilter->filter(aDescriptor);
+    }
 };
 
 void Test::run()
@@ -240,6 +261,7 @@ void Test::run()
         {"fdo62288.rtf", &Test::testFdo62288},
         {"fdo37716.rtf", &Test::testFdo37716},
         {"fdo51916.rtf", &Test::testFdo51916},
+        {"hello.rtf", &Test::testFdo61193},
     };
     for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
     {
@@ -906,6 +928,15 @@ void Test::testCopyPasteFootnote()
     CPPUNIT_ASSERT_EQUAL(OUString("bbb"), xTextRange->getString());
 }
 
+void Test::testFdo61193()
+{
+    // Pasting content that contained a footnote caused a crash.
+    uno::Reference<text::XTextDocument> xTextDocument(mxComponent, 
uno::UNO_QUERY);
+    uno::Reference<text::XTextRange> xText(xTextDocument->getText(), 
uno::UNO_QUERY);
+    uno::Reference<text::XTextRange> xEnd = xText->getEnd();
+    paste("fdo61193.rtf", xEnd);
+}
+
 void Test::testShptxtPard()
 {
     // The problem was that \pard inside \shptxt caused loss of shape text
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx 
b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 6074add..deda4f1 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -726,6 +726,8 @@ void lcl_AddRangeAndStyle(
 void DomainMapper_Impl::CheckUnregisteredFrameConversion( )
 {
     PropertyNameSupplier& rPropNameSupplier = 
PropertyNameSupplier::GetPropertyNameSupplier();
+    if (m_aTextAppendStack.empty())
+        return;
     TextAppendContext& rAppendContext = m_aTextAppendStack.top();
     // n#779642: ignore fly frame inside table as it could lead to messy 
situations
     if( rAppendContext.pLastParagraphProperties.get() && 
rAppendContext.pLastParagraphProperties->IsFrameMode()
@@ -969,6 +971,8 @@ void DomainMapper_Impl::finishParagraph( PropertyMapPtr 
pPropertyMap )
 #endif
 
     ParagraphPropertyMap* pParaContext = dynamic_cast< ParagraphPropertyMap* 
>( pPropertyMap.get() );
+    if (!m_aTextAppendStack.size())
+        return;
     TextAppendContext& rAppendContext = m_aTextAppendStack.top();
     uno::Reference< text::XTextAppend >  xTextAppend;
     if (!m_aTextAppendStack.empty())
@@ -1453,14 +1457,14 @@ void DomainMapper_Impl::PushFootOrEndnote( bool 
bIsFootnote )
         }
         appendTextContent( uno::Reference< text::XTextContent >( 
xFootnoteText, uno::UNO_QUERY_THROW ), aFontProperties );
         m_aTextAppendStack.push(TextAppendContext(uno::Reference< 
text::XTextAppend >( xFootnoteText, uno::UNO_QUERY_THROW ),
-                    m_bIsNewDoc ? uno::Reference<text::XTextCursor>() : 
m_xBodyText->createTextCursorByRange(xFootnoteText->getStart())));
+                    m_bIsNewDoc ? uno::Reference<text::XTextCursor>() : 
xFootnoteText->createTextCursorByRange(xFootnoteText->getStart())));
 
         // Redlines for the footnote anchor
         CheckRedline( xFootnote->getAnchor( ) );
     }
-    catch( const uno::Exception& )
+    catch( const uno::Exception& e )
     {
-        OSL_FAIL( "exception in PushFootOrEndnote" );
+        SAL_WARN("writerfilter", "exception in PushFootOrEndnote: " << 
e.Message);
     }
 }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to